Symulacja modelu AR(p)
Modele autoregresyjne (AR) to rodzaj regresji liniowej dla szeregów czasowych, w której przewidywane wartości zależą od wartości z poprzednich punktów czasowych. Z powodu tej zależności model musi być obliczany krok po kroku. Oznacza to konieczność użycia pętli for – i właśnie tutaj C++ okazuje się niezastąpiony!
Oto algorytm w 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 to liczba symulowanych obserwacji, c to stała, phi to numeryczny wektor współczynników autokorelacji, a eps to odchylenie standardowe szumu. Uzupełnij definicję funkcji ar2(), będącej przekładem ar1() na C++.
To ćwiczenie jest częścią kursu
Optymalizacja kodu R za pomocą Rcpp
Instrukcje do ćwiczenia
- Wygeneruj losową liczbę z rozkładu normalnego o średniej
ci odchyleniu standardowymeps, korzystając z API R dostępnego w Rcpp. - Spraw, żeby wewnętrzna pętla for iterowała od
0dop. - Wewnątrz pętli wewnętrznej zwiększ
valueo iloczynj-tego elementuphii elementuxo indeksie „i minus j minus 1".
Interaktywne ćwiczenie praktyczne
Spróbuj tego ćwiczenia, uzupełniając ten przykładowy kod.
#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()
*/