敏感性或特异性是患病率的函数吗?


10

标准教学说,敏感性和特异性是测试的属性,与患病率无关。但这不只是一个假设吗?

哈里森的内科学原理第19版说

长期以来,人们一直认为敏感性和特异性是测试准确性与患病率无关的参数,许多文献仍在发表这一声明。然而,这种统计学上有用的假设在临床上是简单的。...住院患者的测试敏感性可能更高,而门诊患者的测试特异性更高。

(住院患者的患病率通常高于门诊患者)

这些参数之间是否存在数学或近似图形关系?

即使这个链接也称其为“简化”。为什么?

编辑:我知道如何定义灵敏度。正如答案中所提到的,没有涉及流行的术语。我本人一直坚持认为,这些是测试的属性,不受所使用的总体影响,直到我遇到此声明,因此才提出问题。但我认为,造成这种混乱的原因不是由于定义,而是由于这些值的实际计算。特异性和敏感性是使用2x2表格计算的,这里参考人群的普遍性重要吗?这就是他们所指的吗?如果可以,功能是什么?

Answers:


4

尽管@ Tim♦和@ gung♦的答案几乎涵盖了所有内容,但我将尝试将它们综合为一个,并提供进一步的说明。

引号的上下文通常是指最常见的某种阈值形式的临床测试。想象一下疾病,除之外的所有事物,包括健康状态,都称为。对于我们的测试,我们想找到一些代理度量,以使我们能够对做出很好的预测。(1)之所以没有获得绝对特异性/敏感性的原因在于,代理数量的值与疾病状态,但仅与疾病状态相关,因此,在个别测量中,我们可能有机会使该数量超过阈值D D c D D cDDDcDDc个人,反之亦然。为了清楚起见,让我们假设一个高斯模型的可变性。

假设我们使用作为代理数量。如果已经很好地选择了,则必须高于(是期望值运算符)。现在,当我们意识到是一个复合情况(),实际上是由3个严重等级,和,每个等级对期望值逐渐增加时,就会出现问题。对于单个人,从类别或x E [ x D ] E [ x D c ] E D D c D 1 D 2 D 3 x D D c x T D D c x T D x D cxxE[xD]E[xDc]EDDcD1D2D3xDDc类别,“测试”的概率是否为正将取决于我们选择的阈值。假设我们基于研究具有和个体的真正随机样本来选择。我们的将导致一些错误的肯定和否定。如果我们随机选择一个人,则控制其值的概率(由绿色图给出),以及由随机选择的人由红色图给出的概率。xTDDcxTDxDc在此处输入图片说明

所获得的实际数量将取决于和个体的实际数量,但是所得的特异性和敏感性则不会。令为累积概率函数。然后,对于疾病的患病率,这里是一张2x2表格,这是一般情况下所期望的,当我们尝试实际查看测试在合并人群中的表现时。D c F pDDcF()pD

(D,+)=p(1FD(xT))
(Dc,)=(1p)(1FDc(xT))
(D,)=p(FD(xT))
(Dc,+)=(1p)FDc(xT)

实际数字与,但敏感性和特异性与无关。但是,这两个都依赖于和。因此,所有影响这些因素的因素都将肯定会改变这些指标。例如,如果我们在ICU中工作,则将替换为;如果我们谈论的是门诊病人,则将其替换为。医院的患病率也不同,这是另一回事,p ˚F d ˚F d Ç ˚F d ˚F d 3 ˚F d 1 d C ^ d Ç X d d Ç ˚F d ˚F d Ç d ˚F ˚FppFDFDcFDFD3FD1但是不是不同的患病率导致敏感性和特异性不同,而是不同的分布,因为定义阈值的模型不适用于门诊或住院患者。您可以继续将分解为多个子群体,因为由于其他原因,的住院患者子部分的也应升高(因为在其他严重情况下大多数代理也被“升高”)。将种群分解为亚种群可以解释敏感性的变化,而种群的种群可以解释特异性的变化(通过和DcDcxDDcFDFDc)。这就是合成图实际组成的内容。每种颜色实际上都会有自己的,因此,只要这与计算原始灵敏度和特异度的有所不同,这些指标就会改变。DFF

在此处输入图片说明

