5.3 回归模型的评估

拟合值 \(\hat{y}\) 和实际观测值 \(y\) 之间的差值被称为训练误差或“残差”,其表达式如下: \[\begin{align*} e_t &= y_t - \hat{y}_t \\ &= y_t - \hat\beta_{0} - \hat\beta_{1} x_{1,t} - \hat\beta_{2} x_{2,t} - \cdots - \hat\beta_{k} x_{k,t} \end{align*}\] 其中 \(t=1,\ldots,T\) 。每个残差都是观测值中不可预测的部分。

残差项有两个非常有用的性质: \[ \sum_{t=1}^{T}{e_t}=0 \quad\text{and}\quad \sum_{t=1}^{T}{x_{k,t}e_t}=0\qquad\text{for all $k$}. \] 从以上两式可以明显看出:残差的均值为零;残差项和预测变量之间相关性为零。(当模型中没有截距项时,零相关假设不一定成立。)

在选择回归变量并拟合回归模型之后,有必要绘制残差图以检查模型的假设是否已经满足。此外应该生成一系列图表,以检查拟合模型的不同方面和基本假设是否成立。下面我们将逐个分析。

残差的自相关函数(ACF)图

对于时间序列数据而言,在当前时间段观测到的变量值很可能与历史时段的变量值很相似。因此,当采用回归模型拟合时间序列数据时,残差经常会出现自相关效应。此时,模型违背了残差中无序列自相关的假设,并会导致模型的预测效率低下。为了获得更为准确的预测值,在模型中应该考虑更多的信息。当残差项存在序列自相关时,模型的预测结果仍然是无偏的,但此时得到预测区间范围通常会比我们需要的预测区间范围更大。因此我们应当重点关注模型残差的ACF图。

另一个用于检验残差自相关的效果较好的检验方法是 Breusch-Godfrey 检验,也被称为 LM (拉格朗日乘数)检验。假如p值小于一个特定值(例如0.05),则表明残差中存在显著的自相关性。

Breusch-Godfrey 检验类似于 Ljung-Box 检验,但它是专门用于回归模型的残差检验。

残差直方图

检查残差是否服从正态分布也是很有必要的。正如之前我们所解释的一样,它对预测值并不重要,但它可以让我们更加容易的确定预测区间。

示例

使用3.3节介绍的checkresiduals()函数,我们可以获得上述所有的残差诊断。

checkresiduals(fit.consMR)
对美国季度消费支出回归模型的残差的分析。

图 5.8: 对美国季度消费支出回归模型的残差的分析。

#> 
#>  Breusch-Godfrey test for serial correlation of
#>  order up to 8
#> 
#> data:  Residuals from Linear regression model
#> LM test = 15, df = 8, p-value = 0.06

5.8是利用美国季度消费数据生成的多元回归模型的残差的时序图、 ACF 图和残差直方图。此外,还有 Breusch-Godfrey 检验的结果(checkresiduals()函数将使用 Breusch-Godfrey 检验进行回归模型,但 Ljung-Box 检验则不然)。

时序图显示了不同时间下残差的变化,显然存在异方差性。这种异方差性会导致预测区间的不准确。

残差直方图显示残差似乎略微左偏,这也可能影响预测区间的准确度。

自相关图显示,在滞后7阶处存在一个明显的峰值。但这不足以使 Breusch-Godfrey 在5%显著性水平下显著。在其他滞后阶数的情况下,自相关性都不大。并且当滞后阶数为7时,它不会对预测值或预测区间产生较大影响。在第9章中,我们会详细讨论用于更好的捕获残差中剩余信息的动态回归模型。

预测变量与残差的关系图

我们期望残差是随机分布的并且不显示任何规律,一个简单快捷的检验方法是查看每个预测变量与残差的散点图。如果这些散点图表现出明显的规律,则该关系可能是非线性的,并且需要相应地修改模型。5.8节会详细的阐述非线性模型。

此外,还需要对没有加入到模型中的预测变量绘制其与残差的散点图。如果某个残差图显示出明显的规律,则需要将对应的预测变量加入到模型之中(可能以非线性形式加入)。

示例

5.9中表明,用于预测美国消费的多元回归模型的每个预测变量与残差之间都没有明显的相关关系。因此,模型较为理想。

df <- as.data.frame(uschange)
df[,"Residuals"]  <- as.numeric(residuals(fit.consMR))
p1 <- ggplot(df, aes(x=Income, y=Residuals)) + geom_point() +
  xlab("收入") + ylab("残差")+
    theme(text = element_text(family = "STHeiti"))
p2 <- ggplot(df, aes(x=Production, y=Residuals)) + geom_point()+
  xlab("工业产出") + ylab("残差")+
    theme(text = element_text(family = "STHeiti"))
p3 <- ggplot(df, aes(x=Savings, y=Residuals)) + geom_point()+
  xlab("个人储蓄") + ylab("残差")+
    theme(text = element_text(family = "STHeiti"))
