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

metafor包是否仅接受单研究单行的长格式数据?多行数据需转置吗?

关于metafor包数据格式的问题

metafor包并非仅接受单研究对应一行的格式,需根据数据类型和分析需求灵活处理:

  • 若你的数据是「单研究的实验组、对照组各占一行」(每行对应一个组,通过研究ID关联),使用escalc计算组间效应量(如SMD、RR、OR等)时,确实需要将数据转换为单研究单行的宽格式——因为escalc需要明确传入两组各自的统计量(如样本量、均值、标准差)。不过这个转换可以用数据工具快速完成,无需手动操作。

    举个实际操作例子:
    假设你有长格式分组数据:

    dat_long <- data.frame(
      study = c(1,1,2,2),
      group = c("treat", "control", "treat", "control"),
      n = c(50,50,40,40),
      mean = c(10,8,12,9),
      sd = c(2.3,2.1,3.0,2.8)
    )
    

    用tidyr转为宽格式:

    library(tidyr)
    dat_wide <- dat_long %>%
      pivot_wider(
        id_cols = study,
        names_from = group,
        values_from = c(n, mean, sd),
        names_sep = "_"
      )
    

    再传入escalc计算效应量:

    library(metafor)
    dat_wide <- escalc(measure = "SMD", 
                       m1i = mean_treat, n1i = n_treat, sd1i = sd_treat,
                       m2i = mean_control, n2i = n_control, sd2i = sd_control,
                       data = dat_wide)
    
  • 若你的数据是「单研究内包含多个效应量」(比如同一研究的不同结局指标、亚组分析结果各占一行),这种长格式反而更适合直接分析,无需转置为单行。可以用rma.mv等函数构建多级元分析模型,处理研究内的聚类效应:

    dat_multi <- data.frame(
      study = c(1,1,2,2),
      outcome = c("A", "B", "A", "B"),
      yi = c(0.8, 0.6, 1.0, 0.7),
      vi = c(0.05, 0.04, 0.06, 0.03)
    )
    
    model <- rma.mv(yi ~ 1, V = vi, random = ~ 1 | study/outcome, data = dat_multi)
    

简单总结:如果是组间对比的分组数据,需要转宽格式给escalc;如果是同一研究的多个效应量,长格式可直接用于后续分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 23:45:20