使用R的ARIMA建模的奇怪案例

Shr*_*yes 2 r time-series kalman-filter hessian-matrix

我在使用R中的函数arma {tseries}arima {stats}拟合ARMA模型时发现了一些奇怪的东西.

两个函数采用的估计程序存在根本区别,即在arma {stats}中的卡尔曼滤波器,而不是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
Run Code Online (Sandbox Code Playgroud)

使用这两个函数拟合ARMA模型.

# Works perfectly fine
arima(ts.sim, order = c(1,0,0))
# Works perfectly fine
arma(ts.sim, order = c(1,0))
Run Code Online (Sandbox Code Playgroud)

将时间序列的级别更改为10亿

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

使用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
Run Code Online (Sandbox Code Playgroud)

在我发现这个问题的时候,当SAS软件成功运行proc x12程序进行季节性测试时,R上的相同功能给了我上面的错误.这让我非常怀疑并且怀疑地看着SAS的结果,但事实证明,它可能与arima {stats}有关.

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

Rob*_*man 10

stats::arima在计算系数的协方差矩阵时,该函数出现问题.由于数字较大,代码对缩放效果的影响不是很强,而且在计算此行中Hessian矩阵的逆矩阵时崩溃:

var <- crossprod(A, solve(res$hessian * n.used, A))
Run Code Online (Sandbox Code Playgroud)

简单地缩放数据可以避免这个问题.例如

arima(ts.sim.1/100, order = c(1,0,0))
Run Code Online (Sandbox Code Playgroud)

将工作.

tseries::arma尽管如此,该功能并不"完美".它返回一条警告消息:

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

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

arma(ts.sim.1/1000, order = c(1,0))
Run Code Online (Sandbox Code Playgroud)