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

8
我正在使用glmnet包从mtcars数据集中获取以下图表(mpg与其他变量的回归):
library(glmnet)
fit = glmnet(as.matrix(mtcars[-1]), mtcars[,1])
plot(fit, xvar='lambda')

如何在每条曲线的开头或最大y点(远离x轴的最大值)处添加变量名称?我尝试过添加图例,但无法在每个曲线的起点或其上添加标签。谢谢你的帮助。

由于标签是硬编码的,所以这很困难。请参见https://dev59.com/sYvda4cB1Zd3GeqPXEW6#30463022。 - user2957945
3个回答

9

另一种选择是plot_glmnet函数, 在plotmo包中。 它自动定位变量名,并带有其他附加功能。 例如,以下代码:

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

提供

绘图

为了防止重叠,变量名称被分散显示,但我们仍然可以看出哪个曲线与哪个变量相关。 更多例子可以在plotres小册子中的第6章找到, 该小册子包含在plotmo软件包中。


4

由于标签是硬编码的,因此编写一个快速函数可能更容易。这只是一个快速尝试,因此可以更改以使其更全面。我还要注意,当使用套索工具时,通常会有很多变量,因此标签会有很多重叠(如您的小例子中所示)。

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


这正是我所要求的。谢谢。 - rnso
请查看我关于在此图中添加图例的后续问题:https://dev59.com/eYvda4cB1Zd3GeqPZnna - rnso

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接