2.1 因果图与do算子:Pearl框架


2.1 因果图与do算子:Pearl 框架

本节摘要:结构因果模型(SCM)用一组结构方程描述每个变量如何由其父代与外生噪声生成,因果图是它的几何投影;do(X=x) 算子把"干预"形式化为替换结构方程而非条件化。本节讲清 SCM 三元组、do 与观察的差别、截断分解公式,为全册提供代数与几何两套语言。

把因果假设写成方程和图

上一章我们反复说"需要因果假设",但假设以什么形式书写?Pearl 的答案是结构因果模型。一个 SCM 由三部分组成:外生变量 U(模型之外的因素,充当噪声)、内生变量 V(模型关心其因果关系的变量)、以及每个内生变量对应的一条结构方程——每个变量的取值由其直接原因(图上称为父代)和外生噪声通过确定函数生成。例如:

X ← f_X(U_X);Y ← f_Y(X, Z, U_Y);Z ← f_Z(U_Z)

每个方程读作"右端决定左端",方向性来自"修改右端则左端随之改变,反之不然"这个干预语义。把每个内生变量画成节点、每条方程里的依赖画成有向边,就得到因果图(DAG)。图不是模型的装饰,而是模型的摘要:路径的形状完整决定了后面几章的一切识别规则。

注意两点纪律。第一,DAG 的无环性对应时间与因果的不可逆,反馈系统要靠时间展开处理(见第 2.3 节)。第二,一张 DAG 代表一族 SCM:同一个图可以配任意函数形式与噪声分布——图只声明"谁直接影响谁",不声明影响的形状。

图:SCM 与因果图的对照

图:SCM 与因果图的对照

do(X=x):观察与干预的算术差别

条件化 P(Y|X=x) 是"看到 X=x 的那些个体里 Y 的分布",筛选的是人群。干预 P(Y|do(X=x)) 是"把所有人的 X 强制设为 x 后 Y 的分布",改造的是机制。在 SCM 里,do(X=x) 有一个精确到可实现的操作:把 X 的结构方程删掉,换成常数 X=x。这个操作称为图手术(graph surgery)——X 的所有入边被切断,出边保留。

以图中 Z→X、Z→Y、X→Y 为例:Z 同时是 X 的原因和 Y 的原因(混杂)。看到 X=1 时,这个信息沿 Z→X 反向流动,告诉我们"这个人可能 Z 值高",进而抬高对 Y 的预期——关联路径有两条。而 do(X=1) 切断 Z→X 后,X 的取值不再携带关于 Z 的信息,只剩因果路径 X→Y 一条。两分布之差就是混杂偏倚的大小。

由此得到截断分解公式(truncated factorization):对 DAG 而言,观测联合分布按链式规则分解为各变量的条件分布 P(V|pa(V)) 之积;干预分布则把被干预变量的那个因子直接删掉、其余保留:

P(Y | do(X=x)) = Σ_z P(Y | X=x, Z=z) · P(Z=z) (本例中 Z 是 X 的父代集的情形)

注意右端全部是观测分布的函数——这就是"识别"的最小样板:干预量被化归为可观测量的组合。第 3 章的后门准则只是这个样板在任意 DAG 上的推广。

do 算子落地:一个可跑的概念演示

DoWhy 库的识别步骤就是把上述图手术自动化。概念代码如下(示意流程,非完整工程代码):

# 概念演示:把观察查询与干预查询在同一个 SCM 上对比 import numpy as np rng = np.random.default_rng(7) n = 200_000 Z = rng.normal(0, 1, n) # 混杂因子:总体健康素质 X = (0.8 * Z + rng.normal(0, 1, n) > 0).astype(int) # 健康素质高的人更倾向接受处理 Y = 1.5 * X + 2.0 * Z + rng.normal(0, 1, n) # 真实因果系数 1.5 # 观察查询:P(Y | X=1) - P(Y | X=0),含混杂偏倚 obs = Y[X == 1].mean() - Y[X == 0].mean() # 干预查询:do(X=1) vs do(X=0),直接改数据生成机制重采样 Z2 = rng.normal(0, 1, n) X1 = np.ones(n); X0 = np.zeros(n) do_eff = (1.5 * X1 + 2.0 * Z2).mean() - (1.5 * X0 + 2.0 * Z2).mean() print(round(obs, 2), round(do_eff, 2)) # 典型输出约:2.90 与 1.50 —— 观察差被混杂抬高近一倍

这个演示的价值在于把两件事钉死:观察差的偏倚方向与大小由 Z 的两条边共同决定;一旦能做图手术(无论靠实验还是靠识别公式),干预效应就回到真值。真实场景里我们没有生成器,"重采样"必须换成第 3 章的调整公式——识别理论研究的正是哪些图形状下这种替换合法。

概念自查

⚠️ 最常见的错误是把 do(X=x) 当成"筛选 X=x 的子样本再分布"。前者切断入边,后者保留入边。凡是不切断 X 与其原因之间关联的做法,得到的都是条件分布而非干预分布。

三个自查问题。给定图 Z→X→Y(链),do(X=x) 后 Y 的分布等于 P(Y|X=x) 吗?——相等,因为 X 没有其他入边,切断与保留无差别,这正是随机实验的图解释。给定图 X→Z→Y,控制 Z 之后 X 对 Y 还有效应吗?——没有中介路径之外的路径时效应归零,Z 是中介而非混杂。若在上述链上再添一条 Z→W→Y 呢?——仍无后门,结论不变。能在脑内快速回答这类问题,说明图语言已经开始工作;不能,就该回到本节的图手术定义再读一遍。

FAQ:SCM 与回归的三点差别

问题:结构方程和回归方程是一回事吗?

不是。回归 Y 对 X 是条件期望的拟合,"Y = aX + e"里 e 是残差(定义上与 X 无关);结构方程 Y ← bX + U 里 U 是外生原因,允许与 X 的其他原因相关。差别在干预下的行为:改写结构方程(干预)后其余方程保持不变,回归方程没有这个"模块化"性质。这个差别正是"卢卡斯批判"的因果版本——政策改变了机制,历史回归关系随之作废。

问题:图的边一定意味着"直接因果"吗?

边表示"在模型内其他变量保持固定时"的直接依赖。"直接"是相对于变量集的:模型里没放中间变量时,一条边可能汇总了多层传导。所以读图时应先问变量集的粒度,再谈直接与否——这也是因果发现(第 6 章)输出只能到等价类的原因之一。

问题:do 算子能作用于连续变量吗?

能。do(X=x) 对任意取值 x 有定义,干预分布 P(Y|do(X=x)) 关于 x 的函数就是剂量反应曲线(第 5.3 节)。三规则与截断分解对连续情形同样成立,只是积分替代求和。

本节要点回顾

  • SCM 三元组:外生噪声、内生变量、结构方程;因果图是其几何投影,声明"谁直接决定谁"。
  • do 的定义:删除被干预变量的结构方程并置为常数,即图手术——切其入边、留其出边。
  • 截断分解:干预分布 = 观测链式分解去掉被干预因子,是识别的最小样板。
  • 观察与干预的算术差:条件化筛选人群,干预改造机制;两者只在无入边(或已阻断)时重合。
  • 下一节:读懂任意 DAG 的基本功——链、分叉、对撞三型结构与 d 分离。

作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U