R - Regressione lazo - Lambda diverso per regressore


11

Voglio fare quanto segue:

1) regressione OLS (nessun termine di penalizzazione) per ottenere coefficienti beta ; sta per le variabili usate per regredire. Lo faccio perbjj

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

2) regressione del lazo con un termine di penalizzazione, i criteri di selezione devono essere i criteri di informazione bayesiani (BIC), forniti da

λj=log(T)T|bj|

dove sta per il numero variabile / regressore, per il numero di osservazioni e per i beta iniziali ottenuti nel passaggio 1). Voglio avere risultati di regressione per questo specifico valore , che è diverso per ogni regressore utilizzato. Quindi se ci sono tre variabili, ci saranno tre diversi valori .jTbjλjλj

Il problema di ottimizzazione del lazo OLS è quindi dato da

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

Come posso farlo in R con il pacchetto lars o glmnet? Non riesco a trovare un modo per specificare lambda e non sono sicuro al 100% se ottengo i risultati corretti se corro

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

Apprezzo qualsiasi aiuto qui.


Aggiornare:

Ho usato il seguente codice ora:

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)

Nella riga 1 utilizzo la convalida incrociata con il mio fattore di penalità specificato ( ), che è diverso per ogni regressore . La riga 2 seleziona "lambda.min" di fits.cv, ovvero lambda che fornisce l'errore di convalida incrociata medio minimo. La riga 3 esegue un adattamento lazo ( ) sui dati. Ancora una volta ho usato il fattore di penalità . La riga 4 estrae i coefficienti dagli accoppiamenti che appartengono al "ottimale" scelto nella riga 2.λj=log(T)T|bj|alpha=1λλ

Ora ho i coefficienti beta per i regressori che descrivono la soluzione ottimale del problema di minimizzazione

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

con un fattore di penalità . L'insieme ottimale di coefficienti è molto probabilmente un sottoinsieme dei regressori che inizialmente ho usato, questa è una conseguenza del metodo Lazo che riduce il numero di regressori usati.λj=log(T)T|bj|

La mia comprensione e il codice sono corretti?


2
Puoi utilizzare il markup LATEX nel tuo post, racchiuso tra segni di dollaro. $\alpha$diventa . Per favore, rendi questo, poiché renderà le persone più facilmente in grado di capire la tua domanda e quindi rispondere. α
Sycorax dice di reintegrare Monica il

Risposte:


15

Dalla glmnetdocumentazione ( ?glmnet), vediamo che è possibile eseguire il restringimento differenziale. Questo ci porta almeno in parte a rispondere alla domanda di OP.

penalty.factor: È possibile applicare fattori di penalità separati per ciascun coefficiente. Questo è un numero che si moltiplica lambdaper consentire il restringimento differenziale. Può essere 0 per alcune variabili, il che non implica alcun restringimento e tale variabile è sempre inclusa nel modello. L'impostazione predefinita è 1 per tutte le variabili (e implicitamente infinito per le variabili elencate in exclude). Nota: i fattori di penalità vengono riscalati internamente per essere sommati nvarse la lambdasequenza rifletterà questo cambiamento.

Per rispondere pienamente alla domanda, tuttavia, penso che ci siano due approcci disponibili, a seconda di ciò che si desidera realizzare.

  1. La tua domanda è come applicare il restringimento differenziale glmnete recuperare i coefficienti per un valore specifico . Fornendo st alcuni valori non sono 1 si ottiene un restringimento differenziale a qualsiasi valore di . Per ottenere il restringimento, il restringimento per ogni è , dobbiamo solo fare un po 'di algebra. Sia il fattore di penalità per , a cosa verrebbe fornito . Dalla documentazione, possiamo vedere che questi valori sono ridimensionati di un fattore di st . Ciò significa cheλpenalty.factorλbjϕj=logTT|bj|ϕjbjpenalty.factorCϕj=ϕjm=Cj=1mlogTT|bj|ϕjsostituisce nell'espressione di ottimizzazione seguente. Quindi risolvere per , fornire i valori a , e quindi estrarre coefficienti per . Consiglierei di usare .ϕjCϕjglmnetλ=1coef(model, s=1, exact=T)

  2. Il secondo è il modo "standard" da usare glmnet: uno esegue ripetute convalide incrociate fold per selezionare modo da ridurre al minimo MSE fuori campione. Questo è ciò che descrivo di seguito in modo più dettagliato. Il motivo per cui utilizziamo CV e controlliamo MSE fuori campione è perché MSE in campione sarà sempre ridotto a , ovvero è un normale MLE. L'uso di CV mentre si varia ci consente di stimare il rendimento del modello su dati fuori campione e selezionare un che è ottimale (in un senso specifico).kλλ=0bλλ

