跳转至

贝叶斯网络因果推断

一句话概述:贝叶斯网络(Bayesian Network)用有向无环图(DAG)表示变量间的因果/概率依赖关系,在生信中用于基因调控网络推断、疾病因果分析和多组学因果整合。白话:不只找相关性,还要找谁导致谁。

核心知识点速查表

概念说明
贝叶斯网络DAG + 条件概率表(白话:带方向的因果关系图)
DAG有向无环图,箭头表示因果方向
因果推断区分"A导致B"和"A和B同时出现"(相关≠因果)
条件独立控制中间变量后,两变量独立
结构学习从数据中学习网络结构(哪些变量间有因果关系)
参数学习已知结构,学习条件概率
孟德尔随机化(MR)用遗传变异作为工具变量推断因果

一、R语言贝叶斯网络

# === 使用bnlearn包 ===
library(bnlearn)

# 准备数据(多个变量的观测值)
data <- data.frame(
  gene_A = rnorm(200),
  gene_B = rnorm(200),
  gene_C = rnorm(200),
  phenotype = rnorm(200)
)

# 结构学习(从数据推断因果网络)
# Hill-Climbing算法
bn_hc <- hc(data, score="bic-g")     # 高斯BIC评分
plot(bn_hc)                            # 可视化网络结构

# PC算法(基于条件独立检验)
bn_pc <- pc.stable(data, test="cor")   # 相关性检验
plot(bn_pc)

# 参数学习
fitted_bn <- bn.fit(bn_hc, data)      # 拟合参数
print(fitted_bn)                        # 查看条件概率

# 推理
cpquery(fitted_bn,
        event=(phenotype > 1),          # 查询事件
        evidence=(gene_A > 0.5))        # 给定条件

二、孟德尔随机化(MR)

# === 生信中最常用的因果推断方法 ===
library(TwoSampleMR)

# 暴露因素(如微生物丰度的GWAS summary statistics)
exposure <- extract_instruments("exposure_gwas_id")   # 提取工具变量SNP

# 结局(如疾病风险的GWAS summary statistics)
outcome <- extract_outcome_data(exposure$SNP, "outcome_gwas_id")

# 协调数据
dat <- harmonise_data(exposure, outcome)               # 协调方向

# MR分析
mr_results <- mr(dat, method_list=c(
  "mr_ivw",                    # 逆方差加权(主要方法)
  "mr_egger_regression",       # MR-Egger(检测多效性)
  "mr_weighted_median"          # 加权中位数(稳健方法)
))
print(mr_results)

# 敏感性分析
mr_pleiotropy_test(dat)        # 多效性检验
mr_heterogeneity(dat)          # 异质性检验

# 可视化
mr_scatter_plot(mr_results, dat)   # 散点图
mr_forest_plot(mr_results)          # 森林图

三、面试高频考点

Q1: 相关性≠因果性,怎么区分?

  • 相关:A和B同时变化(可能有混杂因素C)
  • 因果:干预A→B改变(排除混杂后仍成立)
  • 区分方法:①实验干预(金标准) ②孟德尔随机化 ③贝叶斯网络 ④时间序列因果(Granger)
  • 白话:冰淇淋销量和溺水率相关,但冰淇淋不导致溺水(混杂:天气热)

Q2: 孟德尔随机化的原理?

  • 用遗传变异(SNP)作为"天然实验"的工具变量
  • 因为基因型在受精时随机分配(像随机对照试验)
  • 前提:①SNP与暴露相关 ②SNP不直接影响结局 ③SNP不与混杂因素相关

速查表

# === 因果推断速查 ===
# 贝叶斯网络
library(bnlearn)
bn <- hc(data); plot(bn)

# 孟德尔随机化
library(TwoSampleMR)
mr(harmonise_data(exposure, outcome))

# Python: pgmpy(贝叶斯网络), DoWhy(因果推断)