求助:用ggplot2绘制仅含亚组效应量的Meta分析亚组图
解决方案
要实现仅展示pH亚组汇总结果的ggplot2森林图,核心是从已完成的meta分析对象中提取亚组的合并效应量及置信区间,再用ggplot2的几何图层可视化。
完整代码
library(ggplot2) library(meta) # --- 原始数据与Meta分析代码(保留不变)--- study <- c("Study 1","Study 2","Study 3","Study 4","Study 5", "Study 6","Study 7","Study 8","Study 9","Study 10", "Study 11","Study 12","Study 13","Study 14","Study 15") nT <- c(155,31,75,18,8,57,34,110,60,20,11,32,36,97,80) meanT <- c(55,27,64,66,14,19,52,21,30,45,32,80,40,25,70) sdT <- c(47,7,17,20,8,7,45,16,27,11,6,22,31,4,32) nC <- c(156,32,71,18,13,52,33,183,52,22,14,32,44,93,81) meanC <- c(75,29,119,137,18,18,41,31,23,16,44,65,22,11,90) sdC <- c(64,4,29,48,11,4,34,27,20,5,21,37,8,2,55) pH <- c("high","low","high","low","low","high","low","high", "high","low","low","low","low","high","high") dt <- data.frame(study,nT,meanT,sdT,nC,meanC,sdC,pH) dt$pH <- factor(dt$pH, levels = c("low", "high")) m1 <- metacont(nT, meanT, sdT, nC, meanC, sdC, fixed = FALSE, random = TRUE, subgroup = pH, data = dt) # --- 提取亚组汇总数据并绘图 --- # 从Meta分析对象中提取亚组随机效应结果 subgroup_summary <- data.frame( pH_level = c("Low pH", "High pH"), # 自定义显示标签 mean_diff = m1$TE.random.by, # 合并均数差(效应量) ci_lower = m1$lower.random.by, # 95%置信区间下限 ci_upper = m1$upper.random.by, # 95%置信区间上限 weight = m1$w.random.by # 亚组权重(用于调整点大小) ) # 用ggplot2绘制亚组森林图 ggplot(subgroup_summary, aes(x = pH_level, y = mean_diff)) + # 添加效应量为0的参考线(判断统计学显著性) geom_hline(yintercept = 0, linetype = "dashed", color = "gray", linewidth = 0.8) + # 绘制点(效应量)和误差线(置信区间),点大小与权重挂钩 geom_pointrange(aes(ymin = ci_lower, ymax = ci_upper, size = weight), color = "#2E86AB", fatten = 1.5) + # 在点上方显示效应量和95%CI的文本 geom_text(aes(label = sprintf("%.2f\n(%.2f, %.2f)", mean_diff, ci_lower, ci_upper)), vjust = -2, size = 4, color = "#2E86AB") + # 自定义标签和标题 labs( title = "Meta-Analysis Subgroup Results by pH Level", y = "Mean Difference (Treatment vs Control)", x = "pH Subgroup", size = "Subgroup Weight" ) + # 调整主题样式,提升可读性 theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14, face = "bold"), axis.title = element_text(size = 12), axis.text = element_text(size = 10) ) + # 限制权重图例的大小范围(可选) scale_size_continuous(range = c(2, 4))
关键说明
数据提取逻辑:直接从
m1对象中获取亚组的随机效应核心指标,无需额外计算:TE.random.by:亚组合并均数差lower.random.by/upper.random.by:95%置信区间上下限w.random.by:亚组在合并分析中的权重
可视化细节:
- 虚线参考线对应效应量为0的位置,若置信区间不与该线相交,则亚组结果具有统计学显著性
- 点的大小与亚组权重成正比,直观体现亚组对合并结果的贡献
- 文本标签直接展示效应量和置信区间,无需额外查看数值表
内容的提问来源于stack exchange,提问作者chi2
相关产品推荐
相关产品推荐

