ÎncepețiÎncepe gratuit

Simulează un model AR(p)

Modelele autoregresive (AR) sunt un tip de regresie liniară pentru serii de timp, în care valorile prezise depind de valorile din punctele de timp anterioare. Din cauza acestei dependențe, modelul trebuie calculat un punct de timp după altul – ceea ce înseamnă că ai nevoie de o buclă for, iar C++ devine foarte util!

Iată algoritmul în 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 este numărul de observații simulate, c este o constantă, phi este un vector numeric de coeficienți de autocorelație, iar eps este deviația standard a zgomotului. Completează definiția funcției ar2(), o traducere în C++ a funcției ar1().

Acest exercițiu face parte din cursul

Optimizarea codului R cu Rcpp

Vezi cursul

Instrucțiuni pentru exercițiu

  • Generează un număr aleator cu distribuție normală, cu media c și deviația standard eps, folosind API-ul R din Rcpp.
  • Fă ca bucla for interioară să itereze de la 0 până la p.
  • În interiorul buclei interioare, mărește value cu elementul j din phi înmulțit cu elementul de index „i minus j minus 1" din x.

Exercițiu interactiv practic

Încearcă acest exercițiu completând acest cod de exemplu.

#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()
*/
Editează și rulează codul