本节摘要:约束型与分数型在观察数据上都止步于等价类,除非注入额外假设。本节讲 LiNGAM 依托线性非高斯噪声打破方向不可辨识的原理、混合算法(MMHC 等约束加评分的两段式)、连续优化的 NOTEARS 路线,以及时间序列上的 tsFCI/var-LiNGAM/Granger 因果的定位。
等价类不可破的宿命有一个著名例外。线性 SCM 下,若噪声项非高斯(且每个方程至多一个非高斯外生项),则不仅方向、整张 DAG 都可辨识——这是 LiNGAM(Shimizu 等,2006)的核心定理。直觉来自独立成分分析(ICA):把观测写成 X = B·X + U(B 是严格下三角的结构系数矩阵,行重排后),非高斯的独立性结构让 B 从协方差矩阵之外的信息里恢复出来。高斯情形只有二阶统计量可用,等价类挡路;非高斯提供高阶信息,把"X→Y 与 Y→X"在分布层面区分开。
一个两变量最小例:X = U₁(U₁ 均匀分布),Y = 0.8X + U₂(U₂ 均匀分布)。散点上 Y 对 X 的条件方差恒定,而 X 对 Y 的"反向回归"残差与 Y 相关且分布形状随 Y 的取值区间系统变化——回归残差的非齐性正是非高斯性留下的方向指纹。DirectLiNGAM 用核独立性度量直接逐对排出因果次序,绕开 ICA 的收敛问题。
代价必须说清:LiNGAM 的可辨识性对"线性 + 非高斯 + 无隐藏混杂"三条同时敏感。噪声接近高斯时方向估计不稳定;非线性场合要换其推广(如加性噪声模型 ANM、后非线性模型 PNL,它们各有自己的可辨识条件)。
**MMHC(max-min hill-climb)**是两段式的代表:第一阶段用 MMPC(约束型思想,max-min 条件独立检验)剪出候选骨架,把超级指数的搜索空间压到多项式级;第二阶段在骨架上做爬山式的评分搜索定向。约束做减法、评分做排序——兼得 PC 的可扩展骨架与 BIC 的方向偏好,是中大规模数据集的实用默认项。
**NOTEARS(2018)**把"无环"这个组合约束改写成矩阵指数的平滑等价(tr(e^W)−n=0),于是 DAG 学习变成带等式约束的连续优化,可上 L-BFGS。工程收益是可扩展与可微;概念风险是它本质仍在等价类里打转(线性高斯版),无环约束的数值松弛偶尔产生"近似环"。后续工作(GOLEM、DAGMA 等)改损失与约束形式,方向同属"结构学习连续化"这一分支。
滞后结构送来免费的次序约束:过去不能是未来的后代。时间序列因果发现由此获得横截面数据没有的辨识力,三个代表:
带滞后记忆的约束型(tsFCI / PCMCI)。在时间切片图上跑约束型框架,显式处理自相关导致的虚假边与隐藏共同_driver;PCMCI 用条件互信息筛选父代候选再加 MCI 检验,气候科学里广泛用于因果网络重建(如海气相互作用指标之间的滞后影响)。
var-LiNGAM。向量自回归 + LiNGAM:残差非高斯时,同期(同一切片内)方向也可辨识,弥补了第 2.3 节说的"Granger 看不见同期因果"的盲区。
Granger 图的定位。Granger 因果图(把逐对 Granger 检验画成有向图)依旧是探索利器,但要带着第 2.3 节的三条告诫使用:预测性非干预性、对隐藏共同驱动敏感、不处理同期关系。学术工作流里常见组合:先用 Granger 网络做探索性骨架,再用 var-LiNGAM 或带先验的 GES 复核方向。
给一个粗粒度的选型指引:小样本离散数据且需要可审查的中间产物——PC/BDeu-GES;中大规模连续数据——MMHC 或 NOTEARS;有强理由相信线性系统且噪声非高斯——LiNGAM 族;时间序列——PCMCI/var-LiNGAM 组合。无论选哪条,输出验证的纪律不变:稳定性选择(重抽样下边出现频率)、对合成数据(用已知 SCM 生成)回测管线、以及领域专家对每条定向边的机制质询。因果发现的成品是"带置信度的假设清单",把它当第 3 章识别分析的输入,而不是终点。
# 概念流程:DirectLiNGAM 思想示意——用独立性质逐个排出因果源 import numpy as np from scipy import stats rng = np.random.default_rng(31) n = 4000 x1 = rng.laplace(0, 1, n) # 非高斯源 x2 = 0.8*x1 + rng.laplace(0, 1, n) x3 = -0.6*x1 + 0.5*x2 + rng.laplace(0, 1, n) X = np.column_stack([x1, x2, x3]) # 外向独立性:真源对其他变量的回归残差最接近独立(用相关系数量化示意) for j in range(3): resid_corr = [abs(np.corrcoef(X[:, j], X[:, k] - np.polyval(np.polyfit(X[:, j], X[:, k], 1), X[:, j]))[0,1]) for k in range(3)] print(f"以 x{j+1} 为源的平均残差相关: {np.mean(resid_corr):.3f}") # 典型输出:x1 作源时残差相关最小 → 排序 x1 → x2 → x3,与真结构一致
选型速查表:小样本离散、需可审查——PC/BDeu-GES;中大规模连续——MMHC 或 NOTEARS;线性且噪声非高斯有把握——LiNGAM 族;时间序列滞后结构——PCMCI 打骨架、var-LiNGAM 定同期方向;任何情形——双跑互证 + 稳定性选择 + 专家质询三件套。