3

在使用 R 中的函数arma{tseries}arima{stats}拟合 ARMA 模型时,我观察到了一些奇怪的事情。

这两个函数采用的估计程序存在根本差异,arima{stats} 中的 Kalman 滤波器与 arma{tseries} 中的 ML 估计相反。

鉴于这两个函数在估计过程中的差异,如果我们使用相同的时间序列,我们不会期望这两个函数的结果完全不同。

好吧,他们似乎可以!

生成以下时间序列并添加 2 个异常值。

set.seed(1010)
ts.sim <- abs(arima.sim(list(order = c(1,0,0), ar = 0.7), n = 50))
ts.sim[8] <- ts.sim[12]*8
ts.sim[35] <- ts.sim[32]*8

使用两个函数拟合 ARMA 模型。

# Works perfectly fine
arima(ts.sim, order = c(1,0,0))
# Works perfectly fine
arma(ts.sim, order = c(1,0))

将时间序列的水平改变 10 亿倍

# Introduce a multiplicative shift
ts.sim.1 <- ts.sim*1000000000
options(scipen = 999)
summary(ts.sim.1)

使用 2 个函数拟合 ARMA 模型:

# Works perfectly fine
arma(ts.sim.1, order = c(1,0))

# Does not work
arima(ts.sim.1, order = c(1,0,0))

## Error in solve.default(res$hessian * n.used, A): system is 
 computationally singular: reciprocal condition number = 1.90892e-19

我发现这个问题的地方是 SAS 软件能够成功运行 proc x12 程序来进行季节性测试,但是 R 上的相同功能给了我上面的错误。这让我真的很想知道并怀疑地看待 SAS 结果,但事实证明,这可能只是与 arima{stats} 有关。

任何人都可以尝试详细说明上述错误的原因,这限制了我们使用 arima{stats} 来拟合模型吗?

4

1 回答 1

10

stats::arima在计算系数的协方差矩阵时,函数会出现问题。由于数字很大,该代码对规模效应不是很健壮,并且在计算这一行中的 Hessian 矩阵的逆时崩溃:

var <- crossprod(A, solve(res$hessian * n.used, A))

通过简单地缩放数据来避免这个问题。例如

arima(ts.sim.1/100, order = c(1,0,0))

将工作。

但是,该tseries::arma功能不能“完全正常”工作。它返回一条警告消息:

In arma(ts.sim.1, order = c(1, 0)): Hessian 负半定

这也可以通过缩放来避免:

arma(ts.sim.1/1000, order = c(1,0))
于 2015-04-09T01:16:50.657 回答