【问题标题】:extract results from a loop in a function从函数中的循环中提取结果
【发布时间】:2012-08-06 11:06:27
【问题描述】:

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

数据:

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

非常感谢

M

【问题讨论】:

  • 除了 Edward 的解决方案之外,您是否确定您做对了吗?我从来没有使用过BMA 包,但是查看帮助文件,它说您应该能够执行bic.glm(x=mydata, y=TotScore, glm.family="binomial")$bic 之类的操作来一次获得所有结果,但需要y values must be 0 &lt;= y &lt;= 1

标签: r for-loop


【解决方案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 处。

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

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

【讨论】:

  • 顺便问一下,你是怎么发现它正在接全局的?最好有一个调试策略,以备下次发生这种事情时使用。
  • 因为它只拾取最后一个i,我怀疑它可能是您在定义函数之前所做的调用(正常工作的for循环)留下的。所以我使用rm(list=ls()) 清除所有内容,然后定义并运行该函数——它抛出一个错误,抱怨找不到i。它拒绝找到函数中定义的任何内容,所以 global 是我的下一个最佳猜测。我希望这不会再次出现,或者至少它会在它发生时记录在案。
猜你喜欢
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多