推理破案时,侦探往往无法重现凶案现场,只能靠旁观者的证词、现场痕迹和逻辑推演来还原真相。AI 里的因果推断也是这样:我们不能真的去“干预世界”做实验,只能拿着观测数据这类“目击证词”,反推变量之间到底有没有因果关系。而识别算法 IDC,就像是那位经验老到的“结案鉴定专家”——它站在 do-演算的推理法则之上,帮我们判断:在只有观测数据、没有实验干预的条件下,某个因果效应能不能被“算出来”?如果能,又该用什么样的公式把它算出来? 这篇文章会用“侦探破案”这个比喻贯穿始终。我们会先陪侦探弄明白“什么是识别问题”,再学习他手里的“关系地图”(因果图)、最常用的两种“结案手法”(后门准则与前门准则),最后看看通用的“结案算法”(ID 算法)以及如何在代码里落地。你会发现,原本藏在公式里的因果推断,其实就是一个训练有素的侦探,如何从混乱的目击证词里挑出真正的作案逻辑。

岗位关联

掌握识别算法 IDC,是因果推断从“纸上谈兵”走向“工程落地”的关键一步——它能让你在无法做 A/B 实验的场景下,仍然用观测数据给出可信的因果结论,大幅提升数据驱动决策的质量。

目录
  1. 可视化演示
  2. 识别问题是什么
  3. 因果图与do算子
  4. 后门准则破案
  5. 前门准则取证
  6. ID算法总动员
  7. 工程落地实践
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示do-演算中IDC条件干预识别算法,递归剥离与结果独立的条件变量,归约到ID算法识别纯干预部分,直观理解IDC的完备性与不可识别判定。

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

识别算法IDC 条件剥离:IDC递归寻找与结果独立的条件子集,用do-演算规则剥离 归约到ID:剥离后剩余纯干预查询交给ID算法识别,不可识别则IDC也不可 完备性:IDC失败意味着任何方法都无法识别,问题本身无解 IDC: P(y|do(x),z) → ID(P(y|do(x))) IDC算法递归剥离条件实现条件干预识别

识别问题是什么

侦探接到一个案子:有人怀疑“新药 X”能提高“康复率 Y”,但凶案现场的“证人”只有一堆医院的历史病历,没有机会重新做一轮严格的随机对照实验。侦探想:我能不能仅凭这些“目击证词”(观测数据),推出“如果我强迫所有人吃新药,会怎样”的因果结论? 这个“能不能推出、怎么推出”的问题,就叫识别问题(Identification Problem)。

在因果推断里,“观测”和“干预”是两回事。观测是看人们本来的行为,而干预是“do(X=x)“——强行把变量 X 设成某个值。前者只告诉我们”吃药的人康复率更高“,后者才回答”吃药导致康复率更高”。识别算法 IDC 要做的,就是把前者翻译成后者:找到一种方法,让 \(P(Y \mid do(X))\) 这种带干预的分布,能由观测数据 \(P(Y \mid X, Z)\) 这样的普通分布唯一地算出来。

这里要区分两个词:识别(identification) 与估计(estimation)。识别解决的是“公式存不存在”的问题,是理论层面的“能不能算”;估计解决的则是“算出来的数值准不准”,是数据层面的“算得有多好”。先有识别,才有估计。

回到侦探的故事:识别问题就是问“这个案子能不能只靠现有证据结案”。如果能,识别算法就会给出一个“还原真相”的公式;如果不能,侦探就得老实承认:证据不足,需要补充调查。

ACE=E[Y(1)]−E[Y(0)]\text{ACE} = \mathbb{E}[Y(1)] - \mathbb{E}[Y(0)]
平均因果效应(ACE)就是“吃药结果”与“不吃药结果”的期望之差。识别算法的目标,就是把这个差值从观测数据里“还原”出来。
  1. 对照两组结果比较“所有人都吃药”的世界与“所有人都不吃药”的世界。
    ACE=E[Y(1)]−E[Y(0)]\text{ACE} = \mathbb{E}[Y(1)] - \mathbb{E}[Y(0)]
  2. \(Y(1)\) 与 \(Y(0)\)分别表示同一个病人在“吃药”和“不吃药”两种平行世界里的康复情况。
    Y(1):干预组潜在结果Y(0):对照组潜在结果Y(1): \text{干预组潜在结果} \quad Y(0): \text{对照组潜在结果}
  3. 期望 \(\mathbb{E}[\cdot]\)把所有人的潜在结果取平均,得到群体层面的因果效应。
    E[Y]=∑yy×P(Y=y)\mathbb{E}[Y] = \sum_y y \times P(Y=y)

