R - Régression Lasso - Lambda différente par régresseur


11

Je veux faire ce qui suit:

1) Régression OLS (pas de terme de pénalisation) pour obtenir les coefficients bêta ; représente les variables utilisées pour régresser. Je le fais enbjj

lm.model = lm(y~ 0 + x)
betas    = coefficients(lm.model)

2) Régression au lasso avec un terme de pénalisation, les critères de sélection seront les critères d'information bayésiens (BIC), donnés par

λj=log(T)T|bj|

où représente le nombre de variables / régresseurs, T le nombre d'observations et b_ {j} ^ {*} les bêtas initiaux obtenus à l'étape 1). Je veux avoir des résultats de régression pour cette valeur \ lambda_j spécifique , qui est différente pour chaque régresseur utilisé. Donc s'il y a trois variables, il y aura trois valeurs différentes \ lambda_j .jTbjλjλj

Le problème d'optimisation OLS-Lasso est alors donné par

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

Comment puis-je faire cela en R avec le paquet lars ou glmnet? Je ne trouve pas un moyen de spécifier lambda et je ne suis pas sûr à 100% si j'obtiens les bons résultats si je lance

lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")

J'apprécie toute aide ici.


Mise à jour:

J'ai utilisé le code suivant maintenant:

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)

Dans la ligne 1, j'utilise la validation croisée avec mon facteur de pénalité spécifié ( ), qui est différent pour chaque régresseur . La ligne 2 sélectionne le "lambda.min" de fit.cv, qui est le lambda qui donne l'erreur de validation croisée moyenne minimale. La ligne 3 effectue un ajustement au lasso ( ) sur les données. Encore une fois, j'ai utilisé le facteur de pénalité . La ligne 4 extrait les coefficients des ajustements qui appartiennent au "optimal" choisi à la ligne 2.λλλj=log(T)T|bj|alpha=1λλ

J'ai maintenant les coefficients bêta pour les régresseurs qui décrivent la solution optimale du problème de minimisation

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

avec un facteur de pénalité . L'ensemble optimal de coefficients est très probablement un sous-ensemble des régresseurs que j'ai utilisé initialement, c'est une conséquence de la méthode du Lasso qui réduit le nombre de régresseurs utilisés.λj=log(T)T|bj|

Ma compréhension et le code sont-ils corrects?


2
Vous pouvez utiliser le balisage LATEX dans votre message, entouré de signes dollar. $\alpha$devient . Veuillez le faire, car cela rendra les gens plus faciles à comprendre votre question et donc à y répondre. α
Sycorax dit Réintégrer Monica le

Réponses:


15

De la glmnetdocumentation ( ?glmnet), nous voyons qu'il est possible d'effectuer un retrait différentiel. Cela nous permet au moins à mi-chemin de répondre à la question d'OP.

