同一份数据,三个答案
前面十一章讲的所有东西,在这一章一次性摆到桌上。同一份数据,同一个模型,四种控制变量的选法,四个互相矛盾的结论。而我们手上有标准答案——因为这个世界是我写的。
一个真实效应是 +5.00 的处理。你拿到两万人的观察数据,跑回归。下面哪一组数字,是「换不同的控制变量」能得到的?
这一章会给出四个具体的数字。
把牌摊开:这台世界机器长什么样
先看真相。这四行就是整个世界,没有别的了:
C := 噪声 # 资历,老手为正 X := 抛一枚偏心硬币,偏心度 = −1.2 × C # 老手不用学习计划 Y := 60 + 【5】 × X + 9 × C + 噪声 # ← 真效应就是这个 5 S := 抛硬币,偏心度 = 2.0 × X + 0.30 × Y # 留了评价(对撞机)
四个变量在图上的角色:
- C 资历——混淆。它同时影响 X(老手不用)和 Y(老手分高)。一负一正。
- X 有没有开学习计划——处理。
- Y 三个月后的测评分——结果。
- S 有没有留评价——对撞机。用了功能的人更爱留评价,分高的人也更爱留评价。
真效应写在第三行里:5。而引擎用两种互相独立的办法把它算出来,两个数必须对上:
路径规则(解析:沿有向路径把系数乘起来再相加) 5.0000 真的跑两遍 do(X=1) / do(X=0)(蒙特卡洛) 5.0000
第二个数是真的做了两次干预模拟:用同一个随机种子跑两遍,一遍所有人都被拨成 X=1,一遍都被拨成 X=0,取 Y 的均值之差。这是第 9 章那一刀,真的落了下来。
四个答案
两个开关,四种组合。请全部试一遍:
往回归里放什么 估计值 离真值 5.00 ────────────── ──────── ─────────── 什么都不放 −3.3185 −8.32 ← 连符号都反了 只放 C +4.9632 −0.04 ← 对 C 和 S 都放 +3.3061 −1.69 ← 多控制一个,从对变错 只放 S −4.8146 −9.81 ← 最惨的一种
数据一个字节都没变。两万行,四列,同一个文件。变的只是你在写模型时决定放哪几个变量名。
四个数字对应四种在现实中真实存在的分析:
- −3.32:直接对比「用了的人」和「没用的人」。这是最常见的做法,也是第 1 章那个「功能有害」结论的来源。
- +4.96:控制了唯一该控制的那个变量。这是唯一对的。
- +3.31:控制了 C,做对了一半;又顺手加了个 S,因为「留评价的用户和不留评价的用户很不一样,控制一下更严谨」。这个「更严谨」的动作,让估计从 4.96 掉到 3.31。
- −4.81:只控制了 S。比什么都不控制还差。
「该往回归里放哪些变量」这个决定,数据本身给不了你答案。
四个模型的拟合优度、显著性、残差诊断,全都长得很正常。没有任何统计指标会告诉你第三个模型比第二个差——因为「差」的定义在数据之外。
给得了答案的只有一样东西:那张图。而图是你带进来的知识。
调整公式,逐项拆开
上面那个 +4.96 是怎么来的?回归是它的一种实现,但更基本的形式是第 10 章给过的调整公式:
P(Y | do(X=x)) = Σ_z P(Y | X=x, Z=z) × P(Z=z)
───────────────── ────────
在这一层里比 这一层在【总体】中占多大
三步:
- 分层:把所有人按 Z(这里是资历 C)分成若干层。
- 层内比较:在每一层内部,比 X=1 和 X=0 的人的 Y。层内不再有混淆——因为这一层里所有人的 C 都差不多。
- 按总体权重加权平均:注意权重是
P(Z=z),是这一层在整个人群中的占比,不是在处理组或对照组中的占比。这一步正是在模拟「把所有人都拨过去」。
用这台机器的数据真跑一遍,把 C 切成不同层数:
层数 分层调整的估计值 离真值 5.00 ───── ──────────────── ─────────── 2 1.9533 −3.05 5 4.0598 −0.94 10 4.5569 −0.44 20 4.7806 −0.22 50 4.8811 −0.12 100 4.8913 −0.11 # 单调收敛。层分得越细,残余混淆越小。
这张表是理解「调整」的最好材料:分层不够细,层内还剩混淆。只分两层的时候,每一层内部资历的跨度还很大,层内的比较仍然被污染,于是只估到 1.95。
而这也暴露了分层法的死穴:层越细,每层里的人越少。如果某一层里全是处理组、没有对照组,这一层就没法比。变量一多,这个问题会迅速失控——两个各 10 层的变量就是 100 层,三个就是 1000 层。这个诅咒的名字叫维数灾难,也正是第 16 章倾向得分要解决的问题。
把 C 放进回归 Y ~ X + C,等价于假设「层内的效应处处相同,而且 Y 随 C 线性变化」,然后用这个假设把所有层的信息合起来估。
好处:不需要分层,不怕维数灾难,样本利用率高。
代价:如果那个线性假设错了,估计就偏了,而且你不容易发现。
这本书这台机器里 Y 对 C 恰好就是线性的,所以回归给出的 4.9632 比 100 层分层的 4.8913 还准。但那是因为我把模型写对了——现实里你不知道自己写没写对,这也是第 17 章双重稳健要处理的事。
这一章的场景不是虚构的。「上线一个功能,看用了的人和没用的人指标差多少」——这是每一家有数据团队的公司每天都在做的事,而它默认得到的就是那个 −3.32。
更值得警惕的是那个 +3.31。因为得到这个数的人,是四个人里最努力的那个:他知道要控制混淆(放了 C),也注意到了留评价的用户和别人不一样(放了 S)。他做的每一步在直觉上都是「更严谨」。
而结果是:他比只做了一半功课的人错得更多。这不是运气问题,这是因为「更多控制 = 更严谨」这条直觉本身是错的。
能救他的只有一件事:在写代码之前,先花五分钟画一张图,然后问「S 是在处理之前还是之后发生的」。这个问题一问,S 就出局了。
上面那个加了 S 的模型,R² 比只加 C 的模型更高——因为 S 确实和 Y 相关,加进去当然更能预测 Y。它预测得更好,同时因果估计更差。
这是预测和因果最锋利的分界线:预测追求的是「用手上有的东西尽量拟合 Y」,因果追求的是「让 X 的系数等于结构系数」。这两个目标经常打架,而所有现成的模型选择工具都站在预测那一边。
推论:不要用 AIC、LASSO、逐步回归或者特征重要性来挑因果模型的控制变量。它们会挑出预测力强的变量,而对撞机往往预测力很强。
C从 −5 到 +5 都有可能,包括符号相反的。
四个真实数字:−3.3185、+4.9632、+3.3061、−4.8146。跨度 8.28,覆盖了正负两侧。真值是 +5.00。
A 「4.8 到 5.2」——这是「控制变量只影响精度」的假设。控制变量影响的是偏差,不是精度,而偏差没有上限。 B 「控制得差会低估」——低估是可能的(3.31),但也可能高估、也可能反号。偏差的方向由结构决定:混淆的符号是 C→X 和 C→Y 两个系数的乘积,这里一负一正,所以是负偏。换个结构就是正偏。 D 「回归就是回归」——回归是一个确定的算法,给定输入必然给定输出。但「输入是什么」不是回归决定的,是你决定的,而这本书讲的就是怎么做这个决定。这一章的一句话
同一份数据能给出四个互相矛盾的因果结论;选对控制变量所需要的信息不在数据里,而所有衡量「模型好坏」的现成指标,都站在预测那一边。
下一章处理一个更糟的处境:混淆变量你根本没测到,后门准则会明确告诉你「无解」。然后你会看到一条几乎像作弊的出路——只用 X、M、Y 三列数据,在 U 完全不可观测的情况下,把真效应 1.2600 估成 1.2557。