2015-03-27 23 views
5

Sto lavorando a un progetto che mostrerebbe la potenziale influenza di un gruppo di eventi su un risultato. Sto usando il pacchetto glmnet(), in particolare usando la funzione di Poisson. Qui è il mio codice:Differenza tra glmnet() e cv.glmnet() in R?

# de <- data imported from sql connection   
x <- model.matrix(~.,data = de[,2:7]) 
y <- (de[,1]) 
reg <- cv.glmnet(x,y, family = "poisson", alpha = 1) 
reg1 <- glmnet(x,y, family = "poisson", alpha = 1) 

**Co <- coef(?reg or reg1?,s=???)** 

summ <- summary(Co) 
c <- data.frame(Name= rownames(Co)[summ$i], 
     Lambda= summ$x) 
c2 <- c[with(c, order(-Lambda)), ] 

L'inizio importa una grande quantità di dati dal mio database in SQL. Quindi lo metto in formato matrice e separo la risposta dai predittori.

Questo è il punto in cui sono confuso: non riesco a capire esattamente quale sia la differenza tra la funzione glmnet() e la funzione cv.glmnet(). Mi rendo conto che la funzione cv.glmnet() è una cross-validation k-fold di glmnet(), ma cosa significa esattamente in termini pratici? Forniscono lo stesso valore per lambda, ma voglio essere sicuro che non manchi qualcosa di importante sulla differenza tra i due.

Non sono sicuro del motivo per cui funziona correttamente quando si specifica alpha = 1 (presumibilmente il valore predefinito), ma non se lo lascio fuori?

Grazie in anticipo!

+0

Prova a guardare 'trama (reg)'. – Roland

+1

** Non fare mai affidamento sulla sequenza lambda predefinita di glmnet! ** Problema notorio. Fornisci sempre la tua sequenza. Quindi ottieni il valore lambda ottimale in seguito da 'fit $ lambda.min' e usalo con il parametro' s = lambda.min' in tutte le chiamate a 'predichi()', 'coef()' ecc. – smci

+0

@smci perché no usando lambda.1se? Esattamente questo è usato da prevedere() – Tonja

risposta

6

glmnet() è un pacchetto R che può essere utilizzato per adattarsi a modelli di regressione, modello lazo e altri. L'argomento alfa determina il tipo di modello adatto. Quando alpha = 0, Ridge Model è adatto e se alpha = 1, un modello lazo è adatto.

cv.glmnet() esegue la convalida incrociata, di default 10 volte che può essere regolata utilizzando nfolds. Un CV di 10 volte dividerà casualmente le tue osservazioni in 10 gruppi/pieghe non sovrapposte di circa uguale dimensione. La prima piega verrà utilizzata per il set di convalida e il modello si adatta a 9 pieghe. I vantaggi della varianza della distorsione sono solitamente la motivazione alla base dell'utilizzo di tali metodi di convalida del modello. Nel caso dei modelli lazo e cresta, CV aiuta a scegliere il valore del parametro di regolazione lambda.

Nel tuo esempio, puoi fare plot (reg) OR reg $ lambda.min per vedere il valore di lambda che si traduce nel più piccolo errore CV. È quindi possibile derivare il MSE di test per quel valore di lambda. Per impostazione predefinita, glmnet() eseguirà la regressione Ridge o Lazo per un intervallo di lambda selezionato automaticamente che potrebbe non fornire l'MSE di test più basso. Spero che questo ti aiuti!

Spero che questo aiuti!

+1

Più esplicitamente dichiarato: ** Non fare mai affidamento sulla sequenza lambda predefinita di glmnet! Fornisci sempre la tua sequenza. ** – smci

1

Tra reg $ lambda.min e reg $ lambda.1se; il lambda.min ovviamente ti darà il MSE più basso, tuttavia, a seconda di quanto sia flessibile l'errore, potresti voler scegliere reg $ lambda.1se, poiché questo valore ridurrebbe ulteriormente il numero di predittori. Puoi anche scegliere la media di reg $ lambda.min e reg $ lambda.1se come valore lambda.

Problemi correlati