筛检以及ROC曲线
筛检或筛查(screening):是针对临床前期或早期的疾病阶段,运用快速、简便的试验、检查或其他方法,将未察觉或未诊断疾病的人群中那些可能有病或缺陷、但表面健康的个体,同那些可能无病者鉴别开来的一系列医疗卫生服务措施,常见方法有:常规体格检查、问卷调查、分子标志物。用于识别外表健康的人群中那些可能患病个体或具有患病风险个体的方法称为筛检试验(screening test)。
筛检试验的评价
评价一个筛检试验是否有效一般从以下几个指标入手:真实性、可靠性和预测值。
1、真实性(validity)
真实性(validity),亦称效度:指测量值与实际值相符合的程度,又称准确性(accuracy)。评价真实性的指标包括:灵敏度与假阴性率、特异度与假阳性率、正确指数和似然比。
2、可靠性(reliabilitya)
可靠性(reliabilitya),也称信度:相同条件下用某测量工具重复测量同一受试者时结果的一致程度。评价信度的指标根据资料类型的不同而不同。定量资料常用指标有标准差和变异系数,也可用t检验;定性资料常用kappa指数和符合率。
3、预测值(predictive value)
应用筛检结果的阳性和阴性来估计受检者为病人和非病人可能性的指标。包括阳性预测值和阴性预
例子:一项关于乳腺癌早期筛查的筛检试验。目标人群一共有N个个体,筛检后发现病人数为A,非病人为B,经过目前医学界内的“金标准”诊断后发现:病人数为C,非病人数为D。请对该项筛检试验真实性进行评价。
灵敏度(sensitivity):又称真阳性率,实际患病且被筛检试验正确判定为阳性的百分比,反映了筛检试验发现病人的能力。
灵敏度=A/(A B)*100%
假阴性率:又称漏诊率,实际有病但被筛检试验诊断为阴性的百分比。
假阴性率=B/(A B)*100%=1-灵敏度
特异度(specificity):又称真阴性率,实际无病且被筛检试验正确判定为阴性的百分比,反映了筛检试验发现非病人的能力。
特异度=D/(C D)*100%
假阳性率:又称误诊率,实际无病但被筛检试验诊断为阳性的百分百比。
假阴性率=C/(C D)*100%=1-特异度
预测值与灵敏度和特异度之间的关系
当灵敏度和特异度一定时,患病率降低,阳性预测值降低,阴性预测值升高;
当患病率不变时,灵敏度升高,特异度降低,阳性预测值下降。
界值的确定方法
无论是筛检或者是诊断试验,都需要确定阳性与阴性的界值(cut off value),不同的界值对应不同的特异度和灵敏度。在灵敏度和特异度都需要考虑的情况下,最常用的判断界值是方法是受试者工作特征曲线(receiver operating characteristic curve,ROC曲线)法。当筛检/诊断试验以计量资料表达时,将测试值按大小顺序排列,并将诊断试验的连续变量设定出多个不同临界值,计算出一系列的灵敏度/特异度对子,以灵敏度为纵坐标,1-特异度(误诊率)为横坐标,绘制出的曲线即ROC曲线。当我们对灵敏度和特异度都很看重时,往往选取以ROC曲线上离左上角(0,1)最近的点为筛检/诊断试验的界值。
此外,ROC曲线下面积(area under the curve,AUC)可以帮助我们比较两种或者多种筛检/诊断试验总体准确性的大小。ROC曲线下面积越大,越接近1.0,诊断的准确度越高;越接近0.5,诊断的准确度越低。
ROC曲线绘制
install.packages('pROC')
library(pROC)
## 读取数据,数据类型为.csv,文件需要保存在指定工作路径才可读取。使用getwd()读取当前R工作路径,将所有CSV文件移到指定地址。
#本文数据均为虚拟,无实际意义。且本文仅做ROC曲线基本绘制,更多参数设置还等待着读者们自行查看帮助进行学习——
??roc(Rstudio窗口输入)
#存在代码报错可留言
a = read.csv('example01.csv', header = T)
view(a)
# status: 0:真阴性; 1: 真阳性(二分类变量)
# Score_1:诊断试验1评分;Score_2: 诊断试验1评分
# Aim: 比较两种诊断试验
# T为True, print.thres打印最佳cut-off,print.auc打印auc数值,plot画出ROC曲线, a$status:取a中的status变量列
b = roc(a$status ~ a$Score_1, plot = T, print.thres = T, print.auc = T)
c = roc(a$status ~ a$Score_2, plot = T, print.thres = T, print.auc = T)
#同时在一张上面打出多条ROC曲线
b = roc(a$status ~ a$Score_1, plot = T, print.thres = T, print.auc = T, col = 'green')
plot.roc(c, add = T, col = 'red', print.thres = T, print.auc = T)
(从图中可以看出方法2评分更好)
#设置其他参数,grid(0.1,0.2)给背景加上长0.1,宽0.2的虚格,auc.polygon设置为True后可以使用auc.polygon.col='Lightblue'改变AUC下的颜色;legacy.axes=True是将横坐标改为1-specificity, 默认为False,横坐标为specificity
roc(a$status ~ a$Score_2, plot = T, print.thres = T, print.auc = T, auc.polygon=T, grid=c(0.1, 0.2), auc.polygon.col='Lightblue', col ='red',legacy.axes= T)
在上面基础上,添加smooth = T可以使曲线顺滑,读者可自行尝试。
1.Xavier Robin, Natacha Turck, Alexandre Hainard, et al. (2011) “pROC: an open-source package for R and S to analyze and compare ROC curves”. BMC Bioinformatics, 7, 77. DOI: 10.1186/1471-2105-12-77
2.R中help()帮助
大话统计
作者:Keyong_Bio & Haoqi
联系客服