想象你在一座老宅里翻出一本尘封的家族族谱,泛黄的纸页上画满人名与连线——父亲指向儿子,祖母指向孙辈。你满心欢喜,想靠它推断家族的遗传规律,可刚要动笔却犹豫了:这本族谱记录完整吗?每条线的方向可信吗?会不会有一段从未入册的“秘密支脉”?——这些疑虑一天不解决,你做出的每一个推断都如履薄冰。因果推断面临同样的处境:数据只是人名,有向无环图(DAG)是那张画好的家族关系图,而读图之前必须签署三份“阅读须知”:马尔可夫条件、忠实性假设、因果充分性。这三大约定既成就了因果推断的全部力量,也划定了它的脆弱边界。本文就用这本“族谱”,带你逐一读懂 DAG 背后的因果假设。

岗位关联

掌握 DAG 因果假设,是构建可信因果模型的底层能力——它能帮你判断哪些因果结论经得起推敲,哪些一碰就碎,是数据科学家与 AI 工程师的必备思维基石。

目录
  1. 可视化演示
  2. 因果假设概论
  3. 马尔可夫条件
  4. 忠实性假设
  5. 因果充分性
  6. 无环结构约束
  7. 假设检验应用
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

三步展示DAG因果四大假设:马尔可夫条件与忠实性互逆、因果充分性排除隐混杂、无环性保障逻辑先后及假设检验方法。

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

'+captions[0]+'

因果假设概论

想象你在一座老宅里发现了一本尘封的家族族谱。泛黄的纸页上画满人名与连线——父亲指向儿子,母亲指向女儿。你心想:“太好了,有了这本族谱,我就能推断家族里的遗传规律了!”可刚要下笔,你突然犹豫:这本族谱完整吗?每条线记录的方向对吗?会不会有某个远房表亲其实是亲兄弟?——这些不确定因素,决定了你所有推断的可靠性。

因果推断面临着同样的处境。我们手里的数据就像族谱中的人名,有向无环图(DAG)则是那张画好的家族关系图:每个变量是一个节点,每条箭头表示“前者影响后者”,而整张图不允许出现环——正如没人能成为自己的祖先。但光有图还不够,想从图和数据中推出因果结论,必须先接受几条关于世界如何运作的“约定”。

这三条约定就是因果假设三件套:因果马尔可夫条件——给定“父母”后,变量与“旁支亲眷”条件独立;忠实性假设——数据里观察到的独立性都是真实结构所致,而非参数巧合;因果充分性假设——所有共同原因都已经被我们看见,没有藏在暗处的“秘密分支”。这三条假设是连接因果图与概率分布之间的桥梁。

回到那本旧族谱。如果你接受了三大约定,就等于在扉页签下了“阅读须知”:只看父母、不信巧合、不藏秘密亲属。接下来每一次沿着箭头的推断,都建立在这些约定之上——约定越牢,结论越稳。反之,约定一旦被打破,族谱上的每一条线都可能变成误导你的陷阱。

P(X1,X2,…,Xn)=∏i=1nP(Xi∣Pa⁡(Xi))\displaystyle P(X_1, X_2, \dots, X_n) = \prod_{i=1}^{n} P\bigl(X_i \mid \operatorname{Pa}(X_i)\bigr)
这行公式是说:在 DAG 成立的条件下,“全家族的特征分布”可以拆成一个个“在父母已知时的条件分布”相乘——就像族谱中每个人的特征只需追溯到父母,不必翻完整个祖宗十八代。
  1. 联合概率 \(P(X_1,\dots,X_n)\)表示所有变量一起出现的概率分布,对应“全家族特征的整体图景”。
    P(X1,X2,…,Xn)P(X_1, X_2, \dots, X_n)
  2. 连乘符号 \(\prod_{i=1}^{n}\)把每个变量的条件概率逐一相乘,是分解整体为局部的算术手段。
    ∏i=1n\prod_{i=1}^{n}
  3. 父母集合 \(\operatorname{Pa}(X_i)\)DAG 中指向 \(X_i\) 的父节点集合,类比“生养这个人的父母”。
    Pa⁡(Xi)\operatorname{Pa}(X_i)
  4. 条件概率 \(P(X_i \mid \operatorname{Pa}(X_i))\)已知父母特征后,该成员呈现出某特征的概率。
    P(Xi∣Pa⁡(Xi))P\bigl(X_i \mid \operatorname{Pa}(X_i)\bigr)

