想象你要把一道祖传红烧肉的完整做法传给徒弟。你手上有一份“工序流程图”:圆圈里写着“猪肉”“焯水”“煸炒”“加料”“炖煮”“出锅”,箭头串起整个流程。徒弟看这张图,能知道做菜的顺序,却不知道放几勺糖、炖几分钟、用大火还是小火。这时你补上一本“完整菜谱”:每一步都写了精确用量、火候和时长,甚至注明“若五花肉偏肥则少放油”。流程图好比今天的主角之一——DAG(有向无环图),它画出变量之间的因果走向;完整菜谱则是SCM(结构因果模型),它把走向背后的函数关系、随机波动都记录在案。两者是什么关系?为什么研究因果推断的人总把它们放在一起?这篇文章就用这份“菜谱”和“流程图”当向导,带你一步步看清SCM与DAG的深层关系。

岗位关联

理解SCM与DAG的关系,是因果推断的“地基工程”:往后无论是做政策评估、医学研究,还是构建可解释AI,你都需要从“图的结构”升级到“模型的因果推理”,这正是AI从业者从调参走向懂机理的关键一跃。

目录
  1. 可视化演示
  2. SCM核心概念:菜谱的三要素
  3. DAG基础要素:流程图的语言
  4. SCM到DAG映射:从菜谱到流程图
  5. DAG条件独立性:流程图隐藏的“不相关”
  6. SCM超越DAG:流程图没有的配方细节
  7. 实际应用价值:完整菜谱在真实餐厅的价值
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示结构因果模型SCM与有向无环图DAG的对应关系:SCM结构方程映射为DAG有向边,DAG编码条件独立性,SCM增加函数形式与噪声分布信息。

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

SCM与DAG SCM结构方程 X=f(U) Y=g(X,V) 对应DAG有向边 DAG拓扑编码条件独立性 SCM增加函数与噪声 SCM=(V,U,F,P) 观测/干预/反事实三层抽象

SCM核心概念:菜谱的三要素

想象爷爷的祖传菜谱,它由三大块组成:第一块是“食材清单”,写着五花肉、冰糖、生抽等,这些是从市场带来的“外生材料”,菜谱不关心它们怎么长出来;第二块是“工序描述”,比如“五花肉切块后冷水下锅焯水三分钟”,这道工序把食材变成半成品和成品;第三块是“成品变量”,也就是一道道端上桌的菜,它们又可能成为下一道菜的原料,比如肉汁拿去拌饭。这套结构,正是结构因果模型(SCM)的核心骨架。

SCM将变量分为外生变量(U)和内生变量(V)。外生变量是模型外部给定的“背景条件”,如同市场买的食材品质,不由模型解释;内生变量是模型打算解释的“结果”,如同厨房里做出来的每道菜。连接二者的,是结构方程:每个内生变量 Xi 都由它的“直接父变量集” PAi 和对应的噪声 Ui 共同决定。写成公式就是:

回到菜谱的比方:外生变量是进货,内生变量是出菜,结构方程是每一步的“加工说明”。SCM与普通回归的差别在于,它把这些关系写成了可干预、可反事实推演的因果机制,而不是只记录相关性的“菜谱流水账”。

Xi=fi(PAi,Ui),Xi∈V,  Ui∈U\displaystyle X_i = f_i(PA_i, U_i), \quad X_i \in V,\; U_i \in U
这个公式是SCM的“总纲”:它说任何内生变量都是由若干父变量加随机噪声,经一个函数加工出来的。理解它,就理解了因果模型的装配方式。
  1. Xi 内生变量模型要解释的目标变量,好比“出锅的红烧肉”。
    Xi∈V\displaystyle X_i \in V
  2. PAi 父变量集合直接出现在方程右侧的其他内生变量,好比“这步菜直接用到哪些食材和半成品”。
    PAi⊆V\displaystyle PA_i \subseteq V
  3. Ui 外生噪声来自模型之外的随机干扰,好比“今天这块五花肉偏肥,下锅出的油更多”。
    Ui∈U\displaystyle U_i \in U
  4. fi 结构函数把父变量和噪声组合成 Xi 的“烹饪手法”,有明确的代数或函数形式。
    Xi=fi(PAi,Ui)\displaystyle X_i = f_i(PA_i, U_i)
  5. 整体语义给定父变量和噪声,Xi 的取值就被唯一确定,如同给定食材和工序,成品的品质就被菜谱框架锁定。

