医療データ奮闘記

公衆衛生大学院に入った内科系専門医が医師として培った現場感と大学院で培った統計の知識を交えながら、医療や疫学や統計に関する素朴な疑問や本音をつらつら書いています。

ベイズの考え方をRで簡単に実験してみよう。

ベイズの勉強をしたいと思ったが、何をみてもいまいち実感が湧かなかったため、Rで実験したくなった。(初めの段階の理解は以下の記事参照)

yiliaojingji.hatenablog.com

頻度論とベイズは同じ式の形をしてても(同じ確率密度関数の形)解釈が違う。例えば以下のHPで説明されている

to-kei.net

しかし私自身が実際やってみないと何を言っているのかわからなかったためRで手を動かして実験してみる1

まずは頻度論の考え方

目の前にコインがあるとする。一般的にはこのコインが表になる確率は1/2だろうと考える(仮定する)。5回くらいコインを投げて全部表が出た場合に、そんな確率は0.03125(=1/32:3%ちょっと)しかないんだからこのコインはいかさまだ!!と考えるのが頻度論の考えである。

頻度論ではこのコインはまずは「理想的なコインである」と仮定して(考えて)おり、理想的なコインとしてふさわしくない行動を取るとそれはいかさまコインだと考える。

分布を考えて(plotを書いて)、それより低い所の総和(面積)が0.05%以下となっている所なのか否かを検定する事になる。

ベイズ的に考えるとこうなる。

目の前に得体の知れないコインがあるとする。 このコインがどのくらいの確率で表が出るのか(表が出る真の確率であるpの値がいくらと考えるのが妥当か)を実際やってみて(データから)推定したい。

まずは事前情報がないので、事前分布(今回は共役事前分布2としてベータ分布を使う)を一様分布:uniとする

pには「このコインが本当はどのくらいの確率で表が出やすいんだろうか」という確率が入っており、縦軸の高さはわかりやすく言うと「そのp値(表の出やすさ)が妥当な値(真の値)と決めてしまっても良いよーという度合い」が入っている3自分は理解の上でここが一番難しかった

p <- seq(from=0,to=1,length=100)
uni <- dbeta(p,1,1)
plot(p,uni)

f:id:yiliaojingji:20190509142020p:plain
uni

初めの状態は、何の情報もないので、均一(どのp値も同じくらい真の値でありうる)


次に、このコインを5回回すと、表が3回・裏が2回でたとする。

aft <- dbeta(p,1+3,1+2)
plot(p,aft)

f:id:yiliaojingji:20190509142134p:plain
aft

表が出やすいかもしれないという程度のグラフになる。(細かく言うと、今ある情報だけから考えると、pは0.5よりちょっと大きめなコインなのかもしれないな、でも他の値である確率も十分高いな)

例えばここで、本当はp=0.2じゃないか?(イカサマコインだから表は5回に1回しか出ない,というのがp=0.2の意味)とか言われると、まだその可能性も十分あるよね、もう少しやってみないとわからないよね、と返事する事になる。

さっきは表が3回・裏が2回 (3,2)としたが、自分でこの値を(4,0)とか(4,1)とか(5,1)とか自分で実験していくと、だいぶイメージがついてくると思う4


そしてそんな数回ではなくコインをどんどん回してみて、最終的には例えば表が1000回、裏が1000回出たとするとこんなグラフに成長する。

matomo <- dbeta(p,1+1000,1+1000)
plot(p,matomo,type="l") #グラフを直線表記にした

f:id:yiliaojingji:20190509142357p:plain
aft1000

だいぶ尖っている。

これをみてさっきのグラフと比較すると、p=0.5なのだろう(表が出る確率が0.5なのだろう)という考えに近づいていく事が可視化される。

つまりこれはp=0.5のまともなコインなのだろう、という結論に近づく。

ここでp=0.2じゃないか?とか言われると、さすがにそれはないんじゃないかな、といえる。

結論

どっちが良いかという結論はないだろうけど、

  • 医学系の論文ではほとんど頻度論の手法がメイン
  • 最近の統計手法(機械学習など)はベイズの手法の方がどんどん使用されている

気がするので、今後置き換わってくるかもしれない。ビジネスに使うなら人間の考え方に近いベイズなのではないだろうか。


  1. 学んだことの備忘録+自分なりの理解の追記ですので、間違いあれば教えて下さい。

  2. データを入れても事後分布と事前分布の属性が変わらないようにする分布を言う。調べてもよく解らんかったら、とりあえずはそんなに気にしなくて良い。

  3. ゼロに近いと、まあその値はとらないだろうという解釈になる

  4. こういうのはshinyで実装したら面白いので、いつかスクリプトをupする予定。縦軸の絶対値が何かは結構難しいので、今回の記事では割愛