你有没有想过:为什么有人打伞的地方,路面总是湿的?如果按这个逻辑,打伞简直是“路面浇水器”。但三岁小孩都知道真相——是“下雨”同时导致了“打伞”和“路面湿”。统计学家把这件事讲得更严谨:打伞与路面湿之间存在“假相关”,根源是一个共同的“幕后推手”——下雨。要揭穿这个假象,只需做一件事:先把“是否下雨”控制住,再看打伞与路面湿之间还剩下多少“私下的默契”。如果控制之后两者毫无关联,我们就说它们在给定“下雨”的条件下是相互独立的。 判断“控制住第三者之后,两个变量是否还纠缠不清”的统计方法,就是本文的主角——条件独立检验。它不直接回答“谁导致谁”,而是先回答更基础的问题:“这两个变量之间,到底有没有直接联系?”因果发现算法正是靠一次次这样的检验,像侦探一样层层筛掉共因制造的假象,最终拼出因果图。针对连续数据与离散数据,统计学家准备了不同的检验工具;再加上条件集搜索与显著性校准这两门手艺,你就能成为一名合格的“因果侦探”。

岗位关联

条件独立检验是因果发现的“侦察手段”:学会它,你才能分辨真正的因果链与共因制造的巧合,这是构建因果图与贝叶斯网络的基本功。

目录
  1. 可视化演示
  2. 条件独立概念:侦探的“隔离审问”思维
  3. 检验框架总览:侦探的“证据规则”
  4. Fisher Z 检验:连续世界的“精密卷尺”
  5. 卡方检验:离散世界的“对质表”
  6. G 平方检验:卡方的“高精度天平”
  7. 条件集搜索:侦探的“排查艺术”
  8. 显著性校准:别让误判在“多案并查”中浑水摸鱼
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示条件独立检验的核心机制,通过源头/管道/节点/终端四种模式展示关键概念与交互流程。

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

条件独立检验:条件独立 条件独立性检验的统计框架与因果 Fisher Z检验与偏相关系 核心机制可视化 条件独立检验整体架构与关键组件

条件独立概念:侦探的“隔离审问”思维

侦探小说里有个经典桥段:两位嫌疑人总在同一时间出没,看起来配合默契。老练的侦探不会急着下结论,而是先把“中间人”支开——分别单独审问。如果支开中间人后,两人说辞立刻对不上,说明之前的“默契”全靠中间人传话;如果单独审问时依然口径一致,才说明他们之间有直接联系。这个“支开中间人再审问”的套路,正是条件独立思想的生活原型。

在因果发现中,“嫌疑人”是两个变量 X 和 Y,“中间人”是第三个变量 Z。我们关心的问题是:在给定 Z 的条件下,X 与 Y 是否仍然相互依赖?如果给定 Z 后,X、Y 变得毫不相干,就说它们在给定 Z 时条件独立。注意——这里强调“给定 Z”,因为脱离条件谈独立,结论很可能被共因欺骗。

正式定义写在概率语言里:对任意取值 x、y、z,已知 Z 时的联合分布可以拆成两个边缘分布的乘积。

把因果图画出来,这个道理更直观:Z 同时在“指挥”X 和 Y,形成 X ← Z → Y 的结构。在这个共因结构下,X、Y 边缘上看高度相关,但给定 Z 后条件独立;反过来,若结构是 X → Z ← Y(对撞结构),边缘可能独立,条件后反而相关。可见“相关”与“条件独立”是两套完全不同的信息——侦探的职责,就是通过条件独立检验识别出哪些“相关”只是共因制造的假象。