DAG基础要素:流程图的语言

有了菜谱之后,爷爷常画一张“工序流程图”给徒弟看:每个操作步骤画一个圆圈,步骤之间用带箭头的线表示“先后依赖”。这张流程图有严格规矩:箭头永远指向下一步,不允许出现“从某个步骤出发绕一圈又回到自己”的循环——否则徒弟就会无限炖肉永不出锅。这就是DAG:有向(每条边有方向)且无环(不存在有向回路)的图。

在因果推断中,DAG的节点代表变量,有向边代表“直接因果作用”的方向。如果图中有一条从X到Z再到Y的箭头链,我们说Z是X的子代、Y的父代(亲代),并且X到Y之间存在一条有向路径。DAG虽然简单,却能精确回答“谁影响谁”的拓扑问题,相当于把菜谱里的工序关系换算成了一张一目了然的流程图。形式化地写:

所以DAG是SCM的“拓扑抽象”:它不关心影响有多强、是线性还是非线性,只关心“谁是谁的直接原因”,帮我们在纷繁变量中快速看清因果骨架。

G=(V,E),E={(Xi,Xj)∣Xi→Xj},∄  X⇝X\displaystyle G = (V, E), \quad E = \{(X_i, X_j) \mid X_i \to X_j\}, \quad \nexists\; X \rightsquigarrow X
DAG依靠“节点+有向边+无环”三件套,把复杂因果结构压缩成一张可读的图,是SCM的“拓扑投影”。
  1. 节点集合 V图中的每个圆圈代表一个变量,对应菜谱中的一道工序或一种食材。
    V={X1,X2,…,Xk}\displaystyle V = \{X_1, X_2, \dots, X_k\}
  2. 有向边 E中的元素 (Xi, Xj)用箭头 Xi→Xj 表示 Xi 对 Xj 有直接因果作用。
    (Xi,Xj)∈E  ⟺  Xi→Xj\displaystyle (X_i, X_j) \in E \iff X_i \to X_j
  3. 亲代与子代箭头的起点是亲代,终点是子代,如同流程图里“上一步”是“下一步”的前置工序。
    Pa(Xj)={Xi∣Xi→Xj}\displaystyle Pa(X_j) = \{X_i \mid X_i \to X_j\}
  4. 有向路径从X出发沿箭头方向能走到Y,就存在有向路径 X↝Y,表示X通过一串中间变量影响Y。
    X⇝Y\displaystyle X \rightsquigarrow Y
  5. 无环性约束不存在任何变量能沿有向路径回到自身,保证因果方向不出现“自噬”逻辑。
    ∄  X:X⇝X\displaystyle \nexists\; X : X \rightsquigarrow X

SCM到DAG映射:从菜谱到流程图

现在关键问题来了:如果手里有一份完整的SCM菜谱,怎么画成一张DAG流程图?规则其实非常机械:每个内生变量画成一个节点;每一个结构方程 Xi = fi(PAi, Ui),都从它的每个父变量 PAi 画一条箭头指向 Xi。噪声 Ui 虽然参与决定数值,却不在图中占据节点——因为DAG只关心变量之间的结构依赖,不关心随机扰动的来源。换句话说,DAG是SCM在“擦掉函数形式和噪声分布”之后剩下的骨架。

这种映射关系可以用一句话概括:方程右侧的每个父变量,都是图中一条有向边的起点;方程左侧的结果变量,就是这条有向边的终点。反复套用,整个SCM就变成了一张DAG。反过来说,给定一张DAG,我们能想象出一个与之兼容的SCM家族——但具体是哪一种函数形式、哪类噪声分布,DAG本身并没有告诉我们。