因果图与do算子

侦探接手案子后,第一件事是画一张“人物关系图”——谁认识谁、谁可能影响谁。因果推断里的有向无环图(DAG) 就是干这个用的:节点是变量,箭头是“直接影响”。比如 \(X \rightarrow Y\) 表示“治疗影响康复”,而 \(Z \rightarrow X\)、\(Z \rightarrow Y\) 表示还有一个“干扰分子” \(Z\) 同时影响治疗和康复,这就是传说中的混淆因子(confounder)。

DAG 之所以必须“无环”,是因为因果关系不能反过来把自己当成原因——就像侦探不会认为“伤口导致刀”一样。有了这张关系图,do 算子就有了用武之地。\(do(X=x)\) 的含义是“强制让 X 取值为 x”,在图上相当于把指向 X 的所有箭头全部剪掉,因为干预切断了自然界的其他因素对 X 的影响。

为什么剪箭头很关键?因为我们观测到的 \(X\) 是“自然长出来的”,它受 Z 影响;而 \(do(X)\) 是“我们亲手设定的”,它与 Z 无关。这个差异正是因果效应和普通相关关系的分水岭。

侦探画完关系图,心里就有谱了:图中每一个箭头都代表一条“证据链”;do 算子的剪箭头动作,则代表“警察强制控制嫌疑人”——世界从此不一样了。

P(Y=y∣do(X=x))=P(Y=y∣X=x,do(Z=原值))P(Y=y \mid do(X=x)) = P(Y=y \mid X=x, \text{do}(Z=\text{原值}))
这个表达式提醒我们:干预之后,Z 对 X 的影响被切断了,但 Z 仍然可能直接影响 Y。识别算法的任务,就是在这种“剪断箭头”的新世界里,把因果分布转化成可计算的观测分布。
  1. 干预动作 \(do(X=x)\)把 X 强行设为 x,模拟“让所有人都吃药”。
    do(X=x):将从 Z 指向 X 的箭头全部剪除\text{do}(X=x): \text{将从 Z 指向 X 的箭头全部剪除}
  2. 剪箭头后的世界干预后的分布记作 \(P(Y \mid do(X))\),与普通条件分布 \(P(Y \mid X)\) 截然不同。
    P(Y=y∣do(X=x))≠P(Y=y∣X=x)P(Y=y \mid do(X=x)) \neq P(Y=y \mid X=x)
  3. 保留 Z 的作用Z 对 Y 的直接箭头依然存在,因此 Y 的分布仍受 Z 影响。
    P(y∣do(x))=∑zP(y∣x,z)P(z)(如果 Z 满足后门准则)P(y \mid do(x)) = \sum_z P(y \mid x, z) P(z) \quad (\text{如果 } Z \text{ 满足后门准则})

后门准则破案

最常见的破案套路叫后门准则(Back-door Criterion)。侦探发现,从 X 到 Y 除了那条“直接证据链”之外,还有一条“暗路”:\(X \leftarrow Z \rightarrow Y\)。这条暗路就是后门路径,因为它从 X 的背后绕进了 Y。干扰分子 Z 打开了一扇“后门”,让治疗和康复之间出现了“假关联”——就像病人因为病情重(Z)才吃药(X),而病情重本来就更容易康复慢(Y),于是“吃药导致康复慢”就成了冤枉。

后门准则告诉我们:只要找到一个变量集合 \(Z\),它能阻断所有后门路径,且 \(Z\) 中没有 X 的后代节点,那么我们就可以通过“按 Z 分层再加权平均”的方式,把因果效应算出来。换句话说,在 Z 的每一层内部,X 和 Y 的关联就是因果关联——因为同病情的病人里,吃不吃药就是近似随机的了。

