跳到内容

6.2 残差、异方差与影响点:诊断针对哪一种失效

预测模型已经输出系数,阿花却在残差图里看到弧线、漏斗和几个影响异常强的观测。

模型拟合成功只是软件状态。残差图出现弧线说明均值结构漏掉非线性;漏斗形说明误差方差变化;少数高杠杆点则可能决定整条回归线。每种诊断对应不同失效,不能统一归结为“删异常值”。

本课目标

  • 连接线性、独立、方差和分布假设与具体结论;
  • 解释 residual-vs-fitted、Q-Q、leverage 与 Cook's distance;
  • 使用 robust/clustered standard errors 的适当边界;
  • 理解共线性影响系数稳定而非必然损害预测。

1. 先区分预测条件与推断条件

常见假设:

  1. 条件均值形式正确,$E[\varepsilon\mid X]=0$;
  2. 观测或误差依赖结构被正确处理;
  3. 条件方差是否恒定;
  4. 误差分布与有限样本推断方法相容;
  5. 设计矩阵无完全共线;
  6. 模型训练与应用分布相符。

异方差不必然让 OLS 系数有偏,但普通标准误可能错误,OLS 也不再是最有效线性无偏估计。遗漏混杂变量导致的 $E[\varepsilon\mid X]\ne0$ 则可能直接让系数偏。

2. Residual vs fitted 检查均值和方差结构

python
import matplotlib.pyplot as plt
import seaborn as sns

fitted = model.fittedvalues
residuals = model.resid

sns.scatterplot(x=fitted, y=residuals, alpha=0.3)
plt.axhline(0, color="black", linestyle="--")
plt.xlabel("Fitted values")
plt.ylabel("Residuals")

观察:

  • 弧形:漏掉非线性或交互;
  • 漏斗:方差随均值变化;
  • 分组条带:类别、测量离散化或遗漏群体;
  • 大片结构:时间/空间依赖或模型错设。

平滑线有助看系统模式,但 residual 和 fitted 共用估计参数,图形解释仍需结合数据生成过程。

3. Q-Q 图不是“模型是否有效”的总开关

Q-Q 图比较标准化残差分位数与参考分布。尾部偏离可能来自重尾、异常点、混合群体或方差错设。

误差正态性主要用于某些小样本精确 t/F 推断;OLS 点估计并不要求 $Y$ 或 residual 完全正态。大样本近似也依赖独立性、矩条件和设计,不能只凭样本量大就忽略聚类。

若目标是预测,验证集误差和区间覆盖比“残差看起来正态”更直接。

4. 异方差的处理取决于目标

  • 只修推断:使用 heteroskedasticity-consistent covariance(HC 系列);
  • 已知方差结构:加权最小二乘;
  • 方差随均值变化:转换目标或使用合适 GLM;
  • 预测区间:显式建模条件方差或分位数。
python
robust_model = model.get_robustcov_results(cov_type="HC3")
print(robust_model.summary())

robust SE 不会修复非线性、遗漏变量、错误依赖结构或坏数据。它主要改变协方差估计,不改变原 OLS 拟合值。

5. 聚类与时间相关

同一队伍多条任务可能共享未观测因素。普通 SE 把它们当独立,会过窄。若处理或抽样在队伍层发生,考虑 cluster-robust covariance 或层级模型:

python
clustered = model.get_robustcov_results(
    cov_type="cluster",
    groups=training["team_id"],
)

聚类数很少时,常规渐近近似可能不可靠,需要小样本校正、randomization inference 或其他专门方法。

时间序列误差还可能自相关;Newey–West/HAC 等方法有带宽与平稳性假设,不能把 cov_type 当一键修复。

6. Leverage、残差和 influence 不同

  • leverage:$X$ 空间中是否远离其他点;
  • residual:该点结果与拟合相差多少;
  • influence:删除该点会怎样改变拟合。

Cook's distance 综合残差与 leverage,是调查指标,不是自动删除规则。4/n 是经验筛查线,不是“超过即错误”的定理。

高影响点的处理:

  1. 核对采集与解析;
  2. 判断是否属于目标总体;
  3. 比较保留/排除敏感性;
  4. 考虑稳健回归或更合适模型;
  5. 报告规则和结论变化。

删除真实极端案例会让模型只适用于普通区域,应明确新的适用范围。

7. 共线性扩大系数不确定性

当列接近线性组合时,模型难以分离各自贡献。表现为系数对小数据变化敏感、标准误大、符号可能翻转。

VIF:

$$ VIF_j=\frac{1}{1-R_j^2}, $$

其中 $R_j^2$ 来自用其他特征解释第 $j$ 列。VIF > 5>10 只是经验阈值,不能替代目的判断。

共线特征仍可能共同提供好预测;问题主要影响单个系数解释和外推稳定性。删除特征、合成指标、重新设计采样或正则化各有不同语义后果。

8. 缺失模式与选择也要诊断

回归库常按 complete cases 静默删行。先比较进入模型与被删除样本:

python
required = ["duration_minutes", "team_size", "resources_used"]
included = training[required].notna().all(axis=1)
print(included.mean())
print(training.groupby(included)["mission_type"].value_counts(normalize=True))

若删除与结果或群体相关,complete-case 模型目标总体已经改变。需回到缺失机制和 estimand,而不是只看最终 nobs

9. 诊断后要做敏感性分析

比较:

  • 线性与样条/非线性规格;
  • 普通、robust 与 clustered SE;
  • 含/不含高影响点;
  • 不同缺失处理;
  • 预设协变量组合;
  • 时间或群体切片。

若结论方向随合理选择剧烈变化,报告这种脆弱性,不应只挑最漂亮的规格。

常见误区

  • 残差不正态就不能用 OLS:要看目标和推断方法。
  • robust SE 修复模型错设:它不修均值结构和混杂。
  • Cook's D 超阈值必须删除:它只提示影响值得调查。
  • 共线性意味着预测一定差:它更直接损害系数可分辨性。

练习

  1. 分别构造非线性、异方差和高杠杆数据,比较残差图。
  2. 对同一模型比较普通、HC3 与 cluster SE。
  3. 删除高 Cook's D 点前后比较系数,并写调查结论。
  4. 检查 complete-case 删除是否改变群体构成。

小结

诊断不是给模型打一个“通过/失败”标签,而是定位哪项结论受威胁。均值错设、异方差、相关误差、影响点和共线性影响不同,应采取对应修复并报告敏感性。

下一课把预测流程与正则化放进交叉验证,确保缩放、缺失处理和超参数选择都没有偷看最终测试数据。

Built with VitePress | Software Systems Atlas