假设人口为11550,分别为10000 Dc,500,750,300 D1,D2,D3。注释掉的部分是用于上述图形的代码。

set.seed(12345)
dc<-rnorm(10000,mean = 9, sd = 3)
d1<-rnorm(500,mean = 15,sd=2)
d2<-rnorm(750,mean=17,sd=2)
d3<-rnorm(300,mean=20,sd=2)
d<-cbind(c(d1,d2,d3),c(rep('1',500),rep('2',750),rep('3',300)))
library(ggplot2)
#ggplot(data.frame(dc))+geom_density(aes(x=dc),alpha=0.5,fill='green')+geom_density(data=data.frame(c(d1,d2,d3)),aes(x=c(d1,d2,d3)),alpha=0.5, fill='red')+geom_vline(xintercept = 13.5,color='black',size=2)+scale_x_continuous(name='Values for x',breaks=c(mean(dc),mean(as.numeric(d[,1])),13.5),labels=c('x_dc','x_d','x_T'))

#ggplot(data.frame(d))+geom_density(aes(x=as.numeric(d[,1]),..count..,fill=d[,2]),position='stack',alpha=0.5)+xlab('x-values')

我们可以轻松计算出包括Dc,D1,D2,D3和复合D在内的各种总体的x均值。

mean(dc) 
mean(d1) 
mean(d2) 
mean(d3) 
mean(as.numeric(d[,1]))

> mean(dc) [1] 8.997931
> mean(d1) [1] 14.95559
> mean(d2) [1] 17.01523
> mean(d3) [1] 19.76903
> mean(as.numeric(d[,1])) [1] 16.88382

为了获得原始测试用例的2x2表,我们首先根据数据设置一个阈值(在实际情况下,将在运行测试后设置该阈值,如@gung所示)。无论如何,假设阈值为13.5,在对整个人群进行计算时,我们将获得以下敏感性和特异性。

sdc<-sample(dc,0.1*length(dc)) 
sdcomposite<-sample(c(d1,d2,d3),0.1*length(c(d1,d2,d3))) 
threshold<-13.5 
truepositive<-sum(sdcomposite>13.5) 
truenegative<-sum(sdc<=13.5) 
falsepositive<-sum(sdc>13.5) 
falsenegative<-sum(sdcomposite<=13.5) 
print(c(truepositive,truenegative,falsepositive,falsenegative)) 
sensitivity<-truepositive/length(sdcomposite) 
specificity<-truenegative/length(sdc) 
print(c(sensitivity,specificity))

> print(c(truepositive,truenegative,falsepositive,falsenegative)) [1]139 928  72  16
> print(c(sensitivity,specificity)) [1] 0.8967742 0.9280000

让我们假设我们正在与门诊病人一起工作,而我们仅从D1比例中患病患者,或者我们在仅得到D3的ICU中工作。(对于更一般的情况,我们也需要拆分Dc成分)我们的灵敏度和特异性如何变化?通过更改患病率(即通过更改属于任一病例的患者的相对比例,我们根本不会更改特异性和敏感性。碰巧这种患病率也会随着分布的变化而改变)

sdc<-sample(dc,0.1*length(dc)) 
sd1<-sample(d1,0.1*length(d1)) 
truepositive<-sum(sd1>13.5) 
truenegative<-sum(sdc<=13.5) 
falsepositive<-sum(sdc>13.5) 
falsenegative<-sum(sd1<=13.5) 
print(c(truepositive,truenegative,falsepositive,falsenegative)) 
sensitivity1<-truepositive/length(sd1) 
specificity1<-truenegative/length(sdc) 
print(c(sensitivity1,specificity1)) 
sdc<-sample(dc,0.1*length(dc)) 
sd3<-sample(d3,0.1*length(d3)) 
truepositive<-sum(sd3>13.5) 
truenegative<-sum(sdc<=13.5) 
falsepositive<-sum(sdc>13.5) 
falsenegative<-sum(sd3<=13.5) 
print(c(truepositive,truenegative,falsepositive,falsenegative)) 
sensitivity3<-truepositive/length(sd3) 
specificity3<-truenegative/length(sdc) 
print(c(sensitivity3,specificity3))

