大数跨境
0
0

【Meta分析】Meta分析随机效应、固定效应的森林图绘制与优化

【Meta分析】Meta分析随机效应、固定效应的森林图绘制与优化 医学统计数据分析
2025-07-11
2
导读:森林图森林图的核心功能是同时展示单个研究结果和合并分析结果,并直观反映效应量是否具有统计学意义:当横线与无效线
森林图

森林图的核心功能是同时展示单个研究结果和合并分析结果,并直观反映效应量是否具有统计学意义:当横线与无效线相交时,表示该研究无统计学显著差异;当横线完全位于无效线右侧或左侧时,分别表示因素为危险因素或保护因素。

森林图是Meta分析的一种图形表示法,直观地显示了Meta分析中所有研究之间的关联,并展示了所有结果的集合效应估计值和异质性。它之所以叫森林图是因为图形看起来像一个"线条森林"。

森林图的具体构成要素:每项研究用一条横线表示,表示该研究的效应量及其95%置信区间;横线中央的方块代表该研究的点估计值,方块大小反映研究的权重;菱形代表所有研究合并的效应量及可信区间;中间的竖线代表无效应线(通常为X=1或0)。




Meta分析森林图(Forest Plot)是用于系统评价和Meta分析的核心可视化工具,它通过整合多个独立研究的效应量及其置信区间,直观展示研究结果的异质性、整体效应及统计学显著性。

基本概念:

森林图以一条垂直的无效线(通常为X=1或0)为基准,用平行线段表示每个纳入研究的效应量(如OR、RR、HR、SMD等)及其95%置信区间(CI),并用菱形符号展示合并效应量及CI。

核心价值:

1.异质性评估:通过I²统计量(0~100%)量化研究间差异程度(如I²>50%提示显著异质性)。

2.效应量整合:合并结果反映干预措施的整体效果(如菱形位于无效线左侧表示保护因素)。

3.决策支持:快速识别显著结果(如CI不跨无效线)及争议性结论(如CI跨度大)。







森林图是Meta分析的“语言”,将复杂统计结果转化为直观图形,服务于科研决策与政策制定。其核心价值在于:

1⃣ 透明性:展示所有纳入研究及异质性来源;

2⃣ 综合性:合并效应量提供整体证据强度;

3⃣ 可操作性:指导模型选择(固定/随机效应)及临床/生态政策应用。





Meta分析随机效应、固定效应的森林图绘制


在比如我们有一个收集好的meta分析的数据库:



#环境整理

rm(list=ls()) #移除所有变量数据

install.packages("") #安装包

if (!require("")) install.packages("")

library() #加载包

plot() #快速绘制简单图

# 加载必要包

library(meta)

library(readxl)

library(ggplot2)

# 读取Excel数据

data <- read_excel("C:/Users/L/Desktop/meta森林图.xlsx") # 修改为实际路径

data




# 计算效应量及置信区间(使用随机效应模型)

result <- metaprop(event = m, 

                   n = N,

                   data = data,

                   studlab = paste(author, time),

                   method = "Inverse",

                   sm = "PLOGIT",

                   comb.random = TRUE,

                   comb.fixed = FALSE)


# 绘制森林图

forest(result,

       leftcols = c("studlab", "event", "n", "effect", "ci"),

       leftlabs = c("Study", "Events", "Total", "Proportion", "95% CI"),

       rightcols = FALSE,

       xlab = "Proportion with 95% CI",

       col.square = "blue",

       col.diamond = "red",

       print.tau2 = TRUE,

       print.I2 = TRUE,

       digits = 3)




# 保存为PDF

dev.copy(pdf, "C:/Users/L/Desktop/forest_plot01.pdf", width = 10, height = 12, family = "GB1")

dev.off()




# 计算效应量及置信区间(使用固定效应模型)

result3 <- metaprop(event = m, 

                    n = N,

                    data = data,

                    studlab = paste(author, time),

                    method = "Inverse",

                    sm = "PLOGIT",

                    comb.random = FALSE,

                    comb.fixed = TRUE)


