[戻る]

Fisherの正確確率検定(2×2分割表)


2×2の分割表があったときに、「第一の分類基準でどちらかになるかによって、もう一つの分類基準がどちらになるかが影響されるかどうか」という問題を検定します。 例えば、ある種類の蝶を採集して性別に分類をしたときに、地域Aでは12頭の♂と25頭の♀が採取され、地域Bで32頭の♂と30頭の♀が採集された場合に、この地域AとBとの間には性比の差があるかどうかを検定します。



半角文字列で入力して下さい。 最初から表示されている数列は入力例です。
事象Aの観測数 事象Bの観測数
事象1の観測数:
事象2の観測数:



ソースコード(Ruby)

# 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






戻る