马尔可夫条件

老式家族的老人常说“父矮矮一个,娘矮矮一窝”。但这句俗语背后其实藏着一个更精细的判断逻辑:当你已经知道一个孩子的父母身高时,再搬出祖父母的身高,对预测这个孩子身高的帮助微乎其微。族谱上越远的旁支,在“父母信息已到手”之后,就渐渐失去了参考价值。

因果马尔可夫条件把这种直觉形式化:在一个 DAG 中,给定某个变量的全部父节点后,它与所有非后代变量条件独立。也就是说,父节点充当了“信息屏障”——关于这个变量的一切因果影响,都必须经过它的父节点才能传递;旁支的信息若想绕道影响它,会被屏障挡下。

这个条件也是马尔可夫分解公式的基础:正因为因子分解中每个变量只依赖父节点,联合分布才能写成局部条件概率的乘积。若没有这条假设,变量之间会像蜘蛛网一样互相牵连,任何有效的分解都不可能实现。

想象你正在向亲戚解释家族遗传:先查父母,再查父母,还是查父母。马尔可夫条件并不是说祖宗不重要——祖宗的基因正是通过父母一代代传下来的,而是说信息传递的“最后一公里”必然经过父母。这就是为什么在分析因果图时,我们常常只需盯住局部的父子关系,就能推演整棵族谱中的信息流动。

\displaystyle X_i \perp\!\!\!\perp \operatorname{NonDesc}(X_i) \;\middle|\; \operatorname{Pa}(X_i)
读法:“给定 \(X_i\) 的父母后,\(X_i\) 与所有非后代变量条件独立。” 翻译成族谱语言就是——知道爹妈的模样后,七大姑八大姨的长相对你不再有额外信息量。
  1. 目标变量 \(X_i\)族谱中我们正在研究的那位成员。
    XiX_i
  2. 非后代集合 \(\operatorname{NonDesc}(X_i)\)族谱中既不是 \(X_i\) 子孙、也不包括 \(X_i\) 本身的成员。
    NonDesc⁡(Xi)\operatorname{NonDesc}(X_i)
  3. 条件独立符号 \(\perp\!\!\!\perp\)表示“在给定背景下互不提供信息”。
    Xi⊥ ⁣ ⁣ ⁣⊥NonDesc⁡(Xi)X_i \perp\!\!\!\perp \operatorname{NonDesc}(X_i)
  4. 条件竖线 \(\mid \operatorname{Pa}(X_i)\)把“已知父母信息”这个前提挂在右边,一切独立性都在这个前提下谈。
    ∣Pa⁡(Xi)\mid \operatorname{Pa}(X_i)

忠实性假设

假设族谱上记载:叔叔和侄子都爱吃榴莲。乍一看,这像是亲缘关系的铁证。可深入研究后你发现,叔叔爱吃纯属童年游历东南亚留下的口味,侄子爱吃则是因为上学时结交了一个泰国好友——两个互不相干的故事,恰好凑成了“爱吃榴莲”的一致表象。如果只看数据,你会误以为他们之间存在因果联系。

忠实性假设就是在宣告:数据中观察到的每一次“条件独立”或“相关”,都必须是因果结构真实造就的,而不是参数巧合或路径抵消的结果。换句话说,因果图是“说实话”的:图中没有边,数据里就不该有相关;图中路径被阻断,数据里就应当独立。

这条假设之所以必要,是因为因果图与概率分布之间存在双向约束。马尔可夫条件保证“图中阻断则数据独立”,忠实性则保证其逆命题“数据独立则图中阻断”成立。有了它,我们才能从数据中反推图结构——结构学习算法(如 PC 算法)的每一步独立性检验,都默认这份“诚实”。

族谱研究最怕什么?最怕巧合。但如果每次都因为“可能是巧合”而拒绝任何结论,研究便寸步难行。忠实性假设相当于一个业界行规:默认巧合不发生,除非有充分证据表明参数精确地抵消了真实效应——这种极端情况在数学上被称为“测度为零”,在现实中极为罕见,所以值得赌一把。

