开始使用免费开始使用

模拟 AR(p) 模型

自回归(AR)模型是一类用于时间序列的线性回归,预测值依赖于之前时间点的取值。由于这种对过去时点的依赖,模型必须按时间顺序逐点计算。这意味着需要使用 for 循环,因此 C++ 会非常有用!

下面是 R 中的算法:

ar1 <- function(n, constant, phi, eps) {
  p <- length(phi)
  x <- numeric(n)
  for(i in seq(p + 1, n)) {
    value <- rnorm(1, constant, eps)
    for(j in seq_len(p)) {
      value <- value + phi[j] * x[i - j]
    }
    x[i] <- value
  }
  x
}

n 是模拟观测的数量,c 是常数项,phi 是包含自相关系数的数值向量,eps 是噪声的标准差。请完成 ar2() 的定义,这是 ar1() 的 C++ 版本。

本练习是课程的一部分

用 Rcpp 优化 R 代码

查看课程

练习说明

  • 使用 Rcpp 的 R API,生成一个均值为 c、标准差为 eps 的正态分布随机数。
  • 让内部 for 循环从 0 迭代到 p
  • 在内部循环中,将 value 增加为 phi 的第 j 个元素乘以 x 的第 "i 减 j 再减 1" 个元素的乘积。

交互式实操练习

通过完成这段示例代码来试试这个练习。

#include 
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector ar2(int n, double c, NumericVector phi, double eps) {
  int p = phi.size();  
  NumericVector x(n);
  
  // Loop from p to n
  for(int i = p; i < n; i++) {
    // Generate a random number from the normal distribution
    double value = ___::___(___, ___);
    // Loop from zero to p
    for(int j = ___; j < ___; j++) {
      // Increase by the jth element of phi times 
      // the "i minus j minus 1"th element of x
      value += ___[___] * ___[___];
    }
    x[i] = value;
  }
  return x;
}

/*** R
d <- data.frame(
  x = 1:50,
  y = ar2(50, 10, c(1, -0.5), 1)
)
ggplot(d, aes(x, y)) + geom_line()
*/
编辑并运行代码