Kom igångKom igång gratis

Simulera AR(p)-modell

Autoregressiva (AR) modeller är en typ av linjär regression för tidsserier där de förutsagda värdena beror på värden vid tidigare tidpunkter. Eftersom modellen är beroende av tidigare tidpunkter måste beräkningen ske ett steg i taget – det vill säga med en for-loop, och då kommer C++ väl till pass!

Här är algoritmen i R:

ar1 <- function(n, constant, phi, eps) {
  p <- length(phi)
  x <- numeric(n)
  for(i in seq(p + 1, n)) {
    value <- rnorm(1, constant, eps)
    for(j in seq_len(p)) {
      value <- value + phi[j] * x[i - j]
    }
    x[i] <- value
  }
  x
}

n är antalet simulerade observationer, c är en konstant, phi är en numerisk vektor med autokorrelationskoefficienter och eps är standardavvikelsen för bruset. Slutför definitionen av ar2(), en C++-översättning av ar1().

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

Optimera R-kod med Rcpp

Visa kurs

Övningsinstruktioner

  • Generera ett normalfördelat slumptal med medelvärdet c och standardavvikelsen eps via Rcpps R-API.
  • Låt den inre for-loopen iterera från 0 till p.
  • Öka value inuti den inre loopen med det j:e elementet i phi multiplicerat med det "i minus j minus 1":e elementet i x.

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 ar2(int n, double c, NumericVector phi, double eps) {
  int p = phi.size();  
  NumericVector x(n);
  
  // Loop from p to n
  for(int i = p; i < n; i++) {
    // Generate a random number from the normal distribution
    double value = ___::___(___, ___);
    // Loop from zero to p
    for(int j = ___; j < ___; j++) {
      // Increase by the jth element of phi times 
      // the "i minus j minus 1"th element of x
      value += ___[___] * ___[___];
    }
    x[i] = value;
  }
  return x;
}

/*** R
d <- data.frame(
  x = 1:50,
  y = ar2(50, 10, c(1, -0.5), 1)
)
ggplot(d, aes(x, y)) + geom_line()
*/
Redigera och kör kod