(X⊥ ⁣ ⁣ ⁣⊥Y∣Z)P    ⟹    d-sepG(X; Y∣Z)\displaystyle \bigl(X \perp\!\!\!\perp Y \mid Z\bigr)_P \;\implies\; d\text{-sep}_G(X;\, Y \mid Z)
读法:“若在数据分布 \(P\) 中 \(X\) 与 \(Y\) 条件独立,则因果图 \(G\) 中 \(X\) 与 \(Y\) 一定被 \(Z\) d-分离。”——数据不会平白无故表现出独立,每一次独立都在图中找得到对应解释。
  1. 数据中的独立性 \((X \perp\!\!\!\perp Y \mid Z)_P\)左边下标 \(P\) 表示这是在数据分布中观察到的条件独立。
    (X⊥ ⁣ ⁣ ⁣⊥Y∣Z)P(X \perp\!\!\!\perp Y \mid Z)_P
  2. 蕴含箭头 \(\implies\)箭头左边成立时右边必须成立,这是“忠实”的承诺。
      ⟹  \implies
  3. d 分离 \(d\text{-sep}_G(X; Y \mid Z)\)图中所有连接 \(X\) 与 \(Y\) 的路径都被 \(Z\) 阻断。
    d-sepG(X; Y∣Z)d\text{-sep}_G(X;\, Y \mid Z)

因果充分性

夜深人静时,族长悄悄把你拉到一旁:“其实……族谱里还有一支没记进去。孩子的父亲是谁,族谱上只写了'外出经商'。”你倒吸一口冷气:如果存在一条从未记录在册的血缘线,之前所有关于家族遗传的推断,都得打个问号。

因果充分性假设正是要求:对于图中任意两个变量,它们所有的共同原因都已经包含在图中。换句话说,不存在既影响 X 又影响 Y 的“隐形势力”。若这个假设不成立,未观测的共同原因会同时扰动 X 与 Y,让它们表现出虚假的相关——这就是混杂偏误的根源。

随机对照实验(RCT)之所以被视为因果推断的黄金标准,正是因为它通过随机分组直接消灭了绝大多数未观测共同原因,让充分性假设天然成立。而观测研究没有这种特权,研究者只能借助 DAG 识别混杂因子,再用“后门调整”把混杂效应剥离掉。

族谱完整性的重要性在此时充分显现。假如那个“外出经商”的秘密分支真的存在,后门调整公式就会因为缺少这个变量而失效——你调整了所有“以为的共同原因”,却唯独漏了最关键的那个。因果充分性不是一句空话:它决定了你的公式分母里,究竟该出现哪些 Z。

P(y∣do(x))=∑zP(y∣x,z) P(z)\displaystyle P(y \mid do(x)) = \sum_{z} P(y \mid x, z)\, P(z)
读法:“想知道强行把 \(X\) 设为 \(x\) 时 \(Y=y\) 的概率,就在每个混杂层 \(z\) 上求 \(Y\) 的条件概率,再按 \(z\) 的分布加权求和。”——相当于让族谱在每一支旁系内部单独统计,再汇总成全家族的效果。
  1. 干预记号 \(do(x)\)表示主动把 \(X\) 设为 \(x\),观察 \(Y\) 如何变化,区别于被动观察 \(X=x\)。
    do(x)do(x)
  2. 条件概率 \(P(y \mid x, z)\)在给定 \(X=x\) 且混杂因子 \(Z=z\) 时 \(Y=y\) 的概率。
    P(y∣x,z)P(y \mid x, z)
  3. 求和 \(\sum_z\)把 \(Z\) 的所有取值都遍历一遍,逐一剥离每一层的混杂。
    ∑z\sum_{z}
  4. 权重 \(P(z)\)每个 \(z\) 层在总体中的占比,加权后得到总体的因果效应。
    P(z)P(z)

无环结构约束

族谱的第一页永远写着一行小字:“本谱之上,无轮回之说。”没有人能成为自己的祖宗——这在现实世界里是天经地义,但在数学建模中,它是一条必须刻意强调的纪律。一旦允许自我指涉,因果关系就会陷入“鸡生蛋、蛋生鸡”的无解循环。

