在科研的世界里,从众多独立研究中整合信息,得出更具普遍性的结论至关重要,Meta 分析(Meta-analysis)便是实现这一目标的强大工具。它能将针对同一问题的多个研究数据进行综合,为我们提供更全面、可靠的研究结果。
一、Meta 分析简介
Meta 分析是一种综合多个独立研究定量数据的方法,用于解决共同的研究问题。其核心思想是整合相关研究的结果,提高统计功效,增强结论的可靠性。
meta
、metafor
、dmetar
等。其中,meta
包因其简单易用而受到广泛欢迎;metafor
则以其灵活性和强大功能著称,适合处理复杂的Meta分析任务。此外,还有专门针对特定类型数据分析的包,比如esc
(教育与心理学)、metasens
(敏感性分析)等。二、传统方法分析
朴素合并(Naive Pooling)
这是一种简单但统计低效的方法,直接合并所有数据计算均值差。然而,它忽略了方差差异,将低质量和高质量结果同等对待,缺乏标准诊断程序,结果可靠性较差。很少使用。
固定效应模型(Fixed Effects Model)
假设所有研究的真实效应相同,各研究的观测效应是真实效应的有噪估计。
随机效应模型(Random Effects Model)
考虑到研究可能涉及不同人群和效应,假设每个研究有自己的真实效应,且这些效应服从共同分布。
三、Meta分析示例
接下来,我们将以meta
包为例,演示如何利用R语言进行简单的Meta分析操作。
install.packages("meta")
#install.packages("remotes")
#remotes::install_github("guido-s/meta", ref = "develop", build_vignettes = TRUE)
加载R包及数据
library(meta)
data("amlodipine")
查看数据
head(amlodipine)
study n.amlo mean.amlo var.amlo n.plac mean.plac var.plac
1 Protocol 154 46 0.2316 0.2254 48 -0.0027 0.0007
2 Protocol 156 30 0.2811 0.1441 26 0.0270 0.1139
3 Protocol 157 75 0.1894 0.1981 72 0.0443 0.4972
4 Protocol 162A 12 0.0930 0.1389 12 0.2277 0.0488
5 Protocol 163 32 0.1622 0.0961 34 0.0056 0.0955
6 Protocol 166 31 0.1837 0.1246 31 0.0943 0.1734
3.1 固定效应模型(Fixed Effects Model)
m <- metacont(n.amlo, mean.amlo, sqrt(var.amlo),
n.plac, mean.plac, sqrt(var.plac),
data = amlodipine,
studlab = study)
summary(m)
# MD 95%-CI %W(common) %W(random)
# Protocol 154 0.2343 [ 0.0969; 0.3717] 21.2 21.1
# Protocol 156 0.2541 [ 0.0663; 0.4419] 11.4 11.4
# Protocol 157 0.1451 [-0.0464; 0.3366] 10.9 11.0
# Protocol 162A -0.1347 [-0.3798; 0.1104] 6.7 6.7
# Protocol 163 0.1566 [ 0.0072; 0.3060] 17.9 17.9
# Protocol 166 0.0894 [-0.1028; 0.2816] 10.8 10.9
# Protocol 303A 0.6669 [ 0.1758; 1.1580] 1.7 1.7
# Protocol 306 0.1423 [-0.0015; 0.2861] 19.4 19.3
#
# Number of studies: k = 8
# Number of observations: o = 596 (o.e = 299, o.c = 297)
#
# MD 95%-CI z p-value
# Common effect model 0.1619 [0.0986; 0.2252] 5.01 < 0.0001
# Random effects model 0.1617 [0.0978; 0.2257] 4.96 < 0.0001
#
# Quantifying heterogeneity:
# tau^2 = 0.0001 [0.0000; 0.1667]; tau = 0.0116 [0.0000; 0.4082]
# I^2 = 43.2% [0.0%; 74.9%]; H = 1.33 [1.00; 2.00]
#
# Test of heterogeneity:
# Q d.f. p-value
# 12.33 7 0.0902
#
# Details on meta-analytical method:
# - Inverse variance method
# - Restricted maximum-likelihood estimator for tau^2
# - Q-Profile method for confidence interval of tau^2 and tau
meta分析结果可视化-森林图
meta::forest(m)
森林图美化
forest(m, layout = "RevMan5",
common = FALSE,
label.right = "Favours control",
col.label.right = "red",
label.left = "Favours experimental",
col.label.left = "green",
prediction = TRUE)
3.2 随机效应模型 (Random-Effects Model)
random_m <- metacont(n.amlo, mean.amlo, sqrt(var.amlo),
mean.plac, sqrt(var.plac),
random = TRUE,
data = amlodipine,
studlab = study)
summary(random_m)
# MD 95%-CI %W(common) %W(random)
# Protocol 154 0.2343 [ 0.0969; 0.3717] 21.2 21.1
# Protocol 156 0.2541 [ 0.0663; 0.4419] 11.4 11.4
# Protocol 157 0.1451 [-0.0464; 0.3366] 10.9 11.0
# Protocol 162A -0.1347 [-0.3798; 0.1104] 6.7 6.7
# Protocol 163 0.1566 [ 0.0072; 0.3060] 17.9 17.9
# Protocol 166 0.0894 [-0.1028; 0.2816] 10.8 10.9
# Protocol 303A 0.6669 [ 0.1758; 1.1580] 1.7 1.7
# Protocol 306 0.1423 [-0.0015; 0.2861] 19.4 19.3
#
# Number of studies: k = 8
# Number of observations: o = 596 (o.e = 299, o.c = 297)
#
# MD 95%-CI z p-value
# Common effect model 0.1619 [0.0986; 0.2252] 5.01 < 0.0001
# Random effects model 0.1617 [0.0978; 0.2257] 4.96 < 0.0001
#
# Quantifying heterogeneity:
# tau^2 = 0.0001 [0.0000; 0.1667]; tau = 0.0116 [0.0000; 0.4082]
# I^2 = 43.2% [0.0%; 74.9%]; H = 1.33 [1.00; 2.00]
#
# Test of heterogeneity:
# Q d.f. p-value
# 12.33 7 0.0902
#
# Details on meta-analytical method:
# - Inverse variance method
# - Restricted maximum-likelihood estimator for tau^2
# - Q-Profile method for confidence interval of tau^2 and tau
meta::forest(random_m, layout = "RevMan5")
3.3绘制漏斗图
par(mfrow = c(3, 1))
# 标准图
funnel(m)
# 添加置信区间
c <- funnel(m,
common = TRUE,
level = 0.95,
contour = c(0.9, 0.95, 0.99))$col.contour
legend(0.05, 0.05,
c("0.1 > p > 0.05", "0.05 > p > 0.01", "< 0.01"), fill = c)
# 自定义
funnel(m,
common = TRUE,
level = 0.95,
contour = c(0.9, 0.95, 0.99),
col.contour = c("darkgreen", "green", "lightgreen"),
lwd = 2, cex = 2, pch = 16,
studlab = TRUE,
cex.studlab = 0.5)
legend(0.05, 0.05,
c("0.1 > p > 0.05", "0.05 > p > 0.01", "< 0.01"),
fill = c("darkgreen", "green", "lightgreen"))
总结
综上所述,R语言为Meta分析提供了一个强大而又灵活的平台。无论是初学者还是经验丰富的使用者,都可以借助于现有的各种资源和技术支持轻松入门并深入探索这一领域。希望这篇文章能够为你开启通往Meta分析的大门,助力你在科学研究道路上取得更加丰硕的成果。
然而,meta分析并非万能。它依赖于研究的质量和数据的可用性。因此,在进行meta分析时,我们需要谨慎选择研究、合理构建模型,并充分披露分析过程和结果。
参考资料
https://rworks.dev/posts/meta-analysis/#a-random-effects-model
https://github.com/guido-s/meta/
分享更多R语言知识,请关注公众号【数据统计和机器学习】。公众号后台回复“meta”免费索取数据和代码。请【分享+点赞+在看】