疾患が一様でないとき

  • 関節リウマチを例に取ろう
  • 以下の議論は「RF(+)リウマチとRF(-)リウマチ」という2種類のリウマチがあるので、厳密には、「診断確定のための検査」とは議論が異なるのだが、そのことはまた別の機会に書くとして。(気になる場合には、何かほかの検査なり情報なりに置き換えて考えるのがよいと思います)
  • 関節リウマチに比較的特異的な検査にリウマトイド因子(RF)がある
  • このRFをあるコミュニティの個人の全員に実施したとする
  • このコミュニティには、関節リウマチの患者が含まれ、その割合は有病率(a+b)
  • このコミュニティの関節リウマチ患者のうち、RF陽性の者(a)は、RF(+)リウマチ患者と呼ばれ、RF(-)の者(b)はRF(-)リウマチ患者と呼ばれる。2種類のリウマチは、成因・治療反応性・予後などについて、違いがあるものと考えられている
  • 他方、関節リウマチでなくとも、ある一定の割合のものはRF(+)となる(c)
疾患の有無 RF(+) RF(-)
+ a b a+b
- c d c+d
a+c b+d a+b+c+d=1
  • このテーブルを元にすると、有病率はa+b、感度は\frac{a}{a+b}、特異度は\frac{d}{c+d}
  • このような状況でRFを用いて、診断の助けにしようとするならば、リウマチであるという事前確率は有病率そのものであって、a+b、RF(+)であれば、PPVは\frac{a}{a+c}、NPVは\frac{d}{b+d}
  • 今、あるリウマチ専門の医療機関で同様の集計を取ったとする
疾患の有無 RF(+) RF(-)
+ a' b' a'+b'
- c' d' c'+d'
a'+c' b'+d' a'+b'+c'+d'=1
  • このような表から、この医療機関における、RF検査の感度・特異度・PPV・NPVは算出できるだろう
  • よくある感度・特異度・PPV・NPVの説明では、感度・特異度は適用対象集団の構成によらずに一定で、有病率(事前確率)だけが変化するように考える
  • しかしながら、このクリニックでの表は、このクリニックでの集計をすれば得られるわけだから、表の自由度は3だろう(a,b,c,dの4つの変数が、a+b+c+d=1という1つの制約を持っているから、4-1=3で、3)
  • 他方、コミュニティ全体の方も自由度は3(有病率と感度と特異度を決めたら、それで表全体もPPVもNPVも決まる)
  • このように、自由度3同士の2つの表で、ちょうどうまい具合に、感度・特異度が揃うとは限らない
  • では、感度・特異度が変化する(もちろんPPV・NPVも変化する)のはどうして?
  • それはこのクリニックの受診集団が、母集団とずれているから
  • そのずれの理由は
    • リウマチの疑いが高い人が訪れる
    • 1次医療機関で診断がつかない人が訪れる
    • 検診で引っかかって、念のため、としてやってくる
  • これらの要因は、事前確率(a'+b')を高めたり低めたりする
  • それ以外に、RF(+)リウマチとRF(-)リウマチの構成比も変化する
  • では、医療機関で、「コミュニティ」での感度・特異度(とそこから決まるPPV・NPV)を使うことの、精度とか是非とかは、どうやって決まるのだろうか?
  • また、年齢・性別・問診・身体所見などによって、リウマチである事前確率が上下し、その上で検査結果を適用しPPV・NPVを考えることは常道だが、そもそも、「事前情報」でリウマチらしい人と、らしくない人とを別々に集計してテーブルを作れば、そこから決まる、感度・特異度・PPV・NPVも変化してくるが、それはどうする?
  • 以下は、こんなことを考えるときのRの落書き
u<-0.9
v<-0.8
x<-seq(from=0,to=1,length=20)
p<-u*x/(u*x+(1-v)*(1-x))
plot(x,p,type="l")
q<-v*(1-x)/((1-u)*x+v*(1-x))
plot(x,q)
plot(x,q,type="l")

matplot(t(cbind(1-q,x,p)),type="l")

N<-2

P<-c(0.6,0.4)

Table<-list()
Table[[1]]<-matrix(c(0.2,0.1,0.3,0.4),byrow=TRUE,2,2)
Table[[2]]<-matrix(c(0.6,0.2,0.1,0.1),byrow=TRUE,2,2)

Whole<-matrix(0,2,2)
for(i in 1:N){
	Whole<-Whole+P[i]*Table[[i]]
}
Whole
Table

mySSPN<-function(t){
	list(sens=t[1,1]/(t[1,1]+t[1,2]),
	spec=t[2,2]/(t[2,1]+t[2,2]),
	PPV=t[1,1]/(t[1,1]+t[2,1]),
	NPV=t[2,2]/(t[1,2]+t[2,2]))
}

mySSPN(Table[[1]])
mySSPN(Table[[2]])
mySSPN(Whole)