我可能做的事非常愚蠢,但我无法从我的函数循环遍历的一系列模型中提取参数值。
数据:
library(difR)
data(verbal)
TotScore=rowSums(verbal[,c(1:24)])
mydata=verbal[,c(1:24)]
然后我可以在循环中获得模型BIC
library(BMA)
a<-rep(NA,length(1:24))
for (i in (1:24)){
a[i]<-bic.glm(mydata[,i]~ TotScore, glm.family=binomial,data=mydata)$bic
}
a
但是如果我试着将它放在一个函数中,我就无法提取“a”
myB<-function(mydata){
a<-rep(NA,length(ncol(mydata)))
for (i in (1:ncol(mydata))){
a[i]<-bic.glm(mydata[,i]~ TotScore, glm.family=binomial,data=mydata)$bic
}
return(a)
}
myB(mydata)
或者更确切地说,bic仅适用于最后一个模型
我可以为平均值构建相同的函数并设法提取结果,这可能与bic输出的结构有关吗?
非常感谢
中号
答案 0 :(得分:1)
似乎bic.glm
只从全局环境中读取对象 - 您的函数的问题在于它确实识别了函数内本地创建的i
。请尝试以下方法:
library(difR)
data(verbal)
TotScore=rowSums(verbal[,c(1:24)])
mydata=verbal[,c(1:24)]
myB<-function(mydata){
a<-rep(NA,length(ncol(mydata)))
for (i in (1:ncol(mydata))){
# force this.col to be in the global environment
this.col <<- mydata[,i]
# Alternatively:
# assign("this.col", mydata[,i], envir=.GlobalEnv)
a[i]<-bic.glm(this.col ~ TotScore, glm.family=binomial,data=mydata)$bic
}
return(a)
}
myB(mydata)
您的函数仍在读取由第一个循环创建的全局i
,该循环位于24。
它应该这样做似乎很奇怪;在快速谷歌搜索后,我发现问题here和here的引用(这不是一个非常彻底的搜索,我相信有更好的例子)。我在bic.glm
的文档中找不到任何内容,这有点令人惊讶。
从第一个答案到我提供的第二个链接,如果您使用公式但未指定data
参数,似乎会发生这种情况。