outcome 1 outcome 2
group 1 a b
group 2 c d

R で複数の 2 x 2 分割表に対して Fisher の検定で正確な p 値を計算したい, という課題にぶつかったので, 各セルの数値を束ねた行列に対して p 値を算出するコードを書いた.
stackoverflow にも 似た質問 があったので参照のこと.

fisher.test

2 x 2 分割表 (2 x 2 contingency table) の独立性の検定には, 一般的に x2 検定 (Chi-square test) が用いられるが, これは頻度が少なくなると近似が悪くなるので, その場合は正確な p 値を計算する Fisher の正確な検定 (Fisher exact test) を行う方が適している.

R では組み込みの fisher.test で p 値を算出できる.
この関数はオッズ比と信頼区間も出力するが, こちらは計算方法が異なるので注意が必要.

こうした正確な検定は計算量が多いため, 処理に時間がかかる.

Fisher test on each row of data table

普段使う dplyrdata.table に加え, snow での並列化を前提とした.

下記のコードは, 分割表のセルの数値を束ねた data.table の各行に fisher.test を実行し, p 値, オッズ比と信頼区間を含めた data.table を返す.

parallel は detectCores() に使った.

下記は dplyr, data.table, snow を使わないコード.
並列化はしていない. row_fisher は上と同じ関数.

まとめ

R では for ループを使いたくないので apply のファミリーで何とかする.
snow で並列化もしているのでそこそこ速い.

参考文献

  1. 丹後 俊郎 (1993). 新版 医学への統計学 (統計ライブラリー), 朝倉書店.