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

Posted

技术标签:

【中文标题】使用 R 进行 ARIMA 建模的奇怪案例【英文标题】:The curious case of ARIMA modelling using R 【发布时间】:2015-04-08 18:42:41 【问题描述】:

我在使用 R 中的函数 armatseriesarimastats 拟合 ARMA 模型时发现了一些奇怪的现象。

两个函数采用的估计过程存在根本差异,arimastats 中的 Kalman 滤波器与 armatseries 中的 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 结果,但事实证明,这可能与 arimastats 有关。

谁能尝试详细说明导致我们无法使用 arimastats 拟合模型的上述错误的原因?

【问题讨论】:

【参考方案1】:

在计算系数的协方差矩阵时,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))

【讨论】:

感谢您的评论罗。我之所以说 arma() 的结果非常好,是因为我的 beta 估计系数几乎保持不变,而我的截距增加了十亿,这在直觉上是有道理的。你是对的,缩放解决了我们在 arima() 函数中看到的问题,但令人惊讶的是,使用 arima() 甚至没有进行估计。 如果我将初始数据按比例缩小 10,我是否应该将 Arima 产生的残差按比例放大 10? 这取决于你想对残差做什么。如果您只是检查它们是否是白噪声,则比例无关紧要。如果您想使用它们来计算一步预测方差(例如),那么您需要重新调整它们。

以上是关于使用 R 进行 ARIMA 建模的奇怪案例的主要内容,如果未能解决你的问题,请参考以下文章

备战数学建模35-时间序列预测模型

用R语言自动智能化创建时间序列ARIMA模型

建模 ARIMA 时出现 LinAlgError

时间序列建模预测之中国未来GDP预测

数学建模MATLAB应用实战系列(九十四)-PCA降维应用案例(附MATLAB代码)

时间序列分析概述