varias superponer porcentaje los leyenda graficas ggplot etiquetas escala ejes como cambiar r plot glmnet

superponer - Agregar etiquetas en las curvas en el diagrama de glmnet en R



superponer graficas en r ggplot (3)

Estoy usando el paquete glmnet para obtener el siguiente gráfico del conjunto de datos mtcars (regresión de mpg en otras variables):

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

¿Cómo puedo agregar nombres de variables a cada curva, ya sea al comienzo de cada curva o en su punto y máximo (máximo alejado del eje x)? Intenté y puedo agregar leyenda como de costumbre, pero no etiquetas en cada curva o en su inicio. Gracias por tu ayuda.


Aquí hay una modificación de la mejor respuesta, usando segmentos de línea en lugar de etiquetas de texto directamente sobre las curvas. Esto es especialmente útil cuando hay muchas variables y solo desea imprimir aquellas que tienen valores de coeficientes absolutos mayores que cero:

#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


Como las etiquetas están codificadas, quizás sea más fácil escribir una función rápida. Esta es solo una captura rápida, por lo que se puede cambiar para que sea más completa. También me gustaría señalar que cuando se utiliza el lazo normalmente hay muchas variables, por lo que habrá una gran cantidad de superposición de las etiquetas (como se ve en el pequeño ejemplo)

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)


Una alternativa es la función plot_glmnet en el paquete plotmo . Posiciona automáticamente los nombres de las variables y tiene algunas otras campanas y silbidos. Por ejemplo, el siguiente código

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

da

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

Los nombres de las variables están distribuidos para evitar la sobreimpresión, pero aún podemos distinguir qué curva está asociada a cada variable. Se pueden encontrar ejemplos adicionales en el Capítulo 6 en plotres vignette que se incluye en el paquete plotmo .