DAG 的 “D“(Directed)表示每条边都有方向,”A“(Acyclic)表示图中不存在任何有向环。这两个字母共同保证了因果箭头总是指向时间的未来方向。如果 A 影响 B、B 又影响 A,二者互为因果,那么它们之间的”因“与”果”就无法在静态观测数据中区分——这正是不满足无环性的典型状况。

对反馈系统(如生态种群互相制约、神经回路互相调节)而言,DAG 的确不是合适的表达工具。研究者通常会改用循环因果模型、结构方程或时序模型:把时间切成小段,让 A 在 t 时刻影响 B,B 在 t+1 时刻再影响 A,从而把“环”拆成“螺旋”。

在整理族谱时,我们从不担心“曾祖父同时又是曾孙”这种荒唐事,因为时间的单向性替我们排除了环。DAG 正是把这种时间直觉搬进了数据世界:每一条箭头都像族谱中的一笔记录,只能从上一代指向下一代,绝不回头——正是这种“不回头”的纪律,让因果方向有了坚不可摧的根基。

∄  v1→v2→⋯→vk→v1(k≥1)\displaystyle \nexists\; v_1 \to v_2 \to \cdots \to v_k \to v_1 \quad (k \ge 1)
读法:“不存在任意一条从某个节点出发、沿箭头走一圈又回到自身的路径。”——族谱上找不到任何一个自己是自己祖先的人。
  1. 不存在符号 \(\nexists\)表示“找遍全图也找不到”,是数学里的“绝无此事”。
    ∄\nexists
  2. 有向路径 \(v_1 \to v_2 \to \cdots \to v_k\)沿着箭头方向走过一串节点,每一步都必须顺着因果方向。
    v1→v2→⋯→vkv_1 \to v_2 \to \cdots \to v_k
  3. 回到起点 \(\to v_1\)路径终点又连回了起点,构成一个完整的有向环。
    v1→v2→⋯→vk→v1v_1 \to v_2 \to \cdots \to v_k \to v_1

假设检验应用

现在你已经手握族谱和三条约定,准备大干一场。怎么验证一段“亲戚关系”是否属实?族谱研究者的做法是:沿着族谱把所有可能的通路都走一遍,看看有没有一条路是畅通的。这条路被截断,那条路被婚姻关系绕开……把每条路都检查一遍,就能回答“两人之间到底有没有亲缘关联”。

在 DAG 上,这套检查方法就是 d 分离(d-separation)。它根据“路径是否被阻断”来判定条件独立:若 X 与 Y 之间的所有无向路径,都被条件集 Z 阻断,则称 X 与 Y 在给定 Z 下 d 分离。结合马尔可夫与忠实性假设,d 分离就等价于概率上的条件独立。

实际操作中,有三种主流打法。其一是 d 分离检验:在图上手工推导条件独立性,再对数据做条件独立测试验证;其二是结构学习:利用大量的条件独立检验结果反推最吻合的 DAG;其三是敏感性分析:主动假设存在某个未观测混杂,考察结论会在多大程度上被撼动。三者共同构筑了因果假设的“质检体系”。

族谱研究者最得意的时刻,莫过于用这套“通路检查法”推翻一个流传百年的传说:原来表兄妹之间的相似,完全是因为他们共同居住的村庄环境(一个未记录的条件节点),而非血缘。DAG 的检验方法就是这般锋利——它让你不只是“画出假设”,而是真刀真枪地检验假设,让每个因果结论都过一遍质检关。

d-sepG(X; Y∣Z)  ⟺  连接 X 与 Y 的所有无向路径均被 Z 阻断\displaystyle d\text{-sep}_G(X;\, Y \mid Z) \iff \text{连接 } X \text{ 与 } Y \text{ 的所有无向路径均被 } Z \text{ 阻断}
读法:d 分离的定义式——“被条件集阻断所有通路”与“在图中 d 分离”是同一枚硬币的两面。
  1. 左侧 d-sep 记号表示图中 X 与 Y 在 Z 条件下 d 分离。
    d-sepG(X; Y∣Z)d\text{-sep}_G(X;\, Y \mid Z)
  2. 等价符号 \(\iff\)左右两边互为充要条件,这是检验判定的逻辑根基。
      ⟺  \iff
  3. 无向路径被阻断把箭头方向暂时忽略,检查每条通路是否被 Z 里的人员“卡住”。
    所有无向路径均被 Z 阻断\text{所有无向路径均被 } Z \text{ 阻断}

