5.6 回归预测

我们可以用以下模型来预测 \(y\) 值: \[ \hat{y_t} = \hat\beta_{0} + \hat\beta_{1} x_{1,t} + \hat\beta_{2} x_{2,t} + \cdots + \hat\beta_{k} x_{k,t}, \] 它包括估计系数并忽略了残差项。将 \(x_{1,t},\ldots,x_{k,t}\) (其中 \(t=1,\ldots,T\) )分别带入上式,得到 \(y\) 的拟合值。然而我们所关注的是预测 \(y\)未来值

事前预测与事后预测

当我们将回归模型用于时间序列数据时,根据假设的不同,模型可以生成不同类型的预测值。

事前预测 是仅使用预先提供的信息进行预测。例如,对美国季度消费百分比变化的事前预测应仅使用2016年第三季度以前可用的信息。这是使用当前所有可用信息进行的预测。因此,为了生成事前预测,模型需要预测变量的预测值。为获得预测变量的预测值,我们可以使用3.1节中介绍的方法,或采用第8章中更复杂的纯时间序列方法。或者还可以采用其他来源(例如政府部门)的预测值。

事后预测 是使用后来的预测变量信息进行的预测。例如,消费的事后预测可以使用预测变量的实际观察进行预测。这些不是真正的预测值,但对研究预测模型的行为很有用。

不应使用预测期内的数据估计事后预测模型。也就是说,事后预测应该假设预测变量(\(x\))已知,而被预测变量(\(y\))未知。

对事前预测和事后预测的比较评估有助于区分预测不确定性的来源。这将表明预测误差是由于预测变量的预测偏差还是由于预测模型效果不佳所引起。

示例:澳大利亚季度啤酒产量

一般来说,在事前预测中,我们不能使用预测变量的未来实际值,因为我们无法得知它们的未来值。然而,5.4节中介绍的特殊因子都是事先已知的,它们基于日历变量(例如,季节性虚拟变量或公共假日指标)或时间的确定性函数(例如时间趋势),在这种情况下,事前预测和事后预测没有区别。

beer2 <- window(ausbeer, start=1992)
fit.beer <- tslm(beer2 ~ trend + season)
fcast <- forecast(fit.beer)
autoplot(fcast) +
  ggtitle("利用线性回归模型预测啤酒产出")+
  theme(text = element_text(family = "STHeiti"))+
  theme(plot.title = element_text(hjust = 0.5))
啤酒生产回归模型的预测。暗阴影区域表示80%的预测区间,浅阴影区域表示95%的预测区间。

图 5.17: 啤酒生产回归模型的预测。暗阴影区域表示80%的预测区间,浅阴影区域表示95%的预测区间。

基于不同情景的预测

在此类预测问题中,预测者对在预测变量的不同情况下模型的预测值比较关注。例如,美国的政客可能会比较关心在失业率不发生变化的条件下,收入和储蓄分别保持1%和0.5%的固定增长与分别保持1%和0.5%的固定下降两种情况下消费支出的变化。预测结果如图5.18所示。需要注意的是,基于情景预测的预测值的预测区间不会包括与预测变量未来值相关的不确定性。我们应该注意到,该方法中假设预测变量的值是事先知道的。

fit.consBest <- tslm(
  Consumption ~ Income + Savings + Unemployment,
  data = uschange)
h <- 4
newdata <- data.frame(
    Income = c(1, 1, 1, 1),
    Savings = c(0.5, 0.5, 0.5, 0.5),
    Unemployment = c(0, 0, 0, 0))
fcast.up <- forecast(fit.consBest, newdata = newdata)
newdata <- data.frame(
    Income = rep(-1, h),
    Savings = rep(-0.5, h),
    Unemployment = rep(0, h))
fcast.down <- forecast(fit.consBest, newdata = newdata)
fit.consBest <- tslm(
  Consumption ~ Income + Savings + Unemployment,
  data = uschange)
h <- 4
newdata <- cbind(
    Income = c(1, 1, 1, 1),
    Savings = c(0.5, 0.5, 0.5, 0.5),
    Unemployment = c(0, 0, 0, 0)
  ) %>%
  as.data.frame()
fcast.up <- forecast(fit.consBest, newdata = newdata)
newdata <- cbind(
    Income = rep(-1, h),
    Savings = rep(-0.5, h),
    Unemployment = rep(0, h)
  ) %>%
  as.data.frame()
fcast.down <- forecast(fit.consBest, newdata = newdata)

