告知下成‎都有哪些可靠的成‎都咨询?

接着上次的笔记,此次笔记的任务是利用lasso回归建立预测模型并绘制列线图。

在目前发表的论文中,lasso回归大都只是作为一种变量的筛选方法。首先通过lasso回归获得系数不为0的解释变量,再利用这些筛选到的变量进行多重回归建立预测模型,实际上这是relaxed lasso的一种特殊情况(γ=0)。这种做法用于预测问题不大,但一般不用于因果推断。我们也可以直接利用lasso回归的参数来建模预测,但这样做的人并不多,教程也比较少,但笔者觉得这种方法也是一种不错的选择。
在开始本次笔记的查阅之旅前,建议先看一下一文中关于Lasso回归的一些基础介绍。

1Lasso回归筛选变量与模型评估

2】利用lasso筛选的变量进行logistic建模、绘制列线图并进行内外部评估

3Lasso回归参数建模、绘制列线图并进行内外部评估

4lasso回归中分类变量的处理

Hospitals的乳腺癌数据库,数据库含有截至到1992715日的699名乳腺肿瘤患者的活检检查结果,另外保存了患者的9个特征,每个属性都有110分的评分。
0】数据准备,切分数据集
##7:3将数据集分割为训练集和测试集合

##生成解释变量和结局变量的矩阵格式,glmnet数据格式是矩阵

【1】Lasso回归筛选变量与模型评估

mgaussian适用于连续型的多元因变量,poisson适用于计数因变量,binomial适用于二分类因变量, cox适用于生存资料;弹性网络alpha取值在01之间,0alpha1,取值1时拟合lasso回归,取值0时拟合领回归;nlambdaλ值的数量,默认等于100dfmaxpmax可以分别限定模型中的变量的数量;relax=TRUE表示将进行Relaxed

#结果会产生三列结果,分别是Df (0系数的变量数量),

随着λ值的减少,纳入的变量越来越多,模型能够解释的偏差也越来越大。模型构建第77步就结束了,意味着可解释的偏差不再随着λ值的减少而增加了。模型自由度为4时(截距+4个变量),模型可解释的偏差百分比在41.48%~53.14%λ值在0.10之间。

#参数s指定具体的λ值。上述命令是提取λ=0.2时的lasso回归系数,此时模型会有4个非0系数变量。精确系数估算可用coef.exact<-coef(lsofit,

#predict也可以用来提取λ某一个取值时的lasso回归系数

结果表明当λ=0.2时,V1、V2、V3和V6这4个变量系数不为0。

"dev")用于指定X轴的变量,norm表示横坐标使用系数的L1范数,lambda表示横坐标使用lnλ,而 "dev"表示横坐标采用解释偏差的百分比

图中每一条曲线代表了相应的一个自变量系数的变化轨迹,纵坐标是系数的值,横坐标可以是L1范数、lnλ或者解释偏差的百分比,有些变量在λ值很大时依旧有非零的系数,然后随着λ值变小不断变大,这些都是容易保留在模型中的变量。

虽然函数glmnet可以获得一系列的结果,但在很多情况下,我们可能更喜欢选择其中一个。交叉验证可能是完成这个工作的最简单和最广泛使用的方法。cv.glmnet可以完成交叉验证的主要功能,plotpredict也可以提供更多的支持。

set.seed() #设置随机种子,保证K折验证的可重复性

结果中的min1se对应的λ值指的是使模型偏差最小或者偏差+一个标准误时的λ值。这两个λ值也可以通过以下命令来获得:

交叉验证曲线中有两条虚线,一条对应的是偏差的模型,另外一条是偏差+一个标准误的模型。

在确定模型的λ值后,可以回代入glmnet函数建模,系数的估计一般采用函数coef.apprx或者predict,前面已经示例过了。系数的估计也可以在cv.glmnet交叉验证后直接通过函数coefpredict来完成。

#获取使模型偏差最小时λ+一个标准误时的模型系数

"nonzero")link给出的是线性预测值,即进行logit变化前的值,函数默认值;response给出的是概率预测值,即进行logit变换之后的值clase给出0/1预测值;coefficients给出的是指定λ值的模型系数nonzero给出指定的λ值时系数不为0的模型变量

通过glmnet拟合了一系列模型(或者选定其中的一个后),我们还需要对模型进行评估,评估常常使用外部的验证集或者测试集,你也可以用内部数据来评估。同建立模型时一样,我们需要有一个预测矩阵,同时需要确定一个评估指标(如DevianceClassAUCMSEMAE等)来评估一系列λ值时的模型的性能表现glmnet提供了多个函数使得这些评估变的更容易,如assess.glmnetroc.glmnetconfusion.glmnetdeviance.glmnet等。

因为lasso归一般会有很多个λ值(默认100个,当然可能提前收敛而小于100个),这些函数会评估每一个λ值对应的模型指标,结果就会非常多,这里只罗列命令及命令释义:

#下面几个函数有些需要响应变量为因子

rate)的向量,可用于绘制ROC曲线

#生成分类交叉表,可以得到预测正确的概率.

