9.3 模型预测

当我们利用包含 ARIMA 误差项的回归模型进行预测时,需要同时预测线性回归模型部分和 ARIMA 模型部分,然后将两个结果结合起来,得到最终的模型预测结果。与普通的回归模型一样,为了得到待预测变量的预测值,首先应先预测预测变量的预测值。当预测变量的未来值已知时(例如,预测变量为时间、星期几等等),便很容易得到待预测变量的预测值。但当预测变量的未来值未知时,那么我们需要首先对各个预测变量分别建模预测,或者我们人为假定预测变量的未来值。

示例:美国个人消费及收入

在本例中,我们将会预测未来八个季度的预测值,未来的个人可支配收入的百分比变化等于过去四十年间个人可支配收入的平均百分比变化。

fcast <- forecast(fit, xreg=rep(mean(uschange[,2]),8))
autoplot(fcast) + xlab("年份") +
  ylab("百分比变化")+
  theme(text = element_text(family = "STHeiti"))+
  theme(plot.title = element_text(hjust = 0.5))
使用包含ARIMA(1,0,2)误差的回归模型,通过回归消费支出百分比变化预测可支配收入的百分比变化。

图 9.4: 使用包含ARIMA(1,0,2)误差的回归模型,通过回归消费支出百分比变化预测可支配收入的百分比变化。

从结果中可以看出,使用该模型产生预测结果的预测区间比8.5节中的预测区间窄,也就是说预测结果更为准确。

需要注意的是,上述预测过程中,我们使用预测变量的历史平均值作为预测变量的未来值,因此模型的预测结果并未将预测变量的不确定性纳入考虑。

示例:耗电量的预测

本例中,我们对日度耗电量和温度进行建模。从日度耗电量中可以看出,由于在寒冷和炎热的天气,人们分别使用空调取暖和制冷,因此此时的日度耗电量较大。如图9.5所示,为日度耗电量和温度的散点图。

2014年澳大利亚维多利亚州每日耗电量与每日最高温度的散点图。

图 9.5: 2014年澳大利亚维多利亚州每日耗电量与每日最高温度的散点图。

数据集elecdaily中包含日度耗电量、工作日的指示变量(1表示为工作日,0表示非工作日)和当日最高温度。由于数据存在周度季节性,因此指定频率为7。图9.6为日度需求量和当日最高温度的时间序列图。这些图明显表明应该使用非线性模型和动态模型来建模。

2014年澳大利亚维多利亚州的每日耗电量和每日最高温度。

图 9.6: 2014年澳大利亚维多利亚州的每日耗电量和每日最高温度。

在本例中,我们使用auto.arima()函数拟合包含 ARIMA 误差的二次回归模型。并运用该模型,预测从2015年1月1日开始之后未来14天的耗电量。我们可以从天气预报中得到这些天的温度值。但为了更加详细的介绍模型,我们使用在5.6节中介绍的场景预测,将未来14天的温度认为设定为26摄氏度。

xreg <- cbind(MaxTemp = elecdaily[, "Temperature"], 
              MaxTempSq = elecdaily[, "Temperature"]^2, 
              Workday = elecdaily[, "WorkDay"])
fit <- auto.arima(elecdaily[, "Demand"], xreg = xreg)
checkresiduals(fit)

#> 
#>  Ljung-Box test
#> 
#> data:  Residuals from Regression with ARIMA(2,1,2)(2,0,0)[7] errors
#> Q* = 28, df = 4, p-value = 1e-05
#> 
#> Model df: 10.   Total lags used: 14

模型结果显示,该模型的残差存在显著的自相关性,且残差的直方图表明残差有一个明显的异常值,这都会影响预测值的预测区间。

autoplot(elecdaily[,'Demand'], series="真实值") +
  autolayer(fitted(fit), series="拟合值") +
  ylab("") +
  ggtitle("日度耗电量(千兆瓦)") +
  guides(colour=guide_legend(title=" "))+
  theme(text = element_text(family = "STHeiti"))+
  theme(plot.title = element_text(hjust = 0.5))


fcast <- forecast(fit, 
  xreg = cbind(rep(26,14), rep(26^2,14), c(0,1,0,0,1,1,1,1,1,0,0,1,1,1)))
#> Warning in forecast.forecast_ARIMA(fit, xreg =
#> cbind(rep(26, 14), rep(26^2, : xreg contains different
#> column names from the xreg used in training. Please check
#> that the regressors are in the same order.
autoplot(fcast) + ylab("日度耗电量(千兆瓦)") +
  theme(text = element_text(family = "STHeiti"))+
  theme(plot.title = element_text(hjust = 0.5))

2015年的最初两周的日度耗电量的预测值比较准确。由于2014年底耗电量较低(由于许多人休暑假),导致未来两周的耗电量预测值也较低。