预测模型构建利器——基于logistic的列线图(R语言)

王小王-123 发表于 2022/05/02 00:50:06 2022/05/02
【摘要】 目录 模型知识准备 什么是列线图? 如何看懂列线图? 什么是校准曲线? 模型搭建 哑变量的设置 列线图的绘制 校准曲线的绘制 每文一语 模型知识准备 什么是列线图? 列线图(Alignment Diagram),又称诺莫图(Nomogram图),它是建立在多因素回归分析的基础上,将多个预测指标进行整合,然后...

目录

模型知识准备

什么是列线图?

如何看懂列线图?

什么是校准曲线?

模型搭建

哑变量的设置

列线图的绘制

校准曲线的绘制

每文一语


模型知识准备

什么是列线图?

列线图(Alignment Diagram),又称诺莫图(Nomogram图),它是建立在多因素回归分析的基础上,将多个预测指标进行整合,然后采用带有刻度的线段,按照一定的比例绘制在同一平面上,从而用以表达预测模型中各个变量之间的相互关系

列线图的基本原理,简单的说,就是通过构建多因素回归模型(常用的回归模型,例如Cox回归、Logistic回归等),根据模型中各个影响因素对结局变量的贡献程度(回归系数的大小),给每个影响因素的每个取值水平进行赋分,然后再将各个评分相加得到总评分,最后通过总评分与结局事件发生概率之间的函数转换关系,从而计算出该个体结局事件的预测值。

列线图将复杂的回归方程,转变为了可视化的图形,使预测模型的结果更具有可读性,方便对患者进行评估。正是由于列线图这种直观便于理解的特点,使它在医学研究和临床实践中也逐渐得到了越来越多的关注和应用。

如何看懂列线图?

我们可以看到列线图主要由左边的名称以及右边对应的带有刻度的线段所组成。

列线图的名称主要包括三类:

1. 预测模型中的变量名称:例如图中的年龄(Age)、ftv(孕前检查次数),ht(是否高血压),smoke(是否抽烟)等信息,每一个变量对应的线段上都标注了刻度,代表了该变量的可取值范围,而线段的长度则反映了该因素对结局事件的贡献大小。

2. 得分,包括单项得分,即图中的Point(第一行),表示每个变量在不同取值下所对应的单项分数,以及总得分,即Total Point(最后一行),表示所有变量取值后对应的单项分数加起来合计的总得分。

3. 预测概率:例如图中的Low weight rate,表示出生低体重儿的概率。

实例分析:如果产妇35岁,根据列线图,得分10分;无高血压,得分0分;抽烟,得分37分;再加上其他分数,如果总分100分,那么对应的生产低体重儿的概率就约为0.12,那么你就可以拿着这个图表给患者看,告诉她产出低体重儿的概率比较低。这样就到预测的效果了,懂了吗,那么最后就是如何搭建模型,最后达到这些效果。

什么是校准曲线?

校准曲线的解释:事实上,校准曲线是实际发生概率与预测概率的散点图。校准曲线可视化了霍斯默-勒梅休(Hosmer-Lemeshow)拟合优度检验的结果,所以除了校准曲线之外,我们还应该检查霍斯默-勒梅休拟合优度检验的结果。预测率和实际发生率越接近Y = X,Hosmer-Lemeshow拟合优度检验的p值大于0.05,模型校准得越好。在这种情况下,校准曲线几乎Y = X线,表示模型校准良好。

模型搭建

此次模型是基于R语言的多功能程序包,进行logistic回归预测,绘制列线图,绘制校准曲线,包括C指数等计算

为了更好的搭建我们的模型,我们首先对数据进行预处理,对数据进行了清洗和规整化,使得我们的每一个指标都是数值类型


  
  1. #查看当前工作路径
  2. getwd()
  3. #设置当前工作路径
  4. setwd("E:/个人文件/学术科研/身体约束预测模型")
  5. getwd()
  6. #导入第三方程序包
  7. library(rms)
  8. library(readr)
  9. #导入数据
  10. mydata=read.csv("数据.csv",encoding = 'UTF-8')

哑变量的设置

1、如果是二分类变量不用设为哑变量

2、如果是三分类以上有序变量尽量不设哑变量,这样可以节省自由度,准确度会更高一些

3、非有序变量的三分类以上的变量必须设为哑变量,否则会影响结果

将哑变量引入回归模型,虽然使模型变得较为复杂,但可以更直观地反映出该自变量的不同属性对于因变量的影响,提高了模型的精度和准确度。但是我们也需要根据我们的实际的场景来对我们的数据进行处理。

