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 en
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
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 .
Le problème d'optimisation OLS-Lasso est alors donné par
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.λλalpha=1
J'ai maintenant les coefficients bêta pour les régresseurs qui décrivent la solution optimale du problème de minimisation
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.
Ma compréhension et le code sont-ils corrects?
la source
$\alpha$
devient . Veuillez le faire, car cela rendra les gens plus faciles à comprendre votre question et donc à y répondre.Réponses:
De la
glmnet
documentation (?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.Pour répondre pleinement à la question, cependant, je pense qu'il y a deux approches à votre disposition, selon ce que vous voulez accomplir.
Votre question est de savoir comment appliquer la réduction différentielle dansλ λ bj ϕj= journalTT| b∗j| ϕj bj Cϕj= ϕ′j m = C∑mj = 1JournalTT| b∗j| ϕ′j remplace dans l'expression d'optimisation ci-dessous. donc pour , fournissez les valeurs à , puis extrayez les coefficients pour . Je recommanderais d'utiliser .ϕj C ϕ′j λ = 1
glmnet
et 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 quepenalty.factor
penalty.factor
glmnet
coef(model, s=1, exact=T)
La seconde est la façon «standard» d'utiliserk λ λ=0 b λ λ
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).Cetλ λ λ λ
glmnet
appel 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.glmnet
glmnet
penalty.factor
Cette procédure optimise
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 λϕj jth λ ϕj λ ϕ λ ϕ λ b λ .
penalty.factor
C'est essentiellement la motivation de ce
glmnet
que 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.la source
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?glmnet
. Voir ma réponse révisée.