X⊥ ⁣ ⁣ ⁣⊥Y∣Z  ⟺  P(X,Y∣Z)=P(X∣Z)⋅P(Y∣Z)\displaystyle X \perp\!\!\!\perp Y \mid Z \iff P(X,Y\mid Z) = P(X\mid Z)\cdot P(Y\mid Z)
通俗说明:知道“下不下雨”之后,“打不打伞”就不再透露任何“路面湿不湿”的信息——两者彻底“失联”。
  1. 条件概率记号P(X,Y|Z) 表示在已知 Z 取值的条件下,X 与 Y 联合出现的概率。
    P(X,Y∣Z)P(X,Y\mid Z)
  2. 乘积分解若联合概率能拆成 P(X|Z) 与 P(Y|Z) 的乘积,说明给定 Z 后,知道 X 不会改变 Y 的分布规律。
    P(X,Y∣Z)=P(X∣Z)⋅P(Y∣Z)P(X,Y\mid Z) = P(X\mid Z)\cdot P(Y\mid Z)
  3. 独立记号X⊥Y|Z 是“条件独立”的速记符号,读作“X 与 Y 在给定 Z 时独立”。
    X⊥ ⁣ ⁣ ⁣⊥Y∣ZX \perp\!\!\!\perp Y \mid Z

检验框架总览:侦探的“证据规则”

侦探办案不能靠一句“我觉得他俩没关系”交差,得有白纸黑字的证据规则。统计学家更“较真”:先假设嫌疑人清白,即原假设 H0:X 与 Y 条件独立;然后问——如果清白是真的,我们观察到当前这种“巧合”的概率有多大?这个概率就是 p 值。

判决标准很直观:p 值越小,“清白假设”越难为当前数据圆谎。通常约定阈值 α=0.05(也可取 0.01 或 0.1)。若 p<α,就拒绝原假设,认定 X 与 Y 存在条件依赖;若 p≥α,证据不足,维持“条件独立”的结论。注意“证据不足”不等于“证明独立”——这是后文要反复强调的点。

数学上,任何条件独立检验都包含一个统计量 T(由样本计算出的数字,如 Fisher Z 值、卡方值),p 值定义为:

这套规则像侦探的办案流程表:受理案件(设定 H0)→ 收集证据(计算统计量)→ 评估巧合概率(p 值)→ 作出裁决。后文三种检验方法——Fisher Z、卡方、G 平方——本质都是这套流程的具体工具,只是“证据形式”不同。

p=P( T≥tobs∣H0 )\displaystyle p = P(\,T \geq t_{\text{obs}} \mid H_0\,)
通俗说明:先假装“无关是真的”,再看“数据出现这么大动静”的概率;概率越小,越像在打脸原假设。
  1. 统计量 T由样本数据计算出的一个汇总数字,不同检验方法有不同的 T。
    TT
  2. 观测值 t_obs你这份数据实际算出来的统计量数值,是“已发生的事实”。
    tobst_{\text{obs}}
  3. 尾部概率p 值是在 H0 成立的假设世界里,统计量比实际观测值更极端的概率。
    P(T≥tobs∣H0)P(T \geq t_{\text{obs}} \mid H_0)
  4. 判决规则p<α(通常 α=0.05)→ 拒绝 H0;p≥α → 不拒绝,维持条件独立。
    p<0.05p < 0.05

Fisher Z 检验:连续世界的“精密卷尺”

路面湿度、体温、基因表达量都是连续变量,侦探需要一把能“扣除干扰”的精密尺。思路很朴素:既然怀疑 Z 在背后捣鬼,就先让 Z 分别对 X、Y 做回归,把 Z 能解释的部分剔除掉,剩下的残差就是“洗过澡”的干净信号。两个残差之间的相关系数,就是偏相关系数 r_{XY·Z}——它度量的是“扣掉 Z 之后,X、Y 还剩多少私下互动”。

偏相关的计算有简洁的公式:从 X、Y、Z 两两之间的相关系数出发,把 Z 对二者的共同贡献减掉,再归一化。

但直接用偏相关做检验有个麻烦:r 的抽样分布不稳定,越靠近 ±1 越“拧巴”。Fisher 先生的妙招是做变换 arctanh(r),把 r 映射到全体实数,使分布快速逼近正态。于是检验统计量为:

多个条件变量时,偏相关可用相关矩阵求逆的通用算法计算。有了这把精密尺,连续世界的因果侦探如虎添翼:在 PC 算法的骨架发现阶段,每判断“某条边是否该删”,就对候选条件集做一次 Fisher Z 检验。尺子越准,因果图越接近真相。

