IniziaInizia gratis

Modello ARMA (p, q)

Un modello di media mobile autoregressivo (ARMA(p, q)) combina in un unico modello l’autoregressione (AR(p)) e la media mobile (MA(q)). Il valore corrente del vettore simulato dipende sia dai valori precedenti dello stesso vettore sia dai valori precedenti del vettore del rumore.

Completa la definizione della funzione arma().

Questo esercizio fa parte del corso

Ottimizzare il codice R con Rcpp

Visualizza il corso

Istruzioni dell'esercizio

  • Definisci una variabile intera, start, uguale al massimo tra p e q, più uno. Ricorda che max() è nel namespace std.
  • Nel ciclo for esterno, definisci una variabile double, value, come mu più il valore di rumore in posizione i.
  • Nel primo ciclo for interno, incrementa value del j-esimo elemento di theta moltiplicato per l’elemento "i meno j meno 1" di eps.
  • Nel secondo ciclo for interno, incrementa value del j-esimo elemento di phi moltiplicato per l’elemento "i meno j meno 1" di x.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

#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()
*/
Modifica ed esegui il codice