R语言|meta分析全解析

文摘   2024-12-19 12:53   甘肃  

在科研的世界里,从众多独立研究中整合信息,得出更具普遍性的结论至关重要,Meta 分析(Meta-analysis)便是实现这一目标的强大工具。它能将针对同一问题的多个研究数据进行综合,为我们提供更全面、可靠的研究结果。

一、Meta 分析简介

Meta 分析是一种综合多个独立研究定量数据的方法,用于解决共同的研究问题。其核心思想是整合相关研究的结果,提高统计功效,增强结论的可靠性。

R语言提供了多种用于执行Meta分析的软件包,如metametafordmetar等。其中,meta包因其简单易用而受到广泛欢迎;metafor则以其灵活性和强大功能著称,适合处理复杂的Meta分析任务。此外,还有专门针对特定类型数据分析的包,比如esc(教育与心理学)、metasens(敏感性分析)等。

二、传统方法分析

  1. 朴素合并(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.plac1  Protocol 154     46    0.2316   0.2254     48   -0.0027   0.00072  Protocol 156     30    0.2811   0.1441     26    0.0270   0.11393  Protocol 157     75    0.1894   0.1981     72    0.0443   0.49724 Protocol 162A     12    0.0930   0.1389     12    0.2277   0.04885  Protocol 163     32    0.1622   0.0961     34    0.0056   0.09556  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),                               n.plac, 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”免费索取数据和代码。请【分享+点赞+在看】

    麦当的生态学笔记
    用于文献信息解读和分享,统计分析相关方法的传递。
     最新文章