12.9 处理缺失值和离群值

实际数据中通常都会包含缺失值,离群值和其他杂乱的特征。处理它们有时会很麻烦。

缺失值

产生缺失数据的原因有很多,我们需要考虑这些缺失是否会给预测模型带来偏差。例如,假设我们正在研究一个商店的销售数据,在节假日由于商店关闭就会出现缺失值,因此第二天的销量就可能会因此增加。如果我们没能在建模时考虑到这一点,我们很可能会低估节假日后第一天的销售额,并高估后几天的销售额。处理这种情况的一种方法是使用一个动态回归模型,利用虚拟变量来表示这一天是节假日还是节假日后的一天。这样的影响源自特定的预测场景,因而不能通过自动化的方法来进行处理。

在其他情况下,这种缺失可能本质上是随机的。例如,有人可能忘记记录销售数据,或者数据记录设备可能出现故障。如果缺失值的时间不能对待预测问题提供多少信息,那就可以更容易地处理缺失值了。

有些方法允许缺失值存在且没有任何问题。例如,朴素预测方法中最近的非缺失值会为未来时间段的预测提供信息,因此其仍然有效。类似地,当历史数据中存在缺失值时,第 3.1 节中介绍的其他基准方法都可以生成预测。 ARIMA 模型、动态回归模型和 NNAR 模型的 R 函数也可以正常使用,不会产生错误。但是,其它建模函数,包括ets()stlf()tbats(),无法处理缺失值。

当缺失值引发报错时,至少有两种方法可以解决问题。首先,假如有足够长的观测序列可以用来进行有意义的预测时,我们可以只选取最后一个缺失值之后的数据部分。或者,我们可以用估计值替换缺失值。na.interp()函数可以实现这个过程。

数据集gold包含1985年1月1日至1989年3月31日每天早上的黄金价格。这个序列是我们的一个咨询项目提供的一部分数据;它包含34个缺失值以及一个明显错误的值。图12.9的红点是对缺失值的估计。

gold2 <- na.interp(gold)
autoplot(gold2, series="Interpolated") +
  autolayer(gold, series="Original") +
  scale_color_manual(values=c(`Interpolated`="red",`Original`="gray")) +
  xlab("时间") +
  theme(text = element_text(family = "STHeiti"))
1985年1月1日至1989年3月31日的连续1108个交易日的早盘金价。

图 12.9: 1985年1月1日至1989年3月31日的连续1108个交易日的早盘金价。

对于这样的非季节性数据,可以使用简单的线性插值来填充缺失部分。对于季节性数据,可以采用 STL 分解估计季节成分,对季节调整序列进行线性插值。imputeTS包中提供了更复杂的缺失值插值方法。

离群值

离群值是时间序列中与大多数观测值差异非常大的观测值。它们可能是错误的,也可能只是不寻常而已。(在回归中对异常值的讨论请参阅 5.3 节)如果数据中有极端的离群值,我们在本书中介绍的所有方法都将不再有效。在这种情况下,我们可能希望用缺失值或与大多数数据更一致的估计值来替换它们。

简单地替换离群值而不考虑它们产生的原因是一种危险的做法。因为它们可能提供与产生数据过程有关的有用信息,而我们在预测时应该考虑这些信息。

然而,如果我们愿意假设离群值是真正的错误数据,或者它们不会在预测期间发生,那么替换它们可以使预测任务变得更容易。

函数tsoutliers()函数用于识别离群值,并提供可能的替换值。在图12.9中,gold数据在第770天存在一个明显的离群值:

tsoutliers(gold)
#> $index
#> [1] 770
#> 
#> $replacements
#> [1] 494.9

仔细观察发现,邻近的观测值比这个离群值要低将近100美元。

gold[768:772]
#> [1] 495.00 502.75 593.70 487.05 487.75

这很可能是一个记录错误,正确的值应该是493.70美元。

另一个有用的函数是tsclean(),它能够标识并替换离群值,也能够替换缺失值。显然,我们应该谨慎地使用它,但它确实让我们能够使用对离群值敏感或无法处理缺失值的预测模型。例如,使用tsclean()函数后,我们可以对gold序列使用ets()函数。

gold %>%
  tsclean() %>%
  ets() %>%
  forecast(h=50) %>%
  autoplot() + 
   xlab("时间") +
   theme(text = element_text(family = "STHeiti"))
剔除离群值后ETS模型对黄金价格的预测。

图 12.10: 剔除离群值后ETS模型对黄金价格的预测。

需要注意的是,离群值和缺失值已经用估计值进行替换。