如何使用 tsoutliers 包和 auto.arima 进行解释和预测

机器算法验证 r 时间序列 预测 有马 异常值
2022-03-18 06:47:31

我有 1993 年到 2015 年的月度数据,想对这些数据进行预测。我使用 tsoutliers 包来检测异常值,但我不知道如何继续使用我的数据集进行预测。

这是我的代码:

product.outlier<-tso(product,types=c("AO","LS","TC"))
plot(product.outlier)

这是我从 tsoutliers 包的输出

ARIMA(0,1,0)(0,0,1)[12]                    

Coefficients:
        sma1    LS46    LS51    LS61    TC133   LS181   AO183   AO184   LS185   TC186    TC193    TC200
      0.1700  0.4316  0.6166  0.5793  -0.5127  0.5422  0.5138  0.9264  3.0762  0.5688  -0.4775  -0.4386
s.e.  0.0768  0.1109  0.1105  0.1106   0.1021  0.1120  0.1119  0.1567  0.1918  0.1037   0.1033   0.1040
       LS207    AO237    TC248    AO260    AO266
      0.4228  -0.3815  -0.4082  -0.4830  -0.5183
s.e.  0.1129   0.0782   0.1030   0.0801   0.0805

sigma^2 estimated as 0.01258:  log likelihood=205.91
AIC=-375.83   AICc=-373.08   BIC=-311.19

 Outliers:
    type ind    time coefhat  tstat
1    LS  46 1996:10  0.4316  3.891
2    LS  51 1997:03  0.6166  5.579
3    LS  61 1998:01  0.5793  5.236
4    TC 133 2004:01 -0.5127 -5.019
5    LS 181 2008:01  0.5422  4.841 
6    AO 183 2008:03  0.5138  4.592
7    AO 184 2008:04  0.9264  5.911
8    LS 185 2008:05  3.0762 16.038
9    TC 186 2008:06  0.5688  5.483
10   TC 193 2009:01 -0.4775 -4.624
11   TC 200 2009:08 -0.4386 -4.217
12   LS 207 2010:03  0.4228  3.746
13   AO 237 2012:09 -0.3815 -4.877
14   TC 248 2013:08 -0.4082 -3.965
15   AO 260 2014:08 -0.4830 -6.027
16   AO 266 2015:02 -0.5183 -6.442

这是我的阴谋

我也有这些警告信息。

Warning messages:
1: In locate.outliers.iloop(resid = resid, pars = pars, cval = cval,  :
  stopped when ‘maxit’ was reached
2: In locate.outliers.iloop(resid = resid, pars = pars, cval = cval,  :
  stopped when ‘maxit’ was reached
3: In locate.outliers.oloop(y = y, fit = fit, types = types, cval = cval,  :
  stopped when ‘maxit’ was reached
4: In arima(x, order = c(1, d, 0), xreg = xreg) :
  possible convergence problem: optim gave code = 1
5: In auto.arima(x = c(5.77, 5.79, 5.79, 5.79, 5.79, 5.79, 5.78, 5.78,  :
  Unable to fit final model using maximum likelihood. AIC value approximated

疑点:

  1. 如果我没记错的话,tsoutliers 包将删除它检测到的异常值,并通过使用删除了异常值的数据集,它将为我们提供适合数据集的最佳 arima 模型,对吗?
  2. 由于电平移位等的去除,调整序列数据集正在向下移动很多。这是否意味着如果对调整后的序列进行预测,预测的输出将非常不准确,因为最近的数据已经超过 12,而调整后的数据将其移动到 7-8 左右。
  3. 警告消息 4 和 5 是什么意思?这是否意味着它不能使用调整后的系列来做 auto.arima?
  4. ARIMA(0,1,0)(0,0,1)[12] 中的 [12] 是什么意思?只是我将数据集设置为每月的频率/周期吗?这是否也意味着我的数据系列也是季节性的?
  5. 如何检测数据集中的季节性?从时间序列图的可视化来看,我看不到任何明显的趋势,如果我使用分解功能,它会假设有季节性趋势?那么我是否只相信 tsoutliers 告诉我的,哪里有季节性趋势,因为有 1 阶 MA?
  6. 识别出这些异常值后,如何继续使用这些数据进行预测?
  7. 如何将这些异常值纳入其他预测模型——指数平滑、ARIMA、结构模型、随机游走、θ?我确定我不能去除异常值,因为有水平偏移,如果我只取调整后的系列数据,值会太小,我该怎么办?

我是否需要在 auto.arima 中添加这些异常值作为回归量进行预测?那么这是如何工作的呢?

2个回答

这些评论太长了......因此是“答案”

  1. 你错了,它没有调整然后识别 ARIMA(就像 AUTOBOX 所做的那样)。它假定没有干预调整,然后急于识别可能受到不处理异常影响的 ARIMA 模型。在识别 ARIMA 结构之前,通常需要针对用户指定的因果序列和/或未指定的确定性结构(异常值/电平变化、季节性脉冲、本地时间趋势)进行调整。请参阅此错误诊断示例,该示例错误地对原始系列进行了不必要的区分,而自然的真实/正确状态不需要任何区分。非平稳性并不一定意味着需要差分,但通常可以暗示去意义,即调整水平/平均值的变化

  2. 正确的预测总是从原始序列中进行,因此根据历史,预测应该是可信的。

  3. 我不知道,因为我没有积极使用这个程序。我向您推荐它是因为您要求提供基于 r 的免费解决方案,而不是因为我认为它很好或足够,因为 ARIMA 建模是一个迭代(多阶段)自检过程。

  4. 该模型表明它认为数据具有 ma(12) 季节性成分,但这可能只是反映了对季节性脉冲的需求。

  5. 季节性趋势的概念充其量是模糊的。

  6. 我的回答太明显了,太谦虚了

'tsoutliers' 包实现了Chen 和 Liu (1993) [1] 中描述的过程。本文档还提供了对包和程序的描述

简而言之,该程序包括两个主要阶段:

  1. 在选定的 ARIMA 模型上检测异常值。
  2. 选择和/或重新拟合 ARIMA 模型,包括在上一步中检测到的异常值,并删除那些在新拟合中不重要的异常值。

然后针对检测到的异常值调整该系列,并重复阶段 (1) 和 (2) 直到不再检测到异常值或直到达到最大迭代次数。


第一阶段(异常值检测)也是一个迭代过程。在每次迭代结束时,ARIMA 模型的残差会针对该阶段检测到的异常值进行调整。重复该过程,直到不再发现异常值或达到最大迭代次数(默认为 4 次迭代)。您收到的前三个警告与此内部循环有关,即在四次迭代后退出该阶段。

maxit.iloop您可以通过function中的参数增加此最大迭代次数tso建议不要在第一阶段设置大量迭代,而是让过程继续进行到第二阶段,在该阶段重新调整或再次选择 ARIMA 模型。


警告 4 和 5 与拟合 ARIMA 模型和选择模型的过程有关,分别用于函数stats::arimaforecast:auto.arima最大化似然函数的算法并不总是收敛到一个解。您可以找到与这些问题相关的一些详细信息,例如,在这篇文章这篇文章中


[1] Chung Chen and Lon-Mu Liu (1993) “Joint Estimation of Model Parameters and Outlier Effects in Time Series”, Journal of the American Statistical Association , 88 (421), pp. 284-297。DOI:10.1080/01621459.1993.10594321