CommencezCommencez gratuitement

Modèle ARMA (p, q)

Un modèle d'auto-régression à moyenne mobile (ARMA(p, q)) combine les modèles d'autorégression (AR(p)) et de moyenne mobile (MA(q)) en un seul. La valeur courante du vecteur simulé dépend à la fois des valeurs précédentes du même vecteur et des valeurs précédentes du vecteur de bruit.

Complétez la définition de la fonction arma().

Cette activité fait partie du cours

Optimiser le code R avec Rcpp

Voir le cours

Instructions de l’exercice

  • Définissez une variable entière, start, égale au maximum de p et q, plus un. Rappelez-vous que max() se trouve dans l'espace de noms std.
  • Dans la boucle for externe, définissez une variable de type double, value, comme mu plus la iᵉ valeur de bruit.
  • Dans la première boucle for interne, augmentez value de l'élément j de theta multiplié par l'élément « i moins j moins 1 » de eps.
  • Dans la deuxième boucle for interne, augmentez value de l'élément j de phi multiplié par 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 arma(int n, double mu, NumericVector phi, NumericVector theta, double sd) {
  int p = phi.size();
  int q = theta.size();   
  NumericVector x(n);
  
  // Generate the noise vector
  NumericVector eps = rnorm(n, 0.0, sd);
  
  // Start at the max of p and q plus 1
  ___
  
  // Loop i from start to n
  for(int i = start; i < n; i++) {
    // Value is mean plus noise
    ___
    
    // The MA(q) part
    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
      ___
    }
    
    // The AR(p) part
    for(int j = 0; j < p; j++) {
      // Increase by the jth element of phi times
      // the "i minus j minus 1"th element of x
      ___
    }
    
    x[i] = value;
  }
  return x;
}

/*** R
d <- data.frame(
  x = 1:50,
  y = arma(50, 10, c(1, -0.5), c(1, -0.5), 1)
)
ggplot(d, aes(x, y)) + geom_line()
*/
Modifier et exécuter le code