【问题标题】:Adding labels on curves in glmnet plot in R在 R 中的 glmnet 图中的曲线上添加标签
【发布时间】:2015-08-14 03:45:22
【问题描述】:

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

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

如何为每条曲线添加变量名称,无论是在每条曲线的开头还是在其最大 y 点(最大远离 x 轴)?我试过了,我可以像往常一样添加图例,但不能在每条曲线上或其开始处添加标签。感谢您的帮助。

【问题讨论】:

标签: r plot glmnet


【解决方案1】:

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

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)

【讨论】:

【解决方案2】:

另一种选择是 plot_glmnet 函数中 plotmo 包裹。它会自动定位变量名 还有一些其他的花里胡哨。 比如下面的代码

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

给予

变量名分散开来防止过度绘图,但我们可以 仍然确定哪条曲线与哪个变量相关联。 更多示例可在第 6 章中找到 plotres vignette 其中包含在 plotmo 包。

【讨论】:

    【解决方案3】:

    这是对最佳答案的修改,使用线段而不是直接覆盖曲线的文本标签。当有很多变量并且您只想打印绝对系数值大于零的变量时,这尤其有用:

    #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
    

    【讨论】:

      猜你喜欢
      • 2015-08-14
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      相关资源
      最近更新 更多