PC

算法介绍

执行 Peter-Clark (PC [1]) 算法进行因果发现。我们也支持带有缺失值的数据集,并包含了按测试删除的PC (选择 'MV-Fisher_Z' 作为测试名称)。

如果您想使用缺失值 PC [2],请将 'mvpc' 设为 True。

用法

from causallearn.search.ConstraintBased.PC import pc

# default parameters
cg = pc(data)

# or customized parameters
cg = pc(data, alpha, indep_test, stable, uc_rule, uc_priority, mvpc, correction_name, background_knowledge, verbose, show_progress)

# visualization using pydot
cg.draw_pydot_graph()

# or save the graph
from causallearn.utils.GraphUtils import GraphUtils

pyd = GraphUtils.to_pydot(cg.G)
pyd.write_png('simple_test.png')

# visualization using networkx
# cg.to_nx_graph()
# cg.draw_nx_graph(skel=False)

推荐使用 pydot 进行可视化。如果需要特定的标签名称,请参考此用法示例(例如,‘cg.draw_pydot_graph(labels=[“A”, “B”, “C”])’ 或 ‘GraphUtils.to_pydot(cg.G, labels=[“A”, “B”, “C”])’)。

高级用法

  • 如果您想为(条件)独立性检验指定参数(如果可用),您可以直接将参数传递给 pc 调用。例如:

    from causallearn.search.ConstraintBased.PC import pc
    from causallearn.utils.cit import kci
    cg = pc(data, 0.05, kci, kernelZ='Polynomial', approx=False, est_width='median', ...)
    
  • 如果您的图很大和/或独立性检验很慢(例如 KCI),您可能希望将 p 值结果缓存到本地检查点。然后通过从本地检查点读取值,就不会浪费重复计算来恢复检查点/仅微调一些 PC 参数。这可以通过指定 cache_path 来实现。例如:

    citest_cache_file = "/my/path/to/citest_cache_dataname_kci.json"    # .json file
    cg1 = pc(data, 0.05, kci, cache_path=citest_cache_file)             # after the long run
    
    # just finetune uc_rule. p-values are reused, and thus cg2 is done in almost no time.
    cg2 = pc(data, 0.05, kci, cache_path=citest_cache_file, uc_rule=1)
    

    如果本地文件系统中不存在 cache_path,将创建一个新的。否则,缓存将首先从 json 文件加载到 CIT 类并在运行时使用。请注意 1) 加载时会首先检查数据哈希和参数哈希以确保一致性,并且 2) 在运行时,缓存将每 30 秒保存到本地文件。

  • 上述高级用法也适用于其他基于约束的方法,例如 FCI 和 CDNOD。

参数

data: numpy.ndarray, 形状为 (样本数, 特征数)。数据,其中 n_samples 是样本数,n_features 是特征数。

alpha: 期望的显著性水平(浮点数),范围在 (0, 1) 之间。默认值: 0.05。

indep_test: 字符串,独立性检验方法的名称。默认值: ‘fisherz’。
  • fisherz”: Fisher's Z 条件独立性检验。

  • chisq”: 卡方条件独立性检验。

  • gsq”: G 方条件独立性检验。

  • kci”: 基于核的条件独立性检验。(作为一种核方法,其复杂度与样本大小的三次方成正比,因此如果样本大小不小,可能会很慢。)

  • mv_fisherz”: 缺失值 Fisher's Z 条件独立性检验。

(对于更有效的非参数检验,您可以尝试 FastKCI 和 RCIT。两种实现都还处于初步阶段,可能存在一些问题。)

stable: 如果为 True,则运行稳定的骨架发现 [4]。默认值: True。

uc_rule: 如何定向非屏蔽碰撞点。默认值: 0。
  • 0: 运行 uc_sepset。

  • 1: 运行 maxP [3]。将非屏蔽三元组 X-Y-Z 定向为碰撞点,并进行额外的 CI 检验。

  • 2: 运行 definiteMaxP [3]。只定向骨架中的确定碰撞点,并同时跟踪所有确定的非碰撞点。

uc_priority: 解决非屏蔽碰撞点之间冲突的规则。默认值: 2。
  • -1: uc_rule 中的默认设置。

  • 0: 覆盖。

  • 1: 定向为双向边。

  • 2: 优先现有碰撞点。

  • 3: 优先较强的碰撞点。

  • 4: 优先更强的*碰撞点。

mvpc: 是否使用缺失值 PC。默认值: False。

correction_name. 如果使用缺失值 PC,则进行缺失值校正。默认值: ‘MV_Crtn_Fisher_Z’

background_knowledge: class BackgroundKnowledge. 根据指定的因果连接添加先验边。默认值: None。有关详细用法,请参阅其用法示例

verbose: 如果应打印详细输出,则为 True。默认值: False。

show_progress: 如果应在控制台显示算法进度,则为 True。默认值: True。

返回值

cg : 一个 CausalGraph 对象,其中 cg.G.graph[j,i]=1 且 cg.G.graph[i,j]=-1 表示 i –> j;cg.G.graph[i,j] = cg.G.graph[j,i] = -1 表示 i — j;cg.G.graph[i,j] = cg.G.graph[j,i] = 1 表示 i <-> j。