rXY⋅Z=rXY−rXZ rYZ(1−rXZ2)(1−rYZ2)\displaystyle r_{XY\cdot Z} = \frac{r_{XY} - r_{XZ}\,r_{YZ}}{\sqrt{(1-r_{XZ}^2)(1-r_{YZ}^2)}}
通俗说明:将偏相关先“展平”成近似正态的尺度,再乘上样本量修正,就能用标准正态分布查 p 值。
  1. Z 变换½·ln((1+r)/(1-r)) 就是 arctanh(r),把 r 从 (-1,1) 映射到全体实数并稳定方差。
    12ln⁡ ⁣(1+r1−r)\frac{1}{2}\ln\!\left(\frac{1+r}{1-r}\right)
  2. 样本量修正√(n-|S|-3) 中,|S| 是条件集中变量的个数;样本越大、条件越少,信息越足。
    n−∣S∣−3\sqrt{n - |S| - 3}
  3. 标准正态变换后的 z 在原假设下服从标准正态分布,查表或调用软件即可得到 p 值。
    ∼N(0,1)\sim \mathcal{N}(0,1)

卡方检验:离散世界的“对质表”

现实中有大量离散变量:打不打伞、路面干不湿、是否吸烟。侦探手里的证据从“尺子”换成“计数表”。做法是:在 Z 的每个取值层内,把 X、Y 的联合频数整理成一张 I×J 列联表(对质表),然后问:如果 X、Y 无关,每个格子“理应”有多少人?

“理应”的期望频数由行、列合计推出来:若行列独立,格子期望数 = 该行合计 × 该列合计 ÷ 层内样本总数。

实际人数与期望人数差距越大,越说明 X、Y 暗中有联系。把所有格子的偏差平方归一后累加,得到卡方统计量;自由度则要乘上条件变量的水平数。

卡方检验就是侦探的“人口普查法”:把每个“中间人在场”的小圈子分别清点人数、对比账目,任何一个圈子里账目对不上,就说明两人有私下勾连。在贝叶斯网络结构学习中,离散变量的条件独立判断绝大多数靠它。

Eij=Ri×Cjn\displaystyle E_{ij} = \frac{R_i \times C_j}{n}
通俗说明:卡方就像统计“实际到场人数”与“按理说该来的人数”的总体落差,落差太大就有鬼。
  1. 偏差平方归一每个格子“实际-期望”的平方除以期望,偏差越大的格子贡献越多。
    (Oij−Eij)2Eij\frac{(O_{ij} - E_{ij})^2}{E_{ij}}
  2. 跨层累加对条件集中每个 Z 层内的所有格子求和,等效于把各层证据汇总。
    ∑i=1I∑j=1J\sum_{i=1}^{I}\sum_{j=1}^{J}
  3. 自由度(I-1)(J-1) 是单层二维表的自由度,再乘上各条件变量水平数之积得到总自由度。
    df=(I−1)(J−1)⋅∏k∈Sdkdf = (I-1)(J-1)\cdot\prod_{k\in S} d_k

G 平方检验:卡方的“高精度天平”

卡方检验像弹簧秤,只关心“差值平方”;G 平方检验则像精密天平,基于似然比原理:分别比较“X、Y 有关”和“X、Y 无关”两个模型对数据的解释力,用对数似然比衡量数据更支持谁。

Wilks 定理保证:在原假设下,对数似然比的两倍近似服从卡方分布,自由度与卡方检验完全相同。因此 G 平方与卡方是“同分异构”的检验。

两者大样本下渐近等价;差异出现在小样本与稀疏列联表——大量格子期望频数小于 5,甚至出现零计数时,卡方近似变粗,G 平方对稀有事件更敏感,但极端稀疏时也会膨胀。工程上可用加 0.5 平滑或精确检验兜底。主流因果发现工具(pcalg、gCastle)默认用卡方,稀疏数据场景建议改 G 平方。回到侦探故事:如果“下雨且打伞”的样本少得可怜,弹簧秤可能“砰”地失衡,精密天平却能细腻衡量证据——选对工具,才不至于在数据稀薄的角落冤枉好人。

