BaşlayınÜcretsiz başlayın

MA(q) modelini simüle et

Hareketli ortalama (MA) modelleri de önceki yinelemeye bağlıdır. AR modellerinden farklı olarak, bağımlılık gürültü (noise) kısmınadır.

İşte R ile algoritma:

ma1 <- function(n, mu, theta, sd) {
  q <- length(theta)
  x <- numeric(n)
  eps <- rnorm(n, 0, sd)
  for(i in seq(q + 1, n)) {
    value <- mu + eps[i]
    for(j in seq_len(q)) {
      value <- value + theta[j] * eps[i - j]
    }
    x[i] <- value
  }
  x
}

n simüle edilen gözlem sayısıdır, mu beklenen değerdir, theta hareketli ortalama katsayılarını içeren sayısal bir vektördür ve sd gürültünün standart sapmasıdır.

Bu bölümün başlarında, normal dağılımdan tek bir sayı üretmek için R::rnorm() kullandın. Ayrıca tek seferde tüm bir sayısal vektörü üretebilen Rcpp::rnorm() da vardır. Bu, R'deki rnorm() ile aynı argümanları alır. ma1() fonksiyonunun C++ çevirisi olan ma2() fonksiyon tanımını tamamla.

Bu egzersiz, kursun bir parçasıdır

Rcpp ile R Kodunu Optimize Etme

Kursa Göz Atın

Egzersiz talimatları

  • Gürültü vektörünü eps olarak üret. Rcpp ad alanındaki rnorm()u kullan (R ad alanındaki değil).
  • Dış döngü içinde, value değerini mu artı i. gürültü değeri olarak hesapla.
  • İç döngü içinde, value değerini theta'nın j. elemanı çarpı eps'in "i eksi j eksi 1". elemanı kadar artır.
  • Döngülerden sonra, x'in i. elemanını value olarak ayarla.

Uygulamalı etkileşimli egzersiz

Bu egzersizi bu örnek kodu tamamlayarak deneyin.

#include 
using namespace Rcpp ;

// [[Rcpp::export]]
NumericVector ma2( int n, double mu, NumericVector theta, double sd ){
  int q = theta.size(); 
  NumericVector x(n);
  
  // Generate the noise vector
  NumericVector eps = ___(___, 0.0, ___);
    
  // Loop from q to n
  for(int i = q; i < n; i++) {
    // Value is mean plus noise
    double value = ___ + ___;
    // Loop from zero to q
    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
      value += ___ * ___;
    }
    // Set ith element of x to value
    ___ = ___;
  }
    return x ;
}

/*** R
d <- data.frame(
  x = 1:50,
  y = ma2(50, 10, c(1, -0.5), 1)
)
ggplot(d, aes(x, y)) + geom_line()
*/
Kodu Düzenle ve Çalıştır