R² 和调整 R² 是什么关系?为什么有时候调整 R² 会小于 0?
每一个跑过回归的人,都在 Stata 输出中同时见过这两个数字:
一、开篇:R² 有一个"更诚实的弟弟"
每一个跑过回归的人,都在 Stata 输出中同时见过这两个数字:
R-squared = 0.3521
Adj R-squared = 0.3387
调整 R² 永远比 R² 小一点。如果模型里变量很多而样本量不大,它会小很多。在某些极端情况下,它甚至会变成负数。
这个"调整",到底调整了什么?为什么要调整?调整 R² 的出现,背后是一个 R² 本身的根本缺陷——R² 是一个"乐观"的统计量:只要你往模型里加变量,R² 一定不会下降,即使你加的是纯噪声。
调整 R² 就是这个缺陷的补救措施。它给模型的"复杂度"定价——每多用一个参数去"解释"数据,你就得在拟合优度上付出一点代价。如果新增变量带来的解释力不足以支付这个代价,调整 R² 就会下降,甚至跌成负数。
核心信息:R² = 解释变异 / 总变异,天生偏向复杂模型——加变量 R² 一定不降。调整 R² 用自由度给模型复杂度"征税"——每加一个变量,残差自由度减 1,你需要用更高的解释力来弥补。当模型的解释力极低而复杂度极高时,调整 R² 可以为负。
二、R² 的"乐观偏误"——为什么需要调整?
2.1 R² 的精确公式
SSR 是残差平方和。加一个变量,即使它和 Y 毫无关系(在总体中它的系数为零),在这个具体样本中,它也会因为抽样误差而"恰好"和 Y 有一点点相关——从而蹭掉一点点 SSR。
SSR 的下降是必然的,无论新变量有没有真实的解释力。 因此 R² 的上升也是必然的。
2.2 极端例子:用 9 个自变量去拟合 10 个数据点
k = 9, n = 10。你把 9 个自变量扔进去,OLS 会完美地拟合这 10 个点——残差平方和 SSR = 0,R² = 1。
但这不代表你"解释"了 Y。你只是用足够多的参数"记忆"了这 10 个数据点。换一份样本,同样的 9 个变量,R² 可能会跌到 0.3。
R² 无法区分"真正的解释力"和"对样本噪声的过度拟合"。
三、调整 R²——给每个参数贴上"价格标签"
3.1 公式
3.2 它在做什么?——用"均方"替代"平方和"
普通的 R² 直接比较两个平方和(SSR 和 SST),不考虑这两个量各自的自由度。
调整 R² 把 SSR 和 SST 都除以各自的自由度,变成均方:
- SSR / (n - k - 1):平均每个残差自由度上的未解释变异(噪声均方,即 )。
- SST / (n - 1):平均每个总自由度上的总变异。
两者的比值衡量的是——在"平均每份自由度"的意义上,模型没能解释掉的变异占原始变异的比例。
3.3 为什么调整 R² < R²?
从另一个等价公式可以看得更清楚:
关键在最后一个因子:。
当 k > 0(模型中至少有一个自变量),n - 1 > n - k - 1 → 这个比值大于 1。所以:
这个 > 1 的因子就是"复杂度税"——k 越大,惩罚越重。每多一个自变量,分母 n - k - 1 就少 1,惩罚因子就更大。
四、调整 R² 为什么会小于 0?
4.1 数学条件
调整 R² < 0 当且仅当:
即模型的 R² 低于 k/(n-1) 这个极低的阈值。
4.2 举个例子
n = 30 个观测值,k = 10 个自变量。k/(n-1) = 10/29 ≈ 0.345。
如果这 10 个变量的 R² 只有 0.20(低于 0.345),那么:
调整 R² = -0.22。 什么概念?这个模型在"平均每份自由度"的意义上,它的残差噪声均方大于原始 Y 的均方——说明这 10 个变量不仅没帮上忙,反而因为消耗了太多自由度,导致平均噪声水平恶化了。
4.3 什么时候实际会遇到负的调整 R²?
- 极其低的 n/k 比:比如 n=20,k=8。你用了 8 个参数去追 20 个数据点。
- 自变量和 Y 几乎没有任何关联:你放的是一堆纯噪声变量(如随机生成的数字、与Y完全无关的问卷题目)。
- 虽然 R² > 0,但只比 0 大一点点:在自由度惩罚下被拉到负值。
4.4 软件通常如何处理?
Stata 等软件不会将调整 R² 报告为负数——如果计算值小于 0,通常将其报告为 0(或仅标注为 < 0)。这在技术上是一个截断,而非数学上不会发生。在原始公式中,调整 R² 可以为负。Stata 的截断是基于"如果模型的解释力连噪声都不如,从推断角度来看模型没有可解释的信息"这一考量。
五、R² vs 调整 R²——什么时候用哪个?
| 使用场景 | 应该用 R² 还是调整 R²? | 原因 |
|---|---|---|
| 描述单个模型的样本内拟合 | R² 或调整 R² 均可 | 两者都传达有用的信息:R² 给出绝对拟合度,调整 R² 给出惩罚后的拟合度 |
| 比较嵌套模型(同一样本,不同自变量数量) | 调整 R² | R² 偏向复杂模型,调整 R² 惩罚复杂度——更公平 |
| 比较不同样本的模型(同 Y) | 调整 R² | R² 受样本量和模型复杂度影响,调整 R² 做了归一化 |
| 因果识别研究——报告核心结果 | 两者都不是重点 | 因果识别不需要 R² 来支撑可信度 |
| 预测模型——选择变量 | 调整 R² 或交叉验证的 RMSE | 不要用 R² 选变量——它会让你选入过多噪声变量 |
六、实证研究中,什么样的 R² 可能存在问题?
R² 本身没有"正确"的取值范围。但在实证研究的语境下,特定的 R² 值确实值得追问。
6.1 微观调查数据的 R² 超过 0.7——反常
如果你用家庭调查数据分析工资、幸福感、学习成绩等个体层面的 Y,R² 很少超过 0.3—0.5。人类行为包含大量不可观测的异质性——个体的性格、经历、基因、偶然事件——这些不可能被你列在问卷上的十几个变量完全捕获。
当你在微观数据中看到 R² > 0.7,大概率存在以下问题之一:
- 你控制了 Y 的滞后项()——这在动态面板中合法,但它会大幅拉高 R²,而这反映的主要是 Y 的序列相关而非自变量的解释力。
- 你控制了中介变量或反向因果变量——这些变量"吸收"了大量变异,但代价是让你的核心系数不再有清晰的因果含义。
- 你的因变量和自变量包含了恒等式的成分——比如 Y = 总支出,X = 分类支出(食品支出、住房支出等),这时 R² 接近 1 不是发现,而是核算。
6.2 时间序列回归的 R² > 0.90——检查平稳性
在宏观时间序列回归中,高 R² 往往是两个非平稳变量在同一趋势线上漂移的结果。GDP 和人均电话保有量在 1980—2020 年间都大幅增长——它们的回归 R² 会超过 0.95。但这并不代表"电话越多 → 经济越好",这只是两个变量都随时间上升。
在时间序列中,高 R² 是检查单位根和做协整检验的信号,而非模型质量的信号。
6.3 Within R² 极低——在面板数据中通常不是问题
前文讲过,固定效应模型的 Within R² 在 0.01—0.10 之间是一个非常常见的范围——这不代表模型有问题,而是固定效应剔除个体间变异后,剩下的"个体内的逐年波动"本身就具备更大的噪声比。与横截面 OLS 回归的 R² 相比,预期值理应更低。
6.4 R² 等于 0 或非常接近 0——注意样本量
如果 n 非常小(n < 30),且你有足够多的自变量,R² 可能仍然为 0——特别是当自变量之间多重共线性严重时。在输出中看到 R² = 0.000 并不意味着"效应确实为零",而可能意味着"模型拟合完全失败"。检查样本量、检查 F 检验是否显著、检查自变量之间是否存在完全的线性依赖关系。
6.5 加了某个变量后 R² 从 0.2 跳到 0.8——追问"为什么"
一个单一变量带来 R² 的巨幅上升,说明这个变量和 Y 有极强的相关——强到了需要追问"这是因果关系吗?还是同义反复?"的地步。
七、总结:三个公式 + 一个判断原则
一个判断原则:R² 是你的模型在这份样本上的"成绩单"——但一份只看"绝对正确率"的成绩单。调整 R² 是一份"扣掉了蒙对概率"的成绩单。如果调整成绩是负数,说明你的模型的"解释力"连纯噪声都不如——你的自变量放在一起还不如随便找几个随机数。
一句话收尾:
"R² 永远不会嫌弃你多加变量——来者不拒,每加一个它就开心一点。调整 R² 才是那个冷静的会计师——每加一个变量,它就在账本上给你记一笔'复杂度税'。当税超过了收益,调整 R² 就会跌到零以下——它是在告诉你:别加了,你只是在记数据,不在学规律。"
八、B站/公众号呈现建议
- B站视频:建议用"天平动画"演示 R² 和调整 R² 的关系——左侧 R² 放入一个变量就上升一点(SSR 下降);右侧调整 R² 在同一步中先在"复杂度税"一端加砝码,再看净收益。当复杂度税大于 SSR 下降的收益时,调整 R² 往下掉。
- 公众号:调整 R² < 0 的数学推导和实例建议用数字代入演示。R² 异常的四种场景(微观高 R²、时间序列高 R²、Within R² 低、R² 跳升)建议做成"异常信号 × 应追问原因"的对照卡片。
- 推荐标题:
- 主标题:《R² 和调整 R² 是什么关系?为什么调整 R² 有时会变成负数?》
- 备选标题:《R² 永远不会嫌你加变量多——调整 R² 才是一个冷静的会计师》
- 金句提炼:
"R² 来者不拒——每加一个变量它就更开心一点。调整 R² 是那个冷静的会计师——每加一个变量就记一笔'复杂度税'。当税超过了收益,它就跌到零以下,告诉你:别加了,你在记忆数据,不是在学习规律。"