> print(c(truepositive,truenegative,falsepositive,falsenegative)) [1]  38 931  69  12
> print(c(sensitivity1,specificity1)) [1] 0.760 0.931
> print(c(truepositive,truenegative,falsepositive,falsenegative)) [1]  30 944  56   0
> print(c(sensitivity3,specificity3)) [1] 1.000 0.944

总而言之,一个显示敏感性变化(如果我们也由亚群组成的Dc种群,特异性会遵循类似趋势)变化的图,该种群的平均值x有所不同,这是一个图形

df<-data.frame(V1=c(sensitivity,sensitivity1,sensitivity3),V2=c(mean(c(d1,d2,d3)),mean(d1),mean(d3))) 
ggplot(df)+geom_point(aes(x=V2,y=V1),size=2)+geom_line(aes(x=V2,y=V1))

在此处输入图片说明

  1. 如果不是代理人,那么从技术上讲我们将具有100%的特异性和敏感性。假设我们将定义为在肝活检中具有特定的客观定义的病理学图像,那么肝活检将成为金标准,我们将针对自身进行测量,从而得出100%的敏感性D

9

首先,有必要认识到,通常您不能独立于特异性来改变敏感性,反之亦然。这是ROC曲线的点。考虑到数据生成过程的性质以及您的特定数据和模型,您总是会在敏感性和特异性之间进行权衡。您当然希望同时具有100%的敏感性和100%的特异性,但是通常不能。您可以获得更好的灵敏度,但是以较差的特异性为代价,或者更好的特异性为代价,但以较差的灵敏度为代价。ROC曲线显示了您必须在两者之间进行权衡的一组权衡。(以下几点注意事项:1.您有时似乎在一个维度上有所收获,而在另一维度上没有任何损失,因为数据集中存在间隙,但这主要是虚幻的; 2。ROC曲线的敏感性是1特异性的函数,绘制敏感性vs特异性本身就是反映的ROC曲线。)

在此处输入图片说明

无论如何,表观敏感性和特异性如何随患病率变化?这是一个问题,它有助于模拟和处理一些数据以查看如何在实践中实现。假设模型适合具有特定患病率的相当大的数据集,并且在x轴1上设置了阈值。后来,使用具有明显不同的患病率(并因此具有不同的x值)的样本来计算此测试的性能。结果是,将相同的模型,使用相同的阈值应用于具有不同患病率的数据集时,其性能将有所不同。

library(caret)  # we'll use these packages
library(binom)
  # we'll use this function to convert log odds to probabilities
lo2p = function(lo){ exp(lo)/(1+exp(lo)) }

##### training dataset for original model
set.seed(734)                     # these make the examples exactly reproducible
Nt = 1000
xt = rnorm(Nt, mean=5, sd=1)      # this is the distribution of X
lo = -1.386 + .308*xt             # this is the data generating process
pt = lo2p(lo)
yt = rbinom(Nt, size=1, prob=pt)
mt = glm(yt~xt, family=binomial)
summary(mt)
# ...
# Coefficients:
#             Estimate Std. Error z value Pr(>|z|)    
# (Intercept) -1.16736    0.32794  -3.560 0.000371 ***
# xt           0.24980    0.06429   3.886 0.000102 ***
# ...
#     Null deviance: 1384.5  on 999  degrees of freedom
# Residual deviance: 1369.1  on 998  degrees of freedom
# AIC: 1373.1

## determine threshold
# prob(Y) = 50%, where log odds = 0, so:
-coef(mt)[1]/coef(mt)[2]  # 4.673159
threshold = 4.7  # a simple round number
classt    = ifelse(xt>threshold, 1, 0)
tabt      = table(classt, yt)[2:1,2:1]

confusionMatrix(tabt)
#       yt
# classt   1   0
#      1 346 279
#      0 175 200
#                                           
#                Accuracy : 0.546           
#                     ...                                          
#             Sensitivity : 0.6641          
#             Specificity : 0.4175          
#          Pos Pred Value : 0.5536          
#          Neg Pred Value : 0.5333          
#              Prevalence : 0.5210          


