我已经使用 R 中的函数拟合了 ARIMA(5,1,2) 模型auto.arima()
,通过查看顺序,我们可以说这不是预测的最佳模型。如果数据系列中存在异常值,将模型拟合到此类数据的方法是什么?
如何为包含异常值的时间序列拟合模型
迈克尔·切尔尼克(Michael Chernick)为您指明了正确的方向。我也会看看 Ruey Tsay 的作品,因为它增加了这个知识体系。在这里查看更多。
您无法与当今的自动化计算机算法竞争。他们研究了许多方法来处理您没有考虑过的时间序列,并且通常没有在任何论文或书籍中记录。当有人问如何进行 ANOVA 时,在与不同的算法进行比较时,可以预期得到一个精确的答案。当有人问我如何进行模式识别时,由于涉及到启发式,许多答案都是可能的。您的问题涉及启发式方法的使用。
如果数据中存在异常值,则拟合 ARIMA 模型的最佳方法是评估可能的自然状态并选择被认为对特定数据集最佳的方法。一种可能的自然状态是 ARIMA 过程是解释变异的主要来源。在这种情况下,可以通过 acf/pacf 函数“初步识别”ARIMA 过程,然后检查残差中可能存在的异常值。异常值可以是脉冲,即一次性事件或季节性脉冲,这些脉冲由系统异常值以某种频率证明(例如,每月数据为 12)。第三种异常值是具有一组连续的脉冲,每个脉冲具有相同的符号和幅度,这称为阶跃或电平偏移。在检查了试验性 ARIMA 过程的残差之后,可以试验性地添加经验识别的确定性结构以创建试验性组合模型。如果变异的主要来源是 4 种或“异常值”之一,那么最好从头开始(首先)识别它们,然后使用该“回归模型”中的残差来识别随机(ARIMA)结构. 现在,当一个“问题”时,这两种替代策略会变得更加复杂比如对数/倒数等 另一个复杂因素/机会是如何以及何时形成用户建议的预测序列的贡献,以形成一个无缝集成的模型,该模型结合了记忆、因果关系和经验识别的虚拟序列。当趋势系列最好用以下形式的指标系列建模时,这个问题会进一步加剧, 或者和电平移位系列的组合,如. 您可能想尝试在 R 中编写这样的程序,但生命很短暂。我很乐意实际解决您的问题并在这种情况下演示该程序是如何工作的,请发布数据或将其发送至 sales@autobox.com
接收/分析数据/每日数据后的附加评论 外汇汇率/从 2007 年 1 月 1 日开始的 18=765 值
数据的 acf 为:
在识别出表单的 arma 模型时以及一些异常值,残差的 acf 表示随机性,因为 acf 值非常小。AUTOBOX 确定了一些异常值:
最终模型:
包括需要像 TSAY 那样增加方差稳定,其中残差的方差变化被识别和合并。您在自动运行时遇到的问题是,您使用的程序(如会计师)相信数据,而不是通过干预检测(又名异常值检测)挑战数据。我在这里发布了完整的分析。
R中没有现成可用的健壮的 arima 函数对应物;如果出现,将在此处列出。也许另一种方法是降低那些相对于简单的单变量异常值检测规则而言异常的观察值,但我也没有看到准备好使用包来运行加权 ARMA 回归。然后,另一种可能的选择是对外围点进行 Winsorize:
#parameters
para <- list(ar=c(0.6,-0.48), ma=c(-0.22,0.24))
#original series
y1 <- y0 <- arima.sim(n=100, para, sd=sqrt(0.1796))
#outliers
out <- sample(1:100, 20)
#contaminated series
y1[out] <- rnorm(20, 10, 1)
plot( y1, type="l")
lines(y0, col="red")
#winsorized series
y2 <- rep(NA, length(y1))
a1 <- (y1-median(y1)) / mad(y1)
a2 <- which(abs(a1)>3)
y2[-a2] <- y1[-a2]
for(i in 2:length(y2)){
if(is.na(y2[i])){ y2[i] <- y2[i-1] }
}
有大量关于稳健时间序列模型的文献。Martin 和 Yohai 是主要贡献者之一。他们的工作可以追溯到 1980 年代。我自己在检测时间序列中的异常值方面做了一些工作,但在时间序列中存在异常值或重尾残差的情况下,Martin 确实是异常值检测和参数估计的众多贡献者之一。
- 这是一个关于该主题的调查文章的链接,其中包含 100 多个参考文献的列表。它甚至包括我 1982 年的 JASA 论文。
- 这是一篇 2000 年的博士论文 (pdf),涵盖了稳健时间序列分析的理论、方法和应用,并包含一个很好的参考书目。
- 这是包含一些强大的时间序列工具的软件链接。
您的模型的目的是预测或分析历史?如果这不是用于预测,并且您知道这些是异常值,那么只需添加虚拟变量,在这些日期为 1,在其他日期为 0。这样,虚拟系数将处理异常值,您将能够解释模型中的其他系数。
如果这是为了预测,那么你必须问自己两个问题:这些异常值会再次发生吗?如果他们愿意,我是否必须对他们负责?
例如,假设您的数据系列在雷曼兄弟倒闭时存在异常值。很明显,这是一个你无法预测的事件,但你不能简单地忽略它,因为未来肯定会发生这样的事情。如果您为异常值添加虚拟变量,那么您可以有效地从误差方差中消除此事件的不确定性。你的预测会低估尾部风险——对于风险管理来说,这也许不是一件好事。但是,如果您要生成销售的基线预测,虚拟模型将起作用,因为您对尾部不感兴趣,您对最可能的情况感兴趣 - 因此您不必考虑不可预测的事件这个目的。
因此,模型的目的会影响您处理异常值的方式。