Simulera AR(p)-modell
Autoregressiva (AR) modeller är en typ av linjär regression för tidsserier där de förutsagda värdena beror på värden vid tidigare tidpunkter. Eftersom modellen är beroende av tidigare tidpunkter måste beräkningen ske ett steg i taget – det vill säga med en for-loop, och då kommer C++ väl till pass!
Här är algoritmen i 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 är antalet simulerade observationer, c är en konstant, phi är en numerisk vektor med autokorrelationskoefficienter och eps är standardavvikelsen för bruset. Slutför definitionen av ar2(), en C++-översättning av ar1().
Den här övningen är en del av kursen
Optimera R-kod med Rcpp
Övningsinstruktioner
- Generera ett normalfördelat slumptal med medelvärdet
coch standardavvikelsenepsvia Rcpps R-API. - Låt den inre for-loopen iterera från
0tillp. - Öka
valueinuti den inre loopen med detj:e elementet iphimultiplicerat med det "i minus j minus 1":e elementet ix.
Interaktiv övning med praktiskt arbete
Testa den här övningen genom att slutföra den här exempelkoden.
#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()
*/