AI 应用场景

电商营销的混杂控制

阶段:数据预处理与因果推断

解决的问题:分析师常直接回归“优惠券→转化率”,却忽略“用户活跃度”同时影响领券与购买,造成混杂偏误。借助 DAG 画出因果结构并应用后门调整,可在不跑 A/B 实验的情况下获得接近真实的因果效应。

具体案例:某电商平台用 DAG 假设“会员等级→优惠券领取→购买转化”且“会员等级→购买转化”(直接效应),通过调整会员等级这一混杂因子,发现优惠券的真实提升率仅为朴素回归估计的 60%,从而重新制定了发券策略。

可解释 AI 的反事实解释

阶段:模型解释(Explainable AI)

解决的问题:信贷模型给出“拒绝贷款”的评分,但用户需要知道“为什么”。用 DAG 编码收入、负债、违约之间的因果假设,可生成反事实解释:“若收入提高 20%,违约风险将低于阈值”。

具体案例:某金融科技公司为被拒用户生成 DAG 驱动的反事实报告,指出“提升信用评分而非增加收入”对通过审批更有效,显著降低申诉率。

医疗观察性研究的敏感性分析

阶段:临床数据分析与结论验证

解决的问题:观察性数据无法随机分组,药物效果估计可能被未观测的“健康状况”混杂。用 DAG 加上敏感性分析检验结论稳健性,是论文审稿的常见要求。

具体案例:研究团队分析他汀类药物与心梗风险的关系,在 DAG 中加入未观测混杂“体检频率”后,用敏感性分析计算偏误阈值,发现原结论在中等强度混杂下依然成立。

Python 演示

python79 行
"""DAG 因果假设:d 分离判定器 在 DAG 上判断给定条件下两个变量是否独立。只要存在一条未被阻断的路径,就不满足 d 分离。"""from collections import deque  class CausalDAG:    def __init__(self, edges):        self.edges = set(edges)        self.nodes = set()        for a, b in self.edges:            self.nodes.add(a)            self.nodes.add(b)     def parents(self, node):        return {a for a, b in self.edges if b == node}     def children(self, node):        return {b for a, b in self.edges if a == node}     def neighbors(self, node):        return self.parents(node) | self.children(node)     def undirected_paths(self, start, end):        """枚举 start 到 end 的所有简单无向路径"""        paths = []        queue = deque([(start, [start])])        while queue:            node, path = queue.popleft()            if node == end:                paths.append(path)                continue            for nxt in self.neighbors(node):                if nxt not in path:                    queue.append((nxt, path + [nxt]))        return paths     def descendants(self, node):        """返回 node 的所有后代节点集合"""        result = set()        stack = [node]        while stack:            cur = stack.pop()            for ch in self.children(cur):                if ch not in result:                    result.add(ch)                    stack.append(ch)        return result     def path_blocked(self, path, given):        """一条无向路径在 given 条件下是否被阻断"""        for idx, node in enumerate(path[1:-1], start=1):            prev, nxt = path[idx - 1], path[idx + 1]            is_collider = prev in self.parents(node) and nxt in self.parents(node)            if is_collider:                if node not in given and not (self.descendants(node) & given):                    return True            else:                if node in given:                    return True        return False     def d_separated(self, x, y, given):        """x 与 y 在条件集 given 下是否 d 分离"""        for path in self.undirected_paths(x, y):            if not self.path_blocked(path, given):                return False        return True  if __name__ == "__main__":    # X: 吸烟, Z: 焦油沉积, W: 住院, Y: 肺癌    dag = CausalDAG([("X", "Z"), ("Z", "Y"),                     ("X", "W"), ("Y", "W")])    print("条件于 Z 时 X 与 Y 是否 d 分离:", dag.d_separated("X", "Y", {"Z"}))    print("条件于 W 时 X 与 Y 是否 d 分离:", dag.d_separated("X", "Y", {"W"}))    print("无条件时 X 与 Y 是否 d 分离:", dag.d_separated("X", "Y", set()))
目的:实现 d 分离判定——在给定条件集下,检查 DAG 中两个变量的所有无向路径是否全部被阻断,从而判断它们是否条件独立。
  1. self.edges = set(edges)用集合存储有向边,节点自动去重,避免重复边干扰判定。
  2. def parents(self, node)查“爸爸是谁”,用于判断路径上的节点是否为对撞因子。
  3. def undirected_paths(self, start, end)BFS 枚举所有无向路径,d 分离需要逐条检查。
  4. is_collider = prev in self.parents(node) and nxt in self.parents(node)路径上两条边都指向该节点,说明它是“对撞因子”。
  5. if node not in given and not (self.descendants(node) & given)对撞因子及其后代都不在条件集里,路径才算被阻断。
  6. else: if node in given: return True非对撞因子被条件化,路径同样被阻断。
  7. for path in self.undirected_paths(x, y)遍历所有路径,只要一条畅通就拒绝 d 分离。