autoplot(uschange[, 1]) + 
  xlab('年份')+ylab("美国消费的变化 %") +
  autolayer(fcast.up, PI = TRUE, series = "增加") +
  autolayer(fcast.down, PI = TRUE, series = "减少") +
  guides(colour = guide_legend(title = "不同场景"))+
  theme(text = element_text(family = "STHeiti"))+
  theme(plot.title = element_text(hjust = 0.5))
利用基于情景的预测方法预测美国个人消费支出的百分比变化。

图 5.18: 利用基于情景的预测方法预测美国个人消费支出的百分比变化。

建立预测回归模型

回归模型可以清晰的表现出预测变量和被预测变量之间的关系。为了得到事前被预测变量的估计值,需要事先得到每个预测变量的未来值。那么若着重关注基于不同场景下的预测,则模型将十分有效。而若主要关注事前预测,那么建模难点可能是获得预测变量的预测值(在许多情形下,生成预测变量的预测值比生成被预测变量的预测值更具有挑战)。

令一种方法是用预测变量进行滞后预测。假设我们想要生成被预测变量的向前 \(h\) 步预测: \[ y_{t+h}=\beta_0+\beta_1x_{1,t}+\dots+\beta_kx_{k,t}+\varepsilon_{t+h} \] 其中, \(h=1,2\ldots\) 。由上式可看出,直接由 \(t\) 时期的各个预测变量生成 \(t+h\) 期的被预测变量 \(y\) 。因此该模型可以用来估计未来被预测变量值,即当超出观测点个数 \(T\) 时,模型仍然有效。

预测变量的滞后预测不仅使模型便于操作,而且使模型具有更加直观的吸引力。例如,以增加产量为目的的政策变化可能不会对消费支出产生即时影响,很有可能有滞后效应。在5.4节中我们简要介绍了分布滞后因素作为预测变量。第9章的动态回归模型中有更加详细的介绍。

预测区间

在图5.18中,分别生成了消费变化率的80%和95%和预测区间。5.7节介绍了计算多元回归模型预测区间的一般公式。由于这涉及一些高等线性代数内容,我们在这里给出了计算简单回归的预测区间的情况,其中可以使用下面等式生成预测, \[ \hat{y}=\hat{\beta}_0+\hat{\beta}_1x. \] 假设误差项服从正态分布,则95%的预测区间为: \[\begin{equation} \hat{y} \pm 1.96 \hat{\sigma}_e\sqrt{1+\frac{1}{T}+\frac{(x-\bar{x})^2}{(T-1)s_x^2}}, \tag{5.4} \end{equation}\] 其中,\(T\) 为观测点的个数,\(\bar{x}\) 是观测样本 \(x\) 的平均值,\(s_x\)\(x\) 的标准差,\(\hat{\sigma}_e\) 是式(5.3)中的回归标准误差。类似地,通过将1.96替换为1.28可以获得80%的预测间隔。表3.1中显示,用不同的值替换1.96,可以获得其他预测区间。如果采用 R 来生成预测区间,将生成更精确的预测区间(尤其当 \(T\) 较小时)。

(5.4)表明,当 \(x\)\(\bar{x}\) 相差较大时,生成的预测区间会更宽。也就是说,当预测变量值接近样本均值时,模型的预测结果更可靠。

示例

美国消费的简单回归模型为 \[ \hat{y}_t=0.55 + 0.28x_t. \]

在接下来的四个季度中,假设个人收入将会以其历史平均值 \(\bar{x}=0.72\%\) 增长 ,消费支出则会增加 \(0.75\%\) ,对应的 \(95\%\)\(80\%\) 预测区间分别为 \([0.69,3.21]\)\([1.13,2.77]\) 。如图5.19所示,若将收入增加5%,那么预测区间将会很宽。

fit.cons <- tslm(Consumption ~ Income, data = uschange)
h <- 4
fcast.ave <- forecast(fit.cons,
  newdata = data.frame(Income = rep(mean(uschange[, "Income"]), h)))
fcast.up <- forecast(fit.cons,
  newdata = data.frame(Income = rep(5, h)))
autoplot(uschange[, "Consumption"]) +
  xlab('年份')+
  ylab("美国消费变化率 %") +
  autolayer(fcast.ave, PI = TRUE, series = "平均增长") +
  autolayer(fcast.up, PI = TRUE, series = "极值增长") +
  guides(colour = guide_legend(title = "不同情况"))+
  theme(text = element_text(family = "STHeiti"))+
  theme(plot.title = element_text(hjust = 0.5))
收入平均增长 \(0.72\%\) 与收入极值增长5%分别对预测区间的影响。

图 5.19: 收入平均增长 \(0.72\%\) 与收入极值增长5%分别对预测区间的影响。