接着上次的笔记,此次笔记的任务是利用lasso回归建立预测模型并绘制列线图。 【1】Lasso回归筛选变量与模型评估 【2】利用lasso筛选的变量进行logistic建模、绘制列线图并进行内外部评估 【3】Lasso回归参数建模、绘制列线图并进行内外部评估 【4】lasso回归中分类变量的处理 ##生成解释变量和结局变量的矩阵格式,glmnet数据格式是矩阵 mgaussian适用于连续型的多元因变量,poisson适用于计数因变量,binomial适用于二分类因变量, cox适用于生存资料;弹性网络alpha取值在0和1之间,0≤alpha≤1,取值1时拟合lasso回归,取值0时拟合领回归;nlambda为λ值的数量,默认等于100;dfmax和pmax可以分别限定模型中的变量的数量;relax=TRUE表示将进行Relaxed #结果会产生三列结果,分别是Df (非0系数的变量数量), #参数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可以完成交叉验证的主要功能,plot和predict也可以提供更多的支持。 结果中的min和1se对应的λ值指的是使模型偏差最小或者偏差+一个标准误时的λ值。这两个λ值也可以通过以下命令来获得: 交叉验证曲线中有两条虚线,一条对应的是偏差的模型,另外一条是偏差+一个标准误的模型。 #获取使模型偏差最小时λ值+一个标准误时的模型系数 "nonzero")。link给出的是线性预测值,即进行logit变化前的值,函数默认值;response给出的是概率预测值,即进行logit变换之后的值;clase给出0/1预测值;coefficients给出的是指定λ值的模型系数;nonzero给出指定的定λ值时系数不为0的模型变量 通过glmnet拟合了一系列模型(或者选定其中的一个后),我们还需要对模型进行评估,评估常常使用外部的验证集或者测试集,你也可以用内部数据来评估。同建立模型时一样,我们需要有一个预测矩阵,同时需要确定一个评估指标(如Deviance、Class、AUC、MSE、MAE等)来评估一系列λ值时的模型的性能表现。glmnet提供了多个函数使得这些评估变的更容易,如assess.glmnet、roc.glmnet和confusion.glmnet、deviance.glmnet等。 #下面几个函数有些需要响应变量为因子 rate)的向量,可用于绘制ROC曲线 #生成分类交叉表,可以得到预测正确的概率. loglike),其中loglike_sat是饱和模型的对数似然值,饱和模型是每个观测都有一个参数的模型;零偏差( Null model指的是截距模型(Cox回归中是0模型)。dev.ratio=1-deviance/nulldev。devicance函数返回的是(1-dev.ratio)*nulldev,即偏差。assess.glmnet返回的结果跟交叉验证曲线上的偏差值一致,但显然经过了一些变换,具体怎么转换的没找到,但这不影响对结果的判读。 【2】利用lasso筛选的变量进行logistic建模并绘制列线图 lasso将变量选择过程和参数估计过程分成两步来进行,第1步先利用lasso回归获得重要的变量,第2步再对这些变量进行参数估计。第2步中的参数估计并非OLS,而是引进了一个新的调整参数γ,0≤γ≤1,gamma=1时就是传统的lasso回归(glmnet默认relax=FALSE);gamma=0则是无惩罚拟合,相当于进行多重回归拟合。利用lasso筛选的变量进行logistic建模就是gamma=0时的Relaxed 我们可以看到结果跟后面采用logistic回归的结果非常非常接近了,接下来进行系数提取建模就可以了(参见【3】)。在第【1】步中,我们通过lasso回归筛选到了8个解释变量:V1、V3、V4、V5、V6、V7、V8、V9,我们可以直接利用这8个解释变量进行logistic回归并绘制列线图。 结果显示C-index:0.996,采用同样变量进行的logistic回归的模型参数跟lasso回归的估计的变量参数是不同的,但与γ=0时的Relaxed 结果显示校准曲线与y=x的直线重合性比较不错,表明模型的校准度还不错。当然你可能还是想从统计学上来看一下,可以通过以下命令: 统计学的结果显示校准度一般。 基本思路是提取lasso的回归系数,然后替代logistic回归模型的参数。 #提取使模型偏差最小时的λ取值对应的lasso的参数(cv.glmnet函数),并将其转化成数值。也可提取glmnet函数的结果参数,命令如下: #用lasso的估计系数替换掉lrm的估计系数 #用lasso的估计系数替换掉glm的估计系数 用替换系数的glm、lrm做预测: 我们并不会总是有这样的好运气,刚好解释变量全部像示例那样是连续变量。在进行logistic和Cox的lasso回归时,真是世界中的解释变量很多都是分类变量。二分类变量赋值0/1可以直接按连续变量纳入;但多分类变量尤其是无序多分类变量,按连续变量纳入是不合适的。遗憾的是,lasso回归的经典函数glmnet目前只能处理连续变量。 可行的解决的办法是将多分类变量进行哑变量编码(Dummy Encoding),按哑变量进行处理,哑变量遵循同进同出原则进入模型。也可以考虑进行独热编码(One-Hot Encoding)。与哑变量不同的是,独热编码将多分类变量的每个水平都编译成0/1,而哑变量编码中的参照水平编译成0/0,其他水平编译成0/1。我们在《Lasso回归概述与JMP示例》提到JMP的lasso回归可以直接分析分类变量(因子),但需要注意的是JMP对因子的编码采用的是效应编码(Effect Encoding),这种编码也会把K个水平的分类变量编码成K-1个变量,但参照水平会被编码成-1,JMP也默认高水平为参照水平,效应编码的好处是对因子变量而言,截距不再像SPSS那样是因子变量参照水平的值,而是所有水平的均值,因子的系数表示的是该水平与平均水平的差异,不过这不会影响到模型的效应检验。理解这种因子变量的编码差异,有助于对参数做出正确的解读,笔者曾在、等文中对这种效应编码和哑变量编码的结果做出过比较。 我们在此仅以哑变量编码为例演示一下在lasso回归对多分类变量的处理。这方面教材较少,也请大家批评建议。 结果包括不同λ值时的用来评估模型的Deviance、Class、AUC、MSE、MAE等性能指标,此处省略。。。结论是在全部变量都纳入的模型中(哑变量同进同出,相当于10个变量的模型),当λ=0.000272时,模型最佳。 #用lasso的估计系数替换掉lrm的估计系数 |