G2=2∑i=1I∑j=1JOij ln⁡ ⁣(OijEij)\displaystyle G^2 = 2\sum_{i=1}^{I}\sum_{j=1}^{J} O_{ij}\,\ln\!\left(\frac{O_{ij}}{E_{ij}}\right)
通俗说明:把每个格子的“实际/期望”比率取对数再按实际人数加权,稀有但巨大的偏差会被更敏锐地捕捉。
  1. 观测频数O_ij 是列联表中第 i 行第 j 列的实际计数。
    OijO_{ij}
  2. 比值取对数ln(O/E) 度量“实际相对期望”的偏差方向与强度,偏离越远绝对值越大。
    ln⁡ ⁣(OijEij)\ln\!\left(\frac{O_{ij}}{E_{ij}}\right)
  3. 加权求和乘 2以实际频数为权重累加所有格子的对数偏差,整体乘 2 来自似然比检验的 -2lnΛ。
    G2=2∑Oij ln⁡OijEijG^2 = 2\sum O_{ij}\,\ln\frac{O_{ij}}{E_{ij}}

条件集搜索:侦探的“排查艺术”

现实里“中间人”不止一个。侦探要判断 X、Y 之间是否真有直接联系,必须排查所有可能传话的候选人:先怀疑只有 Z1 在传话(条件集 {Z1}),再怀疑 Z1 和 Z2 合伙(条件集 {Z1,Z2})……只要存在某个条件集 S,使得给定 S 后 X、Y 独立,就说明没有证据支持直接关系。

候选条件集的数量随变量数爆炸式增长:p 个变量中挑 k 个做条件集,有 C(p,k) 种;全部可能条件集加起来是 2^p。

PC 算法用两招破解:一是“从小到大增广搜索”,先测空集、再测单变量条件集……一旦在某个小条件集下判定独立,立刻停止扩大;二是“剪枝”,每判定一条边独立就删除该边,并从后续候选条件集中剔除它,搜索空间快速收缩。侦探的排查同样如此:先从与双方都有交集的最可疑中间人审起;若他在场时两人毫无默契,立刻结案,不必把全城人叫来。条件集搜索的每次剪枝,都是为因果发现省下的办案时间。

(pk)=p!k! (p−k)!,∑k=0p(pk)=2p\displaystyle \binom{p}{k}=\frac{p!}{k!\,(p-k)!},\qquad \sum_{k=0}^{p}\binom{p}{k}=2^{p}
通俗说明:嫌疑人名单每多一人,“组合”数就翻倍——侦探必须懂得取舍,不能把全城人都审一遍。
  1. 组合数C(p,k) 表示从 p 个变量中挑选 k 个作为条件集的方式数。
    (pk)=p!k! (p−k)!\binom{p}{k} = \frac{p!}{k!\,(p-k)!}
  2. 总量翻倍所有可能条件集总数是 2^p,p=20 时超过一百万,逐一枚举不现实。
    ∑k=0p(pk)=2p\sum_{k=0}^{p}\binom{p}{k}=2^{p}

显著性校准:别让误判在“多案并查”中浑水摸鱼

侦探接手的连环案越来越多,他给自己定规矩:每案误判率不超过 5%。可当 100 个互不相干的案件同时过堂时,就算全部清白,按 5% 也会冤枉约 5 起。因果结构学习里,检验次数动辄成千上万,单次 α=0.05 会让大量伪边混入骨架。

校准策略分两派:控制“家族错误率”(FWER,确保至少误报一次的概率 ≤ α)和控制“错误发现率”(FDR,控制所有“显著”结论中误报的占比)。前者代表作是 Bonferroni,后者代表作是 Benjamini-Hochberg(BH)。

实际选择:误报代价高、检验次数适中→Bonferroni;希望保留更多候选边、样本量大→FDR。因果发现软件中常对条件独立检验不做过度惩罚(骨架搜索本身有局部性),但特征选择与学术汇报应有校正。侦探最终明白:审的案子越多,越要克制“看谁都可疑”的冲动。统计显著不等于因果显著——经过校准的结论,才敢写进结案报告。

