如何将套索和岭回归拟合(Glmnet)叠加到数据上?
Posted
技术标签:
【中文标题】如何将套索和岭回归拟合(Glmnet)叠加到数据上?【英文标题】:How do I superimpose lasso and ridge regression fits (Glmnet) onto data? 【发布时间】:2019-09-19 12:32:57 【问题描述】:我有数据(如下),并进行了线性回归、岭回归和套索回归。对于套索和岭回归,我使用交叉验证找到了最佳 lambda。我现在想将拟合模型叠加到原始数据的 y vs x 图上。我在图表上有线性模型,我只是不知道如何让其他两个出现。我已经在 ggplot 中尝试过,但是在基础 R 中的答案也会非常有帮助!即使你能指出我正确的方向,那也很棒。
我的模型都工作正常。我在图上有线性回归线。但是,当我尝试以相同的方式绘制其他两个拟合时,它将不起作用。
创建数据的代码
set.seed(1)
x <- rnorm(100)
y <- 1 + .2*x+3*x^2+.6*x^3 + rnorm(100)
d <- data.frame(x=x,y=y)
d$x2 <- d$x^2
d$x3 <- d$x^3
d$x4 <-d$x^4
d$x5 <-d$x^5
线性回归
f <- lm(y ~ ., data=d)
岭回归
library(glmnet)
x <- model.matrix(y ~ ., data=d)
y <- d$y
grid <- 0.001:50
ridge.fit <- glmnet(x,y,alpha=0, lambda = grid)
cv <- cv.glmnet(x,y)
r.fit.new <- glmnet(x,y,alpha=0, lambda = cv$lambda.min)
套索
lasso.fit <- glmnet(x,y,alpha=1, lambda = grid)
l.fit.new <- glmnet(x,y,alpha=1, lambda = cv$lambda.min)
图表
ggplot(data=d, aes(x=x, y=y)) + geom_point() + geom_line(aes(y=fitted(f)), colour="blue")
【问题讨论】:
你需要tidy
它。看看这个:varianceexplained.org/broom-gallery/snippets/broom-glmnet.html
只需重新阅读您的问题并意识到您想要超级强加每个配合,而不仅仅是查看脊和套索配合的诊断。添加了我的答案
【参考方案1】:
稍微更改了创建数据的代码
set.seed(1)
x <- rnorm(100)
y <- 1 + .2*x+3*x^2+.6*x^3 + rnorm(100)
d <- data.frame(x.values=x,y=y)
d$x2 <- d$x.values^2
d$x3 <- d$x.values^3
d$x4 <-d$x.values^4
d$x5 <-d$x.values^5
用于创建模型矩阵的其余代码 并按原样做模型。
为了绘图而格式化数据
library(dplyr)
data.for.plot <- d%>%
select(x.values,y) %>%
mutate(fitted_lm = as.numeric(fitted(f)),
fitted_ridge_lm = as.numeric(predict(r.fit.new, newx= x)),
fitted_lasso_lm = as.numeric(predict(l.fit.new, newx= x)))
#Plot
ggplot(data.for.plot, aes(x = x.values, y = y)) +
geom_point() +
geom_line(aes(y=fitted_lm), colour="blue") +
geom_line(aes(y=fitted_ridge_lm), colour="red") +
geom_line(aes(y= fitted_lasso_lm),color="grey75") + theme_bw()
现在您会注意到很难看到拟合,因为它们彼此非常接近(模型非常同意)。 所以让我们稍微格式化一下数据,并在 ggplot 中使用 faceting 来单独查看拟合
library(tidyr)
data.for.plot.long <- gather(data.for.plot, key= fit_type, value = fits, -x.values,-y)
ggplot(data.for.plot.long, aes(y = y, x = x.values)) +
geom_point() +
geom_line(aes(y = fits,colour=fit_type))+facet_wrap(~fit_type, ncol = 1,scales = "free") + theme_bw()
结果图:
【讨论】:
以上是关于如何将套索和岭回归拟合(Glmnet)叠加到数据上?的主要内容,如果未能解决你的问题,请参考以下文章
线性回归——lasso回归和岭回归(ridge regression)
r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现
R语言glmnet拟合lasso回归模型实战:lasso回归模型的模型系数及可视化lasso回归模型分类评估计算(混淆矩阵accuracyDeviance)