条件付き確率

  • bnlearnパッケージはデータから、適切な因果ネットワークをアルゴリズムに基づいて推定するパッケージ(こちら)
  • ベイジアンネットワークを与えて(Directed Acyclic Graphを作り、その各ノードに確率表を与えたもの)、さらにそこにエビデンスを設定し、エビデンスという条件のもとでの各ノード等の(条件付き)確率を再計算する
  • パッケージはgRainをインストール
    • gRainパッケージが要求するパッケージのうちgraphパッケージとRBGLパッケージはBioconductorから入手する必要があるので、ダウンロード先を指定してgraphパッケージをダウンロードしたうえで、gRainパッケージをCRAN(のミラー)からダウンロードする
  • Short-Vignettesの例
# 0/1のレベルはベイジアンネットワーク(bn)を作るのに頻用するので作っておく
# この例では、すべてのノードのレベルが1/0(yes/no)だが、そうでないものも作れる
yn <- c("yes","no")
# bnのノードを作る
# bnのノードは「ノード名称」とその「親ノード名称」と、親ノードの場合分け条件ごとの情報テーブルからなる
# ノード"asia"のテーブルを作る。asiaは、親はない("asia|hoge"なら"hoge"が親)。(事前)確率はasia=yn[1](yes)が1に対してasia=yn[2](no)に対して99の比率(アジアを訪れた確率は(情報がない段階では1%)
a <- cptable(~asia, values=c(1,99),levels=yn)
# ノードtub(結核)に関するテーブルを作る。tubはasiaだけを親とする。tubの値(レベル)はyes/no(1/0)であって、asia=yn[1]のとき、tub=yn[1]が5,tub=yn[2]が95。asia=yn[2]のとき、tub=yn[1]が1,tub=yn[2]が99。アジア訪問歴+なら結核の確率が5%、訪問歴ーなら結核の確率が1%
t.a <- cptable(~tub|asia, values=c(5,95,1,99),levels=yn)
# smokeノードのテーブルを作る。喫煙歴の事前確率は5/(5+5)
s <- cptable(~smoke, values=c(5,5), levels=yn)
# 喫煙歴に依存してlung(肺がん)の確率が決まる。喫煙歴+のとき、1/(1+9)、喫煙歴ーのとき1/(1+99)
l.s <- cptable(~lung|smoke, values=c(1,9,1,99), levels=yn)
# 慢性気管支炎も喫煙歴で決まる。喫煙歴+のとき6/(6+4)、喫煙歴ーのとき3/(3+7)
b.s <- cptable(~bronc|smoke, values=c(6,4,3,7), levels=yn)
# 『どちらか片方でも、のノード』は結核と肺がんとのどちらか片方ならyesどちらでもなければnoという表。lungとtubが(yes,yes)のときはeitherはyesが1でnoが0。同様に(yes,no),(no,yes)の場合もeitherはyesが1,noが0。lung,tubが(no,no)のときだけ、eitherはyesが0でnoが1
e.lt <- cptable(~either|lung:tub,values=c(1,0,1,0,1,0,0,1),levels=yn)
# 肺がんでも結核でも、どちらか片方でも+なら、X線の陽性所見率は98/(98+2)、どちらでもなければ陽性所見率は5/(5+95)
x.e <- cptable(~xray|either, values=c(98,2,5,95), levels=yn)
# dyspneaの症状は、慢性気管支炎か(肺がん・結核)か、その両方か、で決まる。両方なら9/(9+1),慢性気管支炎だけなら7/(7+3)、慢性気管支炎はなくて、肺がんか結核か肺がんと結核の両方なら8/(8+2)、慢性気管支炎がNoで(肺がんNo、結核No)なら、1/(1+9)
d.be <- cptable(~dysp|bronc:either, values=c(9,1,7,3,8,2,1,9), levels=yn)
# ノードのテーブルオブジェクトを渡して、bnを作る
plist <- compileCPT(list(a, t.a, s, l.s, b.s, e.lt, x.e, d.be))
plist
plist$tub
plist$either ## Notice: a logical node
net1 <- grain(plist)
net1
# 確率・条件付き確率を提示する
querygrain(net1, nodes=c("lung","bronc"), type="marginal")
querygrain(net1,nodes=c("lung","bronc"), type="joint")
# 情報を得て、確定する。アジア渡航歴があって、dyspnea症状がある、という情報
net12 <- setEvidence(net1, nodes=c("asia", "dysp"), states=c("yes", "yes"))
# 同じことは次の操作でもできる
# net12 <- setEvidence(net1, nslist=list(asia="yes", dysp="yes"))
# 肺がんかどうか、慢性気管支炎かどうかの事後確率
querygrain( net12, nodes=c("lung","bronc") )
# 肺がんと慢性気管支炎との組み合わせ四通りの事後確率
querygrain( net12, nodes=c("lung","bronc"), type="joint" )
net13 <- setEvidence(net1,nodes=c("either", "tub"), states=c("no","yes"))
pEvidence( net13 )
querygrain( net13, nodes=c("lung","bronc"), type="joint" )