如果要处理,我们就可以利用下面的代码进行处理,为什么此处不需要,就是因为元数据已经是一个有序的数值变量,而且没有规律的,不会很大的影响我们的模型,反而设置之后会影响。

处理分类变量


  
  1. #此处用于哑变量的设置,此数据已经设置好了
  2. mydata$leibie=as.factor(mydata$leibie)
  3. mydata$n0=as.factor(mydata$n0)
  4. mydata$shuxing=as.factor(mydata$shuxing)
  5. mydata$age=as.factor(mydata$age)
  6. mydata$time=as.factor(mydata$time)
  7. mydata$n4=as.factor(mydata$n4)
  8. mydata$n5=as.factor(mydata$n5)
  9. mydata$n8=as.factor(mydata$n8)
  10. mydata$n9=as.factor(mydata$n9)
  11. mydata$n10new=as.factor(mydata$n10new)
  12. mydata$MOBILITY=as.factor(mydata$MOBILITY)
  13. mydata$n13=as.factor(mydata$n13)
  14. mydata$n14=as.factor(mydata$n14)
  15. mydata$n15=as.factor(mydata$n15)
  16. mydata$n16=as.factor(mydata$n16)
  17. mydata$n18=as.factor(mydata$n18)
  18. mydata$n32=as.factor(mydata$n32)
  19. mydata$n40new=as.factor(mydata$n40new)

  
  1. #查看
  2. mydata
  3. #查看数据集(展示数据集里面的各个自变量的信息)
  4. mydata=as.data.frame(mydata)
  5. summary(mydata)
  6. #打包数据
  7. dd=datadist(mydata)
  8. options(datadist='dd')

模型搭建


  
  1. fit=lrm(n23~age+time+n4+n5+n7+n8+n9+n10new+n13+n14+n15+n16+n18
  2. +n19f1+n20+n21+n22+n32+n39new+n40new,data = mydata,x=T,y=T)

  
  1. Logistic Regression Model
  2. lrm(formula = n23 ~ age + time + n4 + n5 + n7 + n8 + n9 + n10new +
  3. n13 + n14 + n15 + n16 + n18 + n19f1 + n20 + n21 + n22 + n32 +
  4. n39new + n40new, data = mydata, x = T, y = T)
  5. Model Likelihood Discrimination Rank Discrim.
  6. Ratio Test Indexes Indexes
  7. Obs 1026 LR chi2 800.88 R2 0.796 C 0.974
  8. 1 761 d.f. 20 g 4.249 Dxy 0.948
  9. 2 265 Pr(> chi2) <0.0001 gr 70.027 gamma 0.948
  10. max |deriv| 2e-08 gp 0.363 tau-a 0.363
  11. Brier 0.054
  12. Coef S.E. Wald Z Pr(>|Z|)
  13. Intercept -7.7527 1.9490 -3.98 <0.0001
  14. age 0.3654 0.1917 1.91 0.0566
  15. time -0.4446 0.1658 -2.68 0.0073
  16. n4 0.2440 0.2370 1.03 0.3034
  17. n5 -0.9956 0.3846 -2.59 0.0096
  18. n7 0.2332 0.5105 0.46 0.6479
  19. n8 0.7252 0.1620 4.48 <0.0001
  20. n9 -0.6308 0.2890 -2.18 0.0291
  21. n10new 0.8700 0.2214 3.93 <0.0001
  22. n13 0.7915 0.3066 2.58 0.0098
  23. n14 -0.2616 0.3375 -0.77 0.4383
  24. n15 0.2198 0.2727 0.81 0.4203
  25. n16 0.0793 0.1116 0.71 0.4774
  26. n18 0.9823 0.2536 3.87 0.0001
  27. n19f1 -0.1460 0.4530 -0.32 0.7473
  28. n20 0.4265 0.3507 1.22 0.2240
  29. n21 -0.6420 0.4020 -1.60 0.1103
  30. n22 2.8574 0.3696 7.73 <0.0001
  31. n32 -1.2263 0.1500 -8.17 <0.0001
  32. n39new -1.0837 0.3095 -3.50 0.0005
  33. n40new 0.7555 0.3476 2.17 0.0298

数据格式:自变量~因变量,data=源数据,x=T,y=T

我们发现这个模型里面的自变量过多,我们可以通过查看相应的指标,看是否符合统计学意义,也就是我们用于判断模型变量的舍取


  
  1. fit=lrm(n23~age+time+n5+n8+n9+n10new+n13+n18
  2. +n19f1+n20+n21+n22+n32+n39new+n40new,data = mydata,x=T,y=T)

