Kom igångKom igång gratis

Simulera MA(q)-modell

Glidande medelvärde (MA) – modeller beror också på föregående iteration. Till skillnad från AR-modeller ligger beroendet på bruskomponenten.

Här är algoritmen i 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 är antalet simulerade observationer, mu är väntevärdet, theta är en numerisk vektor med glidande medelvärdeskoefficienter och sd är standardavvikelsen för bruset.

Tidigare i kapitlet använde du R::rnorm() för att generera ett enskilt tal från en normalfördelning. Det finns också Rcpp::rnorm(), som kan generera en hel numerisk vektor på en gång. Den tar samma argument som R:s rnorm(). Komplettera funktionsdefinitionen för ma2(), en C++-översättning av ma1().

Den här övningen är en del av kursen

Optimera R-kod med Rcpp

Visa kurs

Övningsinstruktioner

  • Generera brusvektorn som eps. Använd rnorm() från namnrymden Rcpp (inte namnrymden R).
  • Inuti den yttre for-slingan beräknar du value som mu plus det i:te brusvärdet.
  • Inuti den inre for-slingan ökar du value med det j:te elementet i theta multiplicerat med elementet "i minus j minus 1" i eps.
  • Efter slingorna sätter du det i:te elementet i x till value.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

#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()
*/
Redigera och kör kod