使用R进行ARIMA建模的奇怪情况



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

这两个函数所采用的估计程序存在根本差异,arima{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

使用两个函数拟合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)

使用以下两个功能拟合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软件能够成功地运行procx12程序来进行季节性测试,但R上的相同功能给了我上述错误。这让我真的很好奇,并对SAS的结果持怀疑态度,但事实证明,这可能只是与arima的统计数据有关。

有人能详细说明上述错误的原因吗?该错误限制我们使用arima{stats}拟合模型?

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

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

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

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

将起作用。

不过,tseries::arma函数并不能"完美地"工作。它返回一条警告信息:

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

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

arma(ts.sim.1/1000, order = c(1,0))

相关内容

最新更新