# 绘制森林图

forest(result3,

       leftcols = c("studlab", "event", "n", "effect", "ci"),

       leftlabs = c("Study", "Events", "Total", "Proportion", "95% CI"),

       rightcols = FALSE,

       xlab = "Proportion with 95% CI",

       col.square = "blue",

       col.diamond = "red",

       print.tau2 = TRUE,

       print.I2 = TRUE,

       digits = 3)




# 计算效应量及置信区间(使用随机+固定效应模型)

result2 <- metaprop(event = m, 

                    n = N,

                    data = data,

                    studlab = paste(author, time),

                    method = "Inverse",

                    sm = "PLOGIT",

                    comb.random = TRUE,

                    comb.fixed = TRUE)


# 绘制森林图

forest(result2,

       leftcols = c("studlab", "event", "n", "effect", "ci"),

       leftlabs = c("Study", "Events", "Total", "Proportion", "95% CI"),

       rightcols = FALSE,

       xlab = "Proportion with 95% CI",

       col.square = "blue",

       col.diamond = "red",

       print.tau2 = TRUE,

       print.I2 = TRUE,

       digits = 3)





#----美化方案1:基础美化(基于meta包优化)----

library(meta)

library(ggplot2)

library(gridExtra)  # 增强布局控制


# 读取数据

data <- read_excel("C:/Users/L/Desktop/meta森林图.xlsx")


# 计算效应量(随机效应模型)

result <- metaprop(event = m, n = N, 

                   data = data,

                   studlab = paste(author, time),

                   method = "Inverse", 

                   sm = "PLOGIT",

                   comb.random = TRUE,

                   comb.fixed = FALSE)


# 高颜值森林图参数设置

forest(result,

       layout = "RevMan5",  # 采用Cochrane协作网标准布局

       col.diamond = "#4E79A7",  # 钻石色改为深蓝

       col.square = "#F28E2B",   # 方块色改为橙色

       col.line = "#333333",     # 坐标轴深灰色

       col.study = "black",      # 研究标签黑色

       fontsize = 10,

       xlab = "事件发生率 (95% CI)",

       xlim = c(0, 1),           # 固定X轴范围

       leftcols = c("studlab", "event", "n", "effect", "ci"),

       leftlabs = c("研究", "事件数", "样本量", "发生率", "95% CI"),

       rightcols = FALSE,

       print.tau2 = TRUE,

       print.I2 = TRUE,

       digits = 3,

       plotwidth = "8cm")        # 优化图形宽度比例




#----美化方案2:交互式图表----

#交互式森林图能增强数据探索体验,特别是当研究数量较多时。

#plotly 支持悬停信息、缩放等交互功能,比静态图更利于结果展示。

library(meta)

library(plotly)

library(dplyr)


# 从result对象直接提取数据(避免依赖forest_res)

plot_data <- data.frame(

  studlab = result$studlab,

  TE = result$TE,

  lower = result$lower,

  upper = result$upper,

  n = result$n  # 确保原始数据包含样本量列

) %>% 

  mutate(

    # 计算发生率(适用于PLOGIT转换)

    proportion = exp(TE) / (1 + exp(TE)),

    # 生成悬停文本

    hover_text = paste(

      "研究:", studlab, "<br>",

      "发生率:", round(proportion, 3), "<br>",

      "95% CI: [", round(lower, 3), ",", round(upper, 3), "]<br>",

      "样本量:", n

    )

  )


# 单独提取合并效应量

combined_effect <- data.frame(

  TE = result$TE.random,

  lower = result$lower.random,

  upper = result$upper.random,

  studlab = "合并效应"

)


