Simuler un modèle AR(p)
Les modèles auto-régressifs (AR) sont un type de régression linéaire pour les séries temporelles où les valeurs prédites dépendent des valeurs aux instants précédents. En raison de cette dépendance dans le temps, le modèle doit être calculé point par point, dans l’ordre. Cela implique d’utiliser une boucle for, où 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 C++ de ar1().
Cet exercice fait partie du cours
Optimiser du code R avec Rcpp
Instructions
- Générez un nombre aléatoire suivant une loi normale de moyenne
cet d’écart typeeps, 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
valuedu produit entre lej-ième élément dephiet l’élément "i moins j moins 1" dex.
Exercice interactif pratique
Essayez cet exercice en complétant cet exemple de code.
#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()
*/