我有一个在模型中运行的循环。循环生成多个公式,这些公式被插入到模型命令中,然后使用以下方法进行后向步骤选择处理 buildmer()
. 使用 lapply()
函数,它为一个名为Species的列表中的每个数据帧做了这个工作。问题是我需要将结果存储在不同的数据框中,这样才不会让它们混淆。
代码的简化例子是。
lapply(Species, function(x){
for (i in 1:10){
LRm<-buildmer(formula = form.LR, family = 'binomial', control=glmerControl(optimizer="bobyqa"), data=x, crit= c('AIC'), direction = c("order", "backward"))
#Get the species name for current model
ID<-colnames(DIKDIK) %>%
.[grepl("ADULTS",.)]%>%
sub("*.ADULTS", "", .)
paste0(ID)$AIC[i]<-AIC(LRm)
}
})
EDIT: form.LR是模型公式,每次迭代都要重新创建 但这段代码被省略了,因为它不相关
很明显,当代码达到x的第二个值时(也就是运行第二个数据帧的模型),结果将被第一个结果所覆盖,因为'i'的索引是相同的。这就是问题所在。
请注意,我可以通过选择与 "ADULTS "部分匹配的colname来确定使用了哪个数据框,使用的是 grepl()
的全列名称在每个数据框中都是唯一的。所以我想我可以用这个字符串来命名每个数据框,即 "GIRAFFE",并用它来确定数据应该存储在哪里。但我似乎无法找到正确的组合,即 paste()
. 我甚至不确定我所做的尝试是否可行。
目前的代码崩溃了,给出的错误是
Error in paste0(ID)[[i]] <- NA : could not find function "paste0<-"
到目前为止,我在SO上没有找到类似问题的其他解决方案。
物种列表对象的一个简化的可复制的例子是
ADULTS.GIRAFFE<-rnorm(20, 3, sd=1)
ADULTS.DIKDIK<-rnorm(20, 3, sd=1)
ADULTS.IMPALA<-rnorm(20, 3, sd=1)
presence1<-rbinom(20, 1, .5)
presence2<-rbinom(20, 1, .5)
presence3<-rbinom(20, 1, .5)
var1<-rnorm(20, 3, sd=1)
var2<-rnorm(20, 3, sd=1)
var3<-rnorm(20, 3, sd=1)
a<-cbind(presence1, var1, var2, var3, ADULTS.GIRAFFE)
b<-cbind(presence1, var1, var2, var3, ADULTS.DIKDIK)
c<-cbind(presence1, var1, var2, var3, ADULTS.IMPALA)
Species<-list(a,b,c)
将数据帧存储为一个列表,我可以将列表中的每个数据帧命名为so。
snames<-c("DIKDIK","THOMSONS", "GIRAFFE", "GRANTS", "IMPALA")
OutsLR<-lapply(snames, function(x){
x<-data.frame()%>%
insertRows(., 499, new = NA)%>%
mutate(Number=NA)%>%
mutate(AIC=NA)%>%
mutate(Model=NA)
})
#Rename the data frames in the list
names(Outs) = snames
然后用ID这个字符串对象来选择数据框就很容易了。
#Just for the example
ID<-"DIKDIK"
#Then
OutsLR[[ID]][["AIC"]][i]<-AIC(LRm)