看着这张从SCM映射出的DAG,我们仿佛把厚厚的菜谱压缩成一页工序流程图。流程图好携带,菜谱好做菜,二者各有分工,缺一不可。

∀Xj∈PAi:  Xj→Xi\displaystyle \forall X_j \in PA_i:\; X_j \to X_i
这是SCM到DAG的“翻译规则”:结构方程中每一次函数依赖,都对应DAG中的一条有向边。
  1. 识别父变量集 PAi逐个查看结构方程右侧出现的所有内生变量,它们就是该变量的“直接原因”。
    PAi={Xj∣Xj 出现在 fi 的右侧}\displaystyle PA_i = \{X_j \mid X_j \text{ 出现在 } f_i \text{ 的右侧}\}
  2. 为每个父变量添加有向边每发现一个父变量 Xj,就在图中画一条从 Xj 指向 Xi 的箭头。
    Xj→Xi,  ∀Xj∈PAi\displaystyle X_j \to X_i,\; \forall X_j \in PA_i
  3. 噪声项不入图Ui 虽然是方程一部分,但属于“隐变量”,不生成节点也不生成边。
    Ui∉VG\displaystyle U_i \notin V_G
  4. 对所有内生变量重复把每个结构方程都执行一遍上述操作,得到完整的边集合。
    E=⋃i{Xj→Xi∣Xj∈PAi}\displaystyle E = \bigcup_i \{X_j \to X_i \mid X_j \in PA_i\}
  5. 无环性由递归保证当结构方程按因果顺序排列(前因在前,后果在后),生成的图必然无环。
    topological ordering exists⇒G is a DAG\displaystyle \text{topological ordering exists} \Rightarrow G \text{ is a DAG}

DAG条件独立性:流程图隐藏的“不相关”

流程图除了能告诉徒弟做菜顺序,还暗藏一个神奇的信息:某些步骤之间,只要知道中间某一步的状态,前后步骤就“互不相干”了。比如,假设“焯水”是“煸炒”的前置步骤,“煸炒”又是“调味”的前置步骤(X→Z→Y)。一旦你已经知道这锅肉焯得恰到好处,那么“最初的猪肉质量”(X)和“最终调味的咸淡”(Y)之间,就多了一层被Z隔开的“屏障”——在给定Z的条件下,X和Y条件独立。

DAG中这种“屏障”关系由 d-分离(d-separation)刻画。只要Z阻断X与Y之间所有“信息通道”,我们就断言 X ⊥ Y | Z。路径阻断有三种常见形态:链式 X→Z→Y(中间变量被给定)、分叉 X←Z→Y(共同原因被给定),这两种都会阻断路径;但对撞结构 X→Z←Y 恰好相反——不给定时Z天然阻断路径,一旦给定Z,反而打开了两端的“虚假关联”通道。

回到菜谱:这张流程图在关键时刻能提醒厨师,“别被表象骗了”。例如,你发现“猪肉品质”和“调味咸淡”在数据里高度相关,但DAG告诉你,一旦控制住“焯水与煸炒的火候”,这种相关就消失了——原来它只是通过中间工序传递的间接影响,而不是猪肉直接决定咸淡。