Quella glmnetchiamata non specifica un (né dovrebbe, perché calcola l'intera traiettoria per impostazione predefinita per motivi di prestazioni). restituirà i coefficienti per il valore . Ma indipendentemente dalla scelta di che fornisci, il risultato rifletterà la penalità differenziale che hai applicato nella chiamata per adattarla al modello.λλcoef(fits,s=something)λsomethingλ

Il modo standard per selezionare un valore ottimale di è usare , piuttosto che . La convalida incrociata viene utilizzata per selezionare la quantità di restringimento che riduce al minimo l'errore fuori campione, mentre la specifica di ridurrà alcune funzionalità più di altre, in base al proprio schema di ponderazione.λcv.glmnetglmnetpenalty.factor

Questa procedura ottimizza

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

dove è il fattore di penalità per la funzione (cosa fornite nell'argomento). (Questo è leggermente diverso dalla tua espressione di ottimizzazione; nota che alcuni dei pedici sono diversi.) Nota che il termine è lo stesso in tutte le funzionalità, quindi l'unico modo in cui alcune funzionalità sono ridotte più di altre è attraverso . È importante sottolineare che e non sono gli stessi; è scalare e è un vettore! In questa espressione, è fisso / assunto noto; cioè, l'ottimizzazione sceglierà la ottimale , non la ottimaleϕjjthpenalty.factorλϕjλϕλϕλbλ.

Questa è fondamentalmente la motivazione di glmnetcome la capisco: usare la regressione penalizzata per stimare un modello di regressione che non sia eccessivamente ottimista riguardo alle sue prestazioni fuori campione. Se questo è il tuo obiettivo, forse questo è il metodo giusto per te dopo tutto.


+1 Questo è corretto. Aggiungerò anche che la regolarizzazione della regressione può essere vista come un precedente bayesiano, ovvero il massimo a posteriori (MAP) è la massima verosimiglianza (ML). Lavorare in quel quadro offre maggiore flessibilità nella regolarizzazione qualora fosse necessario.
TLJ

Se corro pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty) come posso estrarre i beta regressori che corrispondono alla lambda che ho specificato, poiché la lambda è diversa per ogni fattore di rischio?
Dom

1
@Dom Mi è venuto in mente un po 'troppo tardi che c'è un modo ovvio per ottenere esattamente quello che vuoi usare glmnet. Vedi la mia risposta rivista.
Sycorax dice di reintegrare Monica il

2
Fai attenzione a personalizzare la penalità separatamente per ciascun predittore. Ciò equivarrebbe a nient'altro che alla selezione graduale delle variabili in alcuni casi. La regressione penalizzata riduce l'errore quadratico medio ipotizzando un numero molto limitato di parametri di penalità e prendendo in prestito informazioni attraverso i predittori.
Frank Harrell,

2
@FrankHarrell Grazie per il commento! Sembra che l'utilizzo di penalità diverse per ciascun predittore equivalga a un modello bayesiano che presuppone un diverso precedente per ciascun parametro. Ciò non mi sembra che rappresenti un pericolo unico per l'inferenza bayesiana in generale. Inoltre, potresti approfondire in che modo la regressione penalizzata prende in prestito le informazioni tra i predittori? Non sono sicuro di comprendere appieno come sia il caso in tale scenario.
Sycorax dice di reintegrare Monica il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.