模擬 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的「第i減j減1」個元素。 - 兩層迴圈之後,將
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()
*/