功能最强大的ROC曲线绘制和分界点(Cutpoint)探索工具

ROC(Receiver Operating Characteristic,受试者工作特征)曲线分析是临床医学和流行病学研究中常用于评价诊断准确性以及确定界值点的方法。

本APP能够绘制单条或多条ROC曲线进行统计比较,也能够用多种指标探索最优诊断分界点(Cutpoint)。

传统软件和网络统计平台,通常只能用Youden’s index (约登指数)来寻找最优分界点。但是Youden在临床上作用非常有限。Youden=灵敏度+特异度-1 也就是说Youden取最大值时,灵敏度与特异度的和最大,此时的Cutpoint 被认为是最优分界点。但是Youden只同时考虑让灵敏度+特异度最大化,有时候往往都是20%特异度+90%灵敏度或者80%灵敏度+30%特异度这样的偏心组合,与临床的要求所去甚远。临床上,有些诊断方法需要保证一定的灵敏度,而一些诊断方法则需要保证特异度。比如结直肠癌在人群进行筛查的时候,需要提供更多的预警信号,因此需要灵敏度优先,而入院确诊的时候,则灵敏度和特异度都需要很高。

在诊断研究中,通常需要先固定一个值,比如特异度必须大于80%,在此基础上,寻找灵敏度最大的分界点;或者有些研究,灵敏度必须大于50%,在此基础上,探索特异度最大的点。需要多个指标来联合探索,而不是简单粗暴地选择Youden指数最大值。

本APP,提供了最全的筛选指标,文献中记载的绝大多数指标都可以用:

灵敏度、特异度、准确率、精确率、召回率、PPV、NPV、Youden、灵敏度与特异度的和、灵敏度与特异度的乘积、阳性预测值与阴性预测值的和、阳性预测值与阴性预测值的乘积、灵敏度与特异度的差值的绝对值、阳性预测值与阴性预测值的差值的绝对值、Cohen’s Kappa、Odds ratio、Risk ratio、混淆矩阵卡方检验的P值、ROC曲线上到点(0,1)的距离、Total utility、F1-score。

既可以寻找这些指标的最大值和最小值,也可以用这些指标分开设定不同条件进行联合探索。

Mstata 主要特点:

基础知识

ROC(Receiver Operating Characteristic,受试者工作特征)曲线分析是临床医学和流行病学研究中常用于评价诊断准确性以及确定界值点的方法。

‍1、定义

ROC曲线分析当前在医学领域使用非常广泛,用于研究X(检验变量)对于Y(状态变量)的预测准确率情况以及确定界值点。

ROC曲线的基本思想是把敏感度和特异性看作一个连续变化的过程,用一条曲线描述诊断系统的性能,其制作原理是在连续变量中不同界值点处计算相对应的灵敏度和特异度,然后以敏感度为纵坐标、1-特异性为横坐标绘制一条真阳性率与假阳性率的曲线。

ROC曲线的Y(状态变量)为只有两个类别的结果(例如阳性&阴性、是&否、患病&未患病等);X(检验变量)可以有很多个;X的数据类型为数值型变量或有序分类变量。

例如:预测核酸检测结果(阳性&阴性)的准确率; 评价雷达监测(敌机&飞鸟)的准确率等等。

为更好的理解ROC,需要先理解几个概念。当我们采用某种诊断方法对一个二分类的结局场景进行预测时,就产生了下面的混淆矩阵:

由这个混淆矩阵我们可以得到很多指标:

真阳性率(TPR)=TP/(TP+FN):实际为阳性预测也为阳性的比例。也称灵敏度(Sensitivity)、召回率(Recall);

假阳性率(FPR)=FP/(FP+TN):实际为阴性但预测为阳性的比例;

真阴性率(TNR)=TN/(FP+TN):实际为阴性预测也为阴性的比例。也称为特异度(Specificity);

假阴性率(FNR)=FN/(TP+FN):实际为阳性但预测为阴性的比例;

准确率(ACC)=(TP+TN)/(TP+FP+FN+TN):预测正确的比例;

阳性预测值(PPV)=TP/(TP+FP):预测为阳性的结果中实际为阳性的比例。也称精准率(Precision);

阴性预测值(NPV)=TN/(FN+TN):预测为阴性的结果中实际为阴性的比例。

ROC曲线是以灵敏度为纵坐标、(1-特异度)为横坐标绘制的曲线。灵敏度(Sensitivity)即真阳性率(TPR),特异度(Specificity)即为真阴性率(TNR),(1-特异度)就是(1-TNR)=FPR,所以ROC曲线横坐标值是假阳性率(FPR),而纵坐标值是真阳性率(TPR)。

