You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Metafor亚组分析森林图:如何按发表年份排序各亚组研究?

解决metafor森林图亚组内按发表年份排序的问题

要实现亚组内研究按发表年份排序,核心是正确生成排序索引并传递给forest()函数,或者先对数据集排序后再拟合模型。以下是具体步骤:

方法一:直接在forest()中指定排序索引

  1. 确认变量类型:确保年份变量year是数值型(若为字符型,先转换:dat$year <- as.numeric(dat$year))。
  2. 生成排序索引:基于分组变量和年份生成升序(或降序,加decreasing=TRUE)的排序位置:
    # 假设分组变量为group,数据集为dat
    ord <- order(dat$group, dat$year) # 亚组内按年份升序;降序则用order(dat$group, -dat$year)
    
  3. 绘制森林图时传入索引:拟合模型后,将索引传给forest()的order参数:
    library(metafor)
    # 示例用内置dat.bcg数据集演示
    data(dat.bcg)
    dat <- escalc(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg)
    dat$group <- ifelse(dat$lat < 40, "低纬度", "高纬度") # 构造分组变量
    res <- rma(yi, vi, data=dat)
    
    # 按分组+年份排序绘制森林图
    forest(res, order=ord, atransf=exp, xlab="相对风险",
           ilab=dat$year, ilab.xpos=log(0.2), # 显示年份
           showweights=TRUE, header=TRUE)
    
    # 添加分组标题(需根据实际行数调整位置)
    text(-1.5, 13, "分组", pos=4)
    text(-1.5, c(11,5), c("高纬度", "低纬度"), pos=4)
    

方法二:先排序数据集再拟合模型(更稳妥)

如果担心模型数据与排序索引不匹配,可以先对数据集按分组+年份排序,再拟合模型,此时forest()默认会按排序后的顺序绘制:

# 排序数据集
dat_sorted <- dat[order(dat$group, dat$year), ]
# 基于排序后的数据拟合模型
res_sorted <- rma(yi, vi, data=dat_sorted)
# 绘制森林图
forest(res_sorted, atransf=exp, xlab="相对风险",
       ilab=dat_sorted$year, ilab.xpos=log(0.2),
       showweights=TRUE, header=TRUE)
# 添加分组标题
text(-1.5, 13, "分组", pos=4)
text(-1.5, c(11,5), c("高纬度", "低纬度"), pos=4)

常见问题排查

  • 若排序后仍无效,检查year变量是否为数值型(字符型年份会按字母序排序,而非时间顺序)。
  • 确认分组变量group的类型:若为因子,可通过factor(dat$group, levels=c("组1", "组2"))指定分组的显示顺序。

内容的提问来源于stack exchange,提问作者Longc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 22:23:25