機械に教える医学学習2

  • 症候と診断とをグラフで整理している(こちら)
  • また、こちらからの続きでもある
  • この記事の話は集合で判断をする話。それに関連する話としてはAssociation rule learningがある(Wiki記事ryamadaブログ記事)。Association rule learningならはRのパッケージarulesもある。
  • 症候を与えられたときに、可能性のある診断名のリストを作るが、それは鑑別(するべき)診断(名の)リスト
  • 身体におきる現象(のうち、説明可能なもの)は、医学用語によって定義される
  • 身体におきる現象のうち、主観的にもしくは客観的に(比較的容易に〜あまり派手な測定機器などを用いずに)観察される現象を、症候という
    • 症状は主観的な観察、兆候は客観的な観察
  • 病気は、解剖・生理・病理などの医学用語によって定義される
    • 病気には複数の現象が混在することが多い
  • 症状をS=\{s_1,s_2,...\}と表すことにする
  • 医学用語をG=\{g_1,g_2,...\}と表すことにする
  • 病気・診断名をD=\{d_1,d_2,...\}と表すことにする
  • 症状と医学用語との関係は、s_i\Gamma_{s_i}=\{\gamma_{s_{i,1}},\gamma_{s_{i,2}},...\}; \gamma \subset Gのように、Gの1個以上の部分集合と対応づく
    • s_iを有する、という情報が与えられたとき\Gamma_{s_i}のうちの(通常は)1つの部分集合が体内に存在すると判断する
  • 病気・診断名と医学用語との関係も、d_j\Gamma_{d_j}=\{\gamma_{d_{j,1}},\gamma_{d_{j,2}},...\}; \gamma \subset Gのように、Gの1個以上の部分集合と対応づく
    • d_jとの診断が下されるべき状態においては、\Gamma_{d_j}のうちの(通常は)1つの部分集合が内々に存在するとみなされている
  • では、s_id_jとの関係はどうなっているのか
    • s_iに対応する\Gamma_{s_i}の要素のいずれか(\gamma_{s_{i,p}})が、d_jに対応する\Gamma_{d_j}の要素のいずれか(\gamma_{d_{j,q}}の部分集合になっているとき、s_iという症候をみたら、疾患d_jを鑑別診断リストに入れることが適当なのだろう
      • \exists p,q \gamma_{s_{i,p}} \subset \gamma_{d_{j,q}} \Rightarrow Pr(d_j | s_i) > k,ただし、kは鑑別診断リストに挙げるに足るだけの確率の閾値
  • Rでやってみよう
    • s_i,d_jに対応する部分集合を総当たりで比較する
    • 比較する2つの部分集合の共通要素数を数える
    • 共通要素数の数がs_iの要素数と同じであれば、subsetであるということ
    • subsetであるか否かの判断もしつつ、どのくらいsubsetに近いかも定量するべく、s_i,d_jの要素数と、共通要素数/s_iの要素数の3つの値をすべての総当たりについて3次元アレイで返す処理が以下
# ノード数を指定
n.v <- 20
# ある症候について、3通りの用語セットを与える

s.list <- list()

s.list[[1]] <- sample(1:n.v,3)
s.list[[2]] <- sample(1:n.v,3)
s.list[[3]] <- sample(1:n.v,3)

# ある診断名について、2通りの用語セットを与える
d.list <- list()

d.list[[1]] <- sample(1:n.v,8)
d.list[[2]] <- sample(1:n.v,7)

# 症候の用語セットのリストと、診断名の用語セットのリストをとって、総当たり比較する関数
# 総当たりの上、その場合の症候の要素数と診断名の要素数と、2つの共通要素数/症候の要素数という比の値を返す

diff.dig <- function(s.list,d.list){
	#s.l <- lapply(s.list,sort)
	# 念のため2つの要素セットのリストについて、要素重複をなくす
	s.l <- lapply(s.list,unique)
	#d.l <- lapply(d.list,sort)
	d.l <- lapply(d.list,unique)
	# 返り値を格納する3次元アレイ
	ret <- array(0,c(length(s.l),length(d.l),3))
	# すべての要素セット同士の総当たり
	for(i in 1:length(s.l)){
		for(j in 1:length(d.l)){
			tmp <- sort(c(length(s.l[[i]]),length(d.l[[j]])))
			
			shorter <- tmp[1]
			unique.len <- length(unique(c(s.l[[i]],d.l[[j]])))
			union.len <- length(s.l[[i]]) + length(d.l[[j]]) - unique.len
			ret[i,j,] <- c(length(s.l[[i]]),length(d.l[[j]]),union.len / length(s.l[[i]]))
		}
	}
	return(ret)
}

diff.dig(s.list,d.list)



diff.dig(s.list,d.list)
    • 初めの3x2行列は、3x2=6総当たり通りのそれぞれについてのs_iの要素数。第二の3x2行列は、d_jの要素数。第三の3x2行列は、共通要素数/s_iの要素数
> diff.dig(s.list,d.list)
, , 1

     [,1] [,2]
[1,]    3    3
[2,]    3    3
[3,]    3    3

, , 2

     [,1] [,2]
[1,]    8    7
[2,]    8    7
[3,]    8    7

, , 3

          [,1]      [,2]
[1,] 0.3333333 0.6666667
[2,] 0.6666667 0.3333333
[3,] 0.0000000 0.3333333