ARMA (p, q) 模型
自回归滑动平均 模型(ARMA(p, q))将自回归(AR(p))与滑动平均(MA(q))合并为一个模型。被模拟向量的当前取值同时依赖该向量的历史取值以及噪声向量的历史取值。
请补全 arma() 的函数定义。
本练习是课程的一部分
用 Rcpp 优化 R 代码
练习说明
- 定义一个整数变量
start,其值等于p和q的较大者再加 1。提示:max()位于std命名空间。 - 在外层 for 循环内,定义一个
double变量value,其值为mu加上第i个噪声值。 - 在第一个内层 for 循环中,将
value增加为theta的第j个元素乘以eps的第 "i减j再减1" 个元素。 - 在第二个内层 for 循环中,将
value增加为phi的第j个元素乘以x的第 "i 减 j 再减 1" 个元素。
交互式实操练习
通过完成这段示例代码来试试这个练习。
#include
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector arma(int n, double mu, NumericVector phi, NumericVector theta, double sd) {
int p = phi.size();
int q = theta.size();
NumericVector x(n);
// Generate the noise vector
NumericVector eps = rnorm(n, 0.0, sd);
// Start at the max of p and q plus 1
___
// Loop i from start to n
for(int i = start; i < n; i++) {
// Value is mean plus noise
___
// The MA(q) part
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
___
}
// The AR(p) part
for(int j = 0; j < p; j++) {
// Increase by the jth element of phi times
// the "i minus j minus 1"th element of x
___
}
x[i] = value;
}
return x;
}
/*** R
d <- data.frame(
x = 1:50,
y = arma(50, 10, c(1, -0.5), c(1, -0.5), 1)
)
ggplot(d, aes(x, y)) + geom_line()
*/