看,和拨
这一章把书名兑现。你会看到同一台世界机器、同一份噪声,只差图上的一刀:一边给出 −3.318,另一边给出 +5.000。而那一刀在数据上留下的痕迹,精确到小数点后六位都是零。
P(Y | X = 1) 和 P(Y | do(X = 1)) 这两个式子,什么时候相等?
C 和 D 都对,但其中一个是另一个的特例。想清楚哪个更一般,这一章就读懂一半了。
一个记号,把两件事分开
在 1990 年代之前,统计学的记号系统里写不出「拨动」这件事。
你可以写 P(Y | X = 1)——「在 X 等于 1 的那些情况下,Y 的分布」。这是「看」。至于「我伸手把 X 设成 1」,只能用自然语言描述,没有对应的数学符号。
没有符号,就没法做代数,就没法证明定理,就没法写算法。整个领域被卡在这里几十年——第 3 章说的「辛普森悖论困扰了统计学界几十年」,根子就在这。
Judea Pearl 引入的 do(·) 算子解决了这件事:
P(Y | X = 1) 「看」:我观察到 X 是 1 的那些情况下,Y 怎么样 P(Y | do(X = 1)) 「拨」:我把 X 设成 1,Y 会怎么样
两个式子长得几乎一样,中间只多了三个字母。但它们是两个不同的数,可以差到符号相反。
更重要的是:有了这个记号,「因果效应」就成了一个可以写下来的量:
ATE = E[Y | do(X=1)] − E[Y | do(X=0)]
ATE 是平均因果效应(Average Treatment Effect)。这本书剩下的部分,都是在算这个式子。
do 在图上是什么:那一刀
第 5 章已经埋下了答案:do(X = 1) 就是把 X 那条赋值语句换成 X := 1。在图上,这意味着 X 不再由任何东西决定——
do(X) = 把所有指向 X 的箭头剪断。
其余的箭头,一根都不动。
原图 do(X) 之后 ───── ────────── C → X C ✂ X ← 剪断 C → Y C → Y ← 不动 X → Y X → Y ← 不动 X → S ← Y X → S ← Y ← 不动
剪断之后得到的那张图,通常记作 G_X̄(X 上面加一横,表示「进入 X 的边被去掉了」)。
「拨动后的世界」= 在 G_X̄ 上跑同一套方程。
为什么只剪进来的、不剪出去的?因为你拨动 X 之后,X 对下游的影响照旧发生——那正是你想测的东西。被切断的只是「谁决定了 X」这件事,因为现在是你决定的。
看一次这一刀落下
下面这台机器是第 1 章那个问题的世界:C 是资历,X 是有没有开学习计划,Y 是三个月后的测评分。老手不用学习计划(C→X 为负),老手本来分就高(C→Y 为正)。
按那个按钮,看两组数字:
差值 两组资历 C 的差
──────── ───────────────
看:E[Y|X=1] − E[Y|X=0] −3.318 −0.9279
拨:E[Y|do(1)] − E[Y|do(0)] +5.000 +0.000000
# 同一台机器,同一个随机种子,同一批噪声。
# 唯一的区别是那一刀。
请特别看右边那一列。
「看」的时候,用了学习计划的那批人本来就不一样:他们的资历平均低 0.93。这个差没法怪学习计划,它是 C → X 那条箭头造成的。
「拨」的时候,谁用学习计划由抛硬币决定,两组的资历差是 0.000000——不是「近似为零」,是精确的零。因为在剪断之后的世界里,我用同一个随机种子跑了两遍:一遍 do(X=1),一遍 do(X=0)。两遍里每个人的 C 都是同一个数,两组之间当然没有差。
这个「同一个种子跑两遍」的技巧,其实就是把反事实直接算了出来——同一批人,一次被拨到 1,一次被拨到 0。现实中你只能看到其中一遍,这也正是第 15 章的主题。
拨了之后,那个数是怎么算的
上面那两遍模拟,是因为我拥有这台世界机器才跑得出来的。现实里你没有机器,只有它吐出来的数据。
所以真正的问题是:手上只有「看」的数据,能不能算出「拨」的答案?
这个问题叫识别(identification),是卷 III 的全部内容。它的答案有三种:
| 情形 | 能不能算 | 在哪一章 |
|---|---|---|
| 混淆变量全都测到了 | 能,用后门准则调整 | 第 10、12 章 |
| 混淆测不到,但有一条干净的中介 | 能,用前门准则 | 第 13 章 |
| 混淆测不到,也没有干净的中介 | 不能——数据里根本没有答案 | 第 13 章末 |
最后一行是这门学问最诚实的地方:它会明确告诉你「这个问题在你的数据下无解」,而不是给你一个看起来很像答案的数字。第 19–21 章讲的,就是无解时去外面找一把剪刀。
最一般的条件是:X 和 Y 之间的所有后门路径都被堵住了。
随机化是它的一个特例——它把所有指向 X 的箭头一次剪光,所以后门连存在的机会都没有。这就是随机化被称为「金标准」的确切理由:它不是「更准」,它是让识别这个问题从一开始就不存在。
A/B 测试就是一台图手术机。你给用户分桶时用的那个哈希函数,作用就是把所有「谁会看到新版本」的自然原因剪断,换成一个纯粹的随机数。
这解释了一件很多人觉得多余的事:为什么分桶必须严格随机,不能「按用户 ID 尾号分」如果 ID 是按注册时间发的、不能「让愿意的人先试」、不能「先给活跃用户上」。每一种「聪明」的分桶方式,都是在那把剪刀上留一条没剪断的箭头。
也解释了灰度发布为什么不能直接当 A/B 测试用:灰度通常按版本、按渠道、按地区推,这些都和用户特征相关,箭头没剪干净。
do(X=1) 就是「把数据里 X=1 的那些行筛出来」。
筛出 X=1 的行是「看」,是条件化。do 是换一个世界——在那个世界里,X 的取值原因被换掉了,而其他一切照旧。
这两者的差别,在数据上就是那两列数字:−3.318 vs +5.000。
更精确地说:条件化会改变你在看哪一群人(X=1 的那群人和 X=0 的那群人不是同类),而 do 保持人群不变、只改变他们接受的处理。「同一批人」这四个字,是 do 和条件化最本质的分界。
D当没有变量同时影响 X 和 Y 的时候相等——更精确地说,当所有后门路径都被堵住时。
C(随机分配)是 D 的一个特例:随机分配把指向 X 的箭头全剪了,所以后门必然不存在。但 D 更一般,它还覆盖了「有混淆但你测到了并调整掉了」这种情况——而那正是这本书大部分篇幅在处理的场景。
A 「写法不同而已」——如果这样,这本书就不用写了。整本书的存在理由就是这两个式子通常不相等。 B 「样本量足够大」——第 2 章那句话再说一遍:偏差不随 n 缩小。两万变两亿,−3.318 会变成 −3.3180000。 C 对,但它是充分不必要。以为「只有随机试验才能得因果」的人,会白白放弃掉大量能识别的观察数据;这本书卷 III 到卷 V 都是在讲那些场合。这一章的一句话
do(X) 就是把所有指向 X 的箭头剪断,其余一律不动;「看」和「拨」不等,差的正好是那些没被剪断的后门。
下一章给出那把剪刀的替代品:既然现实中你剪不动真实世界的箭头,那就在算式里把后门堵上。你会拿到一台搜索器——给它一张图,它枚举所有后门路径,并告诉你该控制哪些变量。在书里那张图上,四个候选变量的 16 个子集里只有 1 个能用,而两个看起来最像该控制的变量,放进去一定坏事。