##### high prevalence dataset from hospital
set.seed(4528)
Nh = 500
xh = rnorm(Nh, mean=6, sd=1)  # a different distribution of X
lo = -1.386 + .308*xh         # but the same data generating process
ph = lo2p(lo)
yh = rbinom(Nh, size=1, prob=ph)
classh = ifelse(xh>threshold, 1, 0)  # the same threshold is used
tabh   = table(classh, yh)[2:1,2:1]

confusionMatrix(tabh)
#       yh
# classh   1   0
#      1 284 163
#      0  20  33
#                                           
#                Accuracy : 0.634           
#                     ...
#             Sensitivity : 0.9342          
#             Specificity : 0.1684          
#          Pos Pred Value : 0.6353          
#          Neg Pred Value : 0.6226          
#              Prevalence : 0.6080          


##### low prevalence dataset from outpatients
set.seed(1027)
Nl = 500
xl = rnorm(Nl, mean=3, sd=1)
lo = -1.386 + .308*xl
pl = lo2p(lo)
yl = rbinom(Nl, size=1, prob=pl)
classl = ifelse(xl>threshold, 1, 0)
tabl   = table(classl, yl)[2:1,2:1]

confusionMatrix(tabl)
#       yl
# classl   1   0
#      1   9  14
#      0 190 287
#                                           
#                Accuracy : 0.592           
#                     ...
#             Sensitivity : 0.04523         
#             Specificity : 0.95349         
#          Pos Pred Value : 0.39130         
#          Neg Pred Value : 0.60168         
#              Prevalence : 0.39800         


##### sensitivities
binom.confint(346, 521, method="e")
#   method   x   n      mean     lower    upper
# 1  exact 346 521 0.6641075 0.6217484 0.704592
binom.confint(284, 304, method="e")
#   method   x   n      mean   lower     upper
# 1  exact 284 304 0.9342105 0.90022 0.9593543
binom.confint(  9, 199, method="e")
#   method x   n       mean      lower      upper
# 1  exact 9 199 0.04522613 0.02088589 0.08411464

##### specificities
binom.confint(200, 479, method="e")
#   method   x   n      mean     lower     upper
# 1  exact 200 479 0.4175365 0.3729575 0.4631398
binom.confint( 33, 196, method="e")
#   method  x   n      mean     lower     upper
# 1  exact 33 196 0.1683673 0.1188206 0.2282441
binom.confint(287, 301, method="e")
#   method   x   n      mean     lower     upper
# 1  exact 287 301 0.9534884 0.9231921 0.9743417

以下是敏感性和特异性与患病率的关系,确切的置信区间为95%:

在此处输入图片说明

那么这是怎么回事?考虑到典型的逻辑回归可能类似于下图。请注意,所有“动作”都发生在x轴的间隔[4,6]中。低于该水平的数据将具有非常低的患病率,并且该模型将显示出较差的区分度和敏感性。高于该区间的数据将具有很高的患病率,但是该模型将再次无法很好地进行区分,并且特异性较差。

在此处输入图片说明

为了帮助理解这种情况的发生,请考虑测试丙氨酸转氨酶以确定患者的肝脏是否衰竭2。想法是肝脏通常使用ALT,但是如果肝脏停止功能,则ALT将被排入血液。因此,如果患者血液中的ALT水平高于某个阈值,则表明肝脏正在衰竭。如果您抽取的肝衰竭患病率很高,那么您抽取的血液中的ALT水平就会很高。因此,您将有更多的患者超过阈值。并非所有人的ALT水平高都会导致肝功能衰竭-对于某些患者,还会有其他原因。但是那些肝功能衰竭的人应该被抓。这导致更高的灵敏度。同样,并非所有ALT水平正常的患者肝脏都健康,但是患病率较低的样本的ALT水平较低,更多的患者将通过测试。那些没有肝脏的人 失败,但ALT水平正常的人将被错过。这导致较低的灵敏度,但较高的特异性。

更一般而言,医学检查的整体思路是,某些事物或其他事物与您可能希望直接测量但不能直接测量的疾病状态相关。度量相关因素可以使您深入了解疾病状态。不正确的(潜在)测试将没有价值,也不会使用。因此,在实践中,较高的患病率样本应具有与更多异常值相关的分布,从而导致较高的灵敏度,反之亦然。(请注意,相关因素不一定是疾病的原因;在ALT示例中,这是一种影响,在其他示例中,疾病和相关因素都可能是常见原因的影响,等等。)

