ARMA(p, q)-model
Een autoregressief voortschrijdend gemiddelde-model (ARMA(p, q)) combineert de autoregressie (AR(p)) en voortschrijdend-gemiddelde (MA(q)) modellen in één. De huidige waarde van de gesimuleerde vector hangt zowel af van eerdere waarden van diezelfde vector als van eerdere waarden van de ruisvector.
Maak de functiedefinitie van arma() af.
Deze oefening maakt deel uit van de cursus
R-code optimaliseren met Rcpp
Oefeninstructies
- Definieer een integer-variabele,
start, gelijk aan de maximumwaarde vanpenq, plus één. Denk eraan datmax()in destd-namespace zit. - Definieer binnen de buitenste for-lus een
double-variabele,value, alsmuplus de i-de ruiswaarde. - Verhoog binnen de eerste binnenste for-lus
valuemet het j-de element vanthetamaal het "i min j min 1"-de element vaneps. - Verhoog binnen de tweede binnenste for-lus
valuemet het j-de element vanphimaal het "i min j min 1"-de element vanx.
Praktische interactieve oefening
Probeer deze oefening eens door deze voorbeeldcode in te vullen.
#include
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector arma(int n, double mu, NumericVector phi, NumericVector theta, double sd) {
int p = phi.size();
int q = theta.size();
NumericVector x(n);
// Generate the noise vector
NumericVector eps = rnorm(n, 0.0, sd);
// Start at the max of p and q plus 1
___
// Loop i from start to n
for(int i = start; i < n; i++) {
// Value is mean plus noise
___
// The MA(q) part
for(int j = 0; j < q; j++) {
// Increase by the jth element of theta times
// the "i minus j minus 1"th element of eps
___
}
// The AR(p) part
for(int j = 0; j < p; j++) {
// Increase by the jth element of phi times
// the "i minus j minus 1"th element of x
___
}
x[i] = value;
}
return x;
}
/*** R
d <- data.frame(
x = 1:50,
y = arma(50, 10, c(1, -0.5), c(1, -0.5), 1)
)
ggplot(d, aes(x, y)) + geom_line()
*/