鑑別診断・診断過程〜あいまいな「確率情報」を活用して判断するための準備2

  • この記事の構成
  • 鑑別診断・診断過程・診断支援システムの基礎的な動きについて考えてみる
  • 非常に大きなデータソースがあって、「最終診断名」がある。その診断名に至るにあたって、ありとあらゆる情報取得(主訴、随伴症状、検査結果、他)があるとする
  • それを利用可能とする
  • 情報同士は、独立ではないのだが、独立でなくすると、あっという間に面倒くさくなるので、独立であるとして、どのように確率・尤度が変化するかを見ることにする
  • このデータソースと検査の利用については次の記事に続く
#Number of records
# データソースの診断が下された数
Nr<-10000

#Number of Questions(1番目は主訴、2番目以降は、陽性・陰性の検査)
Nq<-10
#Number of categories per Questions
Cs<-rep(2,Nq)
# 主訴はこの世に5種類だけあるとする
Cs[1]<-5

#Fianl Diagnosis
#Number of types of Dx
# 診断名はこの世に3種類だけあるとする
Nd<-3

#主訴や検査の結果のData行列
Q<-matrix(0,Nr,Nq)
for(i in 1:Nq){
	Q[,i]<-sample(1:Cs[i],Nr,replace=TRUE)
}
# 診断名のベクトル
D<-sample(1:Nd,Nr,replace=TRUE)

# 尤度を考える
# 個々の情報項目ファクターごとの、診断名の尤度
for(i in 1:Nq){
	print(paste("Q",i,"の分割表"))
	tmpt<-as.matrix(table(Q[,i],D))
	print(tmpt)
	print(paste("診断名ごとの情報項目ファクターの確率"))
	tmpt2<-tmpt/apply(tmpt,2,sum)
	print(tmpt2)
	print(paste("情報項目ファクターごとの診断名の尤度"))
	tmpt3<-tmpt2/apply(tmpt2,1,sum)
	print(tmpt3)
}

# 事前確率
print("事前確率〜有病率")
preprob<-table(D)/Nr
print(preprob)

# 主訴Q1から始めて、その他の情報を取って行ったら、こうだった、というときを考える
H<-rep(0,Nq)
for(i in 1:Nq){
	H[i]<-sample(1:Cs[i],1)
}

# すべての質問の答えは「独立」に活用するとすれば積
ProbHistory<-matrix(0,1+Nq,length(preprob))
ProbHistory[1,]<-preprob
for(i in 1:Nq){
	print(paste("Q",i,"の分割表"))
	tmpt<-as.matrix(table(Q[,i],D))
	print(tmpt)
	print(paste("診断名ごとの質問項目ファクターの確率"))
	tmpt2<-tmpt/apply(tmpt,2,sum)
	print(tmpt2)
	print(paste("質問項目ファクターごとの診断名の尤度"))
	tmpt3<-tmpt2/apply(tmpt2,1,sum)
	print(tmpt3)

	ProbHistory[i+1,]<-ProbHistory[i,]*tmpt3[H[i],]
	ProbHistory[i+1,]<-ProbHistory[i+1,]/sum(ProbHistory[i+1,])
}
# 診断名の事前確率→事後確率 が、情報収集につれて変化する様子
matplot(ProbHistory,type="l")