ÎncepețiÎncepe gratuit

Simulează modelul MA(q)

Modelele de medie mobilă (MA) depind și ele de iterația anterioară. Spre deosebire de modelele AR, dependența se referă la componenta de zgomot.

Iată algoritmul în R:

ma1 <- function(n, mu, theta, sd) {
  q <- length(theta)
  x <- numeric(n)
  eps <- rnorm(n, 0, sd)
  for(i in seq(q + 1, n)) {
    value <- mu + eps[i]
    for(j in seq_len(q)) {
      value <- value + theta[j] * eps[i - j]
    }
    x[i] <- value
  }
  x
}

n este numărul de observații simulate, mu este valoarea așteptată, theta este un vector numeric de coeficienți ai mediei mobile, iar sd este abaterea standard a zgomotului.

Anterior în acest capitol, ai folosit R::rnorm() pentru a genera un singur număr dintr-o distribuție normală. Există și Rcpp::rnorm(), care poate genera dintr-o dată un întreg vector numeric. Aceasta primește aceleași argumente ca rnorm() din R. Completează definiția funcției ma2(), o traducere în C++ a funcției ma1().

Acest exercițiu face parte din cursul

Optimizarea codului R cu Rcpp

Vezi cursul

Instrucțiuni pentru exercițiu

  • Generează vectorul de zgomot ca eps. Folosește rnorm() din namespace-ul Rcpp (nu din namespace-ul R).
  • În interiorul buclei for exterioare, calculează value ca mu plus valoarea zgomotului de pe poziția i.
  • În interiorul buclei for interioare, mărește value cu elementul j din theta înmulțit cu elementul de pe poziția "i minus j minus 1" din eps.
  • După bucle, setează elementul de pe poziția i din x la valoarea value.

Exercițiu interactiv practic

Încearcă acest exercițiu completând acest cod de exemplu.

#include 
using namespace Rcpp ;

// [[Rcpp::export]]
NumericVector ma2( int n, double mu, NumericVector theta, double sd ){
  int q = theta.size(); 
  NumericVector x(n);
  
  // Generate the noise vector
  NumericVector eps = ___(___, 0.0, ___);
    
  // Loop from q to n
  for(int i = q; i < n; i++) {
    // Value is mean plus noise
    double value = ___ + ___;
    // Loop from zero to q
    for(int j = 0; j < q; j++) {
      // Increase by the jth element of theta times
      // the "i minus j minus 1"th element of eps
      value += ___ * ___;
    }
    // Set ith element of x to value
    ___ = ___;
  }
    return x ;
}

/*** R
d <- data.frame(
  x = 1:50,
  y = ma2(50, 10, c(1, -0.5), 1)
)
ggplot(d, aes(x, y)) + geom_line()
*/
Editează și rulează codul