p4 <- ggplot(df, aes(x=Unemployment, y=Residuals)) + geom_point()+
  xlab("失业率") + ylab("残差")+
    theme(text = element_text(family = "STHeiti"))
gridExtra::grid.arrange(p1, p2, p3, p4, nrow=2)
各个预测变量与残差的关系图。

图 5.9: 各个预测变量与残差的关系图。

拟合值与残差的关系图

残差与拟合值之间也应没有明显规律。如果观察到明显规律,则残差中可能存在“异方差性”,这意味着残差的方差不是固定的。如果出现异方差性,可能需要对预测变量做对数或者平方根变换(参见第3.2节)。

示例

接上例,图5.10展示拟合值和残差的关系图。随机分布的散点图表示残差是同方差的。

cbind(Fitted = fitted(fit.consMR), Residuals=residuals(fit.consMR)) %>%
  as.data.frame() %>%
  ggplot(aes(x=Fitted, y=Residuals)) + geom_point() + 
  xlab('拟合值') + ylab('残差') +
    theme(text = element_text(family = "STHeiti"))+
    theme(plot.title = element_text(hjust = 0.5))
残差对应于拟合值的散点图。

图 5.10: 残差对应于拟合值的散点图。

异常值点和强影响点

与大多数数据相差甚远的点被称为“异常值点”。对模型的参数估计有重大影响的观测点被称为“强影响点”。通常情况下,强影响点在 \(x\) 方向也是极端的异常值。

在本书的范围之外,有一些检测异常值点和强影响力点的方法。正如在第2章中所讲的一样,在进行数据分析之前,先初步熟悉数据是非常关键的。画出 \(y\)\(x\) 的散点图是回归分析的起点,并且可以帮助我们找出异常值。

异常值的一个来源是不正确的数据录入。简单的数据描述性统计可以识别出异常的最小值和最大值。 如果识别出这样的观察结果,则应立即对样本进行校正或删除。

当某些观测点完全不同时,也会出现异常值点。在这种情况下,将这些观测点全部删除是不可取的。如果观察结果已被确定为异常值,则必须对其进行研究并分析其背后的可能原因。删除或保留观察可能是一个艰难决定(特别是当异常值是有影响力的观察时)。因此,可以分别对删除观测值和保留观测值做分析。

示例

5.11着重表现了单个异常值对回归模型的影响(5.1中介绍的例子)。在左图中,由于消费的百分比变化被错误的记作-4%,因此异常值点在 \(y\) 方向上出现极端值。红线是包含异常值的数据拟合的回归线,而黑线是没有包含异常值数据的回归线。在右图中,异常值点在 \(x\) 方向也出现极端值,即收入的变化率被错误的记作6%。我们可以很明显的看出,在这种情况下,异常值点极具影响力,导致红线大幅偏离黑线。

异常值点和强影响点对回归的影响。

图 5.11: 异常值点和强影响点对回归的影响。

伪回归

时间序列数据一般都是“不平稳的”;也就是说,时间序列数据没有固定的均值和方差。因此我们需要解决非平稳数据对回归模型的影响,在第8章,我们会详细讨论时间序列的平稳性。在这里,我们需要强调非平稳数据对回归模型的影响。

例如,图5.12中的两个变量,它们有着相同的向上增长的趋势,它们似乎有着强正相关关系。但实际上,澳大利亚航空客运量与几内亚水稻产量无关。

澳大利亚航空客运量对几内亚水稻产量的回归结果。

图 5.12: 澳大利亚航空客运量对几内亚水稻产量的回归结果。

不平稳的时间序列会导致伪回归。图5.13展示了澳大利亚航空客运对与几内亚水稻产量的回归模型结果。伪回归的特点是高 \(R^2\) 值和高残差自相关共存。我们将会在第9章更加详细的讨论有关非平稳数据和伪回归问题。

伪回归模型似乎可以给出合理的短期预测,但在长期时间中,伪回归是无效的。

aussies <- window(ausair, end=2011)
fit <- tslm(aussies ~ guinearice)
summary(fit)
#> 
#> Call:
#> tslm(formula = aussies ~ guinearice)
#> 
#> Residuals:
#>    Min     1Q Median     3Q    Max 
#> -5.945 -1.892 -0.327  1.862 10.421 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)    -7.49       1.20   -6.23  2.3e-07 ***
#> guinearice     40.29       1.34   30.13  < 2e-16 ***
#> ---
#> Signif. codes:  
#> 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#> 
#> Residual standard error: 3.24 on 40 degrees of freedom
#> Multiple R-squared:  0.958,  Adjusted R-squared:  0.957 
#> F-statistic:  908 on 1 and 40 DF,  p-value: <2e-16
checkresiduals(fit)
伪回归的残差。

图 5.13: 伪回归的残差。

#> 
#>  Breusch-Godfrey test for serial correlation of
#>  order up to 8
#> 
#> data:  Residuals from Linear regression model
#> LM test = 29, df = 8, p-value = 3e-04