X⊥ ⁣ ⁣ ⁣⊥Y∣Z  ⟺  Z d-separates X and Y in G\displaystyle X \perp\!\!\!\perp Y \mid Z \;\Longleftrightarrow\; Z \text{ d-separates } X \text{ and } Y \text{ in } G
d-分离是从DAG中读取条件独立性的“语法规则”,它告诉我们:观察数据里的哪些“不相关”是结构性的,哪些是虚假的。
  1. d-分离定义Z阻断X与Y之间每一条路径(每条路径都含一个被Z给定的中间节点,或一个未被给定的对撞节点)。
    d-sepG(X,Y∣Z)\displaystyle \text{d-sep}_G(X, Y \mid Z)
  2. 链式结构X→Z→Y,给定Z后,X到Y的信息流被Z截断。
    X⊥ ⁣ ⁣ ⁣⊥Y∣Z\displaystyle X \perp\!\!\!\perp Y \mid Z
  3. 分叉结构X←Z→Y,给定共同原因Z后,两个后果变量不再相关。
    X⊥ ⁣ ⁣ ⁣⊥Y∣Z\displaystyle X \perp\!\!\!\perp Y \mid Z
  4. 对撞结构X→Z←Y,未给定Z时Z阻断路径;给定Z后路径反而开启。
    X⊥ ⁣ ⁣ ⁣⊥Y  但  X⊥̸ ⁣ ⁣ ⁣⊥Y∣Z\displaystyle X \perp\!\!\!\perp Y \;\text{但}\; X \not\perp\!\!\!\perp Y \mid Z
  5. 因果推断意义DAG中的独立性结构帮我们判断,哪些观察到的相关是“货真价实的因果痕迹”,哪些仅仅是“选择偏差”。

SCM超越DAG:流程图没有的配方细节

如果DAG只是流程图,SCM就是那份写满用量、火候、时间的完整菜谱。光看DAG,你知道“煸炒”会影响“调味”,但你不知道影响方向是正还是负、强度多大、是线性加糖还是按指数倍增。SCM补上了这些关键信息:每个结构方程给出明确的函数形式,每个噪声变量给出分布假设。有了这些,我们就能回答DAG永远无法回答的问题:“如果当年多放一勺糖,这锅肉会变成什么味道?”

这类问题在因果推断中叫做反事实与干预。DAG只能告诉我们“如果控制Z,X和Y会条件独立”,SCM却能通过 do 算子模拟物理干预:强制把X设为某个值x,然后观察Y的分布如何变化。经典的干预公式是:

这好比流程图告诉你“先加糖再收汁”,但只有完整菜谱才告诉你“加两勺冰糖,小火收汁十分钟”。SCM的价值正在于用数学语言,把菜谱中每一个影响细节都变成可运算、可预测的因果引擎。

Pr⁡[Y∣do(X=x)]=∑zPr⁡[Y∣X=x,Z=z] Pr⁡[Z=z]\displaystyle \Pr[Y \mid do(X=x)] = \sum_z \Pr[Y \mid X=x, Z=z]\,\Pr[Z=z]
这个公式把“观察到的相关”转换成“干预后的因果效应”:通过控制阻断后门路径的变量Z,从观察数据中还原出强制干预的效果。
  1. do(X=x) 操作想象用手强行把变量X拨到某个值x,切断所有原本指向X的箭头。
    do(X=x)\displaystyle do(X=x)
  2. 调整变量ZZ是能阻断X与Y之间所有后门路径的变量集合,好比“控制住火候再比较加糖量”。
    Z⊆V∖{X,Y}\displaystyle Z \subseteq V \setminus \{X, Y\}
  3. 对Z加权求和把不同Z水平下的条件分布按Z的概率加权平均,消除混杂偏差。
    ∑zPr⁡[Y∣X=x,Z=z] Pr⁡[Z=z]\displaystyle \sum_z \Pr[Y \mid X=x, Z=z]\,\Pr[Z=z]
  4. 与条件分布的区别Pr[Y|X=x] 只是“看到”X取x时的Y分布,Pr[Y|do(X=x)] 是“强制”X取x时的Y分布,二者在混杂存在时不等价。
    Pr⁡[Y∣X=x]≠Pr⁡[Y∣do(X=x)]\displaystyle \Pr[Y \mid X=x] \neq \Pr[Y \mid do(X=x)]
  5. 意义SCM凭借函数形式与噪声分布,让“干预预测”变得可计算,而DAG只能给出识别策略的轮廓。

实际应用价值:完整菜谱在真实餐厅的价值

