2.13 回归分析与线性模型
前面几节把推断的对象限定为单个参数或单个分布。实际问题的形式通常是:某个人群的人均消费如何随收入变化,某商品的销量如何随价格与促销投入变化,某台设备的能耗如何随负载与温度变化。这类问题关心的是变量之间的函数关系,需要把响应变量表示为若干解释变量的函数,并同时给出系数估计、区间与检验。这一套方法统称为回归分析(regression analysis)。
线性回归是回归分析中结构最简单、理论最完整的一类。它的重要性来自三个方面:最小二乘估计有闭式解且几何意义清晰(投影到解释变量张成的子空间,与线性代数部分的结论直接衔接);参数估计的分布可以精确写出,检验与区间都有闭式结果;许多非线性模型通过变换或推广可以纳入同一框架,广义线性模型、方差分析、混合效应模型都是它的推广形式。
本节从最小二乘与 Gauss-Markov 定理出发,依次讨论回归诊断、变量选择与正则化、稳健与分位数回归、广义线性模型、平滑模型与混合效应模型;最后说明回归工具在因果推断中的边界:相关关系的估计不等于因果效应的估计,工具变量、选择模型与生存模型分别处理三类特殊的结构。贝叶斯线性回归与高斯过程回归已在 2.6 节与 2.12 节提及,本节给出它们在回归框架中的位置。
2.13.1 线性回归与最小二乘
模型设定
多元线性回归(multiple linear regression)把响应变量
写成矩阵形式为
其中
模型中的线性指对参数线性,解释变量本身可以是变换后的形式:
最小二乘解
最小二乘(ordinary least squares,OLS)的准则是最小化残差平方和:
对目标函数求导并令其为零,得到法方程(normal equation):
设计矩阵列满秩时
几何解释
法方程的形式在线性代数部分已经出现过:
投影视角给出两条直接结论:残差与拟合值正交,因此
这就是勾股定理在数据空间中的形式。拟合优度指标
Gauss-Markov 定理
Gauss-Markov 定理(Gauss-Markov theorem)给出最小二乘解的最优性:在误差均值为零、同方差、互不相关(不必正态)的假设下,最小二乘估计是最佳线性无偏估计(best linear unbiased estimator,BLUE)。最佳的含义是在所有线性无偏估计中方差最小。
定理的边界需要明确:它只在线性无偏估计的范围内给出最优性,非线性估计或允许偏倚的估计(如岭估计)可能更好;它依赖于误差协方差为
系数估计的分布与检验
在误差为正态且同方差的假设下,系数估计服从多元正态:
由此可以直接构造系数的置信区间与显著性检验。整体检验(所有斜率同时为零)用 F 统计量:
import numpy as np
rng = np.random.default_rng(15)
n, p = 200, 3
X = rng.normal(size=(n, p))
beta_true = np.array([1.0, 2.0, -1.5, 0.5])
Xc = np.column_stack([np.ones(n), X])
y = Xc @ beta_true + rng.normal(scale=1.2, size=n)
# 最小二乘的手写实现
beta_hat = np.linalg.solve(Xc.T @ Xc, Xc.T @ y)
print(f"系数估计 = {np.round(beta_hat, 4)}")
print(f"真值 = {beta_true}")
# 标准误与 t 统计量
resid = y - Xc @ beta_hat
dof = n - p - 1
sigma2 = resid @ resid / dof
cov_beta = sigma2 * np.linalg.inv(Xc.T @ Xc)
se = np.sqrt(np.diag(cov_beta))
t_stat = beta_hat / se
print(f"标准误 = {np.round(se, 4)}")
print(f"t 统计量 = {np.round(t_stat, 3)}")
# 拟合优度
sst = ((y - y.mean()) ** 2).sum()
sse = (resid ** 2).sum()
r2 = 1 - sse / sst
r2_adj = 1 - (sse / dof) / (sst / (n - 1))
print(f"R² = {r2:.4f},调整 R² = {r2_adj:.4f}")2.13.2 回归诊断
残差的类型
模型拟合完成后需要检查假设是否成立,检查的对象是残差。原始残差
学生化残差(studentized residual)进一步在计算第
剔除的影响在样本量大时很小,小样本时差别明显。判断异常值的经验界限是
杠杆值与影响点
杠杆值
影响点(influential point)是删除后系数明显变化的观测。几个常用的度量:
| 度量 | 含义 | 经验界限 |
|---|---|---|
| Cook 距离 | 删除该点后所有拟合值变化的总体度量 | |
| DFFITS | 删除该点后该点拟合值变化的标准化量 | |
| DFBETAS | 删除该点后单个系数变化的标准化量 |
Cook 距离同时包含残差与杠杆的信息:残差大但杠杆小的观测对系数影响有限,杠杆大但残差小的观测也不改变拟合,两者都大时才构成影响点。
异方差与自相关
异方差(heteroskedasticity)指误差方差不相等。后果是系数估计仍然无偏,但标准误的公式不再正确,t 检验与 F 检验失效。识别方法是画残差对拟合值(或对解释变量)的散点图,观察散布是否随横轴变化;Breusch-Pagan 检验与 White 检验给出正式的检验统计量。
处理方式有三种:对响应变量做变换(如对数变换常能稳定方差)、使用加权最小二乘(权重取方差的倒数)、使用稳健标准误(heteroskedasticity-consistent standard errors)。稳健标准误不改变系数估计,只修正标准误的计算,是最省事的做法:
自相关(autocorrelation)指误差项之间存在相关,常见于时间序列数据。后果与异方差类似,标准误错误且系数估计不再有效。识别方法是画残差对时间的图或计算残差的自相关函数,Durbin-Watson 统计量给出滞后一阶自相关的检验。处理方法包括加入滞后项、使用广义最小二乘或对标准误做聚类稳健修正。
多重共线性
多重共线性(multicollinearity)指解释变量之间存在强线性关系。后果是设计矩阵接近奇异,
识别工具有两个。方差膨胀因子(variance inflation factor,VIF)把第
经验规则是 VIF 超过
处理方式包括删除相关变量、合并为一个综合指标、用主成分回归或偏最小二乘提取正交成分、使用岭回归(2.10 节)压缩系数。选择哪一种取决于分析目的:目的是系数解释时通常删除或合并,目的是预测时正则化更合适。
import numpy as np
# 制造共线性:第三个变量近似等于前两个之和
rng = np.random.default_rng(20)
n = 120
x1 = rng.normal(size=n)
x2 = rng.normal(size=n)
x3 = x1 + x2 + rng.normal(scale=0.05, size=n) # 高度相关
X = np.column_stack([x1, x2, x3])
y = 2 * x1 - 1 * x2 + 0.5 * x3 + rng.normal(scale=1.0, size=n)
Xc = np.column_stack([np.ones(n), X])
beta_hat = np.linalg.solve(Xc.T @ Xc, Xc.T @ y)
resid = y - Xc @ beta_hat
sigma2 = resid @ resid / (n - 4)
se = np.sqrt(np.diag(sigma2 * np.linalg.inv(Xc.T @ Xc)))
print("共线性严重时的系数估计:")
for j, name in enumerate(["截距", "x1", "x2", "x3"]):
print(f" {name:4s}:估计 {beta_hat[j]:+7.3f},标准误 {se[j]:.3f}")
def vif(X):
out = []
for j in range(X.shape[1]):
others = np.delete(X, j, axis=1)
others = np.column_stack([np.ones(len(X)), others])
coef = np.linalg.lstsq(others, X[:, j], rcond=None)[0]
r2 = 1 - ((X[:, j] - others @ coef) ** 2).sum() / ((X[:, j] - X[:, j].mean()) ** 2).sum()
out.append(1 / (1 - r2))
return out
print(f"VIF:{np.round(vif(X), 2)}")
print(f"条件数 = {np.linalg.cond(Xc):.1f}")
# 系数标准误远大于无共线性时的水平,估计值偏离真值较多2.13.3 变量选择与模型评价
子集选择
解释变量较多时需要一个选择过程。最优子集选择(best subset selection)枚举所有变量组合,用某个准则评价后选最优。变量数为
逐步回归(stepwise regression)用贪心策略降低搜索量。前向选择(forward selection)从空模型开始逐个加入对准则改善最大的变量;后向消除(backward elimination)从全模型开始逐个删除贡献最小的变量;双向逐步在两方向之间交替。三种方法都只探索了模型空间的一小部分,结果是局部最优,且序贯检验未做多重比较校正,p 值与
信息准则
AIC(Akaike information criterion)与 BIC(Bayesian information criterion)在拟合优度上加入复杂度惩罚:
其中
BIC 可以从贝叶斯角度理解:对边缘似然做拉普拉斯近似,取对数后主要项正好是
交叉验证
交叉验证(cross-validation)直接估计模型的样本外预测误差,不依赖具体准则。
时间序列数据不能随机划分折,需要使用时间序列交叉验证:用前面的时间窗训练、用紧随其后的窗口验证,逐步向前滚动。分层数据需要分层
2.13.4 正则化回归
岭回归与 Lasso
2.10 节已给出两种正则化估计的定义与贝叶斯解释,这里补充它们的回归中的表现差别。
岭回归(ridge regression)的系数平方惩罚使系数连续收缩但不为零。它的主要作用是对抗共线性:加上
Lasso(least absolute shrinkage and selection operator)的系数绝对值惩罚在原点处不可导,使部分系数精确为零,同时完成估计与选择。Lasso 的变量选择一致性有前提:设计矩阵满足一定条件(如不可表示条件)且真实系数足够大,否则可能选错变量。变量高度相关时 Lasso 倾向于随机保留其中一个,这一点与岭回归的均匀分配不同。
弹性网(elastic net)结合两种惩罚,
变体
按数据结构的不同,Lasso 有几个常用变体。自适应 Lasso(adaptive Lasso)对每个系数使用不同的权重(通常取初始估计绝对值倒数的幂),使大系数受惩罚更小、小系数受惩罚更大,从而改善变量选择的一致性。组 Lasso(group Lasso)对预先分组的系数整体惩罚,使整组同时为零或同时保留,适合分类变量产生的哑变量组或多模态特征的组结构。稀疏组 Lasso在组内与组间同时施加惩罚,允许某些组整体保留但组内仍有个别系数为零。融合 Lasso(fused Lasso)对相邻系数的差施加惩罚,使相邻系数接近,适合有序的变量(如相邻时间点、相邻的空间位置)。
求解算法
Lasso 的求解不能用梯度下降(目标函数在原点不可导),常用三种算法。坐标下降(coordinate descent)逐分量优化,每次只更新一个系数并保持其他不变,此时目标函数变成一元凸问题,有闭式解(软阈值算子)。坐标下降简单、稳定、易并行,是 glmnet 等工具的默认算法。最小角回归(least angle regression,LARS)沿着与当前残差相关度相同的方向前进,每次遇到新的变量进入活跃集时改变方向,可以给出完整的正则化路径,计算量与最小二乘相当。近端梯度法(proximal gradient)在梯度步之后施加软阈值操作,适合大规模问题与可以与随机梯度结合的场景。
import numpy as np
def soft_threshold(z, gamma):
"""软阈值算子:Lasso 坐标下降的单步解"""
return np.sign(z) * max(abs(z) - gamma, 0.0)
def lasso_coordinate_descent(X, y, lam, max_iter=500, tol=1e-6):
"""Lasso 的坐标下降实现(不含截距项,数据应已中心化)"""
n, p = X.shape
beta = np.zeros(p)
for _ in range(max_iter):
beta_old = beta.copy()
for j in range(p):
r = y - X @ beta + X[:, j] * beta[j] # 剔除第 j 个变量的部分残差
rho = X[:, j] @ r
z = X[:, j] @ X[:, j]
beta[j] = soft_threshold(rho, lam * n / 2) / (z + 1e-12)
if np.max(np.abs(beta - beta_old)) < tol:
break
return beta
rng = np.random.default_rng(22)
n, p = 150, 8
X = rng.normal(size=(n, p))
X = X - X.mean(axis=0)
y_true = np.array([3.0, 0.0, 0.0, -2.0, 0.0, 1.0, 0.0, 0.0])
y = X @ y_true + rng.normal(scale=1.0, size=n)
y = y - y.mean()
for lam in [0.02, 0.1, 0.3]:
b = lasso_coordinate_descent(X, y, lam)
print(f"lambda = {lam:.2f}:非零系数 {np.sum(np.abs(b) > 1e-8)} 个,估计 = {np.round(b, 3)}")
# lambda 增大时非零系数个数减少,稀疏结构逐步显现2.13.5 稳健回归与分位数回归
稳健回归
最小二乘的目标函数是残差平方和,平方放大了大残差的影响,一个极端观测可以显著拉动回归面。稳健回归(robust regression)改用增长较慢的损失函数。Huber 损失在残差小于阈值
它在中心区域保持二次收敛的效率,在尾部限制极端值的影响。损失对残差求导得到影响函数,Huber 损失的影响函数有界(线性增长被截断),而平方损失的影响函数随残差线性增长无界。求解用迭代重加权最小二乘(iteratively reweighted least squares,IRLS):每次用当前残差计算权重,再做一次加权最小二乘,迭代至收敛。
其他稳健方法包括最小绝对偏差回归(
分位数回归
分位数回归(quantile regression)估计响应变量条件分布的分位数而非条件均值。给定分位数
statsmodels、quantreg)都有实现。
2.13.6 广义线性模型
三个组成部分
线性回归要求响应变量连续且方差恒定。计数数据、二值数据、比例数据的均值与方差都不满足这一条件,需要一个更宽的框架。广义线性模型(generalized linear model,GLM)由三部分组成:
| 组成部分 | 内容 |
|---|---|
| 随机部分 | 响应变量服从指数族分布(2.5 节) |
| 系统部分 | 线性预测子 |
| 链接函数 | 单调可微函数 |
链接函数把响应变量的期望与线性预测子连接起来。
常见 GLM
逻辑回归(logistic regression)处理二值响应,链接函数为 logit:
系数解释为对数几率的变化:
泊松回归(Poisson regression)处理计数响应,链接函数为对数:
其他常见形式包括:多项逻辑回归处理多类别响应,有序逻辑回归处理有序类别,伽马回归与逆高斯回归处理正的连续响应,Tweedie 回归用一个参数统一处理含大量零值的正值响应(如保险理赔金额,零与正值混合)。
估计与推断
GLM 的参数估计同样用极大似然,但似然方程一般没有闭式解,用迭代重加权最小二乘(IRLS)求解:每次迭代构造一个工作响应变量与权重,做一次加权最小二乘,迭代至收敛。这一算法可以理解为对似然面的牛顿法,收敛速度通常是二次的。
推断可以用 2.11 节的三大检验。偏差(deviance)是 GLM 的拟合优度度量,定义为
饱和模型是每个观测有独立参数的模型,偏差度量拟合模型与饱和模型的差距。偏差在大样本下近似服从卡方分布,可以用于嵌套模型的比较(类似线性回归的 F 检验)。皮尔逊残差与偏差残差是 GLM 的常规残差,诊断方式与线性回归类似。
import numpy as np
from scipy import optimize
# 逻辑回归的牛顿法实现(含截距)
rng = np.random.default_rng(25)
n = 400
X = rng.normal(size=(n, 2))
Xc = np.column_stack([np.ones(n), X])
beta_true = np.array([-0.5, 1.5, -1.0])
p_true = 1 / (1 + np.exp(-Xc @ beta_true))
y = rng.binomial(1, p_true).astype(float)
def neg_loglik(beta):
eta = Xc @ beta
# 数值稳定的对数似然
return -np.sum(y * eta - np.logaddexp(0, eta))
res = optimize.minimize(neg_loglik, np.zeros(3), method="BFGS")
print(f"逻辑回归系数(数值优化)= {np.round(res.x, 4)}")
print(f"真值 = {beta_true}")
print(f"优势比 = {np.round(np.exp(res.x), 4)}")
# 迭代重加权最小二乘(一次迭代的形式展示)
beta = res.x
mu = 1 / (1 + np.exp(-Xc @ beta))
W = np.diag(mu * (1 - mu))
z = Xc @ beta + np.linalg.solve(W, y - mu)
beta_irls = np.linalg.solve(Xc.T @ W @ Xc, Xc.T @ W @ z)
print(f"IRLS 一步更新 = {np.round(beta_irls, 4)}")2.13.7 非线性与平滑模型
广义加法模型
线性模型假定每个解释变量的效应是线性的。广义加法模型(generalized additive model,GAM)把线性预测子中的每一项替换为平滑函数:
每个
高斯过程回归与贝叶斯线性回归
高斯过程回归(Gaussian process regression)把函数本身视为随机对象,用 2.8 节的核函数给出函数值的联合分布,用条件公式给出预测分布(2.6 节)。它给出的是完整的预测分布而非点预测,且预测的不确定性随远离训练数据而增大,这一性质在许多场景中比区间估计更有用。
贝叶斯线性回归(Bayesian linear regression)在系数上放先验,后验均值与岭回归的估计形式一致(高斯先验对应
2.13.8 混合效应模型与层次数据
固定效应与随机效应
数据具有分组结构时(同一班级的学生、同一门店的多天销量、同一用户的多条记录),组内观测比组间观测更相似,误差不再独立。混合效应模型(mixed effects model)通过在模型中加入随机效应来处理这一结构:
固定效应(fixed effect)描述对所有组都相同的系数,随机效应(random effect)描述各组相对总体的偏移。
方差分量(variance components)
它度量同一组内两个观测的相关程度,也决定了忽略分组结构对标准误的扭曲程度。ICC 较大时忽略分组会导致标准误严重低估、显著性被高估。
参数估计用限制最大似然(restricted maximum likelihood,REML)或最大似然。REML 在估计方差分量时剔除固定效应的影响,得到的方差估计偏差更小,是多数软件的默认设置。模型比较时注意:用 REML 拟合的模型只能在固定效应相同的条件下比较,固定效应不同的模型需要改用最大似然。
其他结构包括随机斜率(各组对某个变量的敏感度不同)、交叉随机效应(同一观测同时属于两种分组)、嵌套随机效应(组内有子组)。纵向数据(longitudinal data,同一对象多次测量)与面板数据(panel data,同一对象多个时期的多个变量)是这类模型的主要应用场景。
2.13.9 回归工具与因果问题
工具变量与两阶段最小二乘
解释变量与误差相关时(内生性),最小二乘估计有偏且不一致,偏差不会随样本量增大而消失。来源包括遗漏变量、测量误差、双向因果。工具变量(instrumental variable,IV)是满足两个条件的变量:与内生解释变量相关(相关性),且只通过该变量影响响应(外生性)。两阶段最小二乘(two-stage least squares,2SLS)先回归内生变量得到拟合值,再用拟合值做回归:
工具变量与内生变量相关性弱时(弱工具),2SLS 估计的偏差与方差都会显著恶化,需要用第一阶段 F 统计量诊断(经验规则是大于
受限因变量与选择模型
响应变量的取值受限制时,普通回归会产生偏误。Tobit 模型处理删失响应:观测到的值在某个界限处被截断(例如用户消费金额在
生存回归
响应变量是事件发生时间且存在删失时(2.2 节),用生存回归。Cox 比例风险模型(Cox proportional hazards model)是半参数方法:只对风险比的函数形式作假设,不指定基线风险的形式:
系数通过部分似然(partial likelihood)估计,基线风险
2.13.10 本节小结
从最小二乘到广义回归框架
本节把回归分析组织成一条逐步放宽假设的链条。最小二乘在误差同方差且互不相关的假设下给出最佳线性无偏估计,几何上等于把响应投影到解释变量张成的子空间,法方程与投影矩阵把估计、拟合值与残差联系起来。回归诊断检查假设是否成立,杠杆值与 Cook 距离识别影响点,异方差与自相关破坏标准误的正确性并可分别用稳健标准误与广义最小二乘处理,多重共线性放大系数方差并影响解释而非预测。变量选择在子集搜索、信息准则与交叉验证之间取舍,正则化回归用偏差换方差并在高维情形下完成变量选择。广义线性模型通过链接函数把指数族响应与线性预测子连接,逻辑回归与泊松回归扩展到二值与计数数据。平滑模型、混合效应模型与生存模型分别处理非线性关系、分组结构与删失响应。工具变量、Tobit 与 Heckman 模型揭示了回归在因果问题上的局限:当解释变量与误差相关或样本经过选择时,系数不再具有因果解释,需要用 2.14 节的识别策略。
变量数接近或超过样本数时,前面的方法会整体失效:最小二乘无解、交叉验证不稳定、信息准则的自由度项失去意义。同时,实际数据中的变量往往来自非随机化的观测,回归系数与因果效应之间存在系统性差距。下一节讨论这两类问题:高维统计给出稀疏假设下的估计与推断方法,因果推断给出从观测数据识别因果效应的条件与策略。
练习题
第 1 题 概念推导
设简单线性回归模型
参考答案
估计表达式:把
方差公式:由
离散程度的作用:分母是
第 2 题 计算推理
某电商平台用线性回归分析日销售额,解释变量为广告投入(万元)与是否周末(哑变量)。拟合结果为
参考答案
置信区间:自由度为
解释含义:广告投入每增加
周末效应的显著性:题目未给出周末系数的标准误,无法直接判断。合理的做法是补充报告标准误与 t 统计量,或用整体 F 检验判断模型整体是否有效。如果周末系数的标准误为
第 3 题 代码验证
用坐标下降求解 Lasso,在一组含无关变量的数据上观察正则化强度对稀疏性的影响;再用交叉验证选择
参考答案
import numpy as np
def soft_threshold(z, gamma):
return np.sign(z) * max(abs(z) - gamma, 0.0)
def lasso_cd(X, y, lam, max_iter=300, tol=1e-7):
n, p = X.shape
beta = np.zeros(p)
for _ in range(max_iter):
old = beta.copy()
for j in range(p):
r = y - X @ beta + X[:, j] * beta[j]
beta[j] = soft_threshold(X[:, j] @ r, lam * n / 2) / (X[:, j] @ X[:, j])
if np.max(np.abs(beta - old)) < tol:
break
return beta
def ridge(X, y, lam):
p = X.shape[1]
return np.linalg.solve(X.T @ X + lam * np.eye(p), X.T @ y)
rng = np.random.default_rng(44)
n, p = 120, 10
X = rng.normal(size=(n, p))
X = X - X.mean(axis=0)
beta_true = np.array([3.0, 0, 0, -2.0, 0, 0, 0, 1.5, 0, 0])
y = X @ beta_true + rng.normal(scale=1.0, size=n)
y = y - y.mean()
print("正则化强度对稀疏性的影响(Lasso)")
for lam in [0.01, 0.05, 0.15, 0.4]:
b = lasso_cd(X, y, lam)
print(f" lambda = {lam:.2f}:非零系数 {int(np.sum(np.abs(b) > 1e-6)):2d} 个")
# 用简单网格与验证集选择 lambda
idx = rng.permutation(n)
train, valid = idx[:90], idx[90:]
best = min(
[0.01, 0.03, 0.06, 0.1, 0.2, 0.4],
key=lambda lam: ((y[valid] - X[valid] @ lasso_cd(X[train], y[train], lam)) ** 2).mean(),
)
b_final = lasso_cd(X[train], y[train], best)
print(f"验证集选出的 lambda = {best}")
print(f"选出模型的系数 = {np.round(b_final, 3)}")
print(f"真值 = {beta_true}")
# 相关变量下 Lasso 与岭的差别
Xc = X.copy()
Xc[:, 1] = Xc[:, 0] + rng.normal(scale=0.05, size=n) # 制造一对高度相关的变量
yc = Xc @ beta_true + rng.normal(scale=1.0, size=n)
yc = yc - yc.mean()
b_lasso = lasso_cd(Xc, yc, 0.1)
b_ridge = ridge(Xc, yc, 5.0)
print(f"\nLasso 对相关变量的处理:{np.round(b_lasso[:3], 3)}")
print(f"岭回归对相关变量的处理:{np.round(b_ridge[:3], 3)}")典型输出显示 Lasso 在
第 4 题 综合应用
某内容平台想估计文章长度对阅读完成率的影响。数据的响应变量是完成率(
参考答案
线性回归的问题:响应变量是比例,取值被限制在
合适的模型:比例型响应常用的做法有两种。第一种是把比例视为二值结果的聚合,用分数逻辑回归(fractional logit),模型形式与逻辑回归相同但允许响应取
以分数逻辑回归为例,模型为
系数解释:
诊断方法:检查偏差残差对拟合值的图,观察是否存在系统性模式;用过散布检验判断是否需要改用贝塔回归;检查杠杆值与影响点;用Hosmer-Lemeshow 类检验(对比例数据)或校准曲线评估预测概率与实际比例的一致性。模型比较用偏差检验或交叉验证的对数似然。样本量足够时,把响应按解释变量分组、观察组内比例与预测概率的差异,也是有效的诊断方式。
常见错误
错误 1 · 把回归系数解释为因果效应
原因:回归给出的是条件关联,只有在解释变量与误差项独立(无遗漏变量、无测量误差、无双向因果)时,系数才等于因果效应。观测数据中这三个条件通常都不成立,系数会系统性地偏离真实效应,甚至出现符号反转。
解决:明确分析目标。只做预测时不必强调因果解释,报告预测性能即可;要给出因果结论时,先写出变量之间的因果结构假设,判断效应是否可识别,再用工具变量、倾向得分或准实验设计等方法估计,见 2.14 节。
错误 2 · 用
原因:
解决:比较时用调整
错误 3 · 忽略共线性直接解释单个系数
原因:共线性严重时系数标准误膨胀,估计对数据扰动敏感,符号可能反转。此时单个系数的数值与方向都不可靠,但模型的整体预测仍然可用。
解决:先计算 VIF 或条件数,发现共线性后按目的处理:需要解释单个系数时删除相关变量、合并指标或用主成分回归;只需要预测时用岭回归或弹性网。报告时说明共线性的存在与处理方式。
错误 4 · 对分组数据不做处理直接用普通回归
原因:同一组内的观测相关(同一门店的销量、同一用户的记录),误差不再独立。普通最小二乘的标准误低估真实不确定性,显著性被高估,组间差异被错误地归因到组内变量。
解决:检查组内相关(ICC)的大小,明显大于零时使用混合效应模型或在标准误上做聚类修正。报告时说明分组变量的层次结构与处理方式,模型比较时注意固定效应与随机效应的划分。