Ich möchte Folgendes tun:
1) OLS-Regression (kein Bestrafungsterm), um Beta-Koeffizienten ; steht für die zur Regression verwendeten Variablen. Ich mache das durch j
lm.model = lm(y~ 0 + x)
betas = coefficients(lm.model)
2) Lasso-Regression mit einem Bestrafungsbegriff, die Auswahlkriterien sind die Bayesian Information Criteria (BIC), angegeben durch
Dabei steht für die Variable / Regressornummer, für die Anzahl der Beobachtungen und für die in Schritt 1) erhaltenen Anfangsbetas. Ich möchte Regressionsergebnisse für diesen bestimmten Wert haben, der für jeden verwendeten Regressor unterschiedlich ist. Wenn es also drei Variablen gibt, gibt es drei verschiedene Werte .T b ∗ j λ j λ j
Das OLS-Lasso-Optimierungsproblem ist dann gegeben durch
Wie kann ich dies in R entweder mit dem Lars- oder dem glmnet-Paket tun? Ich kann kein Lambda angeben und bin mir nicht 100% sicher, ob ich beim Ausführen die richtigen Ergebnisse erhalte
lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")
Ich freue mich über jede Hilfe hier.
Aktualisieren:
Ich habe jetzt den folgenden Code verwendet:
fits.cv = cv.glmnet(x,y,type="mse",penalty.factor = pnlty)
lmin = as.numeric(fits.cv[9]) #lambda.min
fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
coef = coef(fits, s = lmin)
In Zeile 1 verwende ich eine Kreuzvalidierung mit meinem angegebenen Straffaktor ( ), die für jeden Regressor unterschiedlich ist . Zeile 2 wählt das "Lambda.min" von fit.cv aus. Dies ist das Lambda, das den minimalen mittleren Kreuzvalidierungsfehler ergibt. Zeile 3 führt eine Lasso-Anpassung ( ) für die Daten durch. Wieder habe ich den Straffaktor . Zeile 4 extrahiert die Koeffizienten aus Anpassungen, die zu dem in Zeile 2 gewählten "optimalen" gehören .alpha=1
Jetzt habe ich die Beta-Koeffizienten für die Regressoren, die die optimale Lösung des Minimierungsproblems darstellen
mit einem Straffaktor . Der optimale Satz von Koeffizienten ist höchstwahrscheinlich eine Teilmenge der Regressoren, die ich ursprünglich verwendet habe. Dies ist eine Folge der Lasso-Methode, die die Anzahl der verwendeten Regressoren verringert.
Ist mein Verständnis und der Code korrekt?
quelle
$\alpha$
wird . Bitte machen Sie dies, da die Leute dadurch Ihre Frage leichter verstehen und daher beantworten können.Antworten:
Aus der
glmnet
Dokumentation (?glmnet
) geht hervor, dass es möglich ist, eine Differenzialschrumpfung durchzuführen. Dies bringt uns zumindest teilweise dazu, die Frage von OP zu beantworten.Um die Frage vollständig zu beantworten, stehen Ihnen meines Erachtens zwei Ansätze zur Verfügung, je nachdem, was Sie erreichen möchten.
Ihre Frage ist, wie Sie die Differentialschrumpfung anwendenλ λ bj Wir müssen nur etwas Algebra machen. Seiϕjder Straffaktor fürbj, was geliefert werden würde. Aus der Dokumentation ist ersichtlich, dass diese Werte um einen Faktor vonCϕj=ϕ ' j stm=C∑ m j = 1 logTneu skaliert werdenϕj=logTT|b∗j| ϕj bj Cϕj=ϕ′j . Dies bedeutetdassφ ' j ersetztφjin der unten Optimierung Ausdruck. Lösen Sie also nachC, geben Sie die Werteϕ ′ j anund extrahieren Sie dann die Koeffizienten fürλ=1. Ich würde empfehlen, zu verwenden.m=C∑mj=1logTT|b∗j| ϕ′j ϕj C ϕ′j λ=1
glmnet
und die Koeffizienten für einen bestimmten Wert abrufen können . Wenn einige Werte nicht 1 sind, wird bei jedem Wert von λ eine unterschiedliche Schrumpfung erreicht . Um eine Schrumpfung zu erreichen, beträgt die Schrumpfung für jedes b j ϕ j = log T.penalty.factor
penalty.factor
glmnet
coef(model, s=1, exact=T)
Die zweite ist die "Standard" -Verwendungk λ λ=0 b λ λ
glmnet
: Man führt eine wiederholte fache Kreuzvalidierung durch, um λ so auszuwählen , dass Sie die MSE außerhalb der Stichprobe minimieren. Dies ist, was ich unten ausführlicher beschreibe. Der Grund, warum wir CV verwenden und MSE außerhalb der Stichprobe prüfen , ist, dass MSE innerhalb der Stichprobe immer für λ = 0 minimiert wird , dh b ist eine gewöhnliche MLE. Die Verwendung von CV unter Variation von λ ermöglicht es uns, die Leistung des Modells bei Daten außerhalb der Stichprobe abzuschätzen und ein λ auszuwählen , das (in einem bestimmten Sinne) optimal ist.Dieserλ λ λ λ
glmnet
Aufruf gibt kein (und sollte es auch nicht, da er aus Leistungsgründen standardmäßig die gesamte λ- Trajektorie berechnet ). gibt die Koeffizienten für den λ- Wert zurück . Unabhängig von der von Ihnen angegebenen Auswahl von λ spiegelt das Ergebnis die Differenzstrafe wider, die Sie im Aufruf angewendet haben, um das Modell anzupassen.coef(fits,s=something)
something
Die Standardmethode zum Auswählen eines optimalen Werts von ist die Verwendung von anstelle von . Die Kreuzvalidierung wird verwendet, um das Ausmaß der Schrumpfung auszuwählen, das den Fehler außerhalb der Stichprobe minimiert, während die Spezifikation von einige Merkmale gemäß Ihrem Gewichtungsschema stärker schrumpft als andere.λ
cv.glmnet
glmnet
penalty.factor
Dieses Verfahren wird optimiert
penalty.factor
Dies ist im Grunde die Motivation,
glmnet
wie ich es verstehe: die bestrafte Regression zu verwenden, um ein Regressionsmodell zu schätzen, das hinsichtlich seiner Leistung außerhalb der Stichprobe nicht allzu optimistisch ist. Wenn dies Ihr Ziel ist, ist dies vielleicht doch die richtige Methode für Sie.quelle
pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
wie extrahiere ich dann die Regressor-Betas, die dem von mir angegebenen Lambda entsprechen, da das Lambda für jeden Risikofaktor unterschiedlich ist?glmnet
. Siehe meine überarbeitete Antwort.