常见误区

误区我只要把变量之间的箭头画成一张有向无环图,因果关系就自动被证明了,接下来直接按图分析就行。

正解DAG 只是把你的因果假设明确可视化,它本身不产生任何因果知识。箭头方向必须来自领域知识、实验设计或更底层的物理机制。DAG 的价值在于让假设透明、可检验,而不是替你发明因果。就像族谱只能记录血缘,不能创造血缘。

为何常见:因为 DAG 看起来自带“方向感”,新手容易把形式当实质,误以为画图即证明。

误区只要控制了中间变量 Z,X 和 Y 的相关就一定消失,因为链式路径被切断了。

正解条件于中间变量 Z 只能阻断 X→Z→Y 这一条路径。如果图中还存在其他路径——尤其是未观测混杂 X←U→Y——那么条件于 Z 后 X 与 Y 依然相关。正确做法是检查所有无向路径是否都被阻断,而不是只看一条路。

为何常见:人们习惯用单一路径思考问题,忽略了 DAG 是一个整体结构,d 分离要求的是“所有路径”。

误区回归模型里控制的变量越多越干净,对撞因子 W 也应该一并控制,这样结果才可靠。

正解条件于对撞因子会打开本已阻断的路径,反而引入虚假相关(伯克森悖论)。选择条件集必须依据 d 分离规则:该调整的是混杂因子,该回避的是对撞因子。“控制得越多越好”在因果推断中是危险的直觉。

为何常见:经典统计学的“控制混杂”观念深入人心,但因果图揭示了有些变量一旦被控制,反而会制造麻烦。

误区数据里没看到相关性,就说明因果图里肯定没有对应的边,独立性检验的结果就是真理。

正解忠实性假设要求“条件独立性只由图结构产生”,但参数恰好抵消也可能让存在因果边的变量表现出独立。这种巧合无法靠数据区分,所以忠实性是一个不可直接检验的假设。结构学习的所有结论都建立在这个“默认不巧合”的赌注之上。

为何常见:人们倾向相信“眼见为实”,但因果推断依赖的是假设而非单纯观察,数据只是真相的投影。

误区不允许有环只是为了图论上的美观,对实际因果分析没什么影响,强行画成环也没关系。

正解无环约束保证了因果关系的“时间一致性”——因必须在果之前。反馈系统(如生态平衡、经济周期)需要循环模型或动态时序建模,强行用 DAG 表达会导致方向无法识别、参数不可估计。

为何常见:初学者只见 DAG 的图形外观,忽略了它编码的是时间与方向的语义约束。

面试题

Q1. DAG 中“有向”表示每条边具备怎样的语义?

单选题 · easy

  • A.边从原因指向结果,携带方向← 正确答案
  • B.边从结果指向原因,语义反向
  • C.边只表达变量相关的强弱
  • D.边允许构成有向闭环

答案:A。有向边的核心语义是从原因指向结果,方向性承载因果信息。若反向则因果颠倒,若只表达相关则退化为无向图,允许闭环则违背 DAG 的无环定义。

Q2. “无环”约束的核心保证是什么?

单选题 · easy

  • A.任何变量不能成为自己的祖先← 正确答案
  • B.图中不存在任何无向边
  • C.所有节点必须有多个父节点
  • D.所有节点必须构成链式结构

答案:A。无环意味着沿箭头行走永远回不到起点,即没有任何变量能成为自身的祖先。无向边与父节点数量都不是必要要求,链式结构只是无环图的一种特例。

