開始使用免費開始

模擬 MA(q) 模型

「移動平均」(moving average,MA)模型同樣會依賴前一次的迭代。不過與 AR 模型不同,依賴的是雜訊部分。

以下是 R 的演算法:

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 是要模擬的觀測數量,mu 是期望值,theta 是一個移動平均係數的數值向量,而 sd 是雜訊的標準差。

在本章前面,你用過 R::rnorm() 從常態分配產生單一數值。此外也有 Rcpp::rnorm(),可以一次產生整個數值向量。它的引數與 R 的 rnorm() 相同。請完成 ma2() 的函式定義,這是 ma1() 的 C++ 翻譯版。

本練習屬於課程

用 Rcpp 最佳化 R 程式碼

檢視課程

練習說明

  • eps 產生雜訊向量。使用 Rcpp 命名空間中的 rnorm()(不是 R 命名空間)。
  • 在外層 for 迴圈內,將 value 計算為 mu 加上第 i 個雜訊值。
  • 在內層 for 迴圈內,將 value 增加為 theta 的第 j 個元素乘上 eps 的「第 ij1」個元素。
  • 兩層迴圈之後,將 x 的第 i 個元素設為 value

動手互動練習

試著完成這個範例程式碼,體驗一下這個練習。

#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()
*/
編輯並執行程式碼