CommencezCommencez gratuitement

Simuler un modèle AR(p)

Les modèles autorégressifs (AR) sont un type de régression linéaire pour séries chronologiques où les valeurs prédites dépendent des valeurs aux instants précédents. En raison de cette dépendance, le modèle doit être calculé point par point dans le temps. Cela implique d'utiliser une boucle for, et c'est là que le C++ est très utile!

Voici l'algorithme en 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 est le nombre d'observations simulées, c est une constante, phi est un vecteur numérique de coefficients d'autocorrélation, et eps est l'écart type du bruit. Complétez la définition de ar2(), une traduction en C++ de ar1().

Cette activité fait partie du cours

Optimiser le code R avec Rcpp

Voir le cours

Instructions de l’exercice

  • Générez un nombre aléatoire suivant une loi normale de moyenne c et d'écart type eps, en utilisant l'API R de Rcpp.
  • Faites en sorte que la boucle for interne itère de 0 à p.
  • À l'intérieur de la boucle interne, augmentez value du produit entre le je élément de phi et l'élément « i moins j moins 1 » de x.

Exercice interactif pratique

Essayez cet exercice en complétant ce code d’exemple.

#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()
*/
Modifier et exécuter le code