R 函数 arima() 如何计算其残差?

机器算法验证 r 有马 残差
2022-04-12 20:14:22

我是时间序列的新手,我正试图弄清楚 R 中的场景之外到底发生了什么。假设我有 MA 过程:

ytμ=at+θ1at1+θ2at2
在哪里at是 iid 标准正常。为了具体,让μ=0,θ1=0.2θ2=0.5. 我已经实现了这个过程的模拟,并在上面拟合了一个 MA(2) 模型:

set.seed(47)
n = 200

a = rnorm(n,0,1)
a0 = rnorm(1,0,1)
an1 = rnorm(1,0,1)

theta = c(0.2, 0.5)

y = NULL
y[1] = a[1] + theta[1]*a0 + theta[2]*an1
y[2] = a[2] + theta[1]*a[1] + theta[2]*a0
for (t in 3:n) {
  y[t] = a[t] + theta[1]*a[t-1] + theta[2]*a[t-2]
}

MAfit = arima(y,order = c(0,0,2))

现在,当我从这个 arima() 调用中获取残差时,第一个残差是 2.745251。但是,当我减去y(1)根据 arima() 产生的平均值的估计,我得到 3.122668。那么 R 是如何计算第一个残差的呢?我用于这些各自计算的代码是:

residuals(MAfit)[1]        (returns 2.745251)
y[1] - coef(MAfit)[3]      (returns 3.122668)

我的理解是,对于t=1, 我们有:

a^1=y1μ^
从重新排列我的第一个方程并仅使用预期值a0a1. 我哪里出错了?谢谢!

请注意,我在使用给我的 TS 数据时遇到了同样的问题,所以我认为这不是我的 MA(2) 实现的问题。

1个回答

您期望的等式确实成立,但前提是使用条件平方和 (CSS) 估计器。默认情况下arima()仅对起始值使用 CSS,然后执行完全最大似然 (ML) 估计以对起始值进行积分。

但是您期望的计算可以通过以下方式获得:

css <- arima(y, order = c(0, 0, 2), method = "CSS")
cf <- coef(css)
residuals(css)[1:3]
## [1]  3.1099177  1.0096719 -0.6039833

这仅将创新的两个起始值设置为零,即假设a0=a1=0. 所有后续计算均以此为条件:

a <- c(0, 0)

然后可以通过以下for()循环完成前三个残差的迭代。(请注意,a由于起始值,总是必须移动索引。)

for(i in 1:3) a[i + 2] <- y[i] - cf[3] - cf[1] * a[i + 1] - cf[2] * a[i]
a
## [1]  0.0000000  0.0000000  3.1099177  1.0096719 -0.6039833

因此,这完全复制了您的预期。对于默认的 ML 估计,情况更加复杂,因为它整合了起始值的分布。?arima有关详细信息,请参阅中列出的参考资料。Cryer & Chan 也是一本很好的入门教科书,它在第 7 章中介绍了这个主题。