在R中绘制cv.glmnet

在R中绘制cv.glmnet,r,regression,glmnet,R,Regression,Glmnet,使用R,我试图修改一个标准图,这是我使用cv.glmnet执行岭回归得到的 我执行岭回归 lam = 10 ^ seq (-2,3, length =100) cvfit = cv.glmnet(xTrain, yTrain, alpha = 0, lambda = lam) 通过执行以下操作,我可以根据log lambda绘制系数 plot(cvfit $glmnet.fit, "lambda") 如何根据实际lambda值(不是log lambda)绘制系数

使用R,我试图修改一个标准图,这是我使用cv.glmnet执行岭回归得到的

我执行岭回归

lam = 10 ^ seq (-2,3, length =100)    
cvfit = cv.glmnet(xTrain, yTrain, alpha = 0, lambda = lam)
通过执行以下操作,我可以根据log lambda绘制系数

plot(cvfit $glmnet.fit, "lambda")


如何根据实际lambda值(不是log lambda)绘制系数并在绘图上标记每个预测值?

您可以这样做,这些值存储在
$beta
$lambda
下的
glmnet.fit
下:

library(glmnet)

xTrain = as.matrix(mtcars[,-1])
yTrain = mtcars[,1]

lam = 10 ^ seq (-2,3, length =30)    
cvfit = cv.glmnet(xTrain, yTrain, alpha = 0, lambda = lam)

betas = as.matrix(cvfit$glmnet.fit$beta)
lambdas = cvfit$lambda
names(lambdas) = colnames(betas)
使用ggplot解决方案,我们尝试将其旋转较长,并使用log10 x比例和ggrepel进行绘图,以添加标签:

library(ggplot2)
library(tidyr)
library(dplyr)
library(ggrepel)

as.data.frame(betas) %>% 
tibble::rownames_to_column("variable") %>% 
pivot_longer(-variable) %>% 
mutate(lambda=lambdas[name]) %>% 
ggplot(aes(x=lambda,y=value,col=variable)) + 
geom_line() + 
geom_label_repel(data=~subset(.x,lambda==min(lambda)),
aes(label=variable),nudge_x=-0.5) +
scale_x_log10()

在BaseR中,可能类似于这样,我认为缺点是您无法很好地看到标签:

pal = RColorBrewer::brewer.pal(nrow(betas),"Set3")
plot(NULL,xlim=range(log10(lambdas))+c(-0.3,0.3),
ylim=range(betas),xlab="lambda",ylab="coef",xaxt="n")
for(i in 1:nrow(betas)){
    lines(log10(lambdas),betas[i,],col=pal[i])
}

axis(side=1,at=(-2):2,10^((-2):2))
text(x=log10(min(lambdas)) - 0.1,y = betas[,ncol(betas)],
labels=rownames(betas),cex=0.5)

legend("topright",fill=pal,rownames(betas))

应该有帮助如何将
plot()
图形转换为
ggplot()
图形?也就是说,除了将y轴保持为对数λ而不是将其转换为λ之外,执行您所做的操作。在ggplot解决方案中,您删除了,但不添加
+scale_x_log10()
?这会将lambda值保留在日志中吗?或者你的意思是在0.01、0.1、1等中使用刻度标签。移动
+scale\u x_log10()
由于某种原因不起作用。但是将
log()
添加到
lambdas=cvfit$lmabda
中会起作用。