CommencerCommencer gratuitement

Modèle ARMA (p, q)

Un modèle d’auto-régression à moyenne mobile (ARMA(p, q)) combine en un seul modèle l’auto-régression (AR(p)) et la moyenne mobile (MA(q)). La valeur courante du vecteur simulé dépend à la fois des valeurs passées de ce même vecteur et des valeurs passées du vecteur de bruit.

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

Cet exercice fait partie du cours

Optimiser du code R avec Rcpp

Afficher le cours

Instructions

  • 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.
  • À l’intérieur de la boucle for externe, définissez une variable de type double, value, comme mu plus la i-ème valeur de bruit.
  • À l’intérieur de 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.
  • À l’intérieur de la seconde 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 cet exemple de code.

#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