R:如何从glmnet添加L1范数线到情节

时间:2018-03-11 19:41:25

标签: r glmnet lasso

我正在进行套索回归,我想选择一些最能解释我的模型的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系数路径: enter image description here

然后我想添加一条垂直线,选择具有小均方误差的最佳系数。该情节应如下所示: enter image description here

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

enter image description here

现在,我可以以某种方式基于lambda获取L1范数的值,以便我可以在第一个绘图中添加一条垂直线吗?或者在最后一个图中不是 log(lambda),我可以做 L1规范吗?

1 个答案:

答案 0 :(得分:2)

  

现在,我可以以某种方式基于lambda获取L1范数的值,以便我可以在第一个绘图中添加一条垂直线吗?或者在最后一个图中不是 log(lambda),我可以做 L1范数吗?

您可以按照以下方式执行此操作

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")

这是结果

plot with line of CV L1 norm