全部满足

 summary(fit)  查看


  
  1. > summary(fit)
  2. Effects Response : n23
  3. Factor Low High Diff. Effect S.E. Lower 0.95 Upper 0.95
  4. age 2 3 1 0.410530 0.18719 0.043632 0.777420
  5. Odds Ratio 2 3 1 1.507600 NA 1.044600 2.175900
  6. time 1 3 2 -0.876950 0.32704 -1.517900 -0.235960
  7. Odds Ratio 1 3 2 0.416050 NA 0.219160 0.789810
  8. n5 1 3 2 -2.078500 0.74955 -3.547600 -0.609450
  9. Odds Ratio 1 3 2 0.125110 NA 0.028793 0.543650
  10. n8 1 3 2 1.420900 0.30820 0.816850 2.025000
  11. Odds Ratio 1 3 2 4.140900 NA 2.263400 7.575800
  12. n9 1 4 3 -1.707400 0.84598 -3.365500 -0.049303
  13. Odds Ratio 1 4 3 0.181340 NA 0.034545 0.951890
  14. n10new 1 3 2 1.855200 0.42948 1.013400 2.696900
  15. Odds Ratio 1 3 2 6.392800 NA 2.755000 14.834000
  16. n13 1 3 2 1.296000 0.48649 0.342520 2.249500
  17. Odds Ratio 1 3 2 3.654700 NA 1.408500 9.483300
  18. n18 1 3 2 1.987700 0.49964 1.008400 2.967000
  19. Odds Ratio 1 3 2 7.298600 NA 2.741200 19.433000
  20. n19f1 1 2 1 -0.030359 0.44114 -0.894990 0.834270
  21. Odds Ratio 1 2 1 0.970100 NA 0.408610 2.303100
  22. n20 1 2 1 0.475350 0.34309 -0.197090 1.147800
  23. Odds Ratio 1 2 1 1.608600 NA 0.821120 3.151200
  24. n21 1 2 1 -0.537750 0.37185 -1.266600 0.191060
  25. Odds Ratio 1 2 1 0.584060 NA 0.281800 1.210500
  26. n22 1 2 1 2.751200 0.35705 2.051400 3.451100
  27. Odds Ratio 1 2 1 15.662000 NA 7.779000 31.534000
  28. n32 2 4 2 -2.455500 0.29487 -3.033400 -1.877500
  29. Odds Ratio 2 4 2 0.085824 NA 0.048153 0.152970
  30. n39new 1 2 1 -1.096700 0.30151 -1.687600 -0.505700
  31. Odds Ratio 1 2 1 0.333990 NA 0.184960 0.603090
  32. n40new 1 3 2 1.337900 0.65617 0.051788 2.623900
  33. Odds Ratio 1 3 2 3.810900 NA 1.053200 13.790000

列线图的绘制


  
  1. nom=nomogram(fit,fun = plogis,fun.at = c(.001,.01,.05,seq(.1,.9,by=.1),.95,.99,.999),lp=T,
  2. funlabel = "身体约束预测")
  3. plot(nom)

 到此我们的列线图就绘制好了,至于如何去看,上面的文章也做了详细的解释和介绍!

校准曲线的绘制


  
  1. cal=calibrate(fit,method = 'boot',B=1000)
  2. plot(cal,xlim = c(0,1.0),ylim = c(0,1.0),xlab = "Predicted Probability",ylab = "observed Probability")

 参考线:说明预测值和理论值百分百重合,这是不可能的,用于我们的参考

校准曲线反映我们的模型的预测的好坏

接下来我看看C指数:0.937

临床预测模型是临床研究的常用方法,通常我们构建出模型,需要对模型进行评估,其中一个重要指标是区分能力,也就是区分有病/无病、有效/无效、死亡/存活等结局的预测能力。区分能力一般用C统计量的大小来表示。

C:表示关联度
一般而言,C统计量的值>0.7,说明关联度较高,模型效果较好

 说明共线性比较的强,综合判断我们的基于logistic机器学习算法,对身体约束的变量筛选和预测的模型搭建还是比较的合理,模型效果也比较的好。

对于结局是二分类的回归模型,ROC曲线下面积的值与C指数是一样的,95%可信区间也是一样的

至此我们的logistic模型就完成了!

每文一语

最直接的=没有<-刻骨铭心!

文章来源: wxw-123.blog.csdn.net,作者:王小王-123,版权归原作者所有,如需转载,请联系作者。

原文链接:wxw-123.blog.csdn.net/article/details/124535121

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。