侦探把这个公式叫作“分层审问法”:先把所有证人按“病情轻重”分组,再在每一组里单独对比吃药与不吃药的效果,最后按各组人数比例汇总成总报告。这就是后门调整的智慧。

P(Y=y∣do(X=x))=∑zP(Y=y∣X=x,Z=z)⋅P(Z=z)P(Y=y \mid do(X=x)) = \sum_{z} P(Y=y \mid X=x, Z=z) \cdot P(Z=z)
这就是著名的后门调整公式:先在同一干扰层 \(Z=z\) 内比较 X 对 Y 的影响,再按各层人数占比加权求和,把“嫌疑人”和“干扰分子”彻底分开。
  1. 找到后门路径在 DAG 中,找所有从 X 指向 Y 但箭头逆着 X 的路径。
    X←Z→YX \leftarrow Z \rightarrow Y
  2. 选择阻断集合 ZZ 必须阻断所有后门路径,且不含 X 的后代。
    Z 满足:(X⊥ ⁣ ⁣ ⁣⊥Y∣Z)GX‾\text{Z 满足:}(X \perp\!\!\!\perp Y \mid Z)_{G_{\underline{X}}}
  3. 分层的条件概率在每一层 Z=z 内,计算 \(P(Y \mid X, z)\) 作为因果效应的代理。
    P(Y=y∣X=x,Z=z)P(Y=y \mid X=x, Z=z)
  4. 加权求和用 P(Z=z) 作为权重,把各层结果平均起来。
    ∑zP(Y=y∣X=x,Z=z)⋅P(Z=z)\sum_z P(Y=y \mid X=x, Z=z) \cdot P(Z=z)

前门准则取证

有些案子里,侦探根本不知道 Z 的存在,或者 Z 是永远测不到的“隐形干扰者”。这时前门路径可能派上用场。假设 X 会先影响一个中间变量 M(比如“药物在体内的吸收率”),M 再影响 Y(康复)。中间变量 M 就像案发现场的“关键证物”:虽然我们无法直接观测那个隐藏的干扰源,但 X 对 Y 的效应可以通过 M 这个“传递者”间接锁定。

前门准则(Front-door Criterion) 适用于这样的结构:X 完全通过 M 影响 Y,且 M 到 Y 的路径上没有未观测混淆,同时 X 到 M 之间没有其他未观测的混淆路径。这时,虽然 \(X\) 和 \(Y\) 之间混入了看不见的干扰,但我们依然可以用两个“干净的局部关系”拼出完整的因果效应。

侦探用前门准则时,等于在说:“我虽然没有直接拍到嫌疑人作案的画面,但我拍到了他往饮料里下药(X→M),也拍到了被害人喝完饮料倒下(M→Y)。两段证据拼在一起,真相就出来了。”这就是前门准则的取证逻辑。

