2017-03-05 2 views
0

ich folgende Anrechnungs Aufgabe als eine for-Schleife in R leite:Running for-Schleife über mehrere Gruppen

myData <- essuk[c(2,3,4,5,6,12)] 
myDataImp <- matrix(0,dim(myData)[1],dim(myData)[2]) 

lower <- c(0) 
upper <- c(Inf) 

for (k in c(1:5)) 
{ 
    gmm.fit1 <- gmm.tmvnorm(matrix(myData[,k],length(myData[,k]),1), lower=lower, upper=upper) 

    useMu <- matrix(gmm.fit1$coefficients[1],1,1) 
    useSigma <- matrix(gmm.fit1$coefficients[2],1,1) 
    replaceThese <- myData[,k]<=0 
    myDataImp[,k] <- myData[,k] 

    myDataImp[replaceThese,k] <- rtmvnorm(n=sum(replaceThese), c(useMu), c(useSigma), c(-Inf), c(0)) 
} 

Die Schritte sind ziemlich einfach

  • den Datensatz definieren und eine leere Anrechnungs Daten einstellen.
  • Für Spalte 1-5 passen Sie ein Modell an.
  • Extrahieren Sie Modellschätzungen für die Imputation.
  • Führen Sie ein Modell mit Modellschätzungen aus und ersetzen Sie die Werte < = 0 durch die neuen Werte im Imputationsdatensatz.

Allerdings möchte ich dies separat für mehrere Gruppen, anstatt für die vollständige Probe. Spalte 12 im Datensatz enthält Informationen zur Gruppenzugehörigkeit (Ganzzahlen von 1 bis 72).

Ich habe verschiedene Optionen ausprobiert, einschließlich der Aufspaltung des Datenrahmens mit data_list <- split(myData, myData$V12) und der Verwendung der lapply()-Funktion. Allerdings funktioniert dies nicht darauf zurückzuführen, wie Modellschätzungen formatiert:

Error in as.data.frame.default(data) : 
    cannot coerce class ""gmm"" to a data.frame 

Ich habe auch gedacht, über die Möglichkeit für eine verschachtelte Schleife zu tun, obwohl ich nicht sicher bin, wie das erreicht werden könnte. Irgendwelche Vorschläge werden sehr geschätzt.

+0

Pls liefern reproduzierbares Beispiel von essuk oder myData. – Djork

Antwort

1

Was ist mit der Verwendung von Teilmenge()?

myData$V12 = as.factor(myData$V12) 
listofresults= c() 
for (i in levels(myData$V12)){ 
data = subset (myData, myData$V12 == i) 
    #your analysis here: result saved in myDataImp 

listofresults = c(listofresults, myDataImp) 
} 

nicht die eleganteste, aber sollte funktionieren.

+0

Das hat wie ein Zauber funktioniert! Ich denke, es sollte einen Weg geben, um das apply() - Framework zu verwenden, anstatt eine doppelte Schleife, aber Ihr Vorschlag ist es auch. Auch wenn mein Datensatz nicht besonders groß ist, könnten doppelte Schleifen Probleme bei größeren Datensätzen oder komplizierteren Modellen verursachen. – thesixmax