MulaiMulai sekarang secara gratis

Simulasikan model AR(p)

Model auto-regressive (AR) adalah jenis regresi linear untuk deret waktu di mana nilai prediksi bergantung pada nilai pada titik waktu sebelumnya. Karena ketergantungan pada titik waktu sebelumnya, model harus dihitung satu per satu titik waktu secara berurutan. Itu berarti menggunakan perulangan for, sehingga C++ sangat berguna!

Berikut algoritme dalam 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 adalah jumlah observasi hasil simulasi, c adalah konstanta, phi adalah vektor numerik koefisien autokorelasi, dan eps adalah simpangan baku dari noise. Lengkapi definisi ar2(), terjemahan C++ dari ar1().

Latihan ini adalah bagian dari kursus

Mengoptimalkan Kode R dengan Rcpp

Lihat Kursus

Petunjuk latihan

  • Hasilkan bilangan acak berdistribusi normal dengan mean c dan simpangan baku eps, menggunakan R API dari Rcpp.
  • Buat perulangan for bagian dalam berjalan dari 0 hingga p.
  • Di dalam perulangan bagian dalam, tambahkan value dengan elemen ke-j dari phi dikalikan elemen ke-"i minus j minus 1" dari x.

Latihan interaktif praktis

Cobalah latihan ini dengan menyelesaikan kode contoh berikut.

#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()
*/
Edit dan Jalankan Kode