αBonf=αm,q(i)=mi p(i)\displaystyle \alpha_{\text{Bonf}} = \frac{\alpha}{m},\qquad q_{(i)} = \frac{m}{i}\,p_{(i)}
通俗说明:Bonferroni 把“单案冤案率”摊薄到“总案冤案率”;BH 则按可疑度排序,边放行边计数。
  1. Bonferroni 摊薄把单次显著性水平 α 除以检验次数 m,使总误报率控制在 α 以内。
    αBonf=αm\alpha_{\text{Bonf}} = \frac{\alpha}{m}
  2. BH 的 q 值把 m 个 p 值从小到大排序,第 i 小的 p 值乘以 m/i 得到 q 值,q<α 才判显著。
    q(i)=mi p(i)q_{(i)} = \frac{m}{i}\,p_{(i)}
  3. 判决规则q_{(i)}<α 时拒绝对应原假设;m=1 时退化为普通单次检验。
    q(i)<αq_{(i)} < \alpha

AI 应用场景

基因调控网络推断

阶段:因果结构学习 / 特征筛选

解决的问题:基因表达数据是典型的连续变量,成千上万个基因两两相关性极高,但大量相关是“共表达”假象(共享同一转录因子)。传统做法直接算相关矩阵并画热图,无法区分“直接调控”与“间接共因”。用 Fisher Z 条件独立检验,在控制候选调控基因后判断两个基因是否真正直接相关,从而构建可靠度更高的基因调控网络。

具体案例:某研究团队在单细胞 RNA 测序数据上用 PC 算法骨架学习,对每个基因对在每个候选条件集下做 Fisher Z 检验,保留 p<0.01 的边。结果在 T 细胞分化数据中不仅压缩了 90% 以上的候选边,还成功找回了已知的转录因子调控子结构。

电商用户行为贝叶斯网络

阶段:贝叶斯网络结构学习 / 特征选择

解决的问题:用户行为都是离散事件(点击/加购/下单、是否领券、是否新客),且存在大量伪装成因果的“相关性”——领券用户购买率高,可能只是因为他们本来就有购买意向。“是否领券”与“是否下单”在控制“用户活跃度”后是否仍然关联?这正是卡方/G 平方条件独立检验的用武之地。

具体案例:某电商平台用 Bnlearn 库对 20 个用户行为变量做贝叶斯网络结构学习,内部启用 G² 检验。结果发现“领券”→“加购”的直接边在控制“优惠敏感度”后变得不显著,团队据此把营销资源从“无差别发券”转向“对敏感用户精准投放”,转化率提升了 12%。

Python 演示

