将循环合并到metafor :: rma()中

时间:2016-01-28 16:31:36

标签: r loops bioinformatics

我有两个队列,因此我每个队列分别进行线性回归并使用for循环,以便每个队列保存我的系数。我现在想要得到每SNP的汇总估计值,但我有53个SNP,所以不希望不必手动输入所有系数。有没有办法在metafor?

的rma命令中使用for循环

到目前为止,我已经认为将两个系数文件合并在一起可能是最容易的。我打电话给这个系数。第一列具有SNP名称,第二列和第六列分别具有来自第1组和第2组的beta,第3列和第7列具有来自两个队列的标准错误。

所以我想制作一个项目 beta ,其中包括我的队列1的beta和队列2的1个SNP。那么与 se 相同的想法。然后,我希望每个SNP都有一个rma(beta,se),这样我就可以将结果导出为ex​​cel。

到目前为止,我想过要做以下事情(但它不起作用)

output3 <- data.frame(matrix(nrow=84,ncol=3))
names(output3)=c("Pooled Estimate", "Pooled Std.Error", "P-value")

for(l in 3:84){ 
    beta <-c(output3[l,2], output3[l,6])
    se <-c(output3[l,3], output3[l,7])
    pool <- rma(beta,se)
}

当我运行rma时,我收到以下错误消息:

  

[[<-.data.frame*tmp*,l,value = list(b =   -0.105507438518734,:替换有70行,数据有84行

如果我将nrow改为70,那么我就不会得到这些信息。从rma输出我想要第二行和第1,2和4列。我认为这在某处出错了。

2 个答案:

答案 0 :(得分:1)

我弄清楚了我的错误,我的问题是我忘了告诉R我需要哪些数据线以及需要保存到哪里。

对于有这个问题的其他人,这是我的脚本工作。我首先创建了我想要保存数据的data.frame。

output3 <- data.frame(matrix(nrow=84,ncol=3))
names(output3)=c("Pooled Estimate", "Pooled Std.Error", "P-value")

接下来我做了一个for循环来从每个SNP中提取beta和s.e

for(l in 3:84){ 
  beta <-c(coeffs[l,2], coeffs[l,6])
  se <-c(coeffs[l,3], coeffs[l,7])
  pool <- rma(beta,se^2)
  z3 <- colnames(qcwomenc[1:84])
  row.names(output3)<-z3
  output3[l,1]<-coef(summary(pool))[1,1]
  output3[l,2]<-coef(summary(pool))[1,2]
  output3[l,3]<-coef(summary(pool))[1,4]
}

答案 1 :(得分:0)

你说它不起作用,但你没有说明究竟是什么。我认为您缺少的是保存结果的东西。像列表或data.frame。变量pool在循环的每次迭代时都会更新,因此在循环完成后它将只包含最后一个模型。此外,您的索引与示例data.frame不匹配,因为您指的是不存在的第6列和第7列。但我想它们确实存在于您的实际data.frame中。此外,您的示例data.frame还包含NA个值。也许尝试这样:

output3 <- data.frame(matrix(runif(84*4), nrow=84,ncol=4))
names(output3)=c("se1", "beta1", "se2", "beta2")

modellist <- list()
for(l in 3:84){ 
    beta <-c(output3[l,2], output3[l,4])
    se <-c(output3[l,1], output3[l,3])
    pool <- sum(beta, se)
    modellist[[l]] <- pool
}
modellist

注意,我使用sum而不是你的rma(),因为我不知道这个函数,我不知道它来自哪个包。