Aan de slagGa gratis aan de slag

Simuleer AR(p)-model

Autoregressieve (AR) modellen zijn een soort lineaire regressie voor tijdreeksen waarbij de voorspelde waarden afhangen van de waarden op eerdere tijdstippen. Door deze afhankelijkheid van eerdere tijdstippen moet het model punt voor punt worden berekend. Dat betekent dat je een for-lus gebruikt, dus C++ komt hier goed van pas!

Hier is het algoritme in 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 is het aantal gesimuleerde observaties, c is een constante, phi is een numerieke vector met autocorrelatiecoëfficiënten, en eps is de standaardafwijking van de ruis. Maak de definitie van ar2() af, een C++-vertaling van ar1().

Deze oefening maakt deel uit van de cursus

R-code optimaliseren met Rcpp

Cursus bekijken

Oefeninstructies

  • Genereer een normaal verdeeld willekeurig getal met gemiddelde c en standaardafwijking eps, met de R API van Rcpp.
  • Laat de binnenste for-lus itereren van 0 tot p.
  • Verhoog binnen de binnenste lus value met het j-de element van phi maal het element van x op positie "i min j min 1".

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

#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()
*/
Code bewerken en uitvoeren