假设你是一位侦探,要回答一个有点“反事实”的问题:“如果当初让所有病人都吃了这种药,病情会怎样?”你手上只有医院病历,而病历里病人是否吃药是自己选择的——病情重的人更可能吃药。此时,看到的“吃药与康复相关”并不等于“吃药导致康复”。盲目的相关分析就像听现场证人各执一词,而 do-演算是一本侦探查案手册:它把“我们迫使所有人都吃药”这个不可能在数据中直接看到的干预,一步步翻译成“在不同条件下观察”的问题。后门准则、前门准则、三条操作公理,都是这本手册里的关键招式。掌握它,你就能用观察数据回答“如果重来一次会怎样”的因果问题。
对 AI 从业者而言,do-演算是从“相关模型”走向“因果决策”的必修课:它能让你在可解释 AI、智能推荐和医疗健康等领域,真正回答“干预后会怎样”,而不是只报告“历史上看起来相关”。
可视化演示
三步展示因果效应识别:潜在结果与do算子干预、后门准则混淆调整、前门准则中介路径识别。
本节配有交互动效(进入视口后自动加载,约 3KB)。
潜在结果与do算子干预 潜在结果Y(1)和Y(0)定义个体处理效应ITE do(X=x)模拟物理干预切断混淆路径 P(Y|do(X))≠P(Y|X)区分因果与相关 ATE=E[Y(1)-Y(0)] do算子将观测分布转换为干预分布实现因果效应识别。
因果效应定义
要破案,先得定义“真相”。在因果科学里,每个人其实都活在两个平行世界:一个世界里他吃了药,另一个世界里他没吃药。我们永远只能观察到其中一个世界,但因果效应恰恰问的是这两个世界的差。侦探不能穿越时空,却可以用 do-演算在概率世界里补出另一个平行世界的答案。
技术上说,设 \(X=1\) 表示吃药,\(X=0\) 表示不吃药,\(Y^{(1)}\) 和 \(Y^{(0)}\) 分别表示同一个体在两种干预下的潜在结果。平均因果效应不是比较“吃药的人”和“没吃药的人”,而是比较“所有人被迫吃药”和“所有人被迫不吃药”时的平均结局。
有了这一定义,侦探的问题就从“谁说了什么”变成了“两个平行世界平均差多少”,一个可以被数学工具处理的问题。
- 潜在结果 \(Y^{(1)}\)如果这个个体被强制吃药,他未来会出现的结局。
- 潜在结果 \(Y^{(0)}\)如果这个个体被强制不吃药,他未来会出现的结局。
- 个体因果效应同一个体在两个平行世界里的结局差,这才是真正的“因果效应”。
- 期望与干预对所有个体求平均,并用 \(\mathrm{do}(X=x)\) 表示“强制干预”而非“自然观察”。
观察数据困境
侦探到现场取证时,目击者的证词往往被天气、立场和记忆污染。观察数据也一样:\(X\) 和 \(Y\) 可能同时被一个共同原因 \(Z\) 影响。比如病情严重的病人既更可能吃药,也更可能发烧。于是病历里“吃药的人恢复更差”可能只说明 Z 在背后捣乱,而不是药有问题。
在数学上,观察条件概率 \(P(y \mid x)\) 混入了 Z 的信息:当我们“看到” X=x 时,Z 的分布也会跟着改变。而因果效应 \(P(y \mid \mathrm{do}(x))\) 要求 Z 的分布保持不变,只有 X 被外部强制改变。两者一般不等:
辛普森悖论就是这个困境的典型案例:每个病情亚组里药都有效,合在一起却显得药物有害,因为重症病人在吃药组里占比过高。侦探必须意识到:病历上的相关,可能只是 Z 在背后导演的一场戏。
- 观察分布中的 \(P(z \mid x)\)看到 X 之后,混杂变量 Z 的分布会随之变化。
- 干预分布中的 \(P(z)\)强制 X 后,Z 的分布不再受 X 影响,只能用总体的 Z 分布。
- 内层条件 \(P(y \mid x, z)\)先固定 X 和 Z,看 Y 的分布,作为分层的“标准尺”。
- 求和 \(\sum_z\)把各层的标准尺按权重拼回总体,得到可估计的因果量。
do算子内涵
do 算子不是统计教科书里的条件概率,而是侦探的“重演按钮”。按下 \(\mathrm{do}(X=x)\),就相当于对所有嫌疑人说:“不管你们原本怎么选,现在统一执行 X=x。” 此时,原本决定 X 的那些背景因素全部失效,因为它们不再有机会影响 X。
用因果图的语言说,观察世界里的 X 有父节点(比如病情 Z),干预世界里的 X 没有父节点。我们要把指向 X 的入边全部切断,再固定 X=x。联合分布在干预后会变成所谓的“截断因子分解”:
这个“截断”动作是 do-演算的起点。后面所有识别技巧,本质上都在想方设法把这种干预分布改写成观察数据能估计的形式。
- 原始联合分布观察世界按因果图的父子关系分解成多个条件概率的乘积。
- 删除 X 的父节点因子do(X=x) 后,X 不再由父节点决定,所以对应因子被拿掉。
- 固定 \(X=x\)其他因子中一旦出现 X,就代入常数 x。
后门准则
侦探发现现场有一条后门通道:X 和 Y 之间存在一条不经过 X→Y 的路径,比如 Z→X 和 Z→Y。这条后门路径让 X 和 Y 看起来相关。后门准则说:只要找到一个可观测变量集 Z,它能阻断所有这样的后门路径,并且 Z 不包含 X 的后代,我们就可以用 Z 分层来“关上门”。
一旦 Z 满足后门准则,因果效应就有了一个简洁的调整公式:
后门准则是 do-演算中最常用的招式。它的价值在于:只要找对 Z,普通的病历数据也能用来估计药物效果。
- 分层条件概率 \(P(y \mid x, z)\)在 Z 固定的小组内,比较不同 X 下的 Y。
- 总体权重 \(P(z)\)用 Z 在总体中的分布,而不是 Z 在“看到 X 后”的分布。
- 乘积与求和把每一层的组内效应乘以权重后加起来。
前门准则
现实中,侦探常常找不到所有混杂变量。比如药物 X 和恢复 Y 之间有一个共同原因 U,而这个 U 完全无法观测。此时后门准则失灵,但前门准则仍可能给出答案——前提是存在一个完全中介变量 M:X 通过 M 影响 Y,而 M 与 Y 之间没有未观测混杂。
前门调整公式看起来比后门复杂一点,但思路依然是“分两步走”:
前门准则像侦探绕路:正面后门被封死,就从侧面的中介走廊迂回进入现场。它告诉我们,即使有些混杂看不见,因果效应依然可能可识别。
- 第一段效应 \(P(m \mid x)\)从 X 到中介 M 的作用,可直接从观察数据估计。
- 第二段效应 \(\sum_{x'}P(y \mid x', m)P(x')\)用辅助变量 \(x'\) 估计 M 到 Y 的作用,绕开 X 与 Y 之间未观测的混杂。
- 外层加权求和对所有中介状态 M=m 按第一段权重求和。
do演算公理
后门和前门只是 do-演算手册里的两个特例。真正完整的手册包含三条公理,它们像侦探的三种基本动作:删掉没用的证词、把重演换成目击、删掉多余的干预。只要在对应删边图中满足条件独立,这三条规则就能一步步把烦人的 \(\mathrm{do}\) 操作转化为可估计的观察量。
正因为有了这三条公理,因果识别才从“撞运气”变成算法:从目标表达式出发,反复套用规则,直到 \(\mathrm{do}\) 全部消失,成为只含观察数据的统计量。
- 规则一(删除观察)如果删掉指向 X 的边后,Y 与 Z 独立,那么 Z 是无关证词。
- 规则二(动作与观察互换)在相应删边图中若满足条件独立,\(\mathrm{do}(z)\) 可以替换成观察到的 z。
- 规则三(删除动作)如果 X 在删边图中与 Y 独立,则干预 X 不影响结果,可以直接删去。
反事实推理
侦探不仅关心“整个人群”,有时也关心“这个具体的人”。反事实问的是:如果这个已经吃了药的人当初没吃药,他的结局会怎样?这种问题在现实中永远无法验证,但在因果模型里可以被推理。
核心工具是潜在结果 \(Y_x\) 和一致性条件:当实际观测到 \(X=x\) 时,反事实结果 \(Y_x\) 就等于观测到的 \(Y\)。用公式表达就是:
反事实推理通常走三步:先用数据和模型反推个体背后的混杂因素,再执行 do 干预,最后预测新世界的结果。这在因果机器学习中,正是个性化处理效应估计的底层逻辑。
- 反事实变量 \(Y_x\)在干预 X=x 的平行世界中,这个个体会出现的结局。
- 反事实查询给定已经观察到的真实信息 \(X=x',Y=y'\),反推另一条世界线的概率。
- 一致性条件实际 X 是哪个值,就采用哪个潜在结果,这是反事实与观测相连的桥梁。
工程实践
手册最终要变成工作台。在真实 AI 工程中,我们常用 DoWhy、EconML 等因果推断库完成四步流程:建模、识别、估计、反驳。其中“识别”这一步正是 do-演算的主场:库内部会把 \(P(Y \mid \mathrm{do}(X))\) 自动改写成后门调整或前门调整形式。
一个常见的估计策略是倾向得分加权(IPW)。假设 \(\hat{e}(X_i)\) 是第 \(i\) 个样本被分到处理组的预测概率,加权平均公式为:
工程上还要做敏感性分析:如果存在一个未观测混杂变量,强度和直接效应达到多大才会推翻结论?只有经过反驳检验,do-演算得到的因果结论才能进入可解释 AI 和决策系统。
- 倾向得分 \(\hat{e}(X_i)\)给定混杂变量后,第 i 个人被分配到处理组的概率。
- 处理组权重 \(X_iY_i / \hat{e}(X_i)\)处理组样本用 \(1/\hat{e}\) 加权,代表那些“虽然倾向不大但确实被处理”的人。
- 对照组权重没被处理的样本用 \(1/(1-\hat{e})\) 加权。
- 均值差分两组加权平均后相减,得到总体平均因果效应。
AI 应用场景
医疗真实世界证据
阶段:因果推断与证据生成
解决的问题:传统电子病历分析只能看到“用药和结局相关”,但医生给重症患者开更多药,导致药物效果被混杂污染。AI 需要从真实世界数据中识别因果效应。
具体案例:某药企用 DoWhy 建立“患者严重程度 Z → 用药 X / 康复 Y”的因果图,使用后门调整估计药物的平均因果效应。发现原始相关性为负,而后门调整后药物其实是有效的。该结果被用于临床决策支持系统,避免错误撤药。
推荐系统可解释归因
阶段:模型可解释性与归因分析
解决的问题:传统 SHAP 值只能回答“哪些特征与预测相关”,产品团队真正想问的是“如果我们强制把某个内容曝光给用户,转化率会怎样”。这需要 do-演算,而不是特征相关性。
具体案例:推荐系统中,用户活跃度 Z 同时影响内容曝光 X 和点击 Y。AI 团队建立因果图,用后门调整计算“曝光行为对点击率的因果效应”,从而识别真正能撬动增长的曝光策略,而不是被用户偏好误导。
营销增量建模
阶段:用户增长与个性化运营
解决的问题:业务方希望从历史活动数据中找出“因为收到优惠券才下单”的客户,而不是那些“不发券也会买”的自然用户。A/B 测试成本高,需要从观察数据中估计个体因果效应。
具体案例:增长团队使用反事实推理估计 \(Y_1 - Y_0\),将用户分成“忠实自然购买者”和“优惠敏感型”。营销预算只投向增量最高的群体,活动 ROI 提升约 30%。
Python 演示
import numpy as npimport pandas as pd def generate_data(n=2000, seed=7): rng = np.random.default_rng(seed) z = rng.normal(size=n) p = 1.0 / (1.0 + np.exp(-0.7 * z)) x = rng.binomial(1, p) y = 1.2 * x + 0.8 * z + rng.normal(size=n) return pd.DataFrame({"z": z, "x": x, "y": y}) def naive_ate(df): return df.loc[df["x"] == 1, "y"].mean() - df.loc[df["x"] == 0, "y"].mean() def backdoor_stratification(df, bins=8): df = df.copy() df["z_strata"] = pd.qcut(df["z"], q=bins) total = 0.0 for _, grp in df.groupby("z_strata", observed=True): weight = len(grp) / len(df) treated = grp.loc[grp["x"] == 1, "y"] control = grp.loc[grp["x"] == 0, "y"] if len(treated) > 0 and len(control) > 0: total += weight * (treated.mean() - control.mean()) return total if __name__ == "__main__": data = generate_data() print("naive ATE:", naive_ate(data)) print("backdoor ATE:", backdoor_stratification(data))
y = 1.2 * x + 0.8 * z + rng.normal(size=n)设置真实因果效应为 1.2,同时让 Z 影响 Y,制造混杂。p = 1.0 / (1.0 + np.exp(-0.7 * z))Z 越大用药概率越高,这就是“选择偏差”的来源。df["z_strata"] = pd.qcut(df["z"], q=bins)按 Z 分成 8 层,对应后门调整里的“分层”。weight = len(grp) / len(df)每层人数占比作为权重,把分层结果拼回总体。treated.mean() - control.mean()在同一层内比较用药与不用药,阻断共同原因干扰。
常见误区
误区既然后门调整要控制混杂,那把数据库里所有变量都放进回归模型,肯定能得到因果效应。
正解过多控制会引入两个新风险:一是控制了中介变量,等于把 X 的效应“洗掉”一部分;二是控制了碰撞因子,可能打开新的非因果路径。后门准则要求的是“足够且必要”的调整集,不是越多越好。
为何常见:人们容易把机器学习里的“特征越多越稳”直觉搬运到因果推断中,忘记因果图里有路径、有结构,不是所有变量都能成为无辜的协变量。
误区我做了回归,X 的系数显著为正,所以 X 导致 Y 增加。
正解回归系数只是条件相关。在共同原因 Z 存在时,即使 X 完全没有因果效应,回归系数也可以显著。do-演算专门解决“如何把观察关系改写成因果效应”,不做识别就谈因果,等于不看后门就断定凶手。
为何常见:统计课程里长期强调相关不是因果,但实操中看到显著 p 值时,大脑仍会自动补上因果解释。
误区\(P(Y \mid X=x)\) 就是 \(P(Y \mid \mathrm{do}(X=x))\),因为我处理过的数据里 X=x 的样本都在这儿。
正解条件 X 只是筛选出历史上恰好 X=x 的人;do(X=x) 是让所有个体都变成 X=x。前者中混杂因素 Z 的分布会随组别改变,后者中 Z 的分布保持总体不变。所以两者一般不等。
为何常见:代码里写 df[df["x"] == x] 很容易,但它只是“看”,不是“干预”,两者在数学符号和因果含义上都差着一个 do。
误区只要找一个中介变量 M,前门准则就能处理所有未观测混杂。
正解前门准则要求 M 完全中介 X→Y 的效应,而且 M 到 Y 不能存在未观测混杂;此外 X 与 Y 之间不能有未通过 M 的直接因果路径。条件非常苛刻。
为何常见:中介变量听起来像万能钥匙,但真实业务中“完全中介”很难保证,随便拿一个中间指标当 M,结果可能比后门调整更糟。
误区机器学习预测出“如果吃药就会好”,所以我已经在做反事实推理。
正解预测 \(E[Y \mid X=1]\) 回答“通常这类人会怎样”,反事实 \(Y_1\) 回答“这个特定的人如果换成另一种选择会怎样”。后者需要因果模型、一致性条件和额外假设,不能只靠观测数据训练一个判别模型。
为何常见:预测模型与反事实模型使用相似的数据表格,但“学习相关性”和“回答平行世界问题”是两件不同的事,初学者容易混淆。
面试题
Q1. 在 do-演算中,\(P(Y \mid \mathrm{do}(X=x))\) 与 \(P(Y \mid X=x)\) 的核心区别是什么?
- A.前者是观察条件概率,后者是干预概率
- B.前者是干预概率,后者是观察条件概率← 正确答案
- C.两个概率在数值上一定相同
- D.两个概率都只适用于随机实验
答案:B。\(P(Y \mid X=x)\) 是自然观察到的条件概率,\(P(Y \mid \mathrm{do}(X=x))\) 是强制所有人执行 X=x 后的干预概率。两者因为有混杂因素而通常不同。记住侦探类比:一个是看证词,一个是重演现场。
Q2. 后门准则主要用于解决哪类问题?
- A.样本量不足导致的抽样误差
- B.共同原因造成的混杂偏差← 正确答案
- C.中介变量造成的过度控制
- D.模型过拟合导致的方差过大
答案:B。后门路径是由共同原因 Z 等形成的 X 与 Y 之间的非因果通道。后门准则通过控制 Z 来阻断这条通道,从而消除混杂偏差。它不是为了处理抽样误差或模型过拟合。
Q3. 关于后门准则中的调整变量 Z,下列哪种说法正确?
- A.需要阻断从 X 到 Y 的所有后门路径← 正确答案
- B.必须是 X 的直接父节点
- C.不能包含任何 X 的祖先节点
- D.必须与 Y 完全相互独立
答案:A。Z 只要能阻断所有后门路径且不含 X 的后代,就可以作为后门调整集,不一定要是 X 的父节点。Z 与 Y 独立也不是必需的。关键是让 X 和 Y 之间没有“看不见的通道”。
Q4. do-calculus 规则二允许把哪个操作替换成观察?
- A.do(z) 在条件独立满足时换成看 z← 正确答案
- B.do(x) 在任意条件下直接删除
- C.do(z) 在任何情况下都等于 P(z)
- D.do(x) 和 do(z) 必须同时出现
答案:A。规则二是“动作与观察互换”:在某些删边图中,如果 Y 与 Z 条件独立,则 \(\mathrm{do}(z)\) 可以替换为普通观察 z。它不能随意删除 do(x),也不能无条件成立。
Q5. 辛普森悖论揭示的本质问题是什么?
- A.未控制混杂时分层结论与合并结论可能相反← 正确答案
- B.增加样本量即可消除所有悖论
- C.因果关系只能由随机实验确定
- D.所有变量都应放入回归方程
答案:A。辛普森悖论是典型的相关与因果错位:每个亚组内 X 对 Y 有效,合并后却显示无效甚至有害。原因就是未控制 Z 时,观察分布用 \(P(z|x)\) 加权,干预分布才用 \(P(z)\) 加权。
Q6. 前门准则最核心的适用前提是什么?
- A.存在一个完全中介 M 且 M 不被未观测混杂污染← 正确答案
- B.X 的所有后门路径都已可以被观测
- C.Y 必须有一个工具变量
- D.M 必须与 X 完全独立
答案:A。前门准则要求 M 完全中介 X 对 Y 的效应,并且 M→Y 之间没有未观测混杂。它不需要观测到所有后门变量,因此能在某些后门无法阻断时发挥作用。
Q7. 反事实一致性条件通常写作什么?
- A.X=x 时,Y_x=Y← 正确答案
- B.Y_x=Y 时,X=x
- C.X=x 时,Y_x=1
- D.所有 x 下都有 Y_x=Y
答案:A。一致性条件是说,如果实际观测到的处理是 x,那么该个体的反事实结果 \(Y_x\) 就等于观测结果 Y。它像开关:实际接的是哪条线,看到的灯就是哪条线对应的灯。
Q8. 下列哪些概念属于因果效应识别工具?
- A.后门调整← 正确答案
- B.前门调整← 正确答案
- C.皮尔逊相关系数
- D.do-演算规则← 正确答案
答案:ABD。后门调整、前门调整和 do-演算都是因果识别工具;皮尔逊相关系数只是度量线性相关的统计量,无法区分混杂与因果。
Q9. 关于 do-演算三条规则,下列说法正确的是?
- A.规则一可删除无关观察← 正确答案
- B.规则二可交换动作与观察← 正确答案
- C.规则三可删除多余动作← 正确答案
- D.三条规则只能用于线性模型
答案:ABC。规则一删除无关观察,规则二在条件独立时交换 do 与看,规则三删除不产生影响的干预。do-演算面向非参数结构因果模型,不局限于线性模型。
Q10. 关于观察数据中的因果识别,哪些说法正确?
- A.找到后门调整集就能做后门调整← 正确答案
- B.前门准则可应对部分未观测混杂← 正确答案
- C.do-演算可用于推导可识别估计量← 正确答案
- D.若 X 与 Y 相关则 X 必是 Y 的原因
答案:ABC。后门、前门和 do-演算都是识别方法;它们能把干预概率改写成观察分布。相关不等于因果,D 正是日常生活中最常见的错误推理。