你是一家“国家汤品大赛”的新任首席裁判长。今年大赛最受关注的奖项是“最佳调盐贡献奖”——你要在几千份参赛汤品中判断:加盐到底对口感提升有多大贡献?乍一看很简单:把加盐的汤和不加盐的汤分别算平均分,对比一下不就行了?但你不禁犹豫:那些加盐的汤,往往出自更资深的厨师之手,他们不仅会加盐,还懂得火候、选料、摆盘;不加盐的汤大多是新人作品,连调味都不敢冒进。这样一来,“加盐组得分高”到底是盐的功劳,还是厨师手艺的功劳?这就是因果推断中最经典的一道难题——相关性不等于因果性。要解开它,你需要一套严谨的方法论:do-演算(do-calculus)。而其中最关键的第一步,就是“控制变量选择”——决定分析时,应把哪些干扰因素纳入统计控制,哪些必须排除在外。这就像裁判长要决定:评审表中,到底该记录厨师的哪些信息,才能把“盐的功劳”从“厨师手艺的功劳”中干干净净地剥离出来。

岗位关联

因果推断能力正在成为 AI 从业者的核心竞争力。掌握 do-演算与控制变量选择,你就能在数据建模、AB 实验、可解释 AI 等场景中,避免把相关当因果的系统性陷阱,给出可靠的结论。

目录
  1. 可视化演示
  2. 控制变量基础
  3. 混杂偏倚识别
  4. do算子介入
  5. 后门准则应用
  6. 前门工具变量
  7. do演算三规则
  8. 实践与优化
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示因果推断中控制变量选择的四步流程、后门准则图阻断路径原理、以及欠控制、正确控制与过控制三种策略的偏差对比,交互切换三种模式探索。

本节配有交互动效(进入视口后自动加载,约 3KB)。

'+CAPS.mode1+'

控制变量基础

你端坐在主裁判席上,面前的规则书写着一句让人头疼的话:“本届新增'最佳调盐贡献奖',请科学评估加盐对汤品口感的因果贡献。”你翻看往年记录:加盐的汤平均得分 8.1,不加盐的汤平均得分 7.2,差了整整 0.9 分。这个数字能拿上台面吗?你心里清楚:加盐的汤多数出自资深厨师之手,他们掌控着火候、食材、摆盘——这些因素也可能让汤更好喝。数据里的 0.9 分,混杂了“盐的功劳”和“厨师手艺的功劳”。你真正想知道的,是只有盐发生变化、其他一切保持原样时,口感会提升多少。就像问:让同一位厨师,把同一锅汤分成两半,一半加盐一半不加,再盲评,差异是多少?

统计学家把你想知道的量写成 $P(Y|do(X=x))$——“do“表示干预:强制指定加盐与否。而数据直接告诉你的,是 $P(Y|X=x)$——”观察到“加盐与否时 Y 的分布。两者之间的沟壑,就是整篇故事的起点。控制变量选择要做的事,正是找出那些让沟壑出现的”搅局者“,把它们纳入统计口径,从而把观察分布”校正”成干预分布。

回到比赛现场,裁判长要做的第一件事,就是搞清楚该在评审表中记录哪些字段。只有把“围裙等级”这类变量记录下来,后续才有机会从数据中还原盐的真实贡献——这就是变量选择的意义。

P(Y∣do(X=x))≠P(Y∣X=x)\displaystyle P(Y|do(X=x)) \neq P(Y|X=x)
  1. 等号左边——干预分布$do(X=x)$ 表示“通过实验强制所有人把 X 设为 x”,例如规定某一组厨师必须加盐。这切断了一切其他因素对 X 的影响,只留下 X 本身对 Y 的作用。
    do(X=x)do(X=x)
  2. 等号右边——观察分布$P(Y|X=x)$ 表示“观察到 X=x 时 Y 的条件概率”——这只是在记录海量数据中那些选择了 X=x 的样本,没有做任何干预。
    P(Y∣X=x)=P(X=x,Y=y)P(X=x)P(Y|X=x) = \frac{P(X=x, Y=y)}{P(X=x)}
  3. 不等号的意义二者通常不相等,正是因为混杂因子的存在——“是否加盐”并非随机,而是与厨师技艺等高竞争力的因素纠缠在一起。
    观察差异=因果效应+混杂偏倚\text{观察差异} = \text{因果效应} + \text{混杂偏倚}

混杂偏倚识别