penalty.factor: Des facteurs de pénalité distincts peuvent être appliqués à chaque coefficient. C'est un nombre qui se multiplie lambdapour permettre un retrait différentiel. Peut être 0 pour certaines variables, ce qui n'implique aucun rétrécissement, et cette variable est toujours incluse dans le modèle. La valeur par défaut est 1 pour toutes les variables (et implicitement l'infini pour les variables répertoriées dans exclude). Remarque: les facteurs de pénalité sont redimensionnés en interne pour correspondre à nvars, et la lambdaséquence reflétera ce changement.

Pour répondre pleinement à la question, cependant, je pense qu'il y a deux approches à votre disposition, selon ce que vous voulez accomplir.

  1. Votre question est de savoir comment appliquer la réduction différentielle dans glmnetet récupérer les coefficients pour une valeur spécifique . Fournir st certaines valeurs ne sont pas égales à 1 permet un retrait différentiel à n'importe quelle valeur de . Pour obtenir le rétrécissement st le rétrécissement pour chaque est , il suffit de faire de l'algèbre. Soit le facteur de pénalité pour , ce qui serait fourni . De la documentation, nous pouvons voir que ces valeurs sont remises à l'échelle par un facteur st . Cela signifie queλpenalty.factorλbjϕj=logTT|bj|ϕjbjpenalty.factorCϕj=ϕjm=Cj=1mlogTT|bj|ϕjremplace dans l'expression d'optimisation ci-dessous. donc pour , fournissez les valeurs à , puis extrayez les coefficients pour . Je recommanderais d'utiliser .ϕjCϕjglmnetλ=1coef(model, s=1, exact=T)

  2. La seconde est la façon «standard» d'utiliser glmnet: on effectue une validation croisée répétée fold pour sélectionner telle sorte que vous minimisez MSE hors échantillon. C'est ce que je décris ci-dessous plus en détail. La raison pour laquelle nous utilisons CV et vérifions le MSE hors échantillon est que le MSE dans l'échantillon sera toujours minimisé pour , c'est-à-dire que est un MLE ordinaire. L'utilisation de CV tout en variant nous permet d'estimer la performance du modèle sur des données hors échantillon et de sélectionner un qui est optimal (dans un sens spécifique).kλλ=0bλλ

Cet glmnetappel ne spécifie pas un (il ne devrait pas non plus, car il calcule la trajectoire entière par défaut pour des raisons de performances). renverra les coefficients de la valeur . Mais quel que soit le choix de vous fournissez, le résultat reflétera la pénalité différentielle que vous avez appliquée dans l'appel pour s'adapter au modèle.λλcoef(fits,s=something)λsomethingλ

La manière standard de sélectionner une valeur optimale de est d'utiliser plutôt que . La validation croisée est utilisée pour sélectionner la quantité de retrait qui minimise l'erreur hors échantillon, tandis que la spécification de réduit certaines fonctionnalités plus que d'autres, selon votre schéma de pondération.λcv.glmnetglmnetpenalty.factor

Cette procédure optimise

minbRmt=1T(ytbXt)2+λj=1m(ϕj|bj|)

où est le facteur de pénalité pour la fonction (ce que vous fournissez dans l' argument). (Ceci est légèrement différent de votre expression d'optimisation; notez que certains des indices sont différents.) Notez que le terme est le même pour toutes les fonctionnalités, donc la seule façon dont certaines fonctionnalités sont plus réduites que d'autres est via . Surtout, et ne sont pas identiques; est scalaire et est un vecteur! Dans cette expression, est fixe / supposé connu; c'est-à-dire que l'optimisation choisira le optimal , pas le optimalj t h λ ϕ j λ ϕ λ ϕ λ b λϕjjthpenalty.factorλϕjλϕλϕλbλ.

C'est essentiellement la motivation de ce glmnetque je comprends: utiliser la régression pénalisée pour estimer un modèle de régression qui n'est pas trop optimiste quant à ses performances hors échantillon. Si tel est votre objectif, c'est peut-être la bonne méthode pour vous après tout.


+1 C'est correct. J'ajouterai également que la régularisation de la régression peut être considérée comme un prior bayésien, c'est-à-dire que le maximum a posteriori (MAP) est la similarité maximale régularisée (ML). Travailler dans ce cadre donne plus de flexibilité dans la régularisation en cas de besoin.
TLJ

Si je lance, pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty) comment puis-je extraire les bêtas régresseurs qui correspondent au lambda que j'ai spécifié, car le lambda est différent pour chaque facteur de risque?
Dom

1
@Dom Il m'est apparu un peu trop tard qu'il y avait un moyen évident d'obtenir exactement ce que vous voulez utiliser glmnet. Voir ma réponse révisée.
Sycorax dit Réintégrer Monica le

2
Méfiez-vous de personnaliser la pénalité séparément pour chaque prédicteur. Dans certains cas, cela ne représenterait rien de plus qu'une sélection de variables pas à pas. La régression pénalisée diminue l'erreur quadratique moyenne en supposant un nombre très limité de paramètres de pénalité et en empruntant des informations entre les prédicteurs.
Frank Harrell

2
@FrankHarrell Merci pour le commentaire! Il semble que l'utilisation de pénalités différentes pour chaque prédicteur équivaut à un modèle bayésien qui suppose un a priori différent pour chaque paramètre. Cela ne me semble pas représenter un risque unique pour l'inférence bayésienne en général. Pourriez-vous également nous expliquer comment la régression pénalisée emprunte des informations entre les prédicteurs? Je ne suis pas sûr de bien comprendre comment c'est le cas dans un tel scénario.
Sycorax dit Réintégrer Monica le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.