Nomogram就是这样一种有效的工具,中文常称为诺莫图或者列线图,其实质就是回归方程的可视化。它根据所有自变量回归系数的大小来制定评分标准,给每个自变量的每种取值水平一个评分,对每个患者,就可计算得到一个总分,再通过得分与结局发生概率之间的转换函数来计算每个患者的结局时间发生的概率。图1就是一个关于COX回归的nomogram,图中points就是一个选定的评分标准或者尺度,对于每个自变量取值,在该点做一条垂直于Points轴的直线(可通过直尺),交点即代表该自变量取值下的评分,如CEA,取0时评分为0分,CEA为20时评分约为12.5分。以此类推,计算每个患者各个自变量对应的分值points,加起来就是总分total points。同样的道理,在Total Points轴上找到该患者总分对应的点,画一垂直直接到生存概率轴上(如3年生存概率3-year Survival或者5年生存概率 5-year Survival),交点即为该患者的3年或5年生存概率。该方法只要给予简单的说明就可以轻松的掌握使用方法。
图1 nomogram示意图
空白图1来源于JCO的一篇文献,http://jco.ascopubs.org/content/31/9/1188.long。文献上列出了详细的绘制nomogram的R程序,该文章曾在丁香园和人大经济论坛等论坛上掀起了关于nomogram的热议。下面就随我一起来一步步的解读nomogram的R程序。
空白第一步:加载函数包。由于R中是采用rms包的nomogram函数来绘制诺莫图,因此首先需要加载rms包
library(rms)
空白第二步:构建COX回归模型
S<-Surv(time,status)
f < -cph(S∼CEA+CA-199+…., x = T, y = T, surv = T, time.inc = 3 or 5)
注意:①这里time.inc不一定是3或者5,可以随意取值,但要根据你的生存时间的基本单位来定,如果是月,那就可以是12(月)或者36(月),而如果时间的基本单位是年,很明显一般不会随访但12年或者36年,那么time.inc取12或者36就会导致程序错误;②在采用cph构建COX模型之间通常需要采用datadist函数将数据“打包”一下,dd<-datadist(CEA,CA-199,…),options(datadist='dd')
空白第三步:构建nomogram
nom < - nomogram(f, fun =list(function(x) surv(3, x),function(x) surv(5, x)),
fun.at = c(0.05,seq(0.1, 0.6, by = 0.1), 0.65),
funlabel = c(“3-year Survival”,“5-year Survival”))
注意:①与之前构建COX模型时一样,在list(function(x) surv(3, x),function(x) surv(5, x))中,3和5代表的是你想要预测哪个时间点的生存概率,要根据数据的时间单位来设置,如果单位是月,这里就应该是36和60;2)fun.at是设置生存概率轴的显示范围,这里只显示0.05到0.65这个区间
空白第四步:绘制nomogram图
plot(nom)
空白到这里我们就成功的绘制了所需要的nomogram图,那么这个nomogram用来做预测的效果怎么样呢,是好还是不好,需要有个评价,目前大多通过两个方面来评价,一个是一致性指数C-index,另外一个是标准曲线Calibration Curve(如图2所示)。其中C-index与ROC曲线下面积AUC有点相似,但概念有所区别,C-index是通过将所有患者随机两两组对,计算所有对子中预测生存概率高的患者生存时间也长的对子占全部对子的比例,表示预测结果与实际结果的一致性程度。标准曲线则是比较nomogram预测的结果与K-M法结果的一致性,结果越一致,标准曲线越靠近对角线。
空白下面我们就来看看nomogram预测效果的评价过程
1)计算C-index
采用Hmisc包中的rcorrcens函数来计算
rcorrcens(S∼predict(f))
C-index置信区间95%CI的计算:公式与常用的置信区间公式一致,需要注意的是在这里标准误SE = S.D/2,S.D为rcorrcens函数输出的标准差
2)绘制标准曲线
cal < -calibrate(f, cmethod = “KM”,method = “boot” , u = 3 or 5, m = 100, B = 1000)
注意:①这里u需要与之前f中定义好的time.inc一致,即f中time.inc为3时,此处u即为3;②m要根据样本量来确定,由于标准曲线一般将所有样本分为3组(在图中显示3个点),而m代表每组的样本量数,因此m*3应该等于或近似等于样本量;
par(mar=c(8,5,3,2),cex = 1.0)
plot(cal1,lwd=2,lty=1,errbar.col=c(rgb(0,118,192,maxColorValue=255)),xlim=c(0,1),ylim=c(0,1),
xlab="Nomogram-Predicted Probabilityof 3-Year DFS",ylab="Actual 3-Year DFS (proportion)",
col=c(rgb(192,98,83,maxColorValue=255)))
注意:程序中xlim和ylim请根据自己标准曲线的实际情况进行调整,如:若3各点的值都大于0.6,则xlim可设为c(0.6, 1)
lines(cal1[,c("mean.predicted","KM")],type="b",lwd=2,col=c(rgb(192,98,83,maxColorValue=255)),pch=16)
abline(0,1,lty=3,lwd=2,col=c(rgb(0,118,192,maxColorValue=255)))