在多个子集上使用 dplyr 到 运行 rma()

Using dplyr to run rma() on multiple subsets

我想 运行 在 metafor 包中进行亚组荟萃分析。最简单的方法是:

model.s.1 <- rma(yi=ES, vi=Va, data=dataset, method="DL", subset=S=="S_Level1")
model.s.2 <- rma(yi=ES, vi=Va, data=dataset, method="DL", subset=S=="S_Level2")
...
model.s.n <- rma(yi=ES, vi=Va, data=dataset, method="DL", subset=S=="S_Leveln")

但是,如果子组的因子有多个级别,则手动执行会非常混乱。我尝试使用 dplyr 来解决这个问题并简单地提取所有子组的系数:

Dataset %>%
   mutate(S=as.factor(S)) %>%
   group_by(S) %>%
   summarize(Coeff=coef.rma(rma(yi=ES, vi=Va, method="DL", data=.)))

但结果是这样的:

   S          Coeff
   <fct>       <dbl>
 1 hmdb        0.114
 2 HMDB0000123 0.114
 3 HMDB0000148 0.114
 4 HMDB0000158 0.114
 5 HMDB0000159 0.114
 6 HMDB0000161 0.114
 7 HMDB0000162 0.114
 8 HMDB0000167 0.114
 9 HMDB0000168 0.114
10 HMDB0000172 0.114
# ... with 14 more rows

好像rma函数省略了group_by,每次都是对整个数据集计算pooled effect。可能是什么原因?这种方法有任何替代方法吗?

我们可以做一个group_split,然后用map

遍历list个元素
library(tidyverse)
Dataset %>%
   group_split(S= factor(S)) %>%
   map_dfr(~ .x %>% 
            summarise(S = first(S), Coeff=coef.rma(rma(yi=ES, 
                          vi=Va, method="DL", data=.))))

亲爱的@akrun 我还有一个关于类似代码的问题(之前的问题有误window,抱歉) 假设对于每个研究子集,我想添加一个具有二元因子 (0/1) 的固定效应元回归——我们称之为 F.

library(tidyverse)
Dataset %>%
   group_split(S=factor(S)) %>%
   map.dfr(~ .x %>%
        summarise(S=first(S), Coeff=coef.rma(rma(yi=ES,vi=Va, mods=~F, method="DL", 
        data=.))))

如果S中的某个子集只有0或1,它会给出rma函数的错误信息。然后我如何添加一个公式以从列表中删除此类案例并用 "NA"?

替换它们

谢谢, 雅库布

library(metafor)
library(tidyverse)
Results <- Org %>%   # Primary analysis - DerSimonian-Laire Estimator
group_split(Metabolite= factor(Metabolite)) %>%
map_dfr(~ .x %>%
        summarise(Metabolite = first(Metabolite),
                  Coeff = ifelse(nlevels(Biospecimen)>1, 
                                 ifelse((rma(yi=Est,sei=SE, method="DL", data=.))$k>=5,
                                        coef.rma(rma(yi=Est,sei=SE, mods=~Biospecimen, method="DL", data=.)),NA),NA)))

它起作用了,但是 rma 函数产生了警告。但是结果似乎是正确的。非常感谢@akrun