当一位政策制定者问“提高最低工资到底会增加还是减少就业”,一位医生问“这种新药对老年患者到底有没有效”,一位电商运营问“推送优惠券会不会反而降低复购”——他们问的都是同一个因果问题:如果我干预X,Y会怎样?DAG负责把混杂变量、工具变量、中间变量梳理成一张清晰的因果地图;SCM则在地图上填充可计算的函数,让研究者能基于观察数据估计出干预效应。

在社科和医学领域,常见的量化目标是平均处理效应(ATE),它比较同一个体在干预与不干预两种世界下的结果差异。SCM的框架让这类“平行世界”的比较有了严格的数学表达:

从菜谱到餐厅经营,道理是一样的:仅有流程图你知道“先切肉再炖肉”,但无法预测“今天换一种肉”的效果;只有完整菜谱加精确执行,才能稳定复现美味。SCM与DAG的组合,正是让AI不仅能“看到表象”,还能“推演干预结果”的黄金搭档。

ATE=E[Y(1)]−E[Y(0)]\displaystyle \text{ATE} = \mathbb{E}[Y(1)] - \mathbb{E}[Y(0)]
ATE回答“如果所有人都接受处理,平均结果比所有人都不接受处理好多少”——这是政策评估和医学研究中最常用的因果效应指标。
  1. Y(1) 潜在结果在干预世界(X=1)中Y会取到的值,好比“用了新工艺做出的菜”。
    Y(1)\displaystyle Y(1)
  2. Y(0) 潜在结果在对照世界(X=0)中Y会取到的值,好比“沿用老工艺做出的菜”。
    Y(0)\displaystyle Y(0)
  3. 期望差两个潜在结果的期望之差,消除了个体噪声后,给出平均因果效应。
    E[Y(1)]−E[Y(0)]\displaystyle \mathbb{E}[Y(1)] - \mathbb{E}[Y(0)]
  4. 识别条件需要借助DAG找到合适的调整集,让观察数据中的组间差异能够等同于因果效应。
    ATE=E[Y∣X=1,Z]−E[Y∣X=0,Z], weighted by Z\displaystyle \text{ATE} = \mathbb{E}[Y \mid X=1, Z] - \mathbb{E}[Y \mid X=0, Z], \text{ weighted by } Z
  5. 实践落地SCM把“反事实”变成可计算的函数表达式,使因果推断从哲学思辨走向数据科学产品。

AI 应用场景

政策评估:最低工资对就业的影响

阶段:因果效应识别与政策仿真

解决的问题:传统做法直接比较“提高最低工资城市”与“未提高城市”的就业率,却忽视了经济结构、产业结构等混杂因素,导致虚假相关被误认为因果。借助SCM构建包含最低工资、就业、消费、企业成本等变量的DAG,再补上结构方程,就可以从历史观察数据中识别出真正的政策效应,并用 do 算子模拟“如果所有城市统一提高工资”的反事实世界。

具体案例:某智库评估某地最低工资上调政策,先建立DAG发现“地区经济水平”是同时影响最低工资与就业的共同原因,SCM将其纳入后门调整集,估计出政策对青年就业的ATE为下降0.8个百分点,比简单回归的下降2.3个百分点更接近真值,最终改变了政策建议。

医学研究:新药对老年患者的疗效

阶段:混杂因素校正与处理效应估计

解决的问题:电子病历是观察数据,服药患者和未服药患者往往年龄、基础疾病差异很大。传统多因素回归容易遗漏非线性交互。SCM通过DAG梳理“年龄→病情→用药→康复”的因果链,并用结构方程刻画剂量反应关系,从而在不对病人做随机实验的前提下,估算出更可靠的个体化疗效。

具体案例:某医药团队研究一款降糖药在老年患者中的效果,DAG显示“肾功能”同时影响用药选择和康复结果,SCM以肾功能为调整变量,计算出该药对70岁以上人群的HbA1c平均降低0.5%,与后续小规模RCT结果相差仅0.1个百分点,大幅降低了验证成本。

商业决策:优惠券对复购的真实影响

阶段:干预策略优化与增量因果建模

