2 Stimmen

Ergebnisse aus einer Schleife in einer Funktion extrahieren

Ich tue wahrscheinlich etwas sehr dumm, aber ich kann nicht die Parameterwerte aus einer Reihe von Modellen extrahieren, die meine Funktion in einer Schleife durchläuft.

Daten:

library(difR)
data(verbal)
TotScore=rowSums(verbal[,c(1:24)])
mydata=verbal[,c(1:24)]

Ich kann dann den Modell-BIC in einer Schleife ermitteln

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

Aber wenn ich versuche, dies in eine Funktion einzufügen, kann ich "a" nicht extrahieren

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)

Oder aber der Bic ist nur für das allerletzte Modell

Ich kann die gleiche Funktion für den Mittelwert erstellen und die Ergebnisse extrahieren, also liegt es vielleicht an der Struktur der Bic-Ausgabe?

Vielen Dank!

M

1voto

Edward Punkte 5277

Es scheint, als ob bic.glm liest nur Objekte aus der globalen Umgebung - das Problem mit Ihrer Funktion war, dass sie die i lokal innerhalb der Funktion erstellt. Versuchen Sie das Folgende:

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)

Ihre Funktion las immer noch die globale i die von der ersten Schleife erzeugt wurde, die bei 24 lag.

Es scheint sehr seltsam, dass es dies tun sollte; nach einer schnellen Google-Suche fand ich Hinweise auf das Problem aquí y aquí (die Suche war nicht sehr gründlich, und ich bin sicher, dass es bessere Beispiele gibt). Ich konnte in der Dokumentation nichts finden für bic.glm was ein wenig überraschend ist.

Aus der ersten Antwort auf den zweiten Link, den ich zur Verfügung gestellt habe, scheint es, als würde dies passieren, wenn Sie eine Formel verwenden, aber keine data Parameter.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X