在诊断试验中,通过金标准诊断为患者和非患者,采用某种试验方法诊断为阳性或阴性,列成四格表的形式,计算相关指标评价该试验方法的价值。单个诊断试验中,常用灵敏度、特异度、似然比、预测值等评价诊断试验的价值。
除上述我们熟悉的指标外,我们需要了解下列指标:
诊断优势比(dor)=真阳性*真阴性/(假阳性*假阴性),主要用于诊断试验中,作为合并时每个诊断试验权重的依据。
s是根据单个诊断试验中的诊断优势比的权重,绘制的集成。从s上可以得到每一个研究的灵敏度和特异度,在存在阈值效应时,该方法最适合。在绘制s的基础上,可计算s下面积以及q指数。q指数为在s上,灵敏度=特异度,且最靠近左上角的坐标。
接下来,我们看看诊断试验的步骤。
与其他类型的不同的是,诊断试验中,阈值效应是异质性的重要来源。阈值效应是因为单个诊断试验中采用不同的诊断界值引起的。当存在阈值效应时,随着灵敏度的增加,特异度逐渐减小,反之亦然。
我们常通过计算灵敏度与特异度的spearman相关系数探讨阈值效应,二者之间若存在强负相关则提示存在阈值效应。但需要注意的是,灵敏度与特异度的相关并不一定都是由阈值效应引起。
当不存在阈值效应时,可以直接合并灵敏度、特异度等单一评价指标;当存在阈值效应时,应采用s法,计算s下面积和q指数。
目前,可用来进行诊断试验的软件有revman、meta-disc、stata、r软件等。今天,我们以r软件的meta4diag程序包为例,演示下如何做诊断试验的。
meta4diag程序包的功能是基于inla实现的, 因此在使用时还需同时安装相关程序包,即inla 程序包和sp程序包,程序如下:
(1)下载程序包,若运行出错,可通过r/rstudio的工具栏,手动安装。
install.packages("meta4diag")
install.packages("inla", repos="http://www.math.ntnu.no/inla/r/testing")
(2)加载程序包。library(meta4diag);library(inla)。
(3)读取数据。mydata<-read.csv(file.choose())。数据至少应包括studynames,真阳性例数tp、假阴性例数fn、真阴性例数tn、假阳性例数fp。
(4)整理数据。需要将录入的数据整理成函数要求的格式,这个不用担心,直接运行下列程序即可。将res<-meta4diag(mydata)中的mydata改成您自己的数据即可。
if(requirenamespace("inla", quietly = true)){
require("inla", quietly = true)
res <- meta4diag(mydata)
}
(5)探讨阈值效应。计算灵敏度(真阳性)与特异度(真阴性的)spearman相关系数,若二者之间spearman相关系数呈现强负相关,且p<0.05,提示存在阈值效应,则不适合合并灵敏度、特异度等,而应该拟合s。cor.test(mydata$tp,mydata$tn,method = "spearman")。
(6)绘制森林图。可通过accuracy.type选择绘制哪个指标的森林图,如
"sens", "spec", 分别代表灵敏度、特异度。
forest(res, accuracy.type = "sens");forest(res, accuracy.type = "spec")。
(7)绘制s,计算其曲线下面积。
sroc(res, est.type="mean");auc(res,est.type="mean")。
诊断试验流程图
引自:刘鸿, 周洁, 冯巧灵, 顾海涛,基于检验效能的诊断性试验及系统评价方法《转化医学杂志》2015年1期。
复制下列程序至r或rstudio软件,按要求整理数据,选择存储数据的路径即可。
#下载程序包
install.packages("meta4diag")
install.packages("inla", repos="http://www.math.ntnu.no/inla/r/testing")
#加载程序包
library(meta4diag)
library(inla)
#读取数据
mydata<-read.csv(file.choose())
mydata
#数据整理
if(requirenamespace("inla", quietly = true)){
require("inla", quietly = true)
res <- meta4diag(mydata)
}
#探讨阈值效应
cor.test(mydata$tp,mydata$tn,method = "spearman")
#绘制森林图
forest(res, accuracy.type = "sens")
forest(res, accuracy.type = "spec")
#拟合s,计算其曲线下面积
sroc(res, est.type="mean")
auc(res,est.type="mean")