2×2の分割表があったときに、「第一の分類基準でどちらかになるかによって、もう一つの分類基準がどちらになるかが影響されるかどうか」という問題を検定します。 例えば、ある種類の蝶を採集して性別に分類をしたときに、地域Aでは12頭の♂と25頭の♀が採取され、地域Bで32頭の♂と30頭の♀が採集された場合に、この地域AとBとの間には性比の差があるかどうかを検定します。
半角文字列で入力して下さい。 最初から表示されている数列は入力例です。
# Fisher's exact probability test (2*2 tables) # (C) Copyright 2002, Hisashi SATO # # combination(x,y)は組合せの数を求めるメソッド def fisher1(a,b,c,d) # 入力数値例では、a=12 , b=25 , c=32 , d=30 disproportion = a/(a+b).to_f - c/(c+d).to_f if disproportion == 0.0 then return 1.0 elsif disproportion < 0 then x , y = a , b a , b = c , d c , d = x , y disproportion = -1 * disproportion end case_1 = 0.0 # 片側のケース数算出 loop = min (c,b) for i in 0..loop case_1 += combination(a+c,c-i) * combination(b+d,b-i) end while disproportion > c/(c+d).to_f - a/(a+b).to_f && a != 0 && d!= 0 a -= 1; b += 1; c += 1; d -= 1 end case_2 = 0.0 # 残りの片側ケース数算出 loop = min (a,d) if disproportion <= c/(c+d).to_f - a/(a+b).to_f then for i in 0..loop case_2 += combination(a+c,a-i) * combination(b+d,d-i) end end case_all = combination(a+b+c+d,a+b) # 全ケース数算出 return (case_1 + case_2) / case_all end