解决的问题:电商平台发现“领券用户”复购率更高,但领券本身可能只是“本来就爱买”的信号。DAG分离“用户固有购买力”与“券促成的购买”,SCM进一步量化“发券”对不同用户群的增量效应,从而避免把自然复购误算成补贴的功劳。

具体案例:某零售平台的推荐系统接入SCM后,为高购买力用户减少优惠券投放,为价格敏感用户精准发券;三个月后,补贴成本下降22%,整体复购率反而提升6%,效果显著优于传统的“响应率预测”模型。

Python 演示

python45 行
import numpy as np class SimpleSCM:    """简单结构因果模型:Z = a*X + Uz, Y = b*Z + c*X + Uy"""     def __init__(self, a=0.8, b=1.5, c=0.2):        self.a = a        self.b = b        self.c = c     def generate(self, n=2000):        """生成观察数据:所有变量自然产生"""        X = np.random.normal(0, 1, n)        Z = self.a * X + np.random.normal(0, 0.5, n)        Y = self.b * Z + self.c * X + np.random.normal(0, 0.5, n)        return X, Z, Y     def intervene(self, x_value, n=2000):        """干预数据:do(X=x_value),强制X取值并切断其自然生成机制"""        X = np.full(n, x_value)        Z = self.a * X + np.random.normal(0, 0.5, n)        Y = self.b * Z + self.c * X + np.random.normal(0, 0.5, n)        return X, Z, Y  if __name__ == "__main__":    model = SimpleSCM()     X, Z, Y = model.generate()     # 短回归:只以X预测Y,混入间接路径 X->Z->Y    beta_short = np.polyfit(X, Y, 1)[0]    print("短回归(未控制Z)系数:", round(beta_short, 4))     # 长回归:同时控制Z,得到X的直接效应c    A = np.column_stack([X, Z, np.ones_like(X)])    coef, *_ = np.linalg.lstsq(A, Y, rcond=None)    print("长回归(控制Z)系数[beta_X, beta_Z, intercept]:",          [round(v, 4) for v in coef])     # 干预实验:分别强制X=1和X=0,计算ATE    _, _, Y1 = model.intervene(1.0)    _, _, Y0 = model.intervene(0.0)    ate = Y1.mean() - Y0.mean()    print("干预ATE:", round(ate, 4))
目的:展示同一个SCM下,“观察回归”与“干预推断”的差异——短回归混入了间接效应,长回归校正了中间变量,干预实验直接模拟 do(X=x) 并算出真实因果效应 ATE。
  1. class SimpleSCM:用一个类封装SCM的结构方程与干预逻辑,相当于把“菜谱”变成可调用的Python对象。
  2. Z = self.a * X + np.random.normal(0, 0.5, n)结构方程 Z=f(X, Uz) 的实现,X是父变量,np.random.normal是噪声 Uz。
  3. def intervene(self, x_value, n=2000)干预方法的核心:强制所有样本的X取值相同,抹掉X自身的生成机制。
  4. X = np.full(n, x_value)用固定值填满X,模拟do(X=x)操作,切断指向X的因果箭头。
  5. np.polyfit(X, Y, 1)[0]短回归只看到“X与Y的相关”,其中混入了 X→Z→Y 的间接效应。
  6. np.linalg.lstsq(A, Y, rcond=None)长回归控制Z后,X前的系数约等于直接效应c,说明DAG中的调整策略有效。
  7. ate = Y1.mean() - Y0.mean()两个干预世界下Y的期望之差,就是可解释的反事实因果效应。

常见误区

误区“我已经画好了DAG,是不是就建好了结构因果模型?没问题了吧。”

正解DAG只是SCM的拓扑骨架,好比工序流程图只是菜谱的简化版。SCM还包含每个结构方程的具体函数形式和噪声的分布假设。没有函数与噪声,我们只能判断“谁指向谁”,无法计算“影响有多大”或“干预后会发生什么”。要从图上升到模型,就必须补全 fi 和 Ui 的数学刻画。

为何常见:因为DAG画起来直观、传播广泛,许多教材先从图讲因果,导致初学者误以为“图=模型”。

