在多个子集上使用 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
我想 运行 在 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