9.5 动态谐波回归

当数据存在较长季节性时,包含傅里叶项的动态回归模型通常会比本书中的其它模型的效果更好。例如,日度数据存在长度为365的季节性,周度数据存在长度为52的季节性。

ARIMA 模型和 ETS 模型可用于周期为12的月度数据或周期为4的季度数据。ets()函数限制最大的季节周期为24,而不可以指定更大的周期。因为对于初始季节状态,需要估计 \(m-1\) 个参数,其中 \(m\) 是季节性周期,因此若 \(m\) 过大,估计将变得非常困难。

Arima()函数和auto.arima()函数可以允许季节周期达到 \(m=350\),但是实际上通常在季节性周期超过200时会导致内存不足。对于日度数据来说,它意味着将当天发生的事情与一年前发生的情况进行比较,高阶的季节差分没有多大意义。

因此,对于这样的时间序列,我们更倾向于谐波回归方法,其中季节性模式使用傅里叶项建模,短期时间序列由 ARMA 误差项处理。

这种方法的优点是:

  • 它允许任何长度的季节性;
  • 对于具有一个以上的季节性周期数据,可以包括不同频率的傅里叶项;
  • 对于较小的 \(K\) 值,季节性模式是平滑的(可以通过增加 \(K\) 来处理更多的波动的季节性);
  • 通过简单的 ARMA 误差可以轻松处理短期动态。

与季节性 ARIMA 模型相比,该模型的唯一缺点是假定季节性是固定的,季节性模式不允许随时间发生变化。但在实际问题中,季节性通常是非恒定的,所以除了很长时间序列之外,并不是一个很大的缺点。

示例:澳大利亚人口外出就餐支出

在本例中,我们组合了用于捕获季节性的傅里叶项和用于捕获数据中其它动态的 ARIMA 误差项。为简单起见,我们采用月度数据。在第12.1节中,我们将会采用周度数据。

数据集auscafe中,包含从2004年初到2016年11月,澳大利亚咖啡馆、餐馆和外卖的总支出(十亿美元),我们将预测之后的24个月。图9.9展示了随 \(K\) 增加而展现出的季节性模式。需要注意的是:随着 \(K\) 的增加,傅里叶项会增加并将表现出更加不确定的季节性模式,需要简单的 ARIMA 模型来捕捉动态信息。从图中可以看出,当 \(K=5\) 时,AICc 值取得最小值。从 \(K=4\)\(K=5\),AICc 值存在明显的跳跃,因此我们采用 \(K=5\) 的模型进行预测。

cafe04 <- window(auscafe, start=2004)

plots <- list()
for (i in seq(6)) {
  fit <- auto.arima(cafe04, xreg = fourier(cafe04, K = i), 
    seasonal = FALSE, lambda = 0)
  plots[[i]] <- autoplot(forecast(fit,xreg=fourier(cafe04, K=i, h=24))) +
    xlab(paste("K=",i,"   AICC=",round(fit$aicc,2))) + 
    ylab("") + ylim(1.5,4.7) 
}

gridExtra::grid.arrange(plots[[1]],plots[[2]],plots[[3]],
                        plots[[4]],plots[[5]],plots[[6]], nrow=3)
利用结合傅里叶项和ARIMA误差项的模型预测澳大利亚人口外出就餐支出。

图 9.9: 利用结合傅里叶项和ARIMA误差项的模型预测澳大利亚人口外出就餐支出。