前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你使用R语言做LASSO 回归

手把手教你使用R语言做LASSO 回归

作者头像
全栈程序员站长
发布2022-06-27 11:31:01
3.3K1
发布2022-06-27 11:31:01
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

LASSO 回归也叫套索回归,是通过生成一个惩罚函数是回归模型中的变量系数进行压缩,达到防止过度拟合,解决严重共线性的问题,LASSO 回归最先由英国人Robert Tibshirani提出,目前在预测模型中应用非常广泛。在新格兰文献中,有大牛提出,对于变量过多而且变量数较少的模型拟合,首先要考虑使用LASSO 惩罚函数。今天我们来讲讲怎么使用R语言通过LASSO 回归构造预测模型。 首先我们要下载R的glmnet包,由 LASSO 回归的发明人,斯坦福统计学家 Trevor Hastie 领衔开发。 加载需要的包,导入数据(还是我们既往的SPSS乳腺癌数据),删除缺失值

代码语言:javascript
复制
library(glmnet)
library(foreign)
bc <- read.spss("E:/r/Breast cancer survival agec.sav",
                use.value.labels=F, to.data.frame=T)
bc <- na.omit(bc)

目前,glmnet包只能接受矩阵形式的数据,数据框的数据会报错,所以我们先要把数据转换成矩阵形式,这一步很重要。

代码语言:javascript
复制
y<-as.matrix(bc[,8])
x<-as.matrix(bc[,c(2:7,9:11)])

通过转换后,我们得到了两个数据矩阵,Y是结果,X是数据的变量 开始构建模型

代码语言:javascript
复制
f1 = glmnet(x, y, family="binomial", nlambda=100, alpha=1) #这里alpha=1为LASSO回归,如果等于0就是岭回归
#参数 family 规定了回归模型的类型:
family="gaussian" 适用于一维连续因变量(univariate)
family="mgaussian" 适用于多维连续因变量(multivariate)
family="poisson" 适用于非负次数因变量(count)
family="binomial" 适用于二元离散因变量(binary)
family="multinomial" 适用于多元离散因变量(category)
我们这里结局指标是2分类变量,所以使用binomial
print(f1)#把f1结果输出

可以看到随着lambdas增加,自由度和残差减少,最小lambda为0.000233 输出图形

代码语言:javascript
复制
plot(f1, xvar="lambda", label=TRUE)

横坐标为随着lambdas的对数,纵坐标为变量系数,可以看到随着lambdas增加变量系数不断减少,部分变量系数变为0(等于没有这个变量了)

下面进行交叉验证 我们可以把数据集取一部分进行验证(这步不做也可以)

代码语言:javascript
复制
predict(f1, newx=x[2:5,], type = "response")

然后通过glmnet自带函数进行交叉检验,并输出图形

代码语言:javascript
复制
cvfit=cv.glmnet(x,y)
plot(cvfit)

我们这个图中有两条虚线,一个是均方误差最小时的λ值,一个是距离均方误差最小时一个标准误的λ值,有点拗口没关系,我们只要知道它是多少就可以了

代码语言:javascript
复制
cvfit$lambda.min#求出最小值
cvfit$lambda.1se#求出最小值一个标准误的λ值

OK,我们得出这两个值后分别带进模型看一看

代码语言:javascript
复制
l.coef2<-coef(cvfit$glmnet.fit,s=0.004174369,exact = F)
l.coef1<-coef(cvfit$glmnet.fit,s=0.04272596,exact = F)
l.coef1
l.coef2

我们看到第一个模型变量都没有了,第二个模型还有5个变量,因此就只能选第2个了。 我们把这几个系数拿出来组成广义线性方程,时间变量time懒得拿了(做示范而已,拿也是可以的)

代码语言:javascript
复制
mod<-glm(status~age+pathsize+lnpos+pr,family="binomial",data = bc)
summary(mod)

有3个指标入选,我们还可以求出OR和95%CI

OK,做到这里,模型已经全部做出来啦,您学会了吗?

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133212.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年6月9,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档