卷 IV · 算出来CH 15深度 15/24

一半的格子,永远是空的

因果推断有两套语言。前面十四章用的是图,这一章介绍另一套:潜在结果。它们在数学上是等价的,但看问题的角度完全不同——而这个角度会让你立刻明白,为什么个体因果效应是原则上不可知的。

潜在结果反事实ATE / ATT

▷ 先判一次

「这个用户如果没有开学习计划,他会考多少分?」这个问题?

A 可以估计,用相似用户的平均值B 原则上不可知,但平均效应可以知道C 原则上不可知,所以整个因果推断都是猜的D 只要模型足够好就能算出来

这一题区分的是「个体」和「平均」。这个区分比听起来重要得多。

换一套记号

1974 年,Donald Rubin 提出了一套和图完全不同的语言(源头可追到 Neyman 1923 年的农业试验),今天叫潜在结果框架(potential outcomes framework),也叫 Rubin 因果模型。

◆ 潜在结果

对每一个个体 i,定义两个数:

  • Y_i(1):如果他接受了处理,结果会是多少
  • Y_i(0):如果他没接受处理,结果会是多少

这两个数同时存在,都是这个人身上的客观属性——就像身高体重一样。它们不依赖于他实际接受了什么。

个体因果效应τ_i = Y_i(1) − Y_i(0)

而你观察到的那个数是:Y_i = X_i × Y_i(1) + (1 − X_i) × Y_i(0)——他实际走的那条路上的那个数。

把这件事画成表格,问题立刻变得刺眼:

十个人,两列潜在结果。每一行都有一个格子是问号。不是「测不准」,不是「样本不够」——那个格子对应的世界没有发生过

点「掀开那一半」(现实中你做不到,但这是我造的世界,所以我知道):

真 ATE(十个 τ 的平均)    3.730
真 ATT(处理组的平均 τ)    3.720
朴素差(能看见的那些)      −8.680

朴素差和真 ATE 差了 12.4,而且符号相反。原因和前面一样:谁走哪条路不是随机的。

◆ 因果推断的根本问题

Paul Holland 1986 年给了这件事一个名字:因果推断的根本问题(the fundamental problem of causal inference)。

对任何一个个体,你永远只能观察到两个潜在结果中的一个。另一个是反事实(counterfactual),它不可观测,而且不是因为技术限制。

换句话说:因果推断本质上是一个缺失数据问题,而且是最恶劣的那种——缺失率恒定 50%,且缺失机制和你要估的东西直接相关。

为什么平均值反而有救

个体效应不可知,但平均效应可以。这不是妥协,这是一个真正的数学事实:

ATE = E[Y(1) − Y(0)] = E[Y(1)] − E[Y(0)]
                        ────────   ────────
                        这两项各自都可以从数据里估出来

期望是线性的,所以「差的平均」等于「平均的差」。而 E[Y(1)] 只需要一批「被处理了的人」的平均,E[Y(0)] 只需要一批「没被处理的人」的平均——不需要是同一批人

条件是这两批人得可比。写成潜在结果的语言:

◆ 三个假设(潜在结果版)
  1. 可忽略性(Y(0), Y(1)) ⊥ X | Z——在协变量 Z 相同的人里,谁接受处理与他的潜在结果无关。
    这就是第 10 章的后门准则,只是换了套记号。
  2. 正值性(重叠):0 < P(X=1 | Z) < 1——每一层里都得同时有处理组和对照组的人。
    第 12 章分层表里「某层全是处理组」的问题,就是这一条被违反。
  3. SUTVA:一个人的处理不影响别人的结果,而且处理只有一个版本。
    社交产品的 A/B 测试经常违反前半条;「用了功能」这种模糊定义经常违反后半条。

第二条和第三条在图的语言里是隐含的,容易被忽略。这是潜在结果框架的一个长处:它把这两条摆到了明面上。

三个不同的「平均效应」

「平均因果效应」不止一个,而混用它们是实践中很常见的错误:

记号对谁平均回答的问题
ATE所有人如果所有人都接受处理,比都不接受好多少?
ATT实际接受了处理的人那些真的用了的人,处理帮了多少?
LATE「被工具推动了的人」第 19 章会讲,这是工具变量能给的唯一答案

上面那张表里 ATE 是 3.730,ATT 是 3.720——很接近,因为我造的世界里个体效应和「谁会接受处理」几乎无关。现实中它们可以差很远。