大赛现场有位评委,他有个小习惯:看到系着金色围裙的厨师就忍不住多给 0.5 分。金色围裙只有资深厨师才配拥有,而资深厨师恰恰更爱加盐。于是“围裙等级”同时影响了 X(是否加盐)和 Y(评分)——这就是一个典型的混杂因子(confounder)。它打开了一条从 X 通往 Y 的“后门路径”:X ← 围裙等级 → Y。在这条路径上,信息不是从 X 流向 Y,而是从外部流进来,污染了 X 与 Y 的关系。

判断一个变量是否是混杂因子,看两点:它是否影响 X?它是否在 X 之外独立影响 Y?如果两者都成立,它就会制造偏倚。任何科学评估的第一步,就是画一张因果图,把这类变量找出来。这张图上,箭头代表“干预含义”:删掉某条边,意味着外部的某种手段强制切断了这种影响。

回到比赛,你要做的就是先画出这张“因果关系图”:金色围裙等级既指向“是否加盐”,又指向“评分”。有了这张图,你就知道要在评审表中增加一栏“围裙等级”,为后续的统计控制做好准备。

E[Y∣X=1]−E[Y∣X=0]⏟观察差异=E[Y∣do(X=1)]−E[Y∣do(X=0)]⏟因果效应+Bias\displaystyle \underbrace{\mathbb{E}[Y|X=1] - \mathbb{E}[Y|X=0]}_{\text{观察差异}} = \underbrace{\mathbb{E}[Y|do(X=1)] - \mathbb{E}[Y|do(X=0)]}_{\text{因果效应}} + \text{Bias}
  1. 观察差异不加控制时直接比较“加盐组”和“不加盐组”的平均评分,这是你手上数据直接算出来的数。
    E[Y∣X=1]−E[Y∣X=0]\mathbb{E}[Y|X=1] - \mathbb{E}[Y|X=0]
  2. 因果效应假设已经做了强制干预实验,两组唯一差别只有加盐,这时候的平均分差。
    E[Y∣do(X=1)]−E[Y∣do(X=0)]\mathbb{E}[Y|do(X=1)] - \mathbb{E}[Y|do(X=0)]
  3. 混杂偏倚 Bias观察差异中被“围裙等级”这类第三方因素推高的部分。偏倚可正可负,也可能把真实效应完全掩盖掉。
    Bias=∑z(E[Y∣Z=z]−E[Y])(P(Z=z∣X=1)−P(Z=z∣X=0))\text{Bias} = \sum_{z} \big(\mathbb{E}[Y|Z=z] - \mathbb{E}[Y]\big)\big(P(Z=z|X=1) - P(Z=z|X=0)\big)

do算子介入

你决定不再坐等数据,而是主动出击:在复赛阶段随机抽签,把 100 名厨师分成两组——A 组强制加盐、B 组强制不加盐。其余流程完全照旧。这就是一次真正的干预,统计语言写为 $do(X=1)$ 与 $do(X=0)$。神奇的事情发生了:因为加盐与否由抽签决定,和厨师技艺、围裙等级完全无关,后门路径上的 Z→X 那条边就被切断了。

do 算子的作用,就是在因果图上删除所有指向 X 的箭头。删除之后,X 变成由外部“强制设定”的变量,不再受任何混杂因素影响。你可以把它理解为:厨师长一声令下“今天这锅汤,我说了算”,于是所有“资深厨师才爱加盐”的规律统统失效。

实际比赛里,你并不能强制所有厨师改变习惯,只能对少数人做干预实验。do 算子让你在数学上“切除”外部影响,把小规模随机实验的结论推广到全体——这正是因果推断强大的地方:一场只有 100 人的抽签实验,就能推算出几千名厨师都听令时会发生什么。

P(Y=y∣do(X=x))=∑zP(Y=y∣X=x,Z=z) P(Z=z)\displaystyle P\big(Y=y \mid do(X=x)\big) = \sum_{z} P\big(Y=y \mid X=x, Z=z\big)\, P(Z=z)
  1. do 干预——删边在因果图中去掉所有指向 X 的入边,X 成为“受控变量”,这是与普通条件概率在图形上最本质的区别。
    G→GX‾(删除所有X的入边)G \to G_{\overline{X}} \quad(\text{删除所有} X \text{的入边})
  2. 在 Z 的每一层内看关系对厨师技艺的每个取值 z,分别计算出“加盐时评分”和“不加盐时评分”的条件分布,此时 Z 被固定,不再干扰。
    P(Y=y∣X=x,Z=z)P(Y=y \mid X=x, Z=z)
  3. 按 Z 的原始分布加权把每一层的结果乘上 $P(Z=z)$ 再加总——相当于保留原始样本中各级别厨师的比例,模拟“在全体厨师的混合体中统一施加干预”的效果。
    ∑zP(Y=y∣X=x,Z=z) P(Z=z)\sum_{z} P(Y=y \mid X=x, Z=z)\, P(Z=z)