plot_ly() %>%

  # 添加置信区间线段(修复坐标缺失错误)

  add_segments(

    data = plot_data,

    x = ~lower, xend = ~upper,

    y = ~studlab, yend = ~studlab,

    color = I("#499894"),

    line = list(width = 1.5),

    showlegend = FALSE

  ) %>%

  # 添加效应量点

  add_markers(

    data = plot_data,

    x = ~TE, y = ~studlab,

    size = ~sqrt(n),  # 点大小关联样本量

    color = I("#4E79A7"),

    marker = list(opacity = 0.8, sizemode = "diameter"),

    hoverinfo = "text",

    text = ~hover_text

  ) %>%

  # 添加合并效应钻石

  add_trace(

    data = combined_effect,

    x = ~TE, y = ~studlab,

    type = 'scatter',

    mode = 'markers',

    marker = list(

      symbol = "diamond", 

      size = 20,

      color = "#F28E2B",

      line = list(width = 1, color = "black")

    ),

    name = "合并效应",

    hoverinfo = "text",

    text = ~paste(

      "合并效应量:", round(TE, 3), "<br>",

      "95% CI: [", round(lower, 3), ",", round(upper, 3), "]"

    )

  ) %>%

  # 添加异质性标注

  add_annotations(

    text = paste("异质性检验: I² =", round(100*result$I2,1), "%, τ² =", round(result$tau2,3)),

    xref = "paper", yref = "paper",

    x = 0.95, y = 0.02,

    showarrow = FALSE,

    font = list(size = 12)

  ) %>%

  # 设置布局

  layout(

    title = list(text = "交互式Meta分析森林图", font = list(size = 18)),

    xaxis = list(

      title = "效应量 (logit尺度)",

      gridcolor = "#eee",

      zerolinecolor = "#aaa"

    ),

    yaxis = list(

      title = "",

      categoryorder = "total ascending",  # 按效应量排序

      tickfont = list(size = 11)

    ),

    hoverlabel = list(bgcolor = "white", font = list(size = 12)),

    margin = list(l = 150, r = 50)  # 左侧留足研究名空间

  )






!!!可加我粉丝群!!!





医学统计数据分析分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,机器学习,生存分析,空间分析,问卷分析业务。若有投稿和数据分析代做需求,可以直接联系我,谢谢!




往期推荐:样本含量估计(样本量计算与功效分析)




往期推荐:SPSS、R语言、Python等临床数据分析专题




往期推荐:科研图表绘制专题





往期推荐:重复测量数据分析专题




往期推荐:生信分析、基因测序数据、实验室数据专题




往期推荐:生存分析及机器学习




往期推荐:二分类因变量机器学习及相关评价可视化




往期推荐:时间序列分析




往期推荐:地统计分析-GIS、地图、相关、聚类、回归




往期推荐:科研自动化探究




往期推荐:趣味阅读




把冰箱门

打开

把大象

放进去

把冰箱门

关上



安装包和库


读取数据并分析


结果导出及解释
医学统计数据分析业务流程















































第一步


 与客户沟通数据和分析方法和软件

了解数据构成和预期分析结果,根据工作量议价

第二步


 选择合适的实现软件和可视化方法

R语言、SPSS、Python、ArcGis、GraphPad等... ...

第三步


 结果整理与解释

根据分析结果整理三线表,简单结果解释文本,出图优化与组合排版

第四步


 结果反馈与优化

结果报告交付后,根据客户优化建议进行方法结果调整

第五步


 成交成功!
欢迎继续关注支持“医学统计数据分析”工作室!!!

医学统计数据分析工作室分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得;承接数据分析,论文修回,医学统计,机器学习、深度学习、生存分析、空间分析,问卷分析业务。欢迎有科研需求的广大医务工作者关注“医学统计数据分析”工作室!!!

【声明】内容源于网络
0
0
医学统计数据分析
分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,空间分析,机器学习,生存分析,时间序列,时空面板,深度学习,问卷分析等业务。公众号右下角可联系作者
内容 323
粉丝 0
医学统计数据分析 分享交流SPSS、R语言、Python、ArcGis、Geoda、GraphPad、数据分析图表制作等心得。承接数据分析,论文返修,医学统计,空间分析,机器学习,生存分析,时间序列,时空面板,深度学习,问卷分析等业务。公众号右下角可联系作者
总阅读32
粉丝0
内容323