1.这实际上在医学上很普遍。考虑一下胆固醇应该<200,收缩压应该<140,依此类推。这些本身并不是真正的“测试”,但是有很多类似的测试。对于一些关于阈值的(也许是遥远的)相关讨论,可能有助于阅读我的答案:0-1阈值是否始终等于x轴阈值?如果我们使用p值比较两个独立的数据集为什么误报的数量与样本量无关?
2.请注意,我不是医生,这个例子很可能被严重破坏。询问实际的医生是否需要有关肝功能,其测试以及相关事项的准确信息。


谢谢!为了表明它确实在改变。但是如何考虑@Tim的答案呢?这不是矛盾的吗?
Polisetty

1
蒂姆·波利塞蒂(Polisetty)指出:“住院病人和门诊病人可能在许多方面有所不同,不仅是患病率,其他一些因素也可能影响敏感性”。如果测试是患者某些属性(例如胆固醇)的函数,并且疾病也与该属性密切相关(通常是整个问题),则“其他因素”必须与患病率。因此,当患病率发生变化时,其他相关性也发生变化,并且测试具有或多或少具有该特定人群的敏感性。
gung-恢复莫妮卡

7

正如其他人已经说过的那样,敏感性和特异性并不取决于患病率。敏感性是真实阳性在所有阳性中的比例,特异性是真实阴性在所有阴性中的比例。因此,如果灵敏度为90%,则该测试对于90%阳性的病例是正确的。显然,较小的物体的90%和较大的物体的90%仍然是90%...

因此,鉴于您提到的表格数据,

positiveconditionnegativeconditionpositivetestacnegativetestbd

灵敏度为(来自的定义条件概率)和特异性是。对于每个指标,您一次只查看其中一列,因此,流行度(列的相对大小)对于那些指标而言并不重要。患病率未纳入方程式。如果“实际”敏感性的定义与理论上的定义不同,并得出不同的结论,那将是很奇怪的。aa+b+c+d/a+ba+b+c+d=aa+b p(YX)=p(YX)p(X)da+b+c+d/c+da+b+c+d=dc+d

但是报价似乎也在说些别的

住院患者的测试敏感性可能更高,而门诊患者的测试特异性更高

所以作者说敏感性在不同的群体中是不同的。我猜想住院患者和门诊患者可能在许多方面有所不同,不仅是患病率高,而且其他一些因素也可能影响敏感性。因此,我同意它们可能会在不同的数据集之间发生变化,而这些数据集的患病率会有所不同,但这种变化将不会是患病率本身的函数(如@gung在他的回答中所示)。

另一方面,如果我不得不猜测,也许作者将敏感性与后验概率混淆了。灵敏度为,后验概率为p(positive testcondition)

p(conditionpositive test)p(positive testcondition)×p(condition)

在很多情况下,这就是人们感兴趣的概率(“检测结果呈阳性的患者实际患病的可能性有多大?”),这取决于患病率。请注意,您的链接还讨论了患病率对正预测值(即后验概率)的影响,而不是对敏感性的影响。


正如我在前面的答案之一中提到的那样,我很确定作者不会将其与后验概率混淆,因为他们明确提到“许多文本仍在声明”。我还引用了另一种说法,尽管不如哈里森的可靠,但说这是一个安全的“假设”。我想问的是,什么是“假设”?
Polisetty

2
@Polisetty我不能为作者说些什么,但是从引用的角度看,他们似乎将普遍性称为“假设”,但这是一个数学事实,然后是假设。如果不成立,那就意味着概率论被打破了,事实并非如此。
蒂姆

敏感性和特异性可以认为是诊断测试的固定属性。[这是一个简单的简化,但是对于我们的目的来说已经足够了]。-那就是它的意思
Polisetty

3

请参阅此处有关真/假正/负利率的答案

敏感性只是真实阳性率的别称,而特异性则与真实阴性率相同。敏感性和特异性都是条件概率;它们取决于患者的疾病状况。因此,该疾病(即,患病率的先验概率,一个患者具有疾病)是无关紧要的,因为你是假设特定的疾病状态。