后门准则应用

如果复赛也不能做随机干预呢?比如大赛规定不许干扰厨师操作。你还有一个策略:后门准则。所谓后门路径,就是从 X 出发、逆着箭头方向走到某个混杂因子,再顺着箭头方向到达 Y 的路径。厨师的围裙等级 Z 就打开了一条这样的路径。后门准则说:如果你能找到一个变量集合 Z,它满足“阻断所有从 X 到 Y 的后门路径”且“不包含 X 的后代”,那么你无需干预,只需在统计分析时按 Z 分层,就能得到因果效应。

这就像一个聪明的裁判长说:我无法让每位厨师都听令加盐,但我记录下所有人的围裙等级,然后“在同一个等级内部”比较加盐与不加盐的差异,再把各个等级的结果按人数加权。相当于把后门给堵上,再重新统计。这里的 Z 在公式里被称为“充分协变量集”——它不需要包含所有变量,但必须能阻断所有后门路径。

实际工程中,我们往往不需要控制所有变量,而只需要控制一个“最小充分集合”——用最少的变量阻断所有后门路径。例如,围裙等级和锅具品牌高度相关,控制了围裙等级后,锅具品牌就不再提供额外信息,也就不必再控制。这能有效降低维度灾难,也让分析结果更鲁棒。

P(Y=y∣do(X=x))=∑zP(Y=y∣X=x,Z=z) P(Z=z),Z 满足后门准则\displaystyle P\big(Y=y \mid do(X=x)\big) = \sum_{z} P\big(Y=y \mid X=x, Z=z\big)\, P(Z=z), \quad Z \text{ 满足后门准则}
  1. 后门准则的图形条件Z 必须阻断 X 与 Y 之间的所有后门路径(即所有从 X 出发逆箭头而行再顺箭头到达 Y 的路径),并且 Z 不能是 X 的后代。
    For all paths X←⋯→Y: blocked by Z\text{For all paths } X \leftarrow \cdots \to Y: \text{ blocked by } Z
  2. 分层计算把样本按 Z 的取值(如围裙等级金/银/铜)分成若干层,在每层内计算 X 对 Y 的条件影响。
    P(Y=y∣X=x,Z=z)P\big(Y=y \mid X=x, Z=z\big)
  3. 加权求和用 $P(Z=z)$ 对各层结果加权,还原整体人口中 Z 的分布——这就是“标准化”操作。
    ∑zP(Y=y∣X=x,Z=z) P(Z=z)\sum_{z} P\big(Y=y \mid X=x, Z=z\big)\, P(Z=z)

前门工具变量

有时,即使后门准则也无法满足:你根本测量不到混杂因子“厨师手感”——它是种玄学。但你发现了一条新的路径:加盐会先改变“调味手法 M”(比如抖盐次数、盐粒粗细),而 M 直接决定评分。也就是说,X 经由 M 影响 Y,且 M 到 Y 之间没有其他后门干扰。这就是前门准则:通过测量中介变量 M,用两次后门调整拼接出 X 对 Y 的总效应。另一条出路是寻找工具变量。你发现一个奇妙的“盐罐”:大赛统一使用容量忽大忽小的盐罐,厨师想多加盐但盐罐不给力,导致“盐罐容量”强烈影响 X,却不直接影响 Y——它只能通过 X 这条唯一路径作用于 Y。这个盐罐容量就是一个工具变量,它像一个“天然的随机装置”,替你完成了一次无需你动手的随机化。

在真实场景中,前门准则要求 M 必须是一个可测量、且 X 对 Y 的效应全部经由 M 传递的中介变量;工具变量则要求工具 Z 与 X 强相关、与 Y 仅通过 X 相连。理解这三种识别策略——后门、前门、工具变量——你就掌握了 do-演算的核心直觉,它们分别是“分层堵路”“绕道中介”和“寻找天然随机装置”。

