ただの陽性・陰性にしたくない

  • この記事を、ROCの関連であると読めば、こちらの続き
  • また、この記事を、大量のデータが臨床機関にストックしてあって、それを診断応用するという視点からは、こちらの続きでもある
  • いずれにしろ、検査をして、診断に活かす話(こちら)
  • 疾患陰性のときにある検査はほぼ検出限界以下か、検出可能でも、かなり低い値
  • 疾患陽性のときには、検査値は、かなり高い。「超高値」だったら、病気であるとほぼ考えるが、微妙なあたりというのがなくはない
  • そんな事情のときに、診断するためにこの検査をオーダーして、「陰性」「陽性」という結果が返ってきたとして、必ずや、その値の高低を気にして、診断に活かしていることだろう
  • では、その活かし方は、いかに??という話
# ケース・コントロールの検査値データが手元にある
# ある患者に検査を実施して得られた値から、
# その患者の疾患ありなしの尤度を計算
# Pretest probabilityがあったら、それを掛け合わせて返却

HowLikelyAfterTest<-function(x,Case,Control,p=0.5,minV=NULL,maxV=NULL){
	# x 検査している患者のデータ
	# Case の検査データ
	# Control の検査データ
	# p pretest probability to be a case
	# minV,maxV テストの最小最大値
	if(is.null(minV)){
		if(is.null(maxV)){
			H.density<-density(Control)
			D.density<-density(Case)
		}else{
			H.density<-density(Control,to=maxV)
			D.density<-density(Case,to=maxV)
		}
	}else{
		if(is.null(maxV)){
			H.density<-density(Control,from=minV)
			D.density<-density(Case,from=minV)
		}else{
			H.density<-density(Control,from=minV,to=maxV)
			D.density<-density(Case,from=minV,to=maxV)
		}
	}
	
	Hf.density<-approxfun(H.density$x,H.density$y)
	Df.density<-approxfun(D.density$x,D.density$y)

	LH<-Hf.density(x)
	LD<-Df.density(x)
	LHmat<-outer(LH,1-p,FUN="*")
	LDmat<-outer(LD,p,FUN="*")
	LHmat[is.na(LHmat)]<-0
	LDmat[is.na(LDmat)]<-0
	#LHmat<-LHmat+10^(-16)
	#LDmat<-LDmat+10^(-16)
	SumMat<-LHmat+LDmat
	list(LH=LHmat,LD=LDmat,Ppositive=LDmat/SumMat,Pnegative=LHmat/SumMat,x=x,preprob=p,Hf.density=Hf.density,Df.density=Df.density)
}


# データを作る
Nnormal<-1000
Ndisease<-1000

MeanNormal<-0
MeanDisease<-10

VarNormal<-3
VarDisease<-10

CutOff<-1

H<-abs(rnorm(Nnormal,mean=MeanNormal,sd=sqrt(VarNormal))-CutOff)
D<-abs(rnorm(Ndisease,mean=MeanDisease,sd=sqrt(VarDisease))-CutOff)

# pretest probを振る
Ppretest<-seq(from=0.01,to=0.99,by=0.01)
# これが検査値
test.x<-seq(from=0,to=15,by=1)
hlat<-HowLikelyAfterTest(test.x,D,H,p=Ppretest)

par(mfcol=c(1,2))
image(hlat$Ppositive,col=topo.colors(100))
image(hlat$Pnegative,col=topo.colors(100))
par(mfcol=c(1,1))