imd 统计教程 · 预测模型与机器学习
← 教程首页 返回本模块

6款nomogram列线图实战详解

聂志强实战医学统计2022-11-17 03:23:42广东



前言

预测模型是临床研究长期以来十分热门的关键词,笔者应该是8年前第一次接触,当时十分激动,感叹了许久“logistic回归方程居然能可视化地如此美丽”。久而久之渐渐麻木,pubmed上琳琅满目的nomogram预测模型,大多数像八股文一样魔墨守成规。那有没有更加新颖时髦的nomogram图呢?

答案是有的,需要自己DIY。

1.nomogram图形包

https://cran.r-project.org/web/packages/available_packages_by_date.html,搜索nomogram,涉及的包主要是 rms、DynNom、SvyNom、QHScrnomo、regplot、nomogramFormula、nomogramEx、shinyPredict。常用的诺莫图有如下6种类型:静态有线段式的静态诺莫图、彩色条带式的静态诺莫图;动态有基于regplot 的动态诺莫图、基于shinyapp的DynNom 的动态诺莫图和shinyPredict 的动态诺莫图;其它款借助nomogram之名,html等格式构建预测模型。以下笔者用近期论文数据演示几种nomogram图形。

2. 静态模型

2.1 经典rms包nomogram图

90%以上的nomogram都是rms包绘制的,经典简洁大方,也可修饰加工。


#-------------------data 一般7:3比例分训练和内验证
rm(list = ls()) 
setwd("D:/聂个人文件/我的公众号/预测模型/网页版nomogram")
load("train.rdata")
str(train)
#============1. 构建logistic的经典线段式nomo
pacman::p_load(rms)
#进一步美化nomog,label
# 设置因子的水平标签
train$GDM <- factor(train$GDM,levels=c(0,1),labels=c("No","Yes"))
train$taimozaopo_01 <- factor(train$taimozaopo_01,levels=c(0,1),labels=c("No","Yes"))
train$duotai <- factor(train$duotai,levels=c(0,1),labels=c("No","Yes"))
train$edu_dixueli <- factor(train$edu_dixueli,levels=c(0,1),labels=c("≥High school","< High school"))
train$jiazhuangxian <- factor(train$jiazhuangxian,levels=c(0,1,2),labels=c("Normal","Hypothyroidiss","Thyrotoxicosis"))
# 设置变量的名称
label(train$GDM) <- "Gestational diabetes"
label(train$taimozaopo_01) <- "Premature rupture of membrane"
label(train$duotai) <- "Polyembryony"
label(train$edu_dixueli) <- "Education below senior high school"
label(train$jiazhuangxian) <- "Thyroidfunction"

