将模型的结果存储到矩阵中

时间:2017-02-05 15:42:21

标签: r loops matrix

我寻找答案,但他们没有提供我想要的东西。我正在运行一些简单的模型,我试图将结果(主要是LRT)放到表格或矩阵中,所以我可以更好地呈现它们。但是,命令for不允许我这样做,这很奇怪,因为其他编程语言很容易做到。

在最后一句中,如果我用[j]或其他任何东西替换它,它仍然说没有找到对象。我如何使用for覆盖它?谢谢。

li<-array(c(716, 207,79,25,819,186,67,22), c(2,2,2))
dimnames(li)<-list(c("Normal","High"),c("N BP", "H BP"),c("A","B"))
#General Model with three variables and no interactions.
a1<-loglin(li,list(1,2,3))
#Model with XY,Z
a2<-loglin(li,list(c(1,2),3))
#Model with XZ,Y
a3<-loglin(li,list(c(1,3),2))
#Model with X,ZY
a4<-loglin(li,list(c(2,3),1))
#Model with XY,XZ
a5<-loglin(li,list(c(1,2),c(1,3)))
#Model with YZ,XZ
a6<-loglin(li,list(c(2,3),c(1,3)))
#Model with XY,ZY
a7<-loglin(li,list(c(1,2),c(2,3)))

tabi<-matrix(data=c(0),nrow=10,ncol=2)
for (j in 1:7) {
  i<-j
tabi[i,1]<-a[i]$lrt
}

旁注。我曾尝试写过“ai”,“aj”,“a [i]”等,但它不起作用。

3 个答案:

答案 0 :(得分:3)

如果您在工作区中拥有所有这些模型,则可以使用mget提取,然后返回一个列表,然后循环执行此操作以提取lrt

所以对你的例子来说,

sapply(mget(ls(pattern="a\\d")), "[", "lrt")

其中mget(ls(pattern="a\\d"))使用模式a编号从全局env中获取数据,sapply循环遍历此列表以进行提取。

作为替代工作流程,您可以将模型存储在列表中,而不是在工作区中浮动大量模型。

因此将参数存储在列表中

para <- list(list(1,2,3), list(c(1,2),3), list(c(1,3),2))

然后循环应用模型

lst <- lapply(para, function(x) loglin(li, x))

这会将每个模型存储在lst中。如果您只是想要这个项目,可以使用上面的loglin(li, x)$lrt。否则你可以像以前一样循环来提取它。

sapply(lst, "[", "lrt")

请注意,您的代码a[1]a1

不同

答案 1 :(得分:1)

对于那些想要更简单回答并且和我一样的人来说,这是一种更简单的方法,它涉及更少的编码:

基本上只需创建一个列表并通过添加[[]]将模型定义为列表,就是这样。定期运行您的代码。

a<-list()
#General Model with three variables and no interactions.
a[[1]]<-loglin(li,list(1,2,3))
#Model with XY,Z
a[[2]]<-loglin(li,list(c(1,2),3))
#Model with XZ,Y
a[[3]]<-loglin(li,list(c(1,3),2))
#Model with X,ZY
a[[4]]<-loglin(li,list(c(2,3),1))
#Model with XY,XZ
a[[5]]<-loglin(li,list(1:2,1:3))
#Model with YZ,XZ
a[[6]]<-loglin(li,list(2:3,1:3))
#Model with XY,ZY
a[[7]]<-loglin(li,list(1:2,2:3))

tabi<-matrix(data=c(0),nrow=10,ncol=2)

for (j in 1:7) {
  i<-j
tabi[i,1]<-a[[j]]$pearson
}

答案 2 :(得分:0)

可以使用paste来连接a,并在循环中使用i的值将a1,a2,a3等作为字符串,然后使用eval和parse将其作为变量进行评估。

tabi<-matrix(data=c(0),nrow=10,ncol=2)
for (i in 1:7) {

  tabi[i,1]<-eval(parse(text = paste("a",i,sep="")))$lrt

}