Simuleer AR(p)-model
Autoregressieve (AR) modellen zijn een soort lineaire regressie voor tijdreeksen waarbij de voorspelde waarden afhangen van de waarden op eerdere tijdstippen. Door deze afhankelijkheid van eerdere tijdstippen moet het model punt voor punt worden berekend. Dat betekent dat je een for-lus gebruikt, dus C++ komt hier goed van pas!
Hier is het algoritme in 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 is het aantal gesimuleerde observaties, c is een constante, phi is een numerieke vector met autocorrelatiecoëfficiënten, en eps is de standaardafwijking van de ruis. Maak de definitie van ar2() af, een C++-vertaling van ar1().
Deze oefening maakt deel uit van de cursus
R-code optimaliseren met Rcpp
Oefeninstructies
- Genereer een normaal verdeeld willekeurig getal met gemiddelde
cen standaardafwijkingeps, met de R API van Rcpp. - Laat de binnenste for-lus itereren van
0totp. - Verhoog binnen de binnenste lus
valuemet hetj-de element vanphimaal het element vanxop positie "i min j min 1".
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
#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()
*/