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
Instrucțiuni pentru exercițiu
- Generează un număr aleator cu distribuție normală, cu media
cși deviația standardeps, folosind API-ul R din Rcpp. - Fă ca bucla
forinterioară să itereze de la0până lap. - În interiorul buclei interioare, mărește
valuecu elementuljdinphiînmulțit cu elementul de index „i minus j minus 1" dinx.
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()
*/