🧬+📊

MR联合Meta分析

孟德尔随机化 × 荟萃分析

当单个GWAS样本量不足时,如何联合多个研究提升统计效力? 本教程涵盖MR的Meta分析、GWAS Meta联合、SNP Meta分析等高级方法。

🎯 核心应用场景

🔬

MR的Meta分析

将多个MR研究的效应量进行Meta合并,提升因果推断的可靠性。

🧬

GWAS Meta联合

合并多个GWAS summary statistics,扩大样本量,增强工具变量效力。

📍

SNP Meta分析

对多个研究的SNP水平数据进行Meta合并,构建更强大的工具变量。

💻 实战代码教程

实操

MR的Meta分析 (二分类变量)

将多个MR研究的OR值进行Meta合并,适用于汇总多个独立MR研究的结果。

# 1. 安装并加载meta包
# install.packages("meta")
library(meta)

# 2. 设置工作目录
setwd("your/path/to/data")

# 3. 读取数据 (包含OR, 95%CI, 样本量, p值)
data <- read.csv("MRMETA.csv", header = TRUE)

# 4. 数据整理 - 将OR转换为log值,计算SE
beta <- log(data[, "OR"])
loguci <- log(data[, "or_uci95"])
loglci <- log(data[, "or_lci95"])
se <- (loguci - loglci) / (2 * 1.96)

# 5. Meta分析 (随机效应模型)
metadata <- metagen(
  TE = beta,       # 效应值 (logOR)
  seTE = se,       # 标准误
  data = data,
  sm = "OR",       # 效应量类型
  n.e = ncase,      # 病例组样本量
  n.c = ncontrol,    # 对照组样本量
  pval = p,       # p值
  random = TRUE,     # 随机效应模型
  common = FALSE,
  studlab = paste(author, year, sep = ",")
)

# 查看结果
metadata
实操

森林图与亚组分析

# 6. 绘制森林图
forest(metadata)

# 保存为PDF
pdf("forest_OR.pdf", width = 12, height = 8)
forest(metadata)
dev.off()

# 7. 亚组分析 (按年份分组)
metadata1 <- metagen(
  TE = beta, seTE = se, data = data, sm = "OR",
  n.e = ncase, n.c = ncontrol, pval = p,
  random = TRUE, common = FALSE,
  studlab = paste(author, year, sep = ","),
  subgroup = year   # 按年份进行亚组分析
)
forest(metadata1)
高级

敏感性分析与发表偏倚

# 8. 敏感性分析 (Leave-one-out)
metainf(metadata, pooled = "random")
forest(metainf(metadata, pooled = "random"), comb.random = TRUE)

# 9. 漏斗图 - 检测发表偏倚
funnel(metadata)
pdf("funnel.pdf")
dev.off()

# 10. 剪补法 (Trim-and-fill)
tf0 <- trimfill(metadata)
funnel(tf0, pch = ifelse(tf0$trimfill, 1, 23), 
    level = 0.95, comb.random = TRUE)

# 异质性大时用MM法
metabias(metadata, method.bias = "mm")

# 异质性小时用Harbob法
metabias(metadata, method.bias = "score")
高级

GWAS Meta分析 (METAL结果处理)

对METAL软件输出的GWAS Meta结果进行后处理,转换为TwoSampleMR可用的标准格式。

# 1. 读取METAL结果文件
library(vroom)
res <- vroom("METAANALYSIS1.TBL", col_names = TRUE)

# 2. 根据z-score和p-value计算beta和se
SE = 1 / sqrt((2 * res$`P-value`) * (1 - res$`P-value`) * 
       (res$Weight + res$Zscore^2))
Beta = SE * res$Zscore

# 3. 将beta、se加到结果数据中
res_betase <- as.data.frame(cbind(Beta, SE))
final <- cbind(res, res_betase)

# 4. 转化为TwoSampleMR标准格式
# 标准列名: SNP, beta, se, eaf, effect_allele, other_allele, p, N
GWAS <- final[, c(1, 2, 3, 4, 6, 8, 9)]
colnames(GWAS) <- c("SNP", "effect_allele", "other_allele", 
           "N", "p", "beta", "se")

# 转换为大写
GWAS$effect_allele <- toupper(GWAS$effect_allele)
GWAS$other_allele <- toupper(GWAS$other_allele)

# 5. 导出为CSV
write.csv(GWAS, "GWAS.csv", row.names = FALSE)
实操

SNP水平Meta分析 (病例对照)

对多个研究的等位基因计数数据进行Meta分析,适用于SNP层面的关联研究。

# 1. 加载meta包
library(meta)

# 2. 读取SNP数据 (包含每个研究的2x2表数据)
mydata <- read.csv("snp_meta.csv")

# 3. 二分类变量Meta分析
# 数据格式: Case.CT.TT, Case.CC, Control.CT.TT, Control.CC
metadata <- metabin(
  Case.CT.TT,       # 病例组: 携带变异基因数
  Case.CT.TT + Case.CC,  # 病例组: 总数
  Control.CT.TT,      # 对照组: 携带变异基因数
  Control.CT.TT + Control.CC, # 对照组: 总数
  data = mydata,
  sm = "OR",
  comb.fixed = FALSE,   # 固定效应
  comb.random = TRUE,   # 随机效应
  studlab = paste(Author, Year, Country, sep = ",")
)

# 4. 森林图
forest(metadata)
pdf("forest_SNP.pdf", width = 12, height = 8)
dev.off()

# 5. 亚组分析 (按国家)
metadata1 <- metabin(
  Case.CT.TT, Case.CT.TT + Case.CC,
  Control.CT.TT, Control.CT.TT + Control.CC,
  data = mydata, sm = "OR",
  comb.fixed = FALSE, comb.random = TRUE,
  studlab = paste(Author, Year, Country, sep = ","),
  byvar = Country
)
forest(metadata1)

📈 分析流程图

GWAS研究1
GWAS研究2
GWAS研究n
⬇️
Meta合并 (METAL/PLINK/MR-MetA)
⬇️
汇总统计 → TwoSampleMR分析
⬇️
MR结果验证 (敏感性分析/IVW/ME-AR)

📁 配套资源

🎬 视频课程

MR的Meta分析实操 + 理论讲解

约 4.5小时

📊 示例数据

MRMETA.xlsx + SNP示例数据

💾 代码文档

完整R代码 + 详细注释