【问题标题】:Plotting cv.glmnet in R在 R 中绘制 cv.glmnet
【发布时间】:2016-08-07 23:50:43
【问题描述】:

使用 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 regression glmnet


【解决方案1】:

你可以这样做,值存储在$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()

在 base R 中,可能是这样的,我认为缺点是你不能很好地看到标签:

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() 图表? IE。除了保持 y axis 作为日志 lambda 而不是将其转换为 lambda 之外,执行您所做的操作。
  • 在 ggplot 解决方案中,您删除不添加 +scale_x_log10() ?这会将 lambda 值保留在日志中吗?还是您的意思是在 0.01、0.1、1 等中有刻度标签
  • 由于某种原因,删除 +scale_x_log10() 不起作用。但是将log() 添加到lambdas = cvfit$lmabda 可以。
猜你喜欢
  • 2014-03-09
  • 2015-06-01
  • 2014-12-27
  • 2017-06-27
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2014-04-11
相关资源
最近更新 更多