python65 行
import numpy as npfrom scipy import stats def fisher_z_ci_test(x, y, z, alpha=0.05):    # 连续变量条件独立检验: 控制 Z 后 X 与 Y 是否独立 (Fisher Z)    if z.ndim == 1:        z = z.reshape(-1, 1)    zmat = np.column_stack([z, np.ones(len(z))])    beta_x, _, _, _ = np.linalg.lstsq(zmat, x, rcond=None)    beta_y, _, _, _ = np.linalg.lstsq(zmat, y, rcond=None)    rx = x - zmat.dot(beta_x)    ry = y - zmat.dot(beta_y)    r = np.corrcoef(rx, ry)[0, 1]    k = z.shape[1]    zstat = np.sqrt(len(x) - k - 3) * 0.5 * np.log((1 + r) / (1 - r))    p = 2 * (1 - stats.norm.cdf(abs(zstat)))    return {"corr": r, "zstat": zstat, "p": p, "independent": p >= alpha} def discrete_ci_test(data, x, y, z, method="chi2"):    # 离散变量条件独立检验: 卡方 / G 平方, 控制 Z 后 X 与 Y 是否独立    xs = sorted({row[x] for row in data})    ys = sorted({row[y] for row in data})    zs = sorted({row[z] for row in data})    stat = 0.0    dof = 0    for zv in zs:        table = np.zeros((len(xs), len(ys)))        for row in data:            if row[z] == zv:                table[xs.index(row[x]), ys.index(row[y])] += 1        n = table.sum()        if n == 0:            continue        expected = table.sum(axis=1, keepdims=True) * table.sum(axis=0, keepdims=True) / n        mask = expected > 0        o, e = table[mask], expected[mask]        if method == "g2":            stat += 2 * (o * np.log(o / e)).sum()        else:            stat += ((o - e) ** 2 / e).sum()        dof += (len(xs) - 1) * (len(ys) - 1)    p = 1 - stats.chi2.cdf(stat, dof)    return {"stat": stat, "dof": dof, "p": p, "independent": p >= 0.05} if __name__ == "__main__":    rng = np.random.default_rng(42)    n = 500    z = rng.normal(size=n)    x = 0.8 * z + rng.normal(size=n)    y = 0.8 * z + rng.normal(size=n)    r0 = np.corrcoef(x, y)[0, 1]    print("无条件相关系数 r=%.3f (看似相关!)" % r0)    res = fisher_z_ci_test(x, y, z)    print("FisherZ: r=%.3f, z=%.3f, p=%.4f -> 独立? %s"          % (res["corr"], res["zstat"], res["p"], res["independent"]))    dz = rng.integers(0, 2, n)    dx = np.where(rng.random(n) < 0.9, dz, 1 - dz)    dy = np.where(rng.random(n) < 0.9, dz, 1 - dz)    data = [{"x": int(a), "y": int(b), "z": int(c)} for a, b, c in zip(dx, dy, dz)]    r2 = discrete_ci_test(data, "x", "y", "z", "chi2")    r3 = discrete_ci_test(data, "x", "y", "z", "g2")    print("卡方: stat=%.3f, df=%d, p=%.4f -> 独立? %s"          % (r2["stat"], r2["dof"], r2["p"], r2["independent"]))    print("G平方: stat=%.3f, df=%d, p=%.4f -> 独立? %s"          % (r3["stat"], r3["dof"], r3["p"], r3["independent"]))
目的:分别用 Fisher Z(连续变量)和卡方/G 平方(离散变量)完成条件独立检验,识别“共因制造的假相关”。
  1. rx = x - zmat.dot(beta_x)把 Z 对 X 的线性贡献回归掉,得到“洗过澡”的残差。
  2. zstat = np.sqrt(len(x) - k - 3) * 0.5 * np.log((1 + r) / (1 - r))Fisher Z 变换并乘样本量修正,构造标准正态统计量。
  3. p = 2 * (1 - stats.norm.cdf(abs(zstat)))双侧 p 值,与标准正态分布比较。
  4. expected = table.sum(axis=1, keepdims=True) * table.sum(axis=0, keepdims=True) / n用行列合计推算“假设无关”时的期望频数。
  5. stat += ((o - e) ** 2 / e).sum()逐层累加卡方统计量。
  6. stat += 2 * (o * np.log(o / e)).sum()切到 G 平方模式:以实际频数为权重的对数似然比。
  7. dof += (len(xs) - 1) * (len(ys) - 1)每个 Z 层的自由度合并,等价于乘以条件变量水平数。
  8. dx = np.where(rng.random(n) < 0.9, dz, 1 - dz)构造与 Z 强相关的“假 X”,用于验证检验能否识破共因。

常见误区

误区“我算了一下,X 和 Y 的相关系数很高,p 值 < 0.001,所以它们肯定有关系,可以直接画因果边。”

正解高相关只能说明“边缘依赖”。若存在共同原因 Z(如“下雨”同时影响“打伞”和“路面湿”),X、Y 会被 Z“牵着走”产生假相关。必须在给定候选条件集后重新检验:若控制 Z 后独立性成立,说明 X、Y 之间没有直接因果证据。这正是辛普森悖论的教训——合并数据会骗人,分层(条件化)才见真相。

为何常见:人的直觉天然把“一起出现”等同于“有联系”;而教科书先讲皮尔逊相关,学习者容易把第一步的结论当成最终结论。

误区“反正都是检验独立性,连续变量数据我也用卡方,离散变量我用 Fisher Z,都一样。”