P(Y=y∣do(X=x))=∑zP(Z=z∣x)∑x′P(Y=y∣x′,z)⋅P(x′)P(Y=y \mid do(X=x)) = \sum_{z} P(Z=z \mid x) \sum_{x'} P(Y=y \mid x', z) \cdot P(x')
前门调整公式用两次求和完成“接力取证”:第一段算 X 如何影响 M,第二段算 M 如何影响 Y,然后把两段证据串联还原出总因果效应。
  1. 第一段X 对 M 的影响
    P(M=m∣X=x)P(M=m \mid X=x)
  2. 第二段M 对 Y 的因果影响(M 到 Y 无混淆,可用后门调整)
    ∑x′P(Y=y∣X=x′,M=m)⋅P(X=x′)\sum_{x'} P(Y=y \mid X=x', M=m) \cdot P(X=x')
  3. 串联合并M 每取一个值,就把“X 传递到 M”的概率与“M 传递到 Y”的概率相乘,再对所有 M 求和。
    ∑mP(M=m∣x)×∑x′P(Y=y∣x′,m)P(x′)\sum_m P(M=m \mid x) \times \sum_{x'} P(Y=y \mid x', m) P(x')

ID算法总动员

后门和前门是两种常用“套路”,但现实中的关系图可能比这两个套路复杂得多。这时,侦探需要一套更通用的“总动员方案”——ID 算法(Identification Algorithm)。它的核心思想是:从 do-演算的三条规则出发,递归地把目标干预分布 \(P(Y \mid do(X))\) 一点一点转化成只含观测分布的表达式。

ID 算法的输入是因果图(DAG)和查询目标(比如“X 对 Y 的因果效应”),输出有两个可能:一是“可识别”,并给出具体的由观测分布构成的公式;二是“不可识别”,告诉你这样的证据在图论意义下永远不够。这个过程像侦探把整个案件拆分成多个子问题:先看能不能用后门或前门套路解决局部,解决不了就继续变换图结构、交换观察与干预,直到水落石出。

侦探把 ID 算法当成“破案总流程”:每条 do-演算规则都是一项“侦查技术”,把大案层层拆解为小案。能拆到底,就能用观测数据结案;拆不到底,就承认“此案无解”。

P(y∣do(x))=∑zP(y∣x,z)⋅P(z)(若后门路径已被阻断)P(y \mid do(x)) = \sum_{z} P(y \mid x, z) \cdot P(z) \quad \text{(若后门路径已被阻断)}
ID 算法本质上是一个“公式生成器”:它反复套用 do-演算的三条规则,把含 do 的表达式逐步化简为纯观测表达式;能化简到底,就识别成功。
  1. 规则一(插入/删除干预)若某些变量与干预无关,可以在条件中删去或加入干预操作。
    P(y∣do(x),z)=P(y∣do(x))(Y⊥ ⁣ ⁣ ⁣⊥Z∣X 在图 GX‾ 中)P(y \mid do(x), z) = P(y \mid do(x)) \quad (Y \perp\!\!\!\perp Z \mid X \text{ 在图 } G_{\overline{X}} \text{ 中})
  2. 规则二(观察/干预互换)在特定图条件下,把“给定 do(x)”换成“给定 x”。
    P(y∣do(x),z)=P(y∣x,z)(Y⊥ ⁣ ⁣ ⁣⊥X∣Z 在 GX‾ 中)P(y \mid do(x), z) = P(y \mid x, z) \quad (Y \perp\!\!\!\perp X \mid Z \text{ 在 } G_{\underline{X}} \text{ 中})
  3. 规则三(插入/删除观察)把条件中的观察值 x 替换成干预值 do(x)。
    P(y∣do(x))=P(y∣x)(Y⊥ ⁣ ⁣ ⁣⊥X 在 GX‾ 中)P(y \mid do(x)) = P(y \mid x) \quad (Y \perp\!\!\!\perp X \text{ 在 } G_{\overline{X}} \text{ 中})

工程落地实践

识别公式写在纸上很漂亮,但侦探最终要回到现实世界:拿真实数据把公式算出来。比如后门调整公式落地时,最直接的做法是逆概率加权(Inverse Probability Weighting, IPW):与其逐层加权平均,不如给每个样本赋予一个权重 \(1/P(X=x \mid Z=z)\),把“非随机吃药”的人群重新加权成“看起来像随机实验”的人群。这就像侦探给每个证人按“可信度”重新配权重:内幕证人的话分量更重,无关路人的话轻描淡写。

工程实践中还有几件事不能忘:第一,先做可识别性判断,如果 ID 算法说“不可识别”,再多的数据也白搭;第二,检查后门集合 Z 是否真的可观测,很多变量在现实里没有数据;第三,用倾向得分(Propensity Score) 压缩加权维数,避免 Z 维数过高导致估计不稳定。

这就像侦探最后一步不是猜测结论,而是按规程整理证据、给证词加权、写结案报告。工程落地也就是把“识别公式”这本科查手册变成一行行可执行的代码,让数据替真相开口说话。

P^(Y=y∣do(X=x))=1n∑i=1n1{Xi=x,Yi=y}P^(Xi=x∣Zi=zi)\hat{P}(Y=y \mid do(X=x)) = \frac{1}{n} \sum_{i=1}^{n} \frac{\mathbb{1}\{X_i = x, Y_i = y\}}{\hat{P}(X_i = x \mid Z_i = z_i)}
这是逆概率加权的样本估计式:每个样本的贡献都除以“它被观测到当前处理 X 的概率”,从而在伪人群里构造出随机实验的效果。
  1. 统计每个样本对第 i 个样本,检查它的 X 是否等于目标值 x,Y 是否等于 y。
    1{Xi=x,Yi=y}\mathbb{1}\{X_i = x, Y_i = y\}
  2. 计算倾向得分用逻辑回归等模型估计 \(P(X=x \mid Z=z)\)。
    P^(Xi=x∣Zi=zi)\hat{P}(X_i = x \mid Z_i = z_i)
  3. 加权平均把符合条件的样本按 1/倾向得分 加权,再求平均,得到干预分布估计。
    1n∑i=1n1{Xi=x,Yi=y}P^(Xi=x∣Zi=zi)\frac{1}{n} \sum_{i=1}^{n} \frac{\mathbb{1}\{X_i = x, Y_i = y\}}{\hat{P}(X_i = x \mid Z_i = z_i)}

AI 应用场景

医疗健康:从病历中识别药物因果效应

阶段:应用分析(识别与估计)

解决的问题:医院积累了海量电子病历,但病人是否服药并非随机分配,病情严重程度(混淆因子)同时影响用药和康复。传统做法直接比较“服药组 vs 未服药组”的康复率,会得出“吃药反而有害”的悖论。后门调整公式在“病情严重度”上分层加权,把观测数据还原成类随机实验,得到真实的药物因果效应。

具体案例:某药企利用历史病历数据估计新药对 30 天再入院率的影响,先画出“诊断严重度→用药→再入院”的 DAG,用后门准则选择调整变量集合,再以逆概率加权法估计 \(P(\text{再入院} \mid do(\text{用药}))\),最终提交给监管部门的结论比传统统计模型更可信。

广告营销:剥离人群特征后的投放归因

阶段:特征工程与因果推理

解决的问题:市场部想知道“看了广告是否真的促进购买”,但年轻人本来就更爱买新品、也更爱看广告——年龄是人人都知道的“隐形 Z”。公司不可能强制一半用户看广告(干预不可行),只能用前门或后门准则做调整估计。识别算法 IDC 帮助团队判断:在这个 DAG 下,效应可识别吗?该用哪个公式?

具体案例:某电商平台以 8000 万用户日志为样本,以“广告曝光”为 X、“购买”为 Y、“活跃度与年龄段”为 Z,用后门调整和倾向得分匹配同时估计,得到净化后的投放归因系数,据此重构了广告竞价策略,使同样预算的 ROI 提升 22%。

政策评估:观测数据还原政策因果效应

阶段:决策支持与因果评估

解决的问题:政府想评估“最低工资上调是否减少了失业”,但实施政策的地区往往经济发达(混淆因子 Z),这会让“政策→失业”的关联被经济结构干扰。由于不可能把某个地区强制设为“上调/不上调”(干预受限),必须依赖可识别性分析。ID 算法负责判断该研究问题在给定 DAG 下是否可识别,并输出可计算的调整公式。

具体案例:某智库利用省级面板数据构建 DAG,用 do-演算规则发现直接后门调整难以消除“经济结构”这种隐性干扰,于是改用前门准则,以“企业雇用密度”为中间变量 M,最终给出了可信的因果区间估计,为政策报告提供了方法论支撑。

Python 演示

python55 行
import numpy as npfrom sklearn.linear_model import LogisticRegression def simulate_data(n=5000, seed=42):    """生成带有混淆因子 Z 的观测数据:    Z -> X(严重程度影响是否吃药),Z -> Y(严重程度影响康复),X -> Y(药物真实效应)    """    rng = np.random.RandomState(seed)    Z = rng.normal(0, 1, n)                     # 混淆因子:病情严重度    logit_x = 0.8 * Z - 0.2                     # 严重者更可能吃药    X = rng.binomial(1, 1 / (1 + np.exp(-logit_x)), n)    Y = 0.5 * X + 1.2 * Z + rng.normal(0, 1, n) # 真实因果效应为 0.5    return Z, X, Y def naive_estimate(X, Y):    """朴素估计:直接比较服药组与未服药组的均值差"""    return Y[X == 1].mean() - Y[X == 0].mean() def ipw_estimate(Z, X, Y):    """逆概率加权估计:按倾向得分加权,模拟随机实验"""    lr = LogisticRegression(max_iter=1000)    lr.fit(Z.reshape(-1, 1), X)    ps = lr.predict_proba(Z.reshape(-1, 1))[:, 1]    # 权重 = 1 / P(X=x | Z=z)    weights = np.where(X == 1, 1 / ps, 1 / (1 - ps))    # 用加权平均差作为因果效应估计    treat = np.average(Y[X == 1], weights=weights[X == 1])    control = np.average(Y[X == 0], weights=weights[X == 0])    return treat - control def backdoor_adjustment(Z, X, Y, n_bins=10):    """后门调整公式的直接实现:按 Z 分层加权平均"""    bins = np.linspace(Z.min(), Z.max(), n_bins + 1)    layer_effect, layer_weight = [], []    for i in range(n_bins):        mask = (Z >= bins[i]) & (Z < bins[i + 1])        # 若某一层样本过少则跳过(简化处理)        if mask.sum() < 10:            continue        in_layer = X[mask] == 1        effect = (Y[mask][in_layer].mean() - Y[mask][~in_layer].mean())        layer_effect.append(effect)        layer_weight.append(mask.sum() / len(Z))    # 加权求和    return sum(e * w for e, w in zip(layer_effect, layer_weight)) if __name__ == "__main__":    Z, X, Y = simulate_data()    naive = naive_estimate(X, Y)    ipw = ipw_estimate(Z, X, Y)    adjust = backdoor_adjustment(Z, X, Y)    print(f"朴素估计(相关): {naive:.3f}")    print(f"IPW 后门调整估计: {ipw:.3f}")    print(f"直接分层后门调整: {adjust:.3f}")    print(f"真实因果效应: 0.500")
目的:模拟一个带有混淆因子 Z 的观测数据,用三种方式估计 X→Y 的因果效应——朴素估计、逆概率加权(IPW)和直接分层后门调整,直观展示“观测关联 ≠ 因果效应”。
  1. rng.binomial(1, 1 / (1 + np.exp(-logit_x)), n)以逻辑回归概率生成治疗变量 X,让 Z 影响 X,制造混淆。
  2. Y = 0.5 * X + 1.2 * Z + rng.normal(0, 1, n)生成结果 Y:真实因果效应是 0.5,但 Z 的影响高达 1.2,会污染相关估计。
  3. Y[X == 1].mean() - Y[X == 0].mean()朴素估计直接比较两组均值,走的是“观测相关”路线,必然被混淆因子带偏。
  4. lr.fit(Z.reshape(-1, 1), X)用逻辑回归拟合倾向得分 \(P(X=1 \mid Z)\),这是 IPW 的基础。
  5. weights = np.where(X == 1, 1 / ps, 1 / (1 - ps))把每个样本的权重视为倾向得分的倒数,构造伪随机实验。
  6. layer_effect.append(effect)` 和 `layer_weight.append(...)直接实现后门调整公式:先分层算效应,再按占比加权求和。
  7. print(f"朴素估计(相关): {naive:.3f}")输出对比结果,观察相关与因果的差距。
  8. print(f"真实因果效应: 0.500")用真实系数做基准,验证两种后门调整能否还原真相。

常见误区

误区条件分布 \(P(Y \mid X)\) 不就是因果效应吗?吃了药的人康复率高,就说明药有效。

正解观测分布 \(P(Y \mid X)\) 是“相关”,\(P(Y \mid do(X))\) 才是“因果”。识别算法存在的意义就是区分它们。用侦探比喻:证人看见“病人都在吃药”,和警察强制“让所有人吃药”,完全是两个世界的事。混淆因子 Z 会让观测关联扭曲因果真相,必须通过后门调整等手法净化。

为何常见:大多数统计课程讲的条件概率先入为主,形成了“控制变量就是因果”的直觉;加上很多场景下相关性确实与因果同号,更强化了误解。

误区\(P(Y \mid do(X))\) 和 \(P(Y \mid X)\) 只是记号不同,数值应该差不多吧?

正解do(X) 代表剪断所有指向 X 的箭头,X 不再是“自然长出”的,而是被外力强行设定。以侦探破案类比,前者是“嫌疑人身高 1.8 米”(观察事实),后者是“警察强行让所有人身高 1.8 米”(干预)。在存在混淆时,两个分布可能差出天际。后门调整公式正是要把后者转成前者的加权组合。

为何常见:很多教材在引入干预时符号讲解不够直观,读者没能建立起“剪箭头”的图模型直觉。

误区既然要排除干扰,那就把所有可观测变量都放进回归模型就好了,控制得越多越干净。

正解后门准则要求阻断所有后门路径,但不能控制对撞因子。比如变量 M 是 X 和 Y 的共同结果,控制 M 反而会打开一条新的伪相关路径。侦探比喻:把“受害者身上的刀伤”(结果)也当成嫌疑人来审问,只会让案情更乱。正确的做法是先画 DAG,再根据 d-分离判断哪些变量该调整、哪些绝不能碰。

为何常见:经典统计回归里“加变量减偏差”的思维惯性,与因果图理论中的“控制结果导致偏差”反直觉现象形成了冲突。

误区只要从文献里找到后门/前门调整公式,把数据丢进去就能输出因果效应,不用管数据收集方式。

正解识别是可识别性层面的结论,但工程上还要检查:调整变量 Z 是否真的被观测到了?倾向得分模型是否设定正确?样本是否覆盖 Z 的整个支持空间?如果 Z 的某些层没有样本,加权平均就会失效。侦探即使有了正确公式,也要核实证人是否真实存在、证词是否可信,否则公式只是空中楼阁。

为何常见:理论教科书很少讲数据收集与识别假设之间的匹配问题,导致实践者误以为“公式万能”。

误区只要把图和数据交给 ID 算法,它总能输出一个干净的因果效应公式。

正解ID 算法是人类关于可识别性判断的严格形式化。输入 DAG 后,它可能诚实地回答“不可识别”——这意味着该图结构下,无论多少观测数据都无法唯一确定因果效应。这不是算法不够强,而是证据在逻辑上就不够。侦探比喻:有些案子的目击者全都互相串供(不可识别),再多的证人证词也还原不出唯一的真相。

为何常见:对 do-演算的盲目乐观,以及对“可识别性”与“估计精度”两组概念的混淆。

面试题

Q1. 识别问题解决的核心矛盾是什么?

单选题 · easy

  • A.数据量不够大,需要更多样本
  • B.观测数据无法做随机干预,但仍想得到因果效应← 正确答案
  • C.模型复杂度不够高,无法拟合非线性关系
  • D.因果图无法被计算机读取

答案:B。识别问题研究“仅凭观测数据能否推出干预分布”。A 是估计精度问题,C 是模型容量问题,D 是工程实现问题。后门调整正是把“无法干预”转化为“可用观测数据计算”的典型方案。

Q2. do(X=x) 与普通条件 \(X=x\) 的本质区别是什么?

单选题 · easy

  • A.do 是贝叶斯记号,条件是频率派记号
  • B.do 表示外界干预强制 X 取值,条件只是观察 X 取该值← 正确答案
  • C.两者等价,只是写法不同
  • D.do 只用于时间序列数据

答案:B。do 算子模拟的是“剪断指向 X 的所有箭头”,代表主动干预;普通条件分布只反映被动观测。正是这个区别,决定了 \(P(Y \mid do(X))\) 与 \(P(Y \mid X)\) 在混淆存在时不相等。

Q3. 后门准则中,Z 需要满足的条件是什么?

单选题 · mid

  • A.Z 包含 X 的所有后代节点
  • B.Z 阻断所有从 X 到 Y 的后门路径,且不含 X 的后代← 正确答案
  • C.Z 必须是 X 的直接原因
  • D.Z 必须与 Y 独立

答案:B。后门准则要求 Z 能阻断 DAG 中所有从 X 指向 Y 的后门路径,同时 Z 中不能包含 X 的后代节点,避免引入新的偏差。这与“控制所有变量”的直觉相反,因此 B 是标准定义。

Q4. 前门准则相比后门准则最大的优势是什么?

单选题 · mid

  • A.不需要任何观测数据
  • B.允许存在未观测的混淆因子,只要有中间变量 M← 正确答案
  • C.不需要因果图
  • D.直接得到因果效应数值

答案:B。前门准则通过中间变量 M 做“接力取证”,即使 X 与 Y 之间存在未观测混淆,也能识别因果效应。A、D 是违背识别本质的错误说法,C 则否定了前门准则依赖 DAG 的基本前提。

Q5. 如果 ID 算法返回“不可识别”,以下哪项理解正确?

单选题 · hard

  • A.数据量不够,需要采集更多样本
  • B.当前 DAG 下观测数据无法唯一确定因果效应← 正确答案
  • C.换个机器学习模型就能解决
  • D.do-演算规则不够完备

答案:B。不可识别是指在给定 DAG 和观测分布下,存在多个不同的因果结构生成同样的数据,因此无法唯一确定效应。此时增加样本量或换模型都没有用,必须改变假设、增加观测变量或引入干预数据。

Q6. 逆概率加权(IPW)在工程落地中扮演什么角色?

单选题 · easy

  • A.判断能否识别因果效应
  • B.把观测人群重新加权成“伪随机实验”的样本来估计效应← 正确答案
  • C.生成因果图的结构
  • D.替代所有统计检验

答案:B。IPW 用倾向得分的倒数给样本加权,使各处理组在混淆因子上分布均衡,从而近似随机实验。它依赖后门调整公式,是工程中常用的估计方法,但不能替代可识别性判断。

Q7. 以下哪些是 do-演算的三条核心规则?

多选题 · mid

  • A.插入或删除干预操作← 正确答案
  • B.交换观察与干预操作← 正确答案
  • C.插入或删除观察变量← 正确答案
  • D.对数据进行中心化标准化

答案:ABC。do-演算的三条规则分别是:规则一(在特定图条件下添加/删除 do 操作)、规则二(观察与干预互换)、规则三(添加/删除非干预条件下的观察变量)。D 属于数据预处理,不属于 do-演算规则。

Q8. 关于混淆因子 Z,正确的说法有?

多选题 · mid

  • A.Z 同时影响处理 X 和结果 Y← 正确答案
  • B.Z 是 X 与 Y 的共同结果
  • C.忽略 Z 会导致相关性与因果效应偏差← 正确答案
  • D.Z 一定可以被观测到

答案:AC。混淆因子是 X 和 Y 的共同原因(A 对,B 描述的是对撞因子)。忽略 Z 会打开后门路径,使观测关联偏离因果效应(C 对)。Z 可能观测不到,这正是前门准则要解决的场景(D 错)。

Q9. 关于识别与估计的关系,哪些说法正确?

多选题 · hard

  • A.先有识别公式,才能谈估计← 正确答案
  • B.不可识别时,估计方法再先进也没用← 正确答案
  • C.识别是理论问题,估计是统计问题← 正确答案
  • D.好的估计方法可以绕开识别问题直接得到因果效应

答案:ABC。识别决定因果效应能否由观测分布唯一确定,估计决定从有限样本中怎样算得准。A、C 准确描述了两者关系;B 说明不可识别时没有唯一的真值可供估计;D 是错误想法,估计只能在识别公式之上进行。

Q10. 后门调整公式在图像上的核心操作是什么?

单选题 · easy

  • A.沿着 X→Y 方向走一遍图
  • B.按 Z 分层并加权平均,阻断后门路径← 正确答案
  • C.删除 Y 的所有父节点
  • D.把 DAG 变成无向图

答案:B。后门调整公式 \( \sum_z P(Y \mid X, z) P(z) \) 的本质是“分层 + 加权”,让每一层内 X 和 Y 的关联不再受 Z 干扰。它是图论直觉的数学表达,不是简单地沿边走或删节点。