在R中的glmnet绘图中的曲线上添加标签
我使用glmnet软件包从mtcars数据集中获取以下图表(mpg对其他变量的回归):在R中的glmnet绘图中的曲线上添加标签,r,plot,glmnet,R,Plot,Glmnet,我使用glmnet软件包从mtcars数据集中获取以下图表(mpg对其他变量的回归): 如何将变量名称添加到每条曲线,无论是在每条曲线的开始处还是在其最大y点(最大距离x轴)?我尝试过,我可以像往常一样添加图例,但不能在每条曲线上或其开始处添加标签。感谢您的帮助。由于标签是硬编码的,因此编写快速函数可能更容易。这只是一个快速拍摄,因此可以更改为更彻底。我还想指出,当使用套索时,通常会有很多变量,因此标签会有很多重叠(如您的小示例所示) lbs_fun另一种选择是 功能 包裹它会自动定位变量名
如何将变量名称添加到每条曲线,无论是在每条曲线的开始处还是在其最大y点(最大距离x轴)?我尝试过,我可以像往常一样添加图例,但不能在每条曲线上或其开始处添加标签。感谢您的帮助。由于标签是硬编码的,因此编写快速函数可能更容易。这只是一个快速拍摄,因此可以更改为更彻底。我还想指出,当使用套索时,通常会有很多变量,因此标签会有很多重叠(如您的小示例所示)
lbs_fun另一种选择是
功能
包裹它会自动定位变量名
还有一些其他的铃铛和口哨。
例如,下面的代码
library(glmnet)
mod <- glmnet(as.matrix(mtcars[-1]), mtcars[,1])
library(plotmo) # for plot_glmnet
plot_glmnet(mod)
库(glmnet)
mod这里是对最佳答案的修改,使用线段代替直接覆盖在曲线上的文本标签。当存在大量变量且您只想打印绝对系数值大于零的变量时,这一点尤其有用:
#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
#注意:参数'lra'是cv.glmnet对象
因为标签是硬编码的,所以这很难。看,这正是我要的。谢谢。请参阅我关于将图例添加到此绘图的后续问题:
library(glmnet)
mod <- glmnet(as.matrix(mtcars[-1]), mtcars[,1])
library(plotmo) # for plot_glmnet
plot_glmnet(mod)
#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