正解Fisher Z 基于偏相关,要求 X、Y、Z 近似连续且关系为线性;卡方/G 平方基于频数列联表,要求变量离散。把连续变量强行离散化(如中位数切分)会损失信息甚至扭曲相关结构;把离散变量当连续变量算相关则毫无意义。选择检验前先问:数据是连续尺子还是离散计数器。

为何常见:很多工具库“一键检验”屏蔽了内部差异,用户只看到“输出一个 p 值”,想当然认为可互换。

误区“条件集里变量越多越严谨,我把所有其他变量都放进去,控制得干干净净。”

正解条件集过大有两个问题:一是样本被层层细分,每个格子数据稀疏,检验功效骤降(明明有依赖也检不出);二是自由度随条件水平数快速增长,极端情况下 p 值失去意义。好的条件集搜索遵循“从最小集开始、够用即停”策略——能判定独立就不再扩大。

为何常见:控制变量在日常语境里常被理解为“越多越安全”,但统计检验是要用数据“喂”自由度的,样本量有限。

误区“我把图上所有邻居都测了一遍,只要有一次 p < 0.05 就能说明这条边存在。”

正解检验次数 m 越大,纯随机数据里出现 p<0.05 的期望次数就越多(约 m×0.05)。因果骨架搜索常在成千上万次检验后进行边判定,应做 Bonferroni(严格控制误报)或 FDR(控制错误发现比例)校正,并把校正后的结论作为报告依据。

为何常见:单次检验的教材惯例深入人心,“多重比较”概念属于进阶内容,入门者容易踩坑。

误区“检验的 p 值是 0.3,说明 X 和 Y 条件独立,我可以放心地不画这条边了。”

正解p>0.05 只是“证据不足以拒绝原假设”,不等于“证明独立成立”。样本量小或检验功效低时,p>0.05 可能只是“没发现”而不是“不存在”。因果发现里,通常会结合独立性样本量判断、bootstrap 稳定性分析或额外依赖度量(如互信息估计)来佐证。

为何常见:假设检验的二元判决(拒绝/不拒绝)容易被误解为“独立/不独立”的绝对结论;初学者不熟悉两类错误与检验功效的概念。

面试题

Q1. 关于条件独立 X⊥Y|Z,下列说法正确的是?

单选题 · easy

  • A.X 与 Y 在任何情况下都互不影响
  • B.给定 Z 后 X 与 Y 不再互相提供信息← 正确答案
  • C.存在 Z 使 X 与 Y 永远独立于一切
  • D.X、Y、Z 三者两两之间完全无关

答案:B。条件独立只承诺“在给定 Z 的每个取值下,X、Y 不互相提供额外信息”。A 把它夸大成“永远无关”,C 表述混乱(“独立于一切”不成立),D 混淆了条件独立与两两独立。就像侦探只证明“支开中间人后两人对不上供词”,不代表两人在任何场合都没关联。

Q2. 打伞(X)与路面湿(Y)高度相关,控制下雨(Z)后相关性消失,这说明?

单选题 · easy

  • A.打伞行为会直接导致路面变湿
  • B.下雨是 X、Y 关系里的混杂因素← 正确答案
  • C.Z 是打伞与湿路面之间的中介变量
  • D.X 与 Y 二者完全无关互不影响

答案:B。打伞与路面湿的强相关被“下雨”这个共因同时驱动,控制 Z 后相关消失,说明 Z 是混杂因素。若 Z 是中介(X→Z→Y),控制后 X、Y 的关联通常只是减弱而非消失;本例 X、Y 无直接因果,B 正确。

Q3. 处理连续变量之间的条件独立检验,首选方法是?

单选题 · easy

  • A.卡方检验和 G 平方检验方法
  • B.Fisher Z 检验或偏相关检验← 正确答案
  • C.列联表频数全部两两求和
  • D.把连续数据离散化成 0/1 值

答案:B。连续变量的线性关联用偏相关/Fisher Z 检验最自然;卡方/G 平方围绕频数列联表设计,适用于离散计数数据。把连续数据硬切成 0/1 会损失大量信息,一般不推荐。

