2016-03-23 16 views
1

Ich habe 50 Prädiktorvariablen verwendet, um Kombinationen von mehr als 2 Millionen Regressionsmodellen für eine einzige Ergebnisvariable zu erstellen. Die meisten davon sind Unsinn - ich möchte alle Modelle mit einem korrigierten R-Quadrat (AR2) unter 0,7 eliminieren, und deren Mitglieder haben eine vif> 4 (aus dem Auto-Paket). Ich habe zuerst eine Liste aller Modelle erstellt (b) und in einem zweiten Schritt alle Modelle, die meine Kriterien erfüllen, mit einer for/if-Schleife eliminiert und ein zweites Objekt (bb) erstellt. Dies ist der zweite Schritt:Extract Adj R Square aus einer Liste von lm-Ergebnissen

### Create the filtered list 
mlen <- length(b) 
for (i in 1:mlen) { 
    if(summary(b[[i]])$adj.r.squared > .7 & all(vif(b[[i]]) <4)) { 
     bb[i]<-b[i] 
    }  
    } 
### Get rid of all of the null results 
bb <- bb[!sapply(bb, is.null)] 

Dies funktioniert, aber es scheint so hässlich und ineffizient. Es scheint, als sollte es einen eleganten Weg geben, einen der anwendbaren Befehle (lapply, sapply) zu verwenden, aber das Problem ist zweifach. Erstens, die Tatsache, dass AR2 nicht wirklich Teil der normalen lm-Ergebnisse ist - ich muss "Zusammenfassung" verwenden, um AR2 zu erhalten. Zweitens gibt es das Subsetting-Problem, da dies eine Liste von Listen ist. Ich kann nicht einfach die Zusammenfassungen extrahieren, und die AR2 von denen bekommen, mit bb < - lapply (b, Zusammenfassung) - Ich würde etwas wie bb < verwenden - lapply (b, Zusammenfassung [[]]) aber natürlich mag R das nicht.

Antwort

2

Klingt wie Filter() könnten einige in praktisch hier

bb <- Filter(function(x) { 
    summary(x)$adj.r.squared > .7 & all(vif(x) <4) 
}, b) 

Sie es nur eine Funktion übergeben, um es zu sagen, welche Objekte Sie behalten möchten und die Liste, wenn Elemente, die Sie filtern möchten.

+0

ERSTAUNLICH !! Vielen Dank! Definitiv viel besser als meine verrückte for/if-Schleife –