vlambda博客
学习文章列表

R语言系列3:基于Logistic回归的临床诊断预测模型构建


上一篇文章,我们讲到,以及操作。今天主要围绕基于logistic回归的诊断模型进行讲解及示范操作









1. 诊断模型应用场景



临床诊断模型主要应用于结局变量为二分类变量时

在肿瘤领域与非肿瘤领域均应用广泛

主要回答以下问题

1.是否发病  是/否

2.肿瘤是否复发 是/否

3.冠脉支架植入后是否发生再狭窄 

4.糖尿病患者是否发生远期糖尿病足相关截肢

5.腹膜透析患者是否发生透析相关腹膜感染

6.腹腔引流管植入后是否发生脱管或穿刺口感染

等一系列临床实际问题,均可考虑构建预测模型。。。









2. glm函数应用



R语言中可用glm()函数进行logistic回归分析。

glm()函数是stats包中用于广义线性回归的一个函数,其一般形式为:


glm(formula, family = gaussian, ...)


glm()函数的参数很多,主要用到 formula 和 family。


family可以设定分布函数族,在本例中若设定为binomial,glm会运行logistic回归。


当family设定为binomial时,若l连接函数link设定为logit,则glm运行logistic回归

若设定为probit,glm则运行probit回归。


具体设定格式为:family=binomial(link=logit)


formula用于设定回归模型,其一般形式为formula=y~x,其中y为响应变量,x为解释变量。

有关模型构建之前,变量筛选,这里不再重复。可以使用SPSS或者易侕软件,筛选预测变量,即独立预测因子

推荐使用易侕软件,操作省时省力,

计划近期推出:易侕软件进行logistic回归 和 COX回归,软件操作


setwd("E:\\R work") dev<-read.csv("data.csv")  library(rms) library(foreign)
#构建三个回归模型 A B C(纳入不同变量)modelA <- glm(MN ~NLR, data = dev, family = binomial(link="logit"))summary(modelA)cbind(coef= coef(modelA),confint(modelA))exp(cbind(OR= coef(modelA),confint(modelA)))

modelB <- glm(MN ~age + eGFR + DM, data = dev, family = binomial(link="logit"))summary(modelB)cbind(coef= coef(modelB),confint(modelB))exp(cbind(OR= coef(modelB),confint(modelB)))

modelC <- glm(MN ~age + eGFR + DM + NLR, data = dev, family = binomial(link="logit"))summary(modelC)cbind(coef= coef(modelC),confint(modelC))exp(cbind(OR= coef(modelC),confint(modelC)))








3. ROC曲线绘制



#计算预测值dev$predmodelA<- predict(newdata=dev,modelA,"response")dev$predmodelB<- predict(newdata=dev,modelB,"response")dev$predmodelC<- predict(newdata=dev,modelC,"response")

#绘制ROC曲线,先安装 pROC 包 install.packages("pROC")library(pROC)

#分别绘制三条ROC曲线并给出阈值和ROC曲线下面积。gmodelA <- roc(MN~predmodelA, data = dev,smooth=F)plot(gmodelA, print.auc=TRUE, print.thres=TRUE,main = "ROC CURVE", col= "blue",print.thres.col="blue",identity.col="blue", identity.lty=1,identity.lwd=1)

gmodelB <- roc(MN~predmodelB, data = dev,smooth=F)plot(gmodelB, print.auc=TRUE, print.thres=TRUE,main = "ROC CURVE", col= "blue",print.thres.col="blue",identity.col="blue", identity.lty=1,identity.lwd=1)

gmodelC <- roc(MN~predmodelC, data = dev,smooth=F)plot(gmodelC, print.auc=TRUE, print.thres=TRUE,main = "ROC CURVE", col= "blue",print.thres.col="blue",identity.col="blue", identity.lty=1,identity.lwd=1)


依次为A B C 模型ROC曲线(可以继续美化)

同时显示AUC, 最佳截断值。



R语言系列3:基于Logistic回归的临床诊断预测模型构建

R语言系列3:基于Logistic回归的临床诊断预测模型构建










4. 将多条ROC曲线绘制在一起




#将三条ROC曲线放在一个图形中.
library(pROC)devroc1 <- plot.roc(dev$MN, dev$predmodelA, main="dev ROC", percent=TRUE, col="1")devroc2 <- lines.roc(dev$MN, dev$predmodelB, percent=TRUE, col="2")devroc3 <- lines.roc(dev$MN, dev$predmodelC, percent=TRUE, col="3")legend("bottomright", legend=c("devmodelA""devmodelB","devmodelC"), col=c("1""2","3"), lwd=2)


R语言系列3:基于Logistic回归的临床诊断预测模型构建










5. 诊断模型列线图绘制

以 modelC 为例,进行列线图绘制示范

此处做logistic回归,列线图,与前面计算ROC那里不同,应用lrm() 函数进行操作,以modelC2代指

lrm()函数同样可用于logistic回归,能够自动整合数据维度,如用glm()计算,会出现“下标出界”现象

#打包数据ddist <- datadist(dev)options(datadist='ddist')
modelC2 <- lrm(MN ~age + eGFR + DM + NLR,data=dev)nomomodelC <- nomogram(modelC2,lp=F, fun=function(x)1/(1+exp(-x)), fun.at=seq(0.1,1,by=0.1), funlabel="Diagnostic possibility")plot(nomomodelC)

R语言系列3:基于Logistic回归的临床诊断预测模型构建


至此,模型构建完毕,后续可进行模型预测准确性与区分能力校验。

后续会更新

1. 生存资料,COX回归模型构建基本操作

以及如何将多条 时间依赖ROC 绘制在一个图像里

2. 易侕软件基本操作-logistic回归 与 COX回归


欢迎关注,学习交流为主~ 


获得本文演示数据及代码,后台回复“R03”即可




END