Q3. 依据因果马尔可夫条件,给定父节点后,某变量与哪类变量条件独立?

单选题 · mid

  • A.所有后代变量集合
  • B.所有非后代变量集合← 正确答案
  • C.所有祖先变量集合
  • D.图中全部变量集合

答案:B。马尔可夫条件说的是“给定父母,与所有非后代独立”。后代变量显然与它相关;祖先的信息已经通过父母传递完毕;“全部变量”过于宽泛,只有非后代才是精确表述。

Q4. 在 X→Z→Y 的链式结构中,条件于 Z 会使 X 与 Y 怎样?

单选题 · mid

  • A.路径阻断,条件独立← 正确答案
  • B.路径畅通,相关增强
  • C.因果关系发生反转
  • D.无环结构遭到破坏

答案:A。链式结构的中间节点 Z 是非对撞因子,条件于它会阻断信息传递,使 X 与 Y 条件独立。这是马尔可夫条件的直接体现。

Q5. 对撞因子 X→W←Y 中,条件于 W 会产生什么效应?

单选题 · mid

  • A.打开路径引入虚假相关← 正确答案
  • B.阻断路径消除所有相关
  • C.让 X 与 Y 变为独立
  • D.使 DAG 出现有向环

答案:A。对撞结构默认是阻断的,但条件于对撞因子 W 反而打开路径,让 X 与 Y 产生虚假相关。这是伯克森悖论的本质,也是“控制越多越错”的典型反例。

Q6. 忠实性假设若被违背,可能发生哪些现象?

多选题 · mid

  • A.有因果边却观察不到相关← 正确答案
  • B.条件独立与图结构不符← 正确答案
  • C.数据中自动出现有向环
  • D.样本数量无法继续增加

答案:AB。忠实性违背指参数恰好抵消,导致图中存在因果边但数据表现为独立,或数据中的独立性与图结构不一致。它与数据量无关,也不会改变图的环属性。

Q7. 后门调整公式 P(y|do(x))=Σz P(y|x,z)P(z) 依赖哪条假设?

单选题 · hard

  • A.因果充分性(无未测混杂)← 正确答案
  • B.忠实性假设排除参数巧合
  • C.马尔可夫条件完成分解
  • D.无环结构保证时间顺序

答案:A。后门调整要求找到所有混杂因子 Z 并加权求和,只有当所有共同原因都被观测到时,Z 集合才是完整的。若存在隐藏混杂,公式就失效,这正是因果充分性的核心要求。

Q8. 判定一条路径是否被条件集 Z 阻断,需要考虑哪些因素?

多选题 · hard

  • A.路径中间节点是否为对撞因子← 正确答案
  • B.对撞因子的后代是否出现在 Z 中← 正确答案
  • C.非对撞因子是否被 Z 条件化← 正确答案
  • D.路径起点是否比终点更早出现

答案:ABC。d 分离的三条规则是:非对撞因子被条件化则阻断;对撞因子未被条件化且其后代也不在 Z 中则阻断。起点与终点的时间顺序由无环结构隐含,不是路径阻断的判定依据。

Q9. 结构学习算法(如 PC 算法)最依赖哪条假设来从数据反推图结构?

单选题 · mid

  • A.忠实性确保独立性反映图结构← 正确答案
  • B.充分性确保不存在隐藏混杂
  • C.马尔可夫确保分解可以成立
  • D.无环确保时间方向不矛盾

答案:A。PC 算法靠条件独立性检验来增删边,必须假设“数据中的独立性忠实反映图结构”才能反推。若忠实性被违背,检验结果与真实图不一致,算法会画出错误的 DAG。

Q10. 敏感性分析在因果推断中的主要目的是?

单选题 · hard

  • A.检验结论对未观测混杂的稳健性← 正确答案
  • B.增加样本量以降低抽样误差
  • C.对所有变量进行多重共线性检验
  • D.将反馈系统转换为 DAG 结构

答案:A。当因果充分性可能不成立时,敏感性分析主动假设存在未观测混杂,考察因果效应估计会在多大范围内移动。它是观测研究中评估结论可信度的标准手段,与样本量、共线性和图结构转换无关。