Aan de slagGa gratis aan de slag

ARMA(p, q)-model

Een autoregressief voortschrijdend gemiddelde-model (ARMA(p, q)) combineert de autoregressie (AR(p)) en voortschrijdend-gemiddelde (MA(q)) modellen in één. De huidige waarde van de gesimuleerde vector hangt zowel af van eerdere waarden van diezelfde vector als van eerdere waarden van de ruisvector.

Maak de functiedefinitie van arma() af.

Deze oefening maakt deel uit van de cursus

R-code optimaliseren met Rcpp

Cursus bekijken

Oefeninstructies

  • Definieer een integer-variabele, start, gelijk aan de maximumwaarde van p en q, plus één. Denk eraan dat max() in de std-namespace zit.
  • Definieer binnen de buitenste for-lus een double-variabele, value, als mu plus de i-de ruiswaarde.
  • Verhoog binnen de eerste binnenste for-lus value met het j-de element van theta maal het "i min j min 1"-de element van eps.
  • Verhoog binnen de tweede binnenste for-lus value met het j-de element van phi maal het "i min j min 1"-de element van x.

Praktische interactieve oefening

Probeer deze oefening eens door deze voorbeeldcode in te vullen.

#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()
*/
Code bewerken en uitvoeren