贝叶斯网络因果推断¶
一句话概述:贝叶斯网络(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不与混杂因素相关