使用 for 循环模拟线性趋势上的 AR(1) 过程

Using a for-loop to simulate an AR(1) process over a linear trend

提问人:george1994 提问时间:7/31/2022 最后编辑:Zheyuan Ligeorge1994 更新时间:7/31/2022 访问量:440

问:

我尝试使用循环来模拟 AR(1) 过程。起始值应为 0,并且该过程应具有定义的常数 (= 3)、随机误差和时间趋势 (= t)。for

t = 1:1000
x = rep(0,1000)
b = rnorm(1000)
for (i in 1:length(t)) {
  x[i] = 3 + 0.01 * t[i] + 0.4 * x[i-1] + b
}

当我运行此代码时,不知何故是 NULL,我不明白为什么。关于如何解决它的任何想法?x

R for 循环 时间序列 仿真 自回归模型

评论

0赞 MrFlick 7/31/2022
当您尝试获取 which is 的值时,它将返回一个空向量。R 索引从 1 开始,而不是从 0 开始。不确定在那个边缘情况下你想发生什么。i=1x[i-1]x[0]

答:

2赞 Zheyuan Li 7/31/2022 #1

我没有得到 NULL;我收到“replacement”错误。代码级别存在 2 个问题:

  1. 循环计数器应该从 开始,因为你要在循环中访问;i = 2x[i - 1]

  2. 错误是 ,而不是 。b[i]b

t = 1:1000
x = rep(0, 1000)
b = rnorm(1000)
for (i in 2:length(t)){
  x[i] = 3 + 0.01 * t[i] + 0.4 * x[i - 1] + b[i]
}

此外,在模型级别,我想知道你是否真的应该这样做:

t = 1:1000
x = rep(0, 1000)
b = rnorm(1000)
## AR(1)
for (i in 2:length(t)){
  x[i] = 0.4 * x[i - 1] + b[i]
}
## linear trend
x <- 3 + 0.01 * t + x

这样,自相关就不会与线性趋势混淆。

我强烈建议您了解循环的工作原理。一方面,这种基本语法很有用。另一方面,它是表达数学算法的规范方式。但是一旦你熟悉了循环,我们鼓励你使用 arima.sim 来模拟 AR(1)。


最后,我想指出一些通常会引起巨大混乱的事情。

set.seed(0)  ## for reproducibility
t = 1:1000
x = rep(0, 1000)
b = rnorm(1000)
## AR(1)
for (i in 2:length(t)){
  x[i] = 0.4 * x[i - 1] + b[i]
}
## linear trend
x <- 3 + 0.01 * t + x

AR(1) 系数为 0.4,因此如果我们去除线性趋势,估计的滞后 1 自相关应该在 0.4 左右,对吧?这就是造成混乱的原因。

在时间序列分析中,人们被教导使用 来消除线性趋势。现在,如果你这样做,估计的滞后-1自相关相差甚远,甚至为负!diff()

dx <- diff(x)
acf(dx)

acf

这就是问题所在。 比你想象的要强得多。它能够消除分段随机线性趋势(布朗运动的特征)。当我们有一个简单的、全局的、确定性的线性趋势时,往往会过度劳累并引入负自相关。估计这种滞后 1 自相关的正确方法是:diffdiff

fit <- lm(x ~ t)
acf(fit$residuals)

correct acf