2

我可能在做一些非常愚蠢的事情,但我无法从我的函数循环的一系列模型中提取参数值。

数据:

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 输出的结构有关?

非常感谢

4

1 回答 1

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。

它应该这样做似乎很奇怪;经过快速的谷歌搜索后,我在这里这里找到了对问题的引用(这不是一个非常彻底的搜索,我相信有更好的例子)。我在 的文档中找不到任何内容bic.glm,这有点令人惊讶。

data从第一个答案到我提供的第二个链接,如果您使用公式但不指定参数,似乎会发生这种情况。

于 2012-08-06T11:58:48.857 回答