LoslegenKostenlos loslegen

AR(p)-Modell simulieren

Autoregressive (AR-)Modelle sind eine Art lineare Regression für Zeitreihen, bei der die vorhergesagten Werte von den Werten zu früheren Zeitpunkten abhängen. Aufgrund dieser Abhängigkeit muss das Modell Zeitpunkt für Zeitpunkt berechnet werden. Das bedeutet: Wir brauchen eine for-Schleife – hier ist C++ besonders hilfreich!

Hier ist der Algorithmus 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 ist die Anzahl der simulierten Beobachtungen, c ist eine Konstante, phi ist ein numerischer Vektor der Autokorrelationskoeffizienten und eps ist die Standardabweichung des Rauschens. Vervollständige die Definition von ar2(), einer C++-Übersetzung von ar1().

Diese Übung ist Teil des Kurses

R-Code mit Rcpp optimieren

Kurs anzeigen

Anleitung zur Übung

  • Erzeuge eine normalverteilte Zufallszahl mit Mittelwert c und Standardabweichung eps über die R-API von Rcpp.
  • Lass die innere for-Schleife von 0 bis p iterieren.
  • Erhöhe innerhalb der inneren Schleife value um das j-te Element von phi mal das „i minus j minus 1“-te Element von x.

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

#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()
*/
Code bearbeiten und ausführen