12.1 周数据,日数据及日以下数据

对周数据,日数据及日以下数据进行预测都比较困难,虽然其中的原因各不相同。

周数据

周数据很难进行预测是因为季节周期(一年中的周数)非常大且非整数。一年中的平均周数是 52.18 。我们考虑的大多数方法都是基于整数季节周期进行的。即使我们将周数据的季节周期近似为52,大多数方法也难以有效地处理这么大的季节周期数据。

最简单的方法是使用 STL 分解,并将非季节性方法应用于季节调整数据(如第 6 章中所述)。以下例子中使用了1991年2月至2005年5月期间美国成品汽油产品供应量(千桶/天)的周数据。

gasoline %>% stlf() %>% autoplot() + 
  xlab("时间") +
  theme(text = element_text(family = "STHeiti"))
对美国汽油供应量周数据使用STL分解并对季节调整数据建立 ETS 模型进行预测。

图 12.1: 对美国汽油供应量周数据使用STL分解并对季节调整数据建立 ETS 模型进行预测。

另一种方法是使用动态谐波回归模型,如 9.5 节中所述。在下面的例子中,通过最小化 AICc 选择傅里叶项的个数。 ARIMA 模型的阶数也是通过最小化 AICc 进行选择的,这个过程是通过auto.arima()函数完成的。

bestfit <- list(aicc=Inf)
for(K in seq(25)) {
  fit <- auto.arima(gasoline, xreg=fourier(gasoline, K=K),
    seasonal=FALSE)
  if(fit[["aicc"]] < bestfit[["aicc"]]) {
    bestfit <- fit
    bestK <- K
  }
}
fc <- forecast(bestfit, xreg=fourier(gasoline, K=bestK, h=104))
autoplot(fc) +
  ylab("汽油供应量") + xlab("时间") +
  theme(text = element_text(family = "STHeiti"))
对美国汽油供应量周数据使用动态谐波回归模型进行预测。

图 12.2: 对美国汽油供应量周数据使用动态谐波回归模型进行预测。

拟合的模型中有18对傅里叶项,可以写为 \[ y_t = bt + \sum_{j=1}^{18} \left[ \alpha_j\sin\left(\frac{2\pi j t}{52.18}\right) + \beta_j\cos\left(\frac{2\pi j t}{52.18}\right) \right] + n_t \] 其中 \(n_t\) 是一个服从 ARIMA(0,1,2) 过程的残差项。由于 \(n_t\) 是非平稳的,模型实际上是根据方程两边的变量的差分来进行估计的。模型中包含36个参数来捕捉季节性,这是相当多的,但根据 AICc 信息准则这些参数是十分必要的。总的自由度为42(其他六个中四个为 AR 参数,一个为 MA 参数,一个为漂移参数)。

第三种方法是在第 11.1 节中提到的 TBATS 模型。这是练习11.2的主题。在本例中,预测结果几乎与前两种方法相同。

当季节性随时间变化时, STL 方法和 TBATS 模型是较好的选择。如果有一些协变量是有用的预测因子,那么使用 ARIMA 方法更合适,因为这些协变量可以作为附加的回归变量添加到模型中。

日数据及日以下数据

日数据和日以下数据难以预测的原因与周数据相比则有所不同 —— 它们通常涉及多个季节模式,所以我们需要使用一种能处理这种复杂季节性数据的方法。

当然,如果时间序列相对较短,只包含一种季节模式,此时可以使用我们之前提到过的单季节方法(例如, ETS 或者季节性 ARIMA 模型)。但是,当时间序列太长,以至于一些较长的季节周期变得明显,此时就需要使用 STL ,动态谐波回归或者 TBATS ,如第 11.1 节中所述。

然而需要注意的是,这些模型也只适用于常规季节性的时间序列。捕捉像复活节, Id ,农历新年这些移动事件的季节性是十分困难的。即使有月度数据也很棘手,因为这些节日可能在三月或四月(复活节),一月或二月(农历新年),也可能在一年中的任何时候(Id)。

处理移动节日的最佳方法是使用虚拟变量。然而,无论是 STL 、 ETS 还是 TBATS 模型都不允许存在协变量。在本书提到的模型中(并能够在 R 的 forecast 包中实现),唯一的选择就是动态回归模型,在此模型中,自变量中可以包含描述节日效应的虚拟变量(也可以是傅里叶项)。