ddist <- datadist(train)
options(datadist='ddist')
# rms::lrm 
F1 <- lrm(Y~GDM+taimozaopo_01+duotai+edu_dixueli+jiazhuangxian, data = train,x=TRUE, y=TRUE)
summary(F1)
nom <- nomogram(F1,
                fun=function(x)1/(1+exp(-x)),
                #也可fun=plogis,fun.at概率坐标范围
                fun.at=c(.001,.01,.05,seq(.1,.9,by=.1),.95,.99,.999),
                funlabel="Risk of Y",
                conf.int=F,
                abbrev=F,
                minlength=1,
                #lp线性预测值
                lp=F
plot(nom)
# -----------pdf
pdf("nom1.pdf",family="Times", width=10,height=8)
plot(nom)
dev.off()
#points.label= , total.points.label= 
#cex.axis参数修改坐标轴的文字大小;cex.var参数修改刻度名称的文字大小;xfrac 距左变量名距离

范文SCI,total point处可增加低中高风险色条。

2.2 彩色条带静态nomogram

VRPM包是17年最后更新,pubmed也没检索到引用的文献。VRPM最后会在setwd文件目录下生成nom.png,图形以颜色来判别明显不如score判别,所以导致受众极少。

范文SCI

#install.packages("D:/聂个人文件/我的公众号/预测模型/网页版nomogram/VRPM_1.2.tar.gz", repos = NULL, type = "source")
#手动安装 'fields', 'R2HTML', 'kernlab'
pacman::p_load(fields,R2HTML,kernlab)
pacman::p_load(VRPM,dplyr)
load("train.rdata")
#VRPM只支持x为num,不支持factor
train$GDM <- as.numeric(as.character(train$GDM))
train$taimozaopo_01 <- as.numeric(as.character(train$taimozaopo_01))
train$duotai <- as.numeric(as.character(train$duotai))
train$edu_dixueli <- as.numeric(as.character(train$edu_dixueli))
train$jiazhuangxian <- as.numeric(as.character(train$jiazhuangxian))
ddist <- datadist(train)
options(datadist='ddist')
F2<-glm(Y~ GDM+taimozaopo_01+duotai+edu_dixueli+jiazhuangxian, data=train, family = binomial(link = "logit"))
summary(F2)
colplot(F2,coloroptions=3,
risklabel="risk of Y",
filename="nom")

3. 动态nomogram

3.1 nomoreg包点击图

Nomoreg包虽然具备一定点击功能,但是点起来也很难受。个人感觉体验差,而且图形也不够简洁美观。最后输出依旧是静态图,pubmed文献少。

范文SCI

   #============ 线段式动态诺莫图 regplot 
pacman::p_load(regplot,rms)
load("train.rdata")
#regplot不支持文本label
ddist <- datadist(train)
options(datadist='ddist')
F2<-glm(Y~ GDM+taimozaopo_01+duotai+edu_dixueli+jiazhuangxian, train, family = binomial(link = "logit"))
summary(F2)
nom3 <- regplot(F2,
plots = c("violin", "boxes"), ##连续性变量形状,可选"no plot" "density" "boxes" "ecdf" "bars" "boxplot" "violin" "bean" "spikes";分类变量的形状,可选"no plot" "boxes" "bars" "spikes"
observation = train[2,], #红色点,对应行观测,或者T F
center = T, # 对齐变量
subticks = T,
droplines = T,#是否画竖线
title = "nomogram",
points = T, # 截距项显示为0-100
odds = T, # 是否显示OR值
showP = T, # 是否显示变量的显著性标记
rank = "sd", # 根据sd给变量排序
interval="confidence", # 展示可信区间
clickable = T # 是否可以交互
)

3.2 DynNom包预测

DynNom算比较新的包,而且作者一直都更新十分勤快。需要shinyapp注册。

范文SCI


#============ 2. 动态nomo dynnom包,需要glm函数
pacman::p_load(DynNom)
F2<-glm(Y~ GDM+taimozaopo_01+duotai+edu_dixueli+jiazhuangxian, train, family = binomial(link = "logit"))
summary(F2)
DynNom(F2,train)
#生成脚本文件(在工作目录下)
DNbuilder(F2)
#creating new directory: D:/聂个人文件/我的公众号/预测模型/网页版nomogram/DynNomapp

pacman::p_load('rsconnect')
rsconnect::setAccountInfo(name='niezhiqiang',
token='144CFCF5246C6D2FF3A44789D5B334FB',
secret='请去shinyapp注册')
#部署,也可手动UI.R#数据集名字不能为 data,使用完后Quit
rsconnect::deployApp('D:/聂个人文件/我的公众号/预测模型/网页版nomogram/DynNomapp')

按照步骤完成后,有了属于自己的预测模型,下同。例如登录网页,https://niezhiqiang.shinyapps.io/dynnomapp/。

3.3 shinyPredict包预测

需要DIY shinyapp,优秀案例见:https://amir.shinyapps.io/survapp/。

#============ 3.  shinyPredict的动态诺莫图,强烈推荐
#显示多个模型的诺莫图,还可以更改诺莫图的主题
pacman::p_load('shinyPredict')
F3<-glm(Y~ GDM+taimozaopo_01+duotai+edu_dixueli , train, family = binomial(link = "logit"))
summary(F3)
shinyPredict(models=list("model 1"=F2,F3),
path="D:/聂个人文件/我的公众号/预测模型/网页版nomogram/shinyPredict", #path = "./",
data=train[,c("GDM","taimozaopo_01","duotai","edu_dixueli","jiazhuangxian")],#显示的位置,列变量
title="shinyPredict nomogram",
shinytheme = "paper")
#自动生成app.R
#还可以叠加模型 "Model with splines"=tmp.m2, "Model with two factors"=tmp.m2A,
pacman::p_load('rsconnect')
rsconnect::setAccountInfo(name='niezhiqiang',
token='144CFCF5246C6D2FF3A44789D5B334FB',
secret='请去shinyapp注册')
#部署,也可手动UI.R#数据集名字不能为 data,使用完后Quit
rsconnect::deployApp('D:/聂个人文件/我的公众号/预测模型/网页版nomogram/shinyPredict')

登录网页,https://niezhiqiang.shinyapps.io/shinypredict,是笔者的演示案例,距离高手的预测模型有很多细节需要加强。

3.4 其他nomogram形式

JCO杂志发表很多nomogram,其中有风险预测模型网页版形式也命名为nomogram ,https://nomograms.mskcc.org/Breast/DuctalCarcinomaInSituRecurrencePage.aspx。

4. 发散思维

2019年plosone论文很好的做了nomogram建模的link函数总结。

还提到一个“Translational Statistics”转化统计概念:促进生物统计学与临床研究相结合,以加强统计学研究结果的交流,以准确和易懂的方式向不同的受众传播统计学研究结果。笔者检索发现2014年提出到现在,也没几篇论文啊,又是个噱头概念。

小结

Nomogram其实就是β或score得分的变种,只是换成了图形或app的形式。本文介绍了6种类型的nomogram,其中静态款经典款最通用,可自行改装叠加彩色条带,动态2款都需要依靠shinyapp,洋气、online、美化DIY上限比较高,未来可期

参考文献 

 https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5837352

 https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7298262

 https://www.ncbi.nlm.nih.gov/pmc/articles/PMC6258254

医咖会-5种诺莫图(列线图)教程

原创不易,转载请说明来自本公众号。