目的 2×2 分割表において,フィッシャーの正確確率検定を行う。 R には fisher.test があるが,この関数では fisher.test が計算する Fisher の方法による P 値と同時に,Pearson の方法による P 値も計算する(オッズ比を基準にするものも計算する)。 使用法 my.fisher(x) 引数 x 2×2 分割表を表す,2×2 行列 ソース インストールは,以下の 1 行をコピーし,R コンソールにペーストする source("http://aoki2.si.gunma-u.ac.jp/R/src/my_fisher.R", encoding="euc-jp") # 2×2 分割表のフィッシャーの正確確率検定 my.fisher <- function(x) # 2×2 分割表 { odds.ratio <- function(a, b, c, d) # オッズ比を求める関数 { if (a*b*c*d == 0) { # セルのどれかが 0 の場合 a <- a+0.5 # それぞれに 0.5 を加える b <- b+0.5 c <- c+0.5 d <- d+0.5 } res <- a*d/(b*c) # オッズ比 return(max(res, 1/res)) # どちらか大きい方を返す } stats <- function(i) { e <- (a <- i[1]) + (b <- i[2]) f <- (c <- i[3]) + (d <- i[4]) n <- (g <- a+c) + (h <- b+d) return(c(n*(a*d-b*c)^2/(e*f*g*h), # カイ二乗値 odds.ratio(a, b, c, d), # オッズ比 exp(lchoose(e, a)+lchoose(f, c)-lchoose(n, g)))) # 生起確率 } ct <- colSums(x) # 列和 rt <- rowSums(x) # 行和 n <- sum(x) # 総合計 mx <- min(rt[1], ct[1]) # a が取り得る最大値 mi <- max(0, rt[1]+ct[1]-n) # a が取り得る最小値 A <- mi:mx # a のベクトル B <- rt[1]-A # b のベクトル C <- ct[1]-A # c のベクトル D <- ct[2]-B # d のベクトル Cell <- cbind(A, B, C, D) # 行方向の 4 つの数値が一つの分割表 result<-apply(Cell, 1, stats) # 行方向の 4 つの数値に,stats 関数を適用 Chi.sq <- result[1,] # カイ二乗値ベクトル OddsRatio <- result[2,] # オッズ比ベクトル Probability <- result[3,] # 生起確率ベクトル Cum.Prob1 <- cumsum(Probability) # 生起確率の累積和 Cum.Prob2 <- rev(cumsum(rev(Probability))) # 逆方向からの生起確率の累積和 Pearson <- Chi.sq >= stats(c(x))[1]-1e-15 # カイ二乗値から判定した P 値に算入すべきセル Fisher <- Probability <= stats(c(x))[3]+1e-15 # フィッシャーの定義による P 値に算入すべきセル OR <- OddsRatio >= stats(c(x))[2]-1e-15 # オッズ比から判定した P 値に算入すべきセル p.Pearson <- sum(Probability[Pearson]) # カイ二乗値から判定した P 値 p.Fisher <- sum(Probability[Fisher]) # フィッシャーの定義による P 値 p.OR <- sum(Probability[OR]) # オッズ比から判定した P 値 return(list(result=cbind(Cell, Chi.sq, Probability, OddsRatio, Pearson, Fisher, OR, Cum.Prob1, Cum.Prob2), p.Pearson=p.Pearson, p.Fisher=p.Fisher, p.OR=p.OR)) } 使用例 my.fisher(matrix(c(10, 13, 16, 61), nc=2, byrow=TRUE)) 出力結果例 > my.fisher(matrix(c(10, 13, 16, 61), nc=2, byrow=TRUE)) # 一行がそれぞれ,可能な2×2分割表 # A, B, C, D は各セルの値 # Chi.sq は,カイ二乗値(連続性の修正なし) # Probability は,分割表の生起確率 # Pearson は,カイ二乗値が観察された分割表のカイ二乗値以上の場合に 1 を取る(Pearson の基準による) # Fisher は,生起確率が観察された分割表の生起確率以下の場合に 1 を取る(Fisher の基準による) # Cum.Prob1, Cum.Prob2 は両端からの累積確率(片側検定の時に利用できる) $result A B C D Chi.sq Probability OddsRatio Pearson Fisher OR Cum.Prob1 Cum.Prob2 [1,] 0 23 26 51 1.049491e+01 3.317552e-04 24.184466 1 1 1 0.0003317552 1.000000e+00 [2,] 1 22 25 52 7.278386e+00 3.815185e-03 10.576923 1 1 1 0.0041469406 9.996682e-01 [3,] 2 21 24 53 4.648818e+00 1.979577e-02 4.754717 0 1 1 0.0239427135 9.958531e-01 [4,] 3 20 23 54 2.606207e+00 6.158685e-02 2.839506 0 0 0 0.0855295626 9.760573e-01 [5,] 4 19 22 55 1.150553e+00 1.287725e-01 1.900000 0 0 0 0.2143020653 9.144704e-01 [6,] 5 18 21 56 2.818568e-01 1.922390e-01 1.350000 0 0 0 0.4065410157 7.856979e-01 [7,] 6 17 20 57 1.173914e-04 2.124746e-01 1.005882 0 0 0 0.6190156452 5.934590e-01 [8,] 7 16 19 58 3.053351e-01 1.779344e-01 1.335526 0 0 0 0.7969500639 3.809844e-01 [9,] 8 15 18 59 1.197510e+00 1.146018e-01 1.748148 0 0 0 0.9115518929 2.030499e-01 [10,] 9 14 17 60 2.676642e+00 5.730091e-02 2.268908 0 0 0 0.9688528074 8.844811e-02 [11,] 10 13 16 61 4.742731e+00 2.235675e-02 2.932692 1 1 1 0.9912095577 3.114719e-02 [12,] 11 12 15 62 7.395777e+00 6.818481e-03 3.788889 1 1 1 0.9980280387 8.790442e-03 [13,] 12 11 14 63 1.063578e+01 1.623448e-03 4.909091 1 1 1 0.9996514866 1.971961e-03 [14,] 13 10 13 64 1.446274e+01 3.004940e-04 6.400000 1 1 1 0.9999519805 3.485134e-04 [15,] 14 9 12 65 1.887666e+01 4.292771e-05 8.425926 1 1 1 0.9999949082 4.801948e-05 [16,] 15 8 11 66 2.387753e+01 4.683023e-06 11.250000 1 1 1 0.9999995913 5.091772e-06 [17,] 16 7 10 67 2.946536e+01 3.844272e-07 15.314286 1 1 1 0.9999999757 4.087489e-07 [18,] 17 6 9 68 3.564015e+01 2.327847e-08 21.407407 1 1 1 0.9999999990 2.432162e-08 [19,] 18 5 8 69 4.240190e+01 1.012107e-09 31.050000 1 1 1 1.0000000000 1.043154e-09 [20,] 19 4 7 70 4.975060e+01 3.043931e-11 47.500000 1 1 1 1.0000000000 3.104672e-11 [21,] 20 3 6 71 5.768626e+01 6.002118e-13 78.888889 1 1 1 1.0000000000 6.074018e-13 [22,] 21 2 5 72 6.620888e+01 7.145379e-15 151.200000 1 1 1 1.0000000000 7.189975e-15 [23,] 22 1 4 73 7.531845e+01 4.449177e-17 401.500000 1 1 1 1.0000000000 4.459634e-17 [24,] 23 0 3 74 8.501499e+01 1.045635e-19 1000.428571 1 1 1 1.0000000000 1.045635e-19 $p.Pearson # Pearson の基準による P 値(上記 Pearson の列が 1 になっている生起確率の和) [1] 0.03529413 $p.Fisher # Fisher の基準による P 値(上記 Fisher の列が 1 になっている生起確率の和) [1] 0.05508991 $p.OR # オッズ比を基準としたときの P 値(上記 OR の列が 1 になっている生起確率の和) [1] 0.05508991 # 上記三つの P 値はほとんどの場合に同じになるが,上述の例のように違う結果になることもままある。 # R の fisher.test は,当然ながら(?) Fisher の基準によるものである。 > fisher.test(matrix(c(10, 13, 16, 61), nc=2, byrow=TRUE)) Fisher's Exact Test for Count Data data: matrix(c(10, 13, 16, 61), nc = 2, byrow = TRUE) p-value = 0.05509 以下略 解説ページ