我无法评论教科书作者为何声称敏感性和特异性取决于临床情况。这些是经验性观察吗?


究竟。因此是一个问题。测试的敏感性取决于所用人群。它是独立的假设并不总是正确的。我在问如何和为什么。该书后来也引用了值
-Polisetty

可能存在特定人群的因素会影响敏感性和特异性。但是从敏感性和特异性的数学定义可以得出,流行率不能成为这些因素之一,至少不是直接的。(顺便说一句,如果您对我对数学定义的解释感到满意,请随时接受我的回答。)
tddevlin

对不起,我想还不清楚。我想从数学上了解灵敏度和患病率之间的关系。我知道它们的定义。我猜这种关系是由于它们的计算方式而产生的。灵敏度为tp /(tp + fn),患病率为tp + fn /(tp + fn + fp + tn)
Polisetty

就像我在回答中提到的那样,敏感性和患病率之间没有关系。患病率为而敏感度为。您不能根据另一个的价值谈任何一个的价值。P + |疾病P(Disease)P(+|disease)
tddevlin

哈里森的不会错的。即使是此链接也称为简化。med.uottawa.ca/sim/data/Sensitivity_and_Prevalence_e.htm
Polisetty

1

我当然不能说出作者的意图,但是我的理由是:

将临床情况视为诊断测试本身。一个有非常敏感性和特异性较差,但测试没有少。如果您在医院里,可能会生病。如果您不在医院,就不太可能生病。

从这个角度来看,您执行的实际诊断测试实际上是串行执行的两个测试的第二部分。


在您的解释中,先验会发生变化,从而导致更大的后验概率。那是真实的。但是,敏感性本身如何变化才是问题。
Polisetty

@Polisetty如果您称高位后验为阳性测试该怎么办?“临床背景本身就是一种检验。” 我认为可以通过这种方式进行任意决定的测试来取决于患病率,因此必须更具体地定义“测试”。我认为该声明适用于基于某种代理测量阈值的通常的各种测试。
Satwik Pasani

1

这肯定是一个错误。我认为作者可能试图暗示阳性和阴性预测值(PPV和NPV)取决于患病率(以及敏感性和特异性)。这些经常与诊断测试进行讨论,对于临床医生来说,可能比对敏感性和特异性的原始解释更有价值。

该图说明了对于具有95%敏感性和85%特异性的测试,PPV和NPV之间的关系与患病率有关。

摘自Mausner JS,Kramer S:Mausner和Bahn流行病学:导论。 费城,WB桑德斯,1985年,第9页。 221。

摘自Mausner JS,Kramer S:Mausner和Bahn流行病学:导论。费城,WB桑德斯,1985年,第9页。221。


1

@ Satwik,@ gung和@Tim已经提供了很多详细信息,但是我将尝试添加一个小例子,说明潜在因素的情况如何引起这种影响。

关键原则:偏差

灵敏度/特异性和所有统计检验都具有相同的告诫:它仅适用于以无偏见的方式重复与以前相同的采样过程。

医院是运作正常的组织,旨在执行偏倚抽样,使用入院政策将普通人群过滤为需要入院和治疗的人群。这与科学程序非常对立。如果您想知道测试在不同人群中的表现,则需要在不同人群中进行测试。

潜在影响:相关性

诊断与疾病的所有其他风险因素独立/正交的情况很少见(如果您想严格一点,在现实世界中是不可能的),因此存在一定程度的相关性。

如果入院检查的画面与诊断结果呈正相关,那么您会发现,通过入院测试的人倾向于通过诊断与诊断结果成正比,与相关性成正比。因此,真实的正数会被丰富,错误的负数会减少与相关性成正比的数量。

然后,这使灵敏度显得更大。

现象的解释

因此,在基于医院的情况下灵敏度可能更高的观察并非不切实际。实际上,如果对招生政策进行了深思熟虑并且适合目的,那么人们会期望这种情况发生。

在敏感性和特异性与患病率无关的假设下,这并不是崩溃的证据,而是基于医院入院政策的抽样偏倚的证据。

给定一家医院可以治疗人而不进行科学实验,这绝对是一件好事。

但这确实使科学家头疼。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.