2015-05-31 22 views
5

sto usando glmnet pacchetto per ottenere grafico seguente da mtcars set di dati (regressione del mpg su altre variabili):Aggiunta di etichette sulle curve nella trama glmnet in R

library(glmnet) 
fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1]) 
plot(fit, xvar='lambda') 

enter image description here

Come posso aggiungere nomi di variabili per ogni curva, all'inizio di ogni curva o al suo punto massimo y (massimo lontano dall'asse x)? Ho provato e posso aggiungere la legenda come al solito ma non le etichette su ogni curva o al suo inizio. Grazie per l'aiuto.

+0

È difficile poiché le etichette sono codificate. vedi http://stackoverflow.com/questions/30460410/plot-glmnet-increase-size-of-variable-labels/30463022 – user2957945

risposta

3

Poiché le etichette sono codificate in modo rigido, è forse più semplice scrivere una funzione rapida. Questo è solo un colpo veloce, quindi può essere cambiato per essere più completo. Vorrei anche notare che quando si usa il lazo ci sono di solito un sacco di variabili quindi ci saranno un sacco di sovrapposizione delle etichette (come si vede nel vostro piccolo esempio)

lbs_fun <- function(fit, ...) { 
     L <- length(fit$lambda) 
     x <- log(fit$lambda[L]) 
     y <- fit$beta[, L] 
     labs <- names(y) 
     text(x, y, labels=labs, ...) 
} 

# plot 
plot(fit, xvar="lambda") 

# label 
lbs_fun(fit) 

enter image description here

+0

Questo è esattamente ciò che ho chiesto. Grazie. – rnso

+0

Si prega di vedere la mia domanda di follow-up sull'aggiunta di legenda a questa trama: http://stackoverflow.com/questions/30566788/legend-label-errors-with-glmnet-plot-in-r – rnso

1

Un'alternativa è la funzione plot_glmnet nel pacchetto plotmo . Posiziona automaticamente i nomi delle variabili e ha alcuni altri campanelli e fischietti. Ad esempio, il seguente codice

library(glmnet) 
mod <- glmnet(as.matrix(mtcars[-1]), mtcars[,1]) 
library(plotmo) # for plot_glmnet 
plot_glmnet(mod) 

plot http://www.milbo.org/doc/plot-glmnet-mtcars.png

nomi di variabili sono sparsi per prevenire overplotting, ma possiamo ancora distinguere quale curva è associato con la quale variabile. Ulteriori esempi sono disponibili nel capitolo 6 in plotres vignette incluso nel pacchetto plotmo .

0

Ecco una modifica della risposta migliore, utilizzando segmenti di linea anziché etichette di testo che si sovrappongono direttamente alle curve. Ciò è particolarmente utile quando ci sono molte variabili e si desidera stampare solo quelli con valori di coefficiente assoluti maggiori di zero:

#note: the argument 'lra' is a cv.glmnet object 


lbs_fun <- function(lra, ...) { 

    fit <- lra$glmnet.fit 

    L=which(fit$lambda==lra$lambda.min) 

    ystart <- sort(fit$beta[abs(fit$beta[,L])>0,L]) 
    labs <- names(ystart) 
    r <- range(fit$beta[,100]) # max gap between biggest and smallest coefs at smallest lambda i.e., 100th lambda 
    yfin <- seq(r[1],r[2],length=length(ystart)) 

    xstart<- log(lra$lambda.min) 
    xfin <- xstart+1 


    text(xfin+0.3,yfin,labels=labs,...) 
    segments(xstart,ystart,xfin,yfin) 


} 

plot(lra$glmnet.fit,label=F, xvar="lambda", xlim=c(-5.2,0), lwd=2) #xlim, lwd is optional