开始使用免费开始使用

ARMA (p, q) 模型

自回归滑动平均 模型(ARMA(p, q))将自回归(AR(p))与滑动平均(MA(q))合并为一个模型。被模拟向量的当前取值同时依赖该向量的历史取值以及噪声向量的历史取值。

请补全 arma() 的函数定义。

本练习是课程的一部分

用 Rcpp 优化 R 代码

查看课程

练习说明

  • 定义一个整数变量 start,其值等于 pq 的较大者再加 1。提示:max() 位于 std 命名空间。
  • 在外层 for 循环内,定义一个 double 变量 value,其值为 mu 加上第 i 个噪声值。
  • 在第一个内层 for 循环中,将 value 增加为 theta 的第 j 个元素乘以 eps 的第 "ij 再减 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()
*/
编辑并运行代码