模拟 MA(q) 模型
移动平均(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增加第j个theta元素乘以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()
*/