一旦我在时间序列数据中找到/检测到异常值,我正试图找到一种纠正异常值的方法。某些方法,例如 R 中的 nnetar,会为具有大/大异常值的时间序列提供一些错误。我已经设法纠正了缺失值,但异常值仍在破坏我的预测......
一旦检测到异常值以进行时间序列数据预测,如何纠正?
R 的预测包中现在有一个工具,用于识别和替换异常值。(它还处理缺失值。)由于您显然已经在使用预测包,这对您来说可能是一个方便的解决方案。例如:
fit <- nnetar(tsclean(x))
该tsclean()
函数将使用 loess(对于非季节性序列)拟合稳健的趋势,或使用 STL(对于季节性序列)拟合稳健的趋势和季节性分量。计算残差并计算以下界限:
异常值被识别为残差大于或小于的点。
对于非季节性时间序列,异常值被线性插值代替。对于季节性时间序列,STL 拟合中的季节性分量被移除,季节性调整的序列被线性插值以替换异常值,然后再对结果进行季节性调整。
当您识别 ARIMA 模型时,您应该同时识别脉冲/电平转换/季节性脉冲和/或本地时间趋势。您可以获得一些有关干预检测程序的阅读材料。我推荐David P. Reilly 和 William WS Wei 的“时间序列分析:单变量和多变量方法”。
您可能必须使用 SAS/SPSS/AUTOBOX 之类的商业软件才能获得任何有用的结果,因为我所看到的免费软件是想要的。顺便说一句,我在这方面为 AUTOBOX 做出了重大的技术改进。
编辑:
更好的方法是使用严格的 ARIMA 方法和干预检测程序来识别异常值,从而产生稳健的 ARIMA 参数和良好的预测。现在考虑开发模拟预测,其中包含没有脉冲效应的重新采样残差。通过这种方式,您可以获得两全其美的结果,即一个好的模型和更现实的预测不确定性陈述,这些陈述不假设估计的模型参数是总体值。
我同意@Aksakal。
除了去除异常值,更好的方法是使用某种统计程序来处理异常值。
我建议您对数据进行缩尾处理。如果实施得当,winsorisation 可以对异常值相对稳健。
在这个页面上:http : //www.r-bloggers.com/winsorization/,你会发现 R-codes 来实现winsorisation。
如果您考虑对数据进行缩尾处理,则需要仔细考虑分布的尾部。异常值是预计非常低,还是预计非常高,或者两者兼而有之。这将影响您是否在例如 5% 或 10% 和/或 95% 或 99% 的水平上进行 Winsorise。
在预测环境中,去除异常值是非常危险的。例如,您正在预测一家杂货店的销售额。假设附近的建筑物发生煤气爆炸,导致您关闭商店几天。这是这家商店 10 年来唯一一次关门。因此,您可以获得时间序列、检测异常值、删除它并进行预测。你默默地假设未来不会发生这样的事情。实际上,您压缩了观察到的方差,并且系数方差缩小了。因此,如果您显示预测的置信区间,它们会比不移除异常值时的区间更窄。
当然,您可以保留异常值并照常进行,但这也不是一个好方法。原因是这个异常值会扭曲系数。
在这种情况下,我认为更好的方法是允许带有肥尾的错误分布,也许是稳定的分布。在这种情况下,您的异常值不会过多地扭曲系数。它们将接近去除异常值的系数。但是,异常值会出现在误差分布中,即误差方差中。本质上,您最终会得到更广泛的预测置信区间。
置信带传达了一条非常重要的信息。如果您预测本月销售额为1,000,000 美元,但有 5% 的可能性为 10,000 美元,这会影响您在支出、现金管理等方面的决策……