前言
预测模型是临床研究长期以来十分热门的关键词,笔者应该是8年前第一次接触,当时十分激动,感叹了许久“logistic回归方程居然能可视化地如此美丽”。久而久之渐渐麻木,pubmed上琳琅满目的nomogram预测模型,大多数像八股文一样魔墨守成规。那有没有更加新颖时髦的nomogram图呢?
答案是有的,需要自己DIY。
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图形。
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处可增加低中高风险色条。
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")
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 # 是否可以交互
)
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/。
需要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,是笔者的演示案例,距离高手的预测模型有很多细节需要加强。
JCO杂志发表很多nomogram,其中有风险预测模型网页版形式也命名为nomogram ,https://nomograms.mskcc.org/Breast/DuctalCarcinomaInSituRecurrencePage.aspx。
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
原创不易,转载请说明来自本公众号。