Q4. Fisher Z 变换(arctanh(r))的主要作用是?

单选题 · mid

  • A.让相关系数取值范围扩展到实数域
  • B.使样本偏相关分布近似正态化← 正确答案
  • C.将偏相关值压缩到零到一之间
  • D.消除条件变量之间所有共线性

答案:B。arctanh 将 r∈(-1,1) 映射到 (-∞,+∞) 并使其抽样分布快速趋于正态、方差近似稳定——这是假设检验的前提。A 只是伴随表象而非目的;C 方向反了(是扩展而非压缩);D 与检验无关。

Q5. 在 Z 的每一层内构建 I×J 列联表做条件独立检验,自由度 df 为?

单选题 · mid

  • A.(I-1)(J-1) 乘以条件变量水平数之积← 正确答案
  • B.(I+J) 减去样本数量的平方根
  • C.I×J 减去总样本数后再加一
  • D.(I-1)(J-1) 再加上条件集变量个数

答案:A。各 Z 层内的检验相互独立,总自由度等于单层二维表的自由度 (I-1)(J-1) 乘以各条件变量水平数之积。其余选项都没有统计依据。

Q6. 关于 G² 统计量与卡方统计量的关系,正确的是?

单选题 · mid

  • A.两者在任何情况下都严格相等
  • B.大样本渐近等价小样本表现有别← 正确答案
  • C.G 平方检验比卡方少一个自由度
  • D.卡方检验只适用于二维的 2×2 表

答案:B。大样本下 G² 与 χ² 近似相等;小样本或稀疏列联表中,两者对零频、低期望格子的处理不同,表现有差异。二者自由度相同,C 错误;卡方可用于任意 I×J 表,D 错误。

Q7. Fisher Z 检验中统计量 z=√(n-k-3)·arctanh(r),其中 k 表示?

单选题 · hard

  • A.数据集中所有变量的总个数
  • B.条件集中变量的个数即 |S|← 正确答案
  • C.列联表中行数加列数的和
  • D.检验重复执行的总次数

答案:B。k=|S| 是条件集中变量的个数。样本量 n 越大信息越多,条件变量越多消耗自由度越多,√(n-k-3) 正是这种平衡的体现。A 混淆了总变量数与条件个数,D 是多重检验的概念。

Q8. 下列哪些做法属于条件集搜索的正确策略?

多选题 · mid

  • A.从大小为 0 的条件集开始逐步增大← 正确答案
  • B.一旦找到独立条件集立即停止扩大← 正确答案
  • C.无条件枚举全部 2^p 个条件集
  • D.用已删边的信息来剪枝候选集← 正确答案

答案:ABD。PC 算法从空集开始增广搜索,一旦判定独立就停止扩大,并用已删边更新候选条件集,大幅缩减搜索空间。C 是典型的“组合爆炸”错误做法,p=20 时超过一百万次检验,既不现实也没必要。

Q9. 关于多重检验校正,下列说法正确的有?

多选题 · extreme

  • A.Bonferroni 将 α 除以总检验次数← 正确答案
  • B.FDR 控制所有拒绝中误报的比例← 正确答案
  • C.校正使单次检验门槛变得更宽松
  • D.多重检验只影响离散数据检验

答案:AB。Bonferroni 用 α/m 控制“至少一次误报”的概率;FDR 控制所有“显著”结论中误报的占比。校正使每个单次检验的门槛更严格而非更宽松,C 错误;多重检验影响一切统计检验方法,D 错误。

Q10. 在因果发现中使用条件独立检验,应注意哪些事项?

多选题 · hard

  • A.连续变量用 Fisher Z 并检查线性假设← 正确答案
  • B.离散稀疏列联表需谨慎或加平滑← 正确答案
  • C.p 值显著即证明因果方向完全确定
  • D.报告时注明条件集和校正方法← 正确答案

答案:ABD。A、B、D 都是正确实践。条件独立检验只能判断“是否有直接边的证据”,无法单独确定因果方向(方向还需结合 v 结构与干预实验);C 把“显著拒绝独立”过度解读成“因果方向已定”,是入门者最常犯的错误。