误区“两个变量的相关系数高,我就应该在DAG里画一条箭头指向它。”

正解DAG的箭头表示“结构因果方向”,来自SCM中方程的函数依赖关系,而不是数据里的统计相关。相关可能是反向因果、混杂变量或选择偏差造成的。箭头方向必须由领域知识或受控实验确认,不能仅凭数据相关来画。相关系数告诉你“两者同变”,因果箭头告诉你“谁推动谁”。

为何常见:机器学习时代,大家习惯从数据相关性出发建模,容易把“相关的趋势”误认为“因果的方向”。

误区“图上X和Y之间连了一条箭头,那X对Y的因果效应肯定不等于0。”

正解有向边只表示SCM中X直接出现在Y的结构方程里,属于“结构上的潜在因果”。但效应大小可能接近于0,方向也可能为正或为负;只有代入具体的函数形式和参数,才能算出效应值。DAG是定性地图,SCM是定量引擎,两者不能互相替代。

为何常见:人们容易把“存在关系”和“关系量大”混为一谈,忽略结构方程中系数可能是0的边界情况。

误区“DAG都画全了,直接按图索骥,不就能回答反事实问题吗?”

正解反事实问题如“如果当年没吸烟,他现在会健康吗”,需要知道每个变量的函数形式与噪声分布,才能把现实世界“倒带”后重放一遍。DAG只提供变量间的拓扑关系,不包含函数细节。SCM通过结构方程和噪声分布,才能给出个体层面的反事实推演。没有完整的SCM,反事实只是一个哲学问题。

为何常见:反事实概念抽象,初学者容易觉得“因果图=因果模型”,从而忽略SCM在函数层的关键作用。

误区“Ui只是误差项,反正均值是0,写不写无所谓。”

正解噪声分布直接影响反事实的结果分布和干预预测的不确定性。在同一种DAG下,高斯噪声与均匀噪声会推导出完全不同的个体反事实响应。而且在某些非线性SCM中,噪声的独立性假设还是模型可识别性的关键。忽略噪声,等于做菜时完全忽视食材的随机波动——偶尔好吃,但无法稳定复现。

为何常见:传统回归分析中误差项常被视为“剩余噪声”,大家习惯把它当作无关紧要的背景,忽略它在因果语义中的核心作用。

面试题

Q1. SCM结构方程 Xi = fi(PAi, Ui) 中,PAi 表示什么?

单选题 · easy

  • A.Xi 的所有祖先变量
  • B.Xi 的直接父变量集合← 正确答案
  • C.Xi 的所有后代变量
  • D.Xi 的噪声项来源

答案:B。PAi 是“直接父变量集”,即方程右侧直接出现的其他内生变量,好比菜谱里直接影响这道菜的食材与半成品。祖先变量包含更远的上游变量,后代变量方向相反,噪声项则是Ui,不是PAi。

Q2. 从SCM构建DAG时,一个结构方程 Xi=f(PAi,Ui) 会产生什么?

单选题 · easy

  • A.一条从Xi指向PAi的边
  • B.一条从Ui指向Xi的边
  • C.多条从父变量指向Xi的边← 正确答案
  • D.多条从Xi指向父变量的边

答案:C。每个父变量都会生成一条指向Xi的有向边,所以通常产生多条边,方向是“父变量→子变量”。噪声Ui入方程但不作为图中的节点,因此不会产生边。箭头方向从原因指向结果,不会反向。

Q3. DAG的“有向无环”性质指的是什么?

单选题 · easy

  • A.每条边都有两个方向
  • B.不存在从某变量出发回到自身的路径← 正确答案
  • C.所有节点必须两两连通
  • D.每条路径只能包含一条边

答案:B。无环指不存在有向回路:你不能沿箭头方向绕一圈又回到起点。若存在环,因果方向会自相矛盾,犹如做菜步骤陷入无限循环。连通性和路径长度都不是DAG的定义要求。

Q4. 链式结构 X→Z→Y,在给定Z的条件下,X与Y之间的关系是?