P(Y=y∣do(X=x))=∑mP(M=m∣X=x)∑x′P(Y=y∣X=x′,M=m) P(X=x′)\displaystyle P(Y=y \mid do(X=x)) = \sum_{m} P(M=m \mid X=x) \sum_{x'} P(Y=y \mid X=x', M=m)\, P(X=x')
  1. 第一层X 对 M 的效应:先看加盐如何影响调味手法 M 的分布,用观察概率 $P(M=m \mid X=x)$ 直接估计。
    P(M=m∣X=x)P(M=m \mid X=x)
  2. 第二层M 对 Y 的总效应:以 X 为混杂变量,对 M 到 Y 的关系做一次后门调整:在每个 X 水平内看 M 与 Y 的关系,再按 $P(X=x')$ 加权。
    ∑x′P(Y=y∣X=x′,M=m) P(X=x′)\sum_{x'} P(Y=y \mid X=x', M=m)\, P(X=x')
  3. 嵌套组合把这两个效应相乘并对所有 m 求和,得到 X 通过 M 传导到 Y 的完整间接效应。
    ∑m[P(M=m∣X=x)×∑x′P(Y=y∣X=x′,M=m) P(X=x′)]\sum_{m} \Big[P(M=m \mid X=x) \times \sum_{x'} P(Y=y \mid X=x', M=m)\, P(X=x')\Big]

do演算三规则

现在你有了裁判长的“万能手册”。do-演算的核心,是三条永远正确的改写规则。它们让你在一个包含干预操作 $do(\cdot)$ 的表达式中,逐步删除 do 符号、替换成可计算的观察概率,甚至在无法做任何实验时,仅凭因果图推出因果效应。规则一说:如果一个变量在干预后的图中已经与结果条件独立,就可以把它从条件集合中删掉。规则二说:如果一个变量处在一个“被干预”的位置,但你只是想“观察”它,那么干预与观察可以互换。规则三说:如果一个变量与干预后的结果独立,并且它不会开启新的路径,就可以直接把它从 do 里面抹去。三条规则,对应着三种“化简手术”。

这三条规则合在一起是完备的:只要一个因果效应能从观察数据中识别出来,就一定可以通过有限次应用这三条规则推导出无 do 的表达式。Shpitser 与 Pearl 在 2006 年证明了这一点。对于裁判长来说,这相当于拿到一座数学金矿:即使永远无法做随机实验,只要因果图正确,你仍能算出“加盐的因果贡献”。就像一位经验丰富的大厨,仅凭观察别人的操作,就能推算出自己动手做时味道会有什么变化。

规则一:P(Y∣do(X),Z,W)=P(Y∣do(X),W)如果 Y⊥Z∣X,W 在 GX‾\displaystyle \text{规则一:} P(Y \mid do(X), Z, W) = P(Y \mid do(X), W) \quad \text{如果 } Y \perp Z \mid X, W \text{ 在 } G_{\overline{X}}
规则二:P(Y∣do(X),do(Z),W)=P(Y∣do(X),Z,W)如果 Y⊥Z∣X,W 在 GX‾Z‾\displaystyle \text{规则二:} P(Y \mid do(X), do(Z), W) = P(Y \mid do(X), Z, W) \quad \text{如果 } Y \perp Z \mid X, W \text{ 在 } G_{\overline{X}\underline{Z}}
规则三:P(Y∣do(X),do(Z),W)=P(Y∣do(X),W)如果 Y⊥Z∣X,W 在 GX‾Z(W)‾\displaystyle \text{规则三:} P(Y \mid do(X), do(Z), W) = P(Y \mid do(X), W) \quad \text{如果 } Y \perp Z \mid X, W \text{ 在 } G_{\overline{X}\overline{Z(W)}}
  1. 规则一删除多余观察项:在删除了 X 所有入边的图 $G_{\overline{X}}$ 中,若 Z 与 Y 条件独立,则可以删除条件中的 Z——这个被观测的变量不再携带任何信息,留着只会增加噪声。
    GX‾⊢Y⊥Z∣X,W⇒P(Y∣do(X),Z,W)=P(Y∣do(X),W)G_{\overline{X}} \vdash Y \perp Z \mid X, W \Rightarrow P(Y \mid do(X), Z, W) = P(Y \mid do(X), W)
  2. 规则二干预与观察互换:在删除了 X 入边且删除了 Z 出边的图 $G_{\overline{X}\underline{Z}}$ 中,若 Z 与 Y 条件独立,则“干预 Z”可以改写为“观察 Z”——Z 的行为变得像一个普通观察变量。
    GX‾Z‾⊢Y⊥Z∣X,W⇒P(Y∣do(X),do(Z),W)=P(Y∣do(X),Z,W)G_{\overline{X}\underline{Z}} \vdash Y \perp Z \mid X, W \Rightarrow P(Y \mid do(X), do(Z), W) = P(Y \mid do(X), Z, W)
  3. 规则三忽略无关干预:在删除了 X 入边及所有不含 W 祖先的 Z 入边的图 $G_{\overline{X}\overline{Z(W)}}$ 中,若 Z 与 Y 条件独立,则可以直接删除 do(Z)——干预 Z 对 Y 没有任何直接作用。
    GX‾Z(W)‾⊢Y⊥Z∣X,W⇒P(Y∣do(X),do(Z),W)=P(Y∣do(X),W)G_{\overline{X}\overline{Z(W)}} \vdash Y \perp Z \mid X, W \Rightarrow P(Y \mid do(X), do(Z), W) = P(Y \mid do(X), W)

实践与优化

理论丰满,现实骨感。你回到赛场,发现真实世界的数据往往很乱:漏记了围裙等级、混入了“评委心情”变量、加盐和火候高度相关……工程师面对一桌乱数据,怎么选择控制变量?这里有一套四步法:第一步,与业务方共同画出因果图——把所有“既影响 X 又影响 Y”的候选变量放进清单;第二步,用后门准则找出满足条件的变量集,优先选最小充分集;第三步,用倾向性得分匹配、分层回归或因果树进行统计调整;第四步,做敏感性分析,验证结论在未观测混杂存在时是否仍然稳健。

常见的坑有三个:一是“控制过头”——把 X 的后代(如“盐的结晶度”)也当作控制变量,这会封堵一部分真实效应;二是“控制不足”——漏掉关键混杂,比如没记录围裙等级;三是“控制无关项”——引入纯噪声变量,白白增大方差。这三种错误分别对应:把后门堵一半、根本没堵、以及堵了一扇根本不存在的门。选择控制变量不仅影响模型的系数,还影响推理的置信区间——变量选得越精巧,结论越锋利;选得越粗糙,结论越钝。

掌握这套流程,你就能在工业界的因果推断项目中,从“看见相关”走向“证明因果”。正如裁判长最终交出报告:加盐的真实贡献为 0.32 分(95% 置信区间 [0.21, 0.43]),而不是初看时的 0.9 分——那消失的 0.58 分,就是“厨师手艺”这层滤镜给你造成的错觉。

实践四步流程:因果图建模  →  后门准则选变量  →  分层/加权调整  →  敏感性分析\text{实践四步流程} \quad : \quad \text{因果图建模} \;\to\; \text{后门准则选变量} \;\to\; \text{分层/加权调整} \;\to\; \text{敏感性分析}
  1. 因果图建模与领域专家一起画出 X、Y 和所有候选混杂因子的有向无环图,这是整个分析的决定性一步。
    DAG:Z1,Z2,…,Zk→X,Z1,Z2,…,Zk→Y\text{DAG}: Z_1, Z_2, \dots, Z_k \to X, \quad Z_1, Z_2, \dots, Z_k \to Y
  2. 后门准则选变量从候选集合中挑出能够阻断所有后门路径、且不做多余控制的最小变量集。
    Select Z∗⊆{Z1,…,Zk} satisfying backdoor criterion\text{Select } Z^* \subseteq \{Z_1, \dots, Z_k\} \text{ satisfying backdoor criterion}
  3. 分层/加权调整将选出的变量放入统计模型,通常用分层加权或回归调整得到效应的点估计。
    τ^=∑z∗(E^[Y∣X=1,Z∗=z∗]−E^[Y∣X=0,Z∗=z∗])P^(Z∗=z∗)\hat{\tau} = \sum_{z^*} \big(\hat{\mathbb{E}}[Y \mid X=1, Z^*=z^*] - \hat{\mathbb{E}}[Y \mid X=0, Z^*=z^*]\big) \hat{P}(Z^*=z^*)
  4. 敏感性分析考察若存在未观测混杂 U,结论是否被推翻——这决定了分析的可信度边界。
    Check robustness under U with varying ρ\text{Check robustness under } U \text{ with varying } \rho

AI 应用场景

场景一:推荐系统的因果纠偏

阶段:特征工程与模型评估

解决的问题:推荐系统训练数据中,用户是否点击某个商品受到“商品曝光位置”的干扰——排在首页的商品本就更容易被点击,但这并不代表推荐算法真正喜欢它们。传统 CTR 模型把位置特征当作普通特征训练,导致模型把“位置效应”误学为“内容效应”。通过 do-演算控制变量选择,将曝光位置视为混杂因子 Z,用后门准则把位置影响从样本中剔除,训练出对内容质量的无偏估值。

具体案例:某短视频平台发现推荐算法的线上点击率偏高但用户留存下降。工程师引入位置混杂校正后,重新抽取训练样本,将“是否在首页曝光”作为控制变量分层训练,模型评估指标改用经后门调整后的因果点击率,最终留存提升 5%。

场景二:可解释 AI 中的因果特征归因

阶段:模型解释与公平性分析

解决的问题:SHAP 等归因工具只能给出特征相关性,无法回答“如果强制改变该特征,模型输出会怎样”。利用 do-演算,可将特征视为 X,模型输出视为 Y,在因果图上识别哪些特征存在混杂(如年龄与收入高度相关),并通过控制变量选择得到每个特征的因果归因。

具体案例:信贷风控团队使用因果归因解释拒绝贷款决策。他们发现学历特征与收入存在混杂路径,通过后门调整后,学历的因果贡献从表面上的 12% 下降到 4%,避免了模型对高学历的虚假偏好,也降低了监管合规风险。

场景三:AB 实验失效时的因果替代

阶段:实验设计与效果度量

解决的问题:某些场景无法做随机 AB 实验(如新功能灰度范围受限、政策限制)。这时需要利用观察数据进行因果推断。控制变量选择是其中关键:先画因果图,选出阻断后门路径的最小协变量集,再使用倾向性得分加权或分层分析估计干预效果。

具体案例:某电商平台无法对部分用户强制关闭“运费险”来做 AB 实验。团队改用店铺历史数据,以“用户是否购买运费险”为 X,“复购率”为 Y,将用户城市等级、客单价、投诉率作为控制变量,用后门准则识别出运费险的真实因果效应,指导了保险定价策略调整。

Python 演示

python39 行
# -*- coding: utf-8 -*-"""后门准则演示:控制变量选择如何消除混杂偏倚。"""import numpy as np np.random.seed(42)n = 3000 # 生成数据:Z(厨师技艺)影响 X(是否加盐)与 Y(口感评分)Z = np.random.normal(0, 1, n)X = 0.8 * Z + np.random.normal(0, 0.6, n)Y = 1.2 * X + 0.8 * Z + np.random.normal(0, 1, n) def stratal_adjustment(X, Y, Z, bins=10):    """按 Z 分层,加权估计 X 对 Y 的平均因果效应。"""    cut = np.quantile(Z, np.linspace(0, 1, bins + 1)[1:-1])    layer = np.digitize(Z, cut)    effect = 0.0    for s in range(bins):        mask = layer == s        if mask.sum() < 5:            continue        weight = mask.sum() / len(X)        beta_s = np.cov(X[mask], Y[mask])[0, 1] / np.var(X[mask])        effect += weight * beta_s    return effect # 朴素估计:未控制 Z(观察差异)naive = np.cov(X, Y)[0, 1] / np.var(X)print("朴素估计(未控制Z): %.3f" % naive) # 后门调整:控制 Z 后的因果效应adjusted = stratal_adjustment(X, Y, Z)print("后门调整(控制Z, 分层加权): %.3f" % adjusted) # 用多元线性回归做同样的事A = np.column_stack([X, Z, np.ones(n)])coef = np.linalg.lstsq(A, Y, rcond=None)[0]print("回归调整(控制Z): %.3f" % coef[0])print("真实因果效应: 1.200")
目的:用模拟数据演示混杂偏倚——未控制 Z 时,X 对 Y 的表观效应显著偏离真实值 1.2;采用后门准则对 Z 分层加权后,估计值收敛到真实因果效应。
  1. X = 0.8 * Z + np.random.normal(0, 0.6, n)生成处理变量 X,它与混杂因子 Z 正相关,模拟“资深厨师更爱加盐”。
  2. Y = 1.2 * X + 0.8 * Z + ...生成结果 Y:真实因果效应为 1.2,混杂贡献 0.8。
  3. layer = np.digitize(Z, cut)把连续的 Z 切分成 10 层,等价于把厨师按技艺水平分组。
  4. beta_s = np.cov(X[mask], Y[mask])[0, 1] / np.var(X[mask])在每个 Z 层内做一元回归,得到该层的局部效应。
  5. effect += weight * beta_s按各层人数占比加权,得到全体的平均因果效应,即后门调整公式的数值实现。
  6. coef = np.linalg.lstsq(A, Y, rcond=None)[0]用多元回归同时控制 X 和 Z,得到另一种等价的后门调整估计。
  7. print("朴素估计...")输出未控制 Z 时的偏倚结果,直观展示不加控制变量的危害。

常见误区

误区“既然要控制变量,那就把能拿到的变量全都塞进模型,这样总不会错吧?”很多初学者认为控制变量越多越安全。

正解这是典型的“控制过头”。如果控制了一个本身是 X 结果的变量(如“盐的结晶度”是加盐的直接结果),就会阻断 X 通过真实机制对 Y 的传导,导致因果效应被低估甚至完全消失。正确的做法是只控制满足后门准则的变量,且优先选择最小充分集。就像裁判长不应把“厨师是否出汗”也记进评审表——出汗可能只是加盐后的生理反应,跟口感毫无关系,记了反而破坏分析。

为何常见:机器学习里“特征越多模型越强”的惯性思维,让人把数据量等同于信息量,忽视了因果图中“控制什么”比“有多少数据”更关键。

误区“我看了数据,加盐组的评分显著更高,所以加盐一定提升口感。”初学者容易把 $P(Y|X)$ 和 $P(Y|do(X))$ 混为一谈。

正解观察数据中 X 的取值是系统自选的,混杂因子 Z 同时推高了 X 和 Y。只有在做过随机干预或按后门调整之后,$P(Y|X)$ 才能近似等于 $P(Y|do(X))$。一个直观判断方法是问自己:“如果强行让所有人都加盐,数据的分布会和现在一样吗?”答案几乎总是“不一样”。

为何常见:人类大脑天然擅长发现相关,却不容易自动化地检验混杂,尤其在数据量大、变量多的情况下,相关关系太显眼而因果机制太隐蔽。

误区“只要找一个和 X 相关的变量就能当工具变量。”初学者常把工具变量理解为“X 的另一份观测值”。

正解工具变量必须同时满足三个条件:与 X 强相关;对 Y 没有直接效应;与 Y 之间不存在任何后门路径。这三条缺一不可。“盐罐容量”之所以是好工具,是因为它只通过加盐量这条路径影响评分。如果盐罐容量同时影响厨师情绪,而情绪又直接影响评委打分,那它就不再是有效工具变量。

为何常见:工具变量的定义在数学上简洁,但现实中“直接影响 Y”的路径很难排除,学习者容易忽略对排除性约束的严格检验。

误区“因果图嘛,把相关变量连上线就完了。”很多团队把相关矩阵当作因果图,变量间只要相关系数高就连一条边。

正解因果图的每条边都代表一个明确的“干预含义”:删掉 X 的入边意味着外部强加 X 的值。箭头方向一旦画错,后门准则和 do-演算的结果就会完全失效。正确做法是与领域专家反复确认变量间的机制方向,使用结构学习算法作为辅助,而不是拍脑袋连线。裁判长画图时,必须确认到底是“围裙等级”影响“加盐习惯”,还是反过来——方向错了,整个分析就错了。

为何常见:因果关系与相关关系在视觉上都是“连线”,但因果方向来自领域知识而非数据相关,容易让人用数据直觉替代实质判断。

误区“我已经控制了所有能找到的变量,结论一定是对的。”还有些初学者认为控制变量齐了因果推断就完全可靠。

正解现实中永远可能存在未观测混杂因子 U(比如厨师基因、市场大环境)。敏感性分析可以告诉你:U 需要有多大强度才能推翻当前结论。如果 U 只有极小的相关性就能逆转结论,那么分析结果不可信。优秀的因果研究报告,一定会报告不同混杂强度下结论的稳定性区间。

为何常见:人们天然偏好确定性答案,容易把“已观测”当成“已完备”,忽略了因果推断中“不可观测世界”的普遍存在。

面试题

Q1. 观察分布 $P(Y|X=x)$ 与干预分布 $P(Y|do(X=x))$ 不等的最主要原因是?

单选题 · easy

  • A.样本量不足
  • B.存在混杂因子← 正确答案
  • C.数据缺失较多
  • D.结果变量离散

答案:B。混杂因子同时影响 X 和 Y 时,$P(Y|X=x)$ 中混入了外部因素的作用,而 $P(Y|do(X=x))$ 是纯粹干预的效果。样本量、缺失值和变量离散性会带来噪声或限制,但都不是两者系统性不等的原因。好比加盐组评分高,是因为资深厨师(混杂 Z)既爱加盐又做得好。

Q2. 后门准则要求控制变量集 Z 满足的核心条件是?

单选题 · easy

  • A.包含 X 的全前驱
  • B.阻断全部后门路径← 正确答案
  • C.包含 Y 的全部后代
  • D.Z 与 X 互不相关

答案:B。后门准则的定义是 Z 阻断所有从 X 到 Y 的含指向 X 箭头的后门路径,且 Z 中不含 X 的后代。A 不是充分条件,C 会引入对撞偏差,D 与阻断要求恰好相反。

Q3. do 算子 $do(X=x)$ 在因果图上的操作等价于?

单选题 · mid

  • A.删除 X 的入边← 正确答案
  • B.删除 X 的出边
  • C.新增指向 X 的边
  • D.把 X 与 Y 合并

答案:A。do 干预意味着 X 由外部强制设定,不再受其自然原因影响,因此删除所有指向 X 的入边 $G_{\overline{X}}$。删除出边是规则二的操作,新增边和合并节点都不符合干预语义。

Q4. 前门准则主要适用于以下哪种情形?

单选题 · mid

  • A.混杂因子可直接测量
  • B.混杂不可测但中介可测← 正确答案
  • C.需要工具且父节点未知
  • D.数据完全来自随机实验

答案:B。前门准则正是当 X 与 Y 之间的混杂不可观测时,通过可观测的中介变量 M(X→M→Y)实施两次后门调整来识别效应。A 情况可以直接用后门准则,C 属于工具变量思路,D 情形根本不需要调整。

Q5. 工具变量需要满足哪些条件?

多选题 · mid

  • A.与处理变量 X 强相关← 正确答案
  • B.对结果 Y 无直接效应← 正确答案
  • C.与 Y 间无未阻断后门← 正确答案
  • D.必须是连续型变量

答案:ABC。工具变量三条件为相关性、排除性、外生性,即 A、B、C。D 是错的,工具变量可以是二值或分类变量,只要满足三条件即可。好比“盐罐容量”是随机忽大忽小的工具变量,它影响加盐但本身不影响评委打分。

Q6. 某图符合 $X \leftarrow Z \rightarrow Y$ 且 $X \rightarrow Y$,以下哪个说法正确?

单选题 · hard

  • A.不控制 Z 时系数等于因果效应
  • B.控制 Z 后系数是无偏因果效应← 正确答案
  • C.结构图中 Z 是中介变量
  • D.控制 Z 会引入对撞偏倚

答案:B。该结构 Z 是 X 与 Y 的共同原因(混杂因子),后门路径 X←Z→Y 被 Z 阻断后,回归调整能得到无偏因果效应。A 中不控制 Z 会有偏,C 中 Z 是混杂而非中介,D 中控制 Z 是阻断后门而不是制造对撞。

Q7. 关于 do-演算三规则,以下哪些描述正确?

多选题 · hard

  • A.规则一可删独立观察变量← 正确答案
  • B.规则二可交换干预与观察← 正确答案
  • C.规则三可删独立干预变量← 正确答案
  • D.三规则无需条件直接使用

答案:ABC。A、B、C 分别是规则一、二、三的描述。规则三的删除条件是“Z 与 Y 在删边后的图中条件独立”,并非无条件;D 忽视了每条规则前面的独立性前提。

Q8. 为了估计“是否购买运费险(X)对复购率(Y)的因果效应”,你控制了“城市等级”和“客单价”,但漏掉了“投诉率”,因为它同时影响购买运费险和复购。这属于哪种错误?

单选题 · mid

  • A.控制过头
  • B.控制不足漏掉混杂← 正确答案
  • C.控制了工具变量
  • D.引入对撞偏倚

答案:B。投诉率同时影响 X 和 Y,是一个典型的混杂因子。遗漏它相当于没有完全阻断后门路径,得到的估计仍包含偏倚,这是“控制不足”。

Q9. 敏感性分析的核心目的是什么?

单选题 · hard

  • A.验证训练集预测精度
  • B.评估未观测混杂的强度影响← 正确答案
  • C.计算置信区间宽度
  • D.确定工具变量相关性

答案:B。因果推断永远可能受未观测混杂影响,敏感性分析通过引入假设的未观测混杂 U,给出其强度与结论翻转阈值的关系,从而衡量结论的稳健性。预测精度和置信区间属于传统统计范畴,不是敏感性分析重点。

Q10. 已知因果图 X→M→Y、X←U→Y,U 不可观测,M 可观测。识别 $P(Y|do(X=x))$ 的表达式是?

单选题 · extreme

  • A.前门公式两层加权调整← 正确答案
  • B.直接观察条件分布估计
  • C.按不可观测 U 分层加权
  • D.中介分布与条件概率相乘

答案:A。U 不可观测时无法按 C 操作;B 是观察分布,不等于干预分布;D 缺少对 X 的再次求和,项也不完整。正确做法是前门调整公式:先以 X 为混杂调整 M→Y,再按 X→M 的分布加权,从而绕开不可观测的 U 识别因果效应。