Ich benutze cv.glmnet
, um Prädiktoren zu finden. Das Setup, das ich verwende, ist wie folgt:
lassoResults<-cv.glmnet(x=countDiffs,y=responseDiffs,alpha=1,nfolds=cvfold)
bestlambda<-lassoResults$lambda.min
results<-predict(lassoResults,s=bestlambda,type="coefficients")
choicePred<-rownames(results)[which(results !=0)]
Um sicherzustellen, dass die Ergebnisse reproduzierbar sind, habe ich set.seed(1)
. Die Ergebnisse sind sehr unterschiedlich. Ich habe genau den gleichen Code 100 ausgeführt, um zu sehen, wie variabel die Ergebnisse waren. In den 98/100 Läufen wurde immer ein bestimmter Prädiktor ausgewählt (manchmal nur für sich); Andere Prädiktoren wurden in der Regel 50/100 Mal ausgewählt (der Koeffizient war ungleich Null).
Es heißt also für mich, dass jedes Mal, wenn die Kreuzvalidierung ausgeführt wird, wahrscheinlich ein anderes bestes Lambda ausgewählt wird, da die anfängliche Randomisierung der Falten eine Rolle spielt. Andere haben dieses Problem gesehen ( CV.glmnet-Ergebnisse ), aber es gibt keine vorgeschlagene Lösung.
Ich denke, dass vielleicht diejenige, die 98/100 zeigt, ziemlich stark mit allen anderen korreliert ist? Die Ergebnisse haben stabilisieren , wenn ich nur laufen LOOCV ( ), aber ich bin neugierig , warum sie so variabel sind , wenn .
quelle
set.seed(1)
einmal und danncv.glmnet()
100 Mal rennst? Das ist keine großartige Methode für die Reproduzierbarkeit. Besserset.seed()
vor jedem Lauf nach rechts oder die Faltlinien über die Läufe hinweg konstant halten. Jeder Ihrer Anrufe ancv.glmnet()
ruftsample()
N-mal an. Wenn sich also die Länge Ihrer Daten ändert, ändert sich die Reproduzierbarkeit.Antworten:
Der Punkt hier ist, dass in
cv.glmnet
der K-Falte ("Teile") nach dem Zufallsprinzip ausgewählt werden.Bei der Kreuzvalidierung mit K-Faltungen wird der Datensatz in Teile unterteilt, und Teile werden verwendet, um den K-ten Teil vorherzusagen (dies wird mal durchgeführt, wobei jedes Mal ein anderer Teil verwendet wird). Dies wird für alle Lambdas durchgeführt und ist derjenige, der den kleinsten Kreuzvalidierungsfehler ergibt.K K- 1 K K
lambda.min
Aus diesem Grund die Ergebnisse bei Verwendung von nicht: Jede Gruppe besteht aus einer, sodass für die Gruppen keine große Auswahl besteht .n fo l ds = n K
Aus dem
cv.glmnet()
Referenzhandbuch:MSEs ist der Datenrahmen, der alle Fehler für alle Lambdas enthält (für die 100 Läufe),
lambda.min
ist Ihr Lambda mit minimalem Durchschnittsfehler.quelle
cv.glmnet(...)$lambda
. Meine Alternative behebt dies: stats.stackexchange.com/a/173895/19676Dann bekomme ich für jeden Prädiktor:
Auf diese Weise erhalte ich eine ziemlich solide Beschreibung der Wirkung des Prädiktors. Sobald Sie Verteilungen für die Koeffizienten haben, können Sie alle statistischen Dinge ausführen, die Sie für wert halten, um CI-, p-Werte usw. zu erhalten, aber ich habe dies noch nicht untersucht.
Diese Methode kann mit mehr oder weniger jeder Auswahlmethode verwendet werden, die ich mir vorstellen kann.
quelle
Ich werde eine weitere Lösung hinzufügen, die den Fehler in @ Alice aufgrund fehlender Lambdas behebt, aber keine zusätzlichen Pakete wie @ Max Ghenis benötigt. Vielen Dank an alle anderen Antworten - jeder macht nützliche Punkte!
quelle
Die Antwort von Alice funktioniert in den meisten Fällen gut, aber manchmal treten Fehler auf, weil
cv.glmnet$lambda
manchmal Ergebnisse unterschiedlicher Länge zurückgegeben werden, z.OptimLambda
Das folgende sollte im Allgemeinen funktionieren und ist auch schneller, wenn diemclapply
parallele Verarbeitung und die Vermeidung von Schleifen genutzt werden.quelle
Sie können die Zufälligkeit steuern, wenn Sie foldid explizit festlegen. Hier ein Beispiel für einen 5-fachen Lebenslauf
Führen Sie nun cv.glmnet mit diesen Foldids aus.
Sie erhalten jedes Mal die gleichen Ergebnisse.
quelle