loglike)其中loglike_sat是饱和模型的对数似然值,饱和模型是每个观测都有一个参数的模型;零偏差( Null model指的是截距模型(Cox回归中是0模型)。dev.ratio=1-deviance/nulldevdevicance函数返回的是(1-dev.ratio)*nulldev,即偏差assess.glmnet返回的结果跟交叉验证曲线上的偏差值一致,但显然经过了一些变换,具体怎么转换的没找到,但这不影响对结果的判读。

2】利用lasso筛选的变量进行logistic建模并绘制列线图

lasso将变量选择过程和参数估计过程分成两步来进行,第1步先利用lasso回归获得重要的变量,第2步再对这些变量进行参数估计。第2步中的参数估计并非OLS,而是引进了一个新的调整参数γ,0≤γ≤1gamma=1时就是传统的lasso回归(glmnet默认relax=FALSE);gamma=0则是无惩罚拟合,相当于进行多重回归拟合。利用lasso筛选的变量进行logistic建模就是gamma=0时的Relaxed

我们可以看到结果跟后面采用logistic回归的结果非常非常接近了,接下来进行系数提取建模就可以了(参见【3】)。在第【1】步中,我们通过lasso回归筛选到了8个解释变量:V1V3V4V5V6V7V8V9,我们可以直接利用这8个解释变量进行logistic回归并绘制列线图。

结果显示C-index0.996,采用同样变量进行的logistic回归的模型参数跟lasso回归的估计的变量参数是不同的,但与γ=0时的Relaxed

接下来我们可以对模型进行一下评估,评估包括内部验证和外部验证,主要指标是区分度(Discrimination)和校准度(Calibration)验证。区分度常用C-indexAUC),校正度常用校准曲线或者Hosmer

结果显示校准曲线与y=x的直线重合性比较不错,表明模型的校准度还不错。当然你可能还是想从统计学上来看一下,可以通过以下命令:

统计学的结果显示校准度一般。

一个优秀的模型不仅应该对建模的内部数据表现良好,也应该对外的的测试集数据有着不错的预测能力。文章一开始已经生成了验证集数据:testingset<-biopsy[-n,],以下命令可以分别获得验证数据的校准度统计学校验、校准度曲线及C-index
3Lasso回归参数建模并绘制列线图

基本思路是提取lasso的回归系数,然后替代logistic回归模型的参数。

#提取使模型偏差最小时的λ取值对应的lasso的参数(cv.glmnet函数),并将其转化成数值。也可提取glmnet函数的结果参数,命令如下:

#lasso的估计系数替换掉lrm的估计系数

#lasso的估计系数替换掉glm的估计系数

logistic回归与lasso回归外部验证的AUC比较(本例差别不大)
还有件事情需要啰嗦一下,函数glmlrm的估计参数用lasso回归的估计参数替换掉后,对测试集用新的glmlrm做预测或直接采用lasso回归后的predict的预测结果是一致的。

用替换系数的glmlrm做预测:

4】分类自变量的处理

我们并不会总是有这样的好运气,刚好解释变量全部像示例那样是连续变量。在进行logisticCoxlasso回归时,真是世界中的解释变量很多都是分类变量。二分类变量赋值0/1可以直接按连续变量纳入;但多分类变量尤其是无序多分类变量,按连续变量纳入是不合适的。遗憾的是,lasso回归的经典函数glmnet目前只能处理连续变量。

可行的解决的办法是将多分类变量进行哑变量编码(Dummy Encoding,按哑变量进行处理,哑变量遵循同进同出原则进入模型。也可以考虑进行独热编码(One-Hot Encoding。与哑变量不同的是,独热编码将多分类变量的每个水平都编译成0/1,而哑变量编码中的参照水平编译成0/0,其他水平编译成0/1。我们在《Lasso回归概述与JMP示例》提到JMPlasso回归可以直接分析分类变量(因子),但需要注意的是JMP对因子的编码采用的是效应编码(Effect Encoding,这种编码也会把K个水平的分类变量编码成K-1个变量,但参照水平会被编码成-1JMP也默认高水平为参照水平,效应编码的好处是对因子变量而言,截距不再像SPSS那样是因子变量参照水平的值,而是所有水平的均值,因子的系数表示的是该水平与平均水平的差异,不过这不会影响到模型的效应检验。理解这种因子变量的编码差异,有助于对参数做出正确的解读,笔者曾在等文中对这种效应编码和哑变量编码的结果做出过比较。

Data),数据集介绍参见。原数据集存在大量的缺失数据,是VIM包中用于缺失值分析的的一个数据集。考虑到演示的目的,并未对缺失值进行填补由于原数据集解释变量全部为连续变量,笔者界值25303540BMI转换成因子变量BMIc:正常(0)、超重(1)、一级肥胖(2)、二级肥胖(3)、三级肥胖(4)
##导入数据,并进行缺失值删除
##构建响应变量和解释变量矩阵

我们在此仅以哑变量编码为例演示一下在lasso回归对多分类变量的处理。这方面教材较少,也请大家批评建议。

接下来的事情就会很简单,既可以利用这些系数不为0的变量进行logistic建模,只是需要特别注意哑变量应遵循同进同出原则,或者提取lasso回归的系数进行建模。前面已经花了非常多的笔墨来解释这个两个过程,下面只展示一下命令清单和结果。

结果包括不同λ值时的用来评估模型的Deviance、Class、AUC、MSE、MAE等性能指标,此处省略。。。结论是在全部变量都纳入的模型中(哑变量同进同出,相当于10个变量的模型),当λ=0.000272时,模型最佳。

#用lasso的估计系数替换掉lrm的估计系数

因为哑变量的存在,列线图中的BMI对应着4变量,需要注意的是在进行评分预测时,每一个患者只能用其中的一个BMI

我要回帖

更多关于 专家咨询法 的文章

 

随机推荐