举个例子:如果一个功能只对新手有用,而实际用它的都是新手,那么 ATT(对用了的人的效果)会很大,ATE(如果强制所有人用)会小得多。决定「要不要默认开启」时该看 ATE,决定「要不要继续维护」时该看 ATT。

两套语言,一件事

图和潜在结果这两个框架,历史上曾经互相看不上(Pearl 和 Rubin 之间有过著名的争论)。今天的共识是它们在数学上等价——任何一个能在图里表达的因果查询,都能在潜在结果里表达,反之亦然。

图的语言潜在结果的语言
P(Y | do(X=1))E[Y(1)]
Z 满足后门准则给定 Z 可忽略
d-分离条件独立
剪断进入 X 的箭头处理分配与潜在结果独立

实用上的分工大致是这样:图擅长「该控制什么」(识别),潜在结果擅长「怎么估、误差多大」(估计)。这本书两个都用——卷 III 是图,卷 IV 是潜在结果,而它们在讲同一件事。

∑ 反事实的三步计算

如果你手上有完整的结构方程模型,反事实是可以算的,Pearl 给了三个步骤:

  1. 溯因(abduction):看见这个人的实际取值,倒推出他身上那组噪声。「他运气比平均好 0.8」
  2. 行动(action):在他身上做手术,把 X 换成别的值。
  3. 预测(prediction):用同一组噪声重新跑一遍方程。

「同一个人」这四个字,就落在「同一组噪声」上。这也正是第 9 章那个 demo 里「用同一个种子跑两遍」在做的事。

但注意代价:这需要你知道完整的结构方程,不只是图。而这个要求比识别 ATE 强得多——ATE 只要图,反事实要方程。

▸ 在现实里

「这次事故如果没上这个版本,还会不会发生?」——这是一个个体反事实问题,原则上不可观测。你能做的是找一批相似的情形去估。

归因分析(attribution):营销里问「这次转化该记在哪个渠道头上」,本质上是在问一串反事实——「如果没有这次曝光,他还会不会买」。多数归因模型(首触、末触、线性分配)根本不是在回答这个问题,它们只是在分账。

可解释 AI 里的「反事实解释」:「如果你的收入再高 5000,贷款就会通过」——这句话是一个反事实断言,它需要一个因果模型才站得住。用纯预测模型生成的反事实解释,说的其实是「换一个特征值,模型的输出会变」,而不是「换一个真实世界的状态,结果会变」。这两件事的差距,就是这本书。

✗ 这个直觉是错的
既然个体因果效应不可知,那因果推断就是在猜。 个体效应不可知,但平均效应在明确的假设下可以被无偏地估计——而且那些假设是写得出来、可以被反驳的。

这个跳跃很重要,值得类比一下:你不知道下一次抛硬币是正是反,但你精确地知道抛一万次里正面的比例会是多少。「个体不可知」和「群体可算」并不矛盾,统计学整个建立在这个区别上。

另一个方向的错误同样要防:不要把平均效应当成个体承诺。「这个药平均延长两年寿命」不意味着对你延长两年——它可能对 30% 的人延长七年,对 70% 的人没用。这就是效应异质性(heterogeneity),第 23 章会再碰它。

◇ 判词

B原则上不可知,但平均效应可以知道。

那个用户的 Y(0) 是一个真实存在的数,但它对应的世界没有发生过。你能做的是估计一群和他相似的人的平均 Y(0)——那是一个不同的、但可以回答的问题。

A 「用相似用户的平均值」——这个操作本身是对的(第 16 章的匹配就是这么干的),但它估的是群体平均,不是这个人的个体效应。差别在于:个体效应还有他自己那份噪声,而那份噪声你永远拿不到。 C 「所以整个因果推断都是猜的」——把「个体不可知」错误地推广成了「什么都不可知」。ATE 的可估计性是有证明的,不是猜。 D 「模型足够好」——模型再好也造不出那个没发生过的观测。缺的不是拟合能力,是数据点本身。

这一章的一句话

每个人身上有两个数,你只能看见一个;个体效应原则上不可知,而平均效应在明确写出的假设下可以被无偏地估计。

下一章解决第 12 章留下的维数灾难。你会看到一个惊人的压缩:不管有多少个协变量,都可以压成一个数。用它做匹配之后,那个原本差了 −1.0539 个标准差的混淆变量,被抹平到 −0.0007