R:如何添加 L1 范数线以从 glmnet 绘图

R: how to add L1 norm line to plot from glmnet

我正在进行套索回归,我想通过使用留一交叉验证来选择一些最能解释我的模型的 beta 系数。 这是我的代码:

library(glmnet)
set.seed(19875)
n=100
p=500
real_p=15
x=matrix(rnorm(n*p), nrow=n, ncol=p)
y=as.matrix(apply(x[, 1:real_p], 1, sum) + rnorm(n))
lasso=glmnet(x,y,alpha = 1)
plot(lasso)
#computing loocv 
cvlassofit<-cv.glmnet(x,y, nfolds =n, grouped = FALSE )
plot(cvlassofit)

第一个图生成 beta 系数路径:

然后我想添加一条垂直线,选择均方误差小的最佳系数。情节应该是这样的:

在我执行 CV 的代码部分,我得到了具有最小 mse(均方误差) 的最佳 lambda。 这是情节:

现在,我能否以某种方式基于 lambda 获得 L1 范数的值,以便我可以在第一个图中添加一条垂直线?或者在最后一个情节中代替 log(lambda),我可以做一个 L1 norm 吗?

Now, can I somehow based on the lambda get a value for the L1 norm, so that I could add a vertical line to the first plot? Or instead of log(lambda) in the last plot, could I do a L1 norm?

您可以按照以下方式进行:

lambda_min <- cvlassofit$lambda.min
estimates <- as.vector(coef(lasso, s = lambda_min, exact = TRUE))
norm. <- sum(abs(estimates))
plot(lasso, xlim = range(0, norm., as.vector(lasso$beta)))
abline(v = norm., col = "red")

结果如下: