Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用for循环存储荟萃分析结果_R_Loops_For Loop - Fatal编程技术网

使用for循环存储荟萃分析结果

使用for循环存储荟萃分析结果,r,loops,for-loop,R,Loops,For Loop,我试图对一组研究进行元分析。我试图找出正确输出我想要的代码。从本质上说,我试图使用metafor包运行一个固定效应meta分析测试,并收集系数估计值,将其存储在矩阵中 我有几个问题。例如,我只想为有多个结果的研究运行这些测试。因此,研究数字出现不止一次的研究(参见代码示例)。当我使用我现有的代码尝试这个时,它不起作用,它吐出一个数字,但它不是正确的。而且,一些研究数字比我实际的研究数量还要多。例如,在我的个人数据集中有一项编号为3500的研究。当我运行我的循环时,R在第3500行上显示特定固定效

我试图对一组研究进行元分析。我试图找出正确输出我想要的代码。从本质上说,我试图使用
metafor
包运行一个固定效应meta分析测试,并收集系数估计值,将其存储在矩阵中

我有几个问题。例如,我只想为有多个结果的研究运行这些测试。因此,研究数字出现不止一次的研究(参见代码示例)。当我使用我现有的代码尝试这个时,它不起作用,它吐出一个数字,但它不是正确的。而且,一些研究数字比我实际的研究数量还要多。例如,在我的个人数据集中有一项编号为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]
    }
}
库(metafor)

origdata考虑使用
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]
  }
}

我认为您的语句
(表(origdata$studynum)
输出不是一个单一的数字,
if/else
只在长度为1时工作。您可能需要
ifelse
您有什么建议吗?我一直在尝试将代码重新编写成ifelse语句。这帮了大忙!
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)