单选题 · mid

  • A.条件独立← 正确答案
  • B.条件正相关
  • C.完全相等
  • D.无法判断

答案:A。链式结构的信息流沿箭头传递,Z作为中间站一被给定,就切断了X到Y的通道,因此 X⊥Y|Z。这类似于已知焯水状态后,原始猪肉质量与最终调味之间的关联被“隔断”。条件相关和完全相等都不符合d-分离的结论。

Q5. SCM相比DAG,额外提供了哪一类信息?

单选题 · mid

  • A.节点名称
  • B.有向边的方向
  • C.函数形式和噪声分布← 正确答案
  • D.变量的取值范围

答案:C。DAG只提供拓扑结构(节点与边),SCM在此基础上补充了每个内生变量的结构方程 fi 和噪声分布 Ui。这让模型能进行数值估计、干预模拟和反事实推断。节点名、方向、取值范围都只是图或数据的基本属性。

Q6. 在DAG中,分叉结构 X←Z→Y 下,想估计X对Y的因果效应,通常需要?

单选题 · mid

  • A.控制Z← 正确答案
  • B.控制Y的后代变量
  • C.忽略Z直接回归
  • D.反向调节X

答案:A。分叉结构中Z是X和Y的共同原因,构成后门路径 X←Z→Y。只有控制Z才能阻断这条虚假路径,避免混杂偏差。这好比比较两种做菜方法时,必须统一食材品质等级,否则结论被进货差异污染。

Q7. 对撞结构 X→Z←Y,在控制Z之后,X与Y之间会出现?

单选题 · hard

  • A.条件独立保持不变
  • B.虚假相关被打开← 正确答案
  • C.因果方向反转
  • D.边的数量减少

答案:B。对撞结构天然阻断X与Y的信息流,但一旦给定对撞变量Z,反而打开了一条“虚假关联”通道,使X与Y条件相关。这就是著名的“对撞偏差”。在做因果分析时,随意控制中间结果或选择变量,可能人为引入偏差。

Q8. 关于SCM与DAG的关系,下列说法正确的有?

多选题 · mid

  • A.DAG是SCM的拓扑抽象← 正确答案
  • B.SCM包含DAG的全部信息
  • C.DAG能替代SCM做反事实计算
  • D.SCM中的噪声项不出现在DAG节点中← 正确答案

答案:AD。A正确:DAG是SCM去掉函数与噪声后的骨架。B错误:SCM包含DAG的信息,反过来DAG不包含SCM的函数细节,所以描述反了。C错误:光有DAG无法计算反事实。D正确:噪声Ui不生成节点,只参与方程。

Q9. 关于d-分离与条件独立性,正确的是?

多选题 · hard

  • A.给定Z阻断所有路径时,X⊥Y|Z成立← 正确答案
  • B.对撞结构给定对撞变量后可能打开路径← 正确答案
  • C.链式结构给定X时会使X与Y相关
  • D.分叉结构不给定Z时X与Y条件独立

答案:AB。A正确:d-分离的充要条件就是所有路径被阻断。B正确:对撞结构在给定对撞变量后路径打开,产生虚假相关。C错误:链式结构给定的是中间变量Z,不是起点X。D错误:分叉结构不给定Z时,X与Y存在由共同原因导致的边缘相关。

Q10. 关于SCM的干预与反事实,以下说法正确的有?

多选题 · extreme

  • A.do(X=x) 通过切断X的父作用模拟物理干预← 正确答案
  • B.反事实推断需要结构方程的函数形式← 正确答案
  • C.Pr[Y|X=x] 与 Pr[Y|do(X=x)] 总是相等
  • D.干预公式可借助调整集Z从观察数据估计← 正确答案

答案:ABD。A正确:do算子切断指向X的箭头再强制赋值。B正确:反事实要“重放”结构方程,必须知道函数形式。C错误:存在未控制混杂时,条件概率与干预概率不相等,这正是因果推断要解决的问题。D正确:调整集Z通过后门准则从观察数据中识别干预效应。