这里可能会有一个疑问,一组数据不应该只有一个分类结果吗,而ROC曲线则是需要一系列的TPR和FPR值,这是如何做到的?其实这就涉及到分类的界值了。我们可以通过计算获得每一个样本的阳性预测概率,这时再确定一个分类的标准,比如高于50%算阳性,而低于50%算阴性,这样就可以获得50%作为分类界值的TPR和FPR。同样的当我们把这个界值设定为0-1之间的不同数值时,我们就获得了不同的TPR和FPR。在ROC中有几个特殊的点:(1,0),(0,1),(0,0),(1,1)。在(1,0)点,表示TPR=0,FPR=1,也就是真阳性率为0%,假阳性率为100%(或者说真阴性率为0%),该点完美的避开了所有正确的结果。在(0,1)恰好相反,TPR=100%,TNR=100%,是最完美的模型,所有的预测结果跟实际一样。(0,0)点,TPR=FPR=0%,所有的结果都会被预测为阴性结果,而(1,1)点TPR=FPR=100%,所有的结果都会被预测为阳性结果。一个完美预测模型的TPR=100%,FPR=0%(或者说TNR=100%),其ROC曲线应该是与纵坐标轴重合垂直向上,然后在纵坐标=100%处水平向右。实际当中,ROC曲线越靠近左上角,实验或者模型区分二分类结果的能力就越强,ROC曲线最靠近左上角的的点假阳性和假阴性的总数最少,正确率最高。

探索最佳分界点(Cutpoint)的指标:

除了文献中最常见的Youden’ index外,其他指标总结如下:

  • accuracy: Fraction correctly classified

  • abs_d_sens_spec: The absolute difference of sensitivity and specificity

  • abs_d_ppv_npv: The absolute difference between positive predictive value (PPV) and negative predictive value (NPV)

  • roc01: Distance to the point (0,1) on ROC space

  • cohens_kappa: Cohen’s Kappa

  • sum_sens_spec: sensitivity + specificity

  • sum_ppv_npv: The sum of positive predictive value (PPV) and negative predictive value (NPV)

  • prod_sens_spec: sensitivity * specificity

  • prod_ppv_npv: The product of positive predictive value (PPV) and negative predictive value (NPV)

  • youden: Youden- or J-Index = sensitivity + specificity - 1

  • odds_ratio: (Diagnostic) odds ratio

  • risk_ratio: risk ratio (relative risk)

  • p_chisquared: The p-value of a chi-squared test on the confusion matrix

  • total_utility: The total utility of true / false positives / negatives. Additional arguments: utility_tp, utility_tn, cost_fp, cost_fn

  • F1_score: The F1-score (2 * TP) / (2 * TP + FP + FN)

除了abs_d_sens_spec, abs_d_ppv_npv, p_chisquared, roc01这几个指标是越小越好之外,其余的指标都是越大越好。因此,要确定最佳Cutpoint,有些指标需要取最大值,有些指标需要取最小值。

另外,可以联合多个指标共同来确定最佳Cutpoint,比如当Sensitivity不低于0.5的时候,Youden的最大值;召回率不低于0.5的时候,ACC的最大值等。

下面我们用新一代的医学统计软件:Mstata 医学统计机器人(www.mstata.com) 来进行ROC的分析:

准备数据

ROC 曲线分析主要设计到两个变量,一个是金标准(结局)变量,就是真实的阴性和阳性结果;另一个是诊断检测变量,为连续数值型或有序分类,设定某个参考值拐点后来进行诊断,得到预测的阴性和阳性。

只研究一个诊断检测指标时,只涉及一条曲线,但如果有多个诊断指标,有时候需要把多条ROC曲线放在一起呈现,这时候就有两种研究设计,也就有了两种数据库准备方式:

配对(Paired) ROC 是指多项诊断检测(多条曲线)都是在同一批患者测量的,一个患者同时做多项检测,多个检测指标(自变量)共享同一组金标准(结局)数据,样本量相同;

非配对(Unpaired) ROC 是指多个检测指标各自在不同组的患者独立做的检测,每个指标(曲线)对应各自独立的金标准(结局)数据, 每个指标的人群不同,样本量也可能不尽相同。”

两种研究设计的数据结构不同,根据说明来准备数据:

首先务必按照下面的格式准备数据(网站上可下载,下载后在此基础上修改):

配对 ROC:

下载csv样例数据(右击另存为)

打开如下图:

本样例数据的规则:

  1. 一个患者一行(这是准备数据最重要的前提)。

  2. 代表金标准的结局变量:例如上图中的outcome, 为二分类的变量。

  3. 代表诊断指标的变量:如上图的age, wfns, s100b, ndka,诊断指标用数字表示,可以是数值型变量,也可以是有序分类变量(如 I级,II级,III级,IV级,用1, 2, 3, 4代替),但不能是无序分类变量(如城市、职业等),二分类变量需要转换成数字(0,1 或1,2等)。上图中的gender为文字Male和Female,这是我们举的一个反例,不能在软件中使用,需要把它替换成0,1再导入。

  4. 每一行都是同一个患者,因此诊断指标如 age, wfns, s100b, ndka 都共享一个金标准结局,就是outcome

非配对 ROC:

下载csv样例数据(右击另存为)

打开如下图:

  1. 代表金标准的结局变量:例如上图中的outcome1, outcome2, outcome3, 为二分类的变量。

  2. 代表诊断指标的变量:如上图的test1, test2, test3,可以是数值型变量,也可以是有序分类变量(如 I级,II级,III级,IV级,用1, 2, 3, 4代替),但不能是无序分类变量(如城市、职业等),二分类变量需要转换成数字(0,1 或1,2等)。

  3. 该数据有三组患者,每组患者都分别测量了金标准结局和诊断指标测量,例如 outcome1, test1是一组患者,outcome2和test2是一组患者;把数据拉倒最底下,可以看到三组的样本量不相同。

绘制ROC曲线

先绘制配对的ROC:

选定金标准,然后选择哪个值代表阳性,阳性一般指根据研究设计,发生感兴趣的事件。在此例中,病情恶化(Poor)代表阳性,研究目的就是看几个诊断指标取值来预测病情恶化的能力。

ROC的方向:诊断指标取值越大越容易阳性,还是取值越小越容易阳性;建议选”自动” 让计算机判断,这样ROC曲线下面积AUC恒大于0.5。

如果勾选”比较多条曲线” 则可以选择多个诊断指标在同一张图:

如果只选定了两条ROC曲线时,可以比较两条曲线的AUC并计算P值:

这是需要注意,如果用原始ROC曲线进行比较,用的是配对 DeLong’s test,如果勾选了”平滑曲线”,则用bootstrap方法进行P值的比较:

如果是非配对的ROC:

选定所有的金标准,如 outcome1, outcome2, outcome3, 然后选定所有的诊断检测变量,如 test1, test2, test3, 前后一一对应起来,顺序不要选错。

分界点(Cutpoint 值)分析

下面来分析各个切割点的情况:

先选定一个诊断指标,然后点击生成Cutpint 的参数表:

可以点击”dowanload all data” 下载到自己电脑上,然后灵活筛选、排序,自己深入分析,也可以在本网站上直接分析。

点击左上角的 “Column visibility” :

选定需要用来分析的变量。然后点击每个字段下面的空格,出现筛选条,可以限定该字段的上限和下限,可以对多个字段进行限定。然后点击字段名右侧的排序,可以探索最大值或最小值。

由此可筛选出自己感兴趣的指标取值组合。

另外,本网站也提供了自动化的工具:

单个评价指标

如图我们先用传统的Youden指数,可以看到,当Cutpoint取年龄大于等于51岁时,Youden最大,为0.2035908。

这里为了防止出现偏倚,我们从图上看到,接近最高点的youden其实有好几个。我们可以修改容忍度都看一下。

容忍度指的是评价指标取最大值附近上下一定范围的所有值,留有一定余地。容忍度取值越大,Cutpoint值个数越多:

容忍度改成0.01后,出现了三个cutpoint, 我们可以根据需要选一个,或者点下拉菜单取平均值或中位数。

这里我们看到这三个点分别为,51, 53, 54岁,Youden差别不大,但我们希望灵敏度相对高一些的,所以最终选了51岁。

多个评价指标联合

多个评价指标联合时,有多种组合都可以。上图是给定特异度下限,使灵敏度最大化。

输入0.5,特异度不能低于50%,这时候看灵敏度。

容忍度0.0001时,有两个值满足条件,分别是大于等于50岁和51岁。我们看到灵敏度都达到了63.4%,但特异度51岁更大。这时候可以把特异度下限修改为0.58,则最终选取了大于等于50岁作为最佳分界点。