我正在尝试对一组研究进行元分析。我试图找出代码以正确输出我想要的东西。本质上,我正在尝试使用metafor
包运行固定效果的荟萃分析测试,并收集系数估计值以将其存储在矩阵中。
我有几个问题。例如,我只想对具有多个结果的研究运行这些测试。因此,其研究编号多次出现的研究(例如,参见代码)。当我使用现有代码尝试此操作时,它不起作用,会吐出一个数字,但它不是正确的数字。另外,有些学习数量大于我的实际学习数量。在我的个人数据集中,有一个研究编号为3500。当我运行循环时,R会在第3500行上吐出该特定固定效果模型的结果,而不仅仅是将其放在下一个空行中。
下面我有一个基本示例,任何人都可以在R中运行。
library(metafor)
origdata <- data.frame(matrix(data=NA, nrow=15, ncol=3))
colnames(origdata) <- c("studynum", "Mail_b", "Mail_SE")
origdata$studynum <- c(1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 7, 7, 7, 7, 7)
origdata$Mail_b <- c(1.8, 0.8, 1.2, 1, 1, 5, 3, 3, 6, 4, 5, 8, 5, 9, 2)
origdata$Mail_SE <- c(1.6, 0.8, 1.3, 1, 1, 1, 3, 2.9, 6, 4, 5, 8, 5, 8, 1)
collapsedtest <- data.frame(matrix(data=NA, nrow=5, ncol=3))
colnames(collapsedtest) <- c("studynum", "Meta_b", "Meta_SE")
collapsedtest$studynum <- unique(origdata$studynum)
for(i in unique(origdata$studynum)) {
if((table(origdata$studynum) == 1) == FALSE){
collapsedtest[i, 2] <- (coef(summary(rma(yi=Mail_b[origdata$studynum == i],
sei=Mail_SE[origdata$studynum == i],
method="FE",
data=origdata)))$estimate)
collapsedtest[i, 3] <- (coef(summary(rma(yi=Mail_b[origdata$studynum == i ],
sei=Mail_SE[origdata$studynum == i],
method="FE", data=origdata)))$ci.ub
-
(coef(summary(rma(yi=Mail_b[origdata$studynum == i],
sei=Mail_SE[origdata$studynum == i],
method="FE",
data=origdata)))$estimate)) / 1.96
} else {
collapsed[i, 2] <- origdata$Mail_b[origdata$studynum == i]
collapsed[i, 3] <- origdata$Mail_SE[origdata$studynum == i]
}
}
答案 0 :(得分:0)
考虑使用nrow
并根据 studynum 的条件调整行索引器。另外,请确保只运行一次 rma 方法,然后使用得出的估算值。
for(i in unique(origdata$studynum)) {
coef_data <- coef(summary(rma(yi=Mail_b[origdata$studynum == i],
sei=Mail_SE[origdata$studynum == i],
method="FE",
data=origdata)))
if(nrow(origdata[origdata$studynum==i,]) > 1) {
collapsedtest[collapsedtest$studynum==i, 2] <- coef_data$estimate
collapsedtest[collapsedtest$studynum==i, 3] <- (coef_data$$ci.ub - coef_data$estimate) / 1.96
collapsedtest[collapsedtest$studynum==i, 2] <- origdata$Mail_b[origdata$studynum == i]
collapsedtest[collapsedtest$studynum==i, 3] <- origdata$Mail_SE[origdata$studynum == i]
}
}
但是,您可以使用by
来避免 studynum 过滤器,do.call
是一种按因子对数据帧进行子集并将子集运行到操作中的方法。然后,在处理之后,使用df_list <- by(origdata, origdata$studynum, function(sub){
coef_data <- coef(summary(rma(yi=Mail_b, sei=Mail_SE, method="FE", data=origdata)))
if(nrow(sub) > 1) {
df <- data.frame(studynum = sub$studynum[[1]],
Meta_b = coef_data$estimate,
Meta_SE = (coef_data$$ci.ub - coef_data$estimate) / 1.96
} else {
df <- data.frame(studynum = sub$studynum[[1]],
Meta_b = sub$Mail_b,
Meta_SE = sub$Mail_SE)
}
return(df)
})
collapsedtest <- do.call(rbind, df_list)
行绑定所有子集的数据帧:
Bar&& rb = Bar{}.doThings();
use(rb); // not safe if returning rvalue reference, while safe if returning by value