R语言系列3:基于Logistic回归的临床诊断预测模型构建
上一篇文章,我们讲到,以及操作。今天主要围绕基于logistic回归的诊断模型进行讲解及示范操作
临床诊断模型主要应用于结局变量为二分类变量时
在肿瘤领域与非肿瘤领域均应用广泛
主要回答以下问题
1.是否发病 是/否
2.肿瘤是否复发 是/否
3.冠脉支架植入后是否发生再狭窄
4.糖尿病患者是否发生远期糖尿病足相关截肢
5.腹膜透析患者是否发生透析相关腹膜感染
6.腹腔引流管植入后是否发生脱管或穿刺口感染
等一系列临床实际问题,均可考虑构建预测模型。。。
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)))
#计算预测值
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, 最佳截断值。
#将三条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)
以 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)
至此,模型构建完毕,后续可进行模型预测准确性与区分能力校验。
后续会更新
1. 生存资料,COX回归模型构建基本操作
以及如何将多条 时间依赖ROC 绘制在一个图像里
2. 易侕软件基本操作-logistic回归 与 COX回归
欢迎关注,学习交流为主~
获得本文演示数据及代码,后台回复“R03”即可
END