返回MR专题首页

2SMR 核心分析教程

一套代码串起 harmonise、工具变量强度评估与七种MR方法

⚙️ 新手导读:2SMR是整套流程的主干

如果你只准备先学一页实操,优先掌握这页。它连接了数据协调、主分析和结果导出。

背景介绍

TwoSampleMR是目前最常用的MR分析工具链。通过统一的输入格式和方法集合,可以快速比较不同估计器的一致性。

备注(统一三段)

适用人群:已经准备好暴露/结局数据,准备进入主分析和结果导出的同学。
常见错误:忽略mr_keep与F统计量过滤,容易把弱工具变量带入主结果。
论文写法:结果建议同时给beta与OR(若二分类结局),并统一95%CI展示格式。

核心步骤

完整代码模板(可直接复用)

library(TwoSampleMR)
library(data.table)
library(MRPRESSO)
library(foreach)

# 0) 初始化结果模板(注:模板文件建议在 ./input/ 目录预先准备)
OR_summary <- read.csv("./input/OR_summary_templete_for_multiSNPs.csv")
mr_presso_summary <- read.csv("./input/mr_presso_templete_for_multiSNPs.csv")
mr_heterogeneity_summary <- read.csv("./input/mr_heterogeneity_templete_for_multiSNPs.csv")
mr_pleiotropy_summary <- read.csv("./input/mr_pleiotropy_test_templete_for_multiSNPs.csv")
mr_leaveoneout_summary <- read.csv("./input/mr_leaveoneout_templete_for_multiSNPs.csv")

message("6. 准备进行孟德尔随机化")

# 1) 协调暴露/结局数据方向
dat <- harmonise_data(
 exposure_dat = exposure_dat_mediation,
 outcome_dat = outcome_dat_mediation
)

# 2) 计算 R² 与 F 统计量,并剔除弱工具变量(F <= 10)
harm_rt <- dat
harm_rt$R2 <- (2 * (harm_rt$beta.exposure^2) * harm_rt$eaf.exposure * (1 - harm_rt$eaf.exposure)) /
 (2 * (harm_rt$beta.exposure^2) * harm_rt$eaf.exposure * (1 - harm_rt$eaf.exposure) +
   2 * harm_rt$samplesize.exposure * harm_rt$eaf.exposure * (1 - harm_rt$eaf.exposure) * harm_rt$se.exposure^2)
harm_rt$F <- harm_rt$R2 * (harm_rt$samplesize.exposure - 2) / (1 - harm_rt$R2)
harm_rt$meanF <- mean(harm_rt$F, na.rm = TRUE)
dat <- harm_rt[harm_rt$F > 10, ]

# 3) 主MR分析 + OR转换(用于二分类结局展示)
res <- mr(dat)
OR <- generate_odds_ratios(res)
OR_summary <- rbind(OR_summary, OR)

# 4) 异质性检验(新增覆盖点)
heterogeneity_res <- TwoSampleMR::mr_heterogeneity(dat)
mr_heterogeneity_summary <- rbind(mr_heterogeneity_summary, heterogeneity_res)

# 5) 多效性检验(新增覆盖点)
pleiotropy_res <- mr_pleiotropy_test(dat)
mr_pleiotropy_summary <- rbind(mr_pleiotropy_summary, pleiotropy_res)

# 6) Leave-one-out 分析(新增覆盖点)
loo_res <- mr_leaveoneout(dat)
mr_leaveoneout_summary <- rbind(mr_leaveoneout_summary, loo_res)

# 7) 结果写出(建议每个模块单独文件,便于批量append)
fwrite(dat, "./output/harmonised_dat.tsv", sep = "\t")
fwrite(OR_summary, "./output/mr_or_summary.tsv", sep = "\t")
fwrite(mr_heterogeneity_summary, "./output/mr_heterogeneity.tsv", sep = "\t")
fwrite(mr_pleiotropy_summary, "./output/mr_pleiotropy_test.tsv", sep = "\t")
fwrite(mr_leaveoneout_summary, "./output/mr_leaveoneout.tsv", sep = "\t")

rm(outcome_dat_mediation)
if (exists("formatted_outcome_dat")) rm(formatted_outcome_dat)
gc()
message("7. 孟德尔随机化完成")

七种方法速览