中野智文

中野智文(VOYAGE GROUP)のコンピュータなどのメモ

対数尤度比(G検定の統計量)のrubyワンライナ

2015-09-11 11:31:41 | 統計・機械学習

背景

対数尤度比(G検定の検定統計量)のワンライナーが欲しいので作った。

入力

以下の様な2×2の分割表を想定。
ab
cd

入力フォーマット

下記のようなtsv
id⇔a⇔b⇔c⇔d
※ここで⇔は、tabを表す。 idは任意の文字列、a,b,c,dは整数。

出力フォーマット

下記のようなtsv
id⇔a⇔b⇔c⇔d⇔g
ここでgはG検定の検定統計量。ただし、a*d-b*cが負の時、gは負となる。

そのワンライナー

ruby -ane 'a,b,c,d=$F[1..4].map(&:to_i); n=a+b+c+d; g=[[a,a+c,a+b],[b,b+a,b+d],[c,c+a,c+d],[d,d+c,d+b]].reduce(0.0){|s,(x,x1,x2)| (x.zero?) ? s : s+x*-Math.log(x1.to_f*x2/x/n)}; g=-g if a*d-b*c<0; puts [$F[0..4],2*g].join("t")'

実行例

bash-3.2$ cat a
word1   3       0       3       56
word2   137     59      284     149520
bash-3.2$ ruby -ane 'a,b,c,d=$F[1..4].map(&:to_i); n=a+b+c+d; g=[[a,a+c,a+b],[b,b+a,b+d],[c,c+a,c+d],[d,d+c,d+b]].reduce(0.0){|s,(x,x1,x2)| (x.zero?) ? s : s+x*-Math.log(x1.to_f*x2/x/n)}; g=-g if a*d-b*c<0; puts [$F[0..4],2*g].join("t")' < a
word1   3       0       3       56      15.705805465988453
word2   137     59      284     149520  1420.6614930368132
0対策済み(分割表に0があってもエラーになることはない)。

最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。