在R中的glmnet图中的曲线上添加标签

时间:2015-05-31 17:54:48

标签: r plot glmnet

我正在使用glmnet包从mtcars数据集中获取以下图表(其他变量的mpg回归):

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

enter image description here

如何在每条曲线的开头或最大y点(最远离x轴)的每条曲线上添加变量名称?我尝试过,我可以像往常一样添加图例但不是每条曲线或开头的标签。谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

由于标签是硬编码的,因此编写快速功能可能更容易。这只是一个快速镜头,因此可以更改为更彻底。我还要注意,使用套索时通常会有很多变量,所以标签会有很多重叠(如你的小例子所示)

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

答案 1 :(得分:3)

另一种选择是 plot_glmnet的功能 plotmo 包。它会自动定位变量名称 并有一些其他的花里胡哨。 例如,以下代码

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

给出

plot

变量名称被分散以防止过度绘图,但我们可以 仍然可以确定哪条曲线与哪个变量相关联。 进一步的例子可以在第6章中找到 plotres vignette 包括在内 plotmo 封装

答案 2 :(得分:0)

以下是对最佳答案的修改,使用线段而不是直接覆盖曲线的文本标签。当有很多变量而你只想打印那些绝对系数值大于零的那些时,这个特别有用:

#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