2×2分割表のイエーツの補正     Last modified: Dec 26, 2005 Dec 17, 2013

信州大学の鈴木先生から,R のプログラムが修正されているようだとの情報を頂きました。 さかのぼって調べてみたところ,R-2.15.1 から変更があったようです。この変更により,chisq.test(matrix(11:14, 2)) のカイ二乗値は 0 と出力されるようになりました。

> grep YATES ./R-2.15.0/src/library/stats/R/chisq.test.R
                YATES <- 0.5

> grep YATES ./R-2.15.1/src/library/stats/R/chisq.test.R
                YATES <- min(0.5, abs(x-E))                          # ここで(こっそりと?)細工しましたね
以下,何を問題としていたかが分かるように,残しておく。


当初,RjpWikiの「何でも掲示板」へ書いたのだが,迷惑になりそうなので,こちらの方へ引き取ることにした。


R で,2×2分割表の独立性の検定を行う関数は,chisq.test である。この関数は,しかし,
11 12
13 14
のときに,イエーツの補正をしてカイ二乗検定すると,間違った答えを出す(と私は考えた)。
	> chisq.test(matrix(11:14, 2))
		Pearson's Chi-squared test with Yates' continuity correction
	data:  matrix(11:14, 2) 
	X-squared = 0.0683, df = 1, p-value = 0.7939
正しい答えは
	X-squared = 0, df = 1, p-value = 1
と思われる。プログラムの修正は以下のようにでもなるだろうか。
	#           if (correct && nrow(x) == 2 && ncol(x) == 2) {
	#               YATES <- 0.5
	#               METHOD <- paste(METHOD, "with Yates' continuity correction")
	#           }
	#           else YATES <- 0
	#           STATISTIC <- sum((abs(x - E) - YATES)^2/E)
	## replace begin
	            if (correct && nrow(x) == 2 && ncol(x) == 2) {
	                STATISTIC <- if (abs(x[1,1]*x[2,2]-x[1,2]*x[2,1]) < sum(x)/2) 0    
	                             else sum((abs(x - E) - 0.5)^2/E)
	                METHOD <- paste(METHOD, "with Yates' continuity correction")
	            }
	            else STATISTIC <- sum((abs(x - E))^2/E)
	## replace end
 しかし,R のメンテナンスをしている人たちは,「Yates の原典に従っているのだから,これで良いのだ」と言う。「イエーツの補正(連続性の修正)を取り上げたどのような文献・資料でも,そのような取り扱いはない」と言う。
 しかし,原典にどう書いてあるかというのとは問題の質が違うように思うのだ。
 「同じ答えを返すはずの prop.test が以下のような答えを返すのだが?」という問いかけをしても,その意図を理解してくれない。prop.test の方を修正しそうな雰囲気だ。
	> prop.test(matrix(11:14, 2))
		2-sample test for equality of proportions with continuity correction
	data:  matrix(11:14, 2) 
	X-squared = 0, df = 1, p-value = 1
	    以下略

 さらに,「SPSS も,このような場合にはカイ二乗値として 0,対応する P 値として 1 を返すんだけど?」と言う指摘は,はなから無視のようで。

 イエーツの補正(連続性の修正)は,しない方が良いという議論の方が優勢なようなのと,このような違いは実質上たいした違いではないというのは議論するつもりはない。


他の統計ソフトがどんなことをやっているのか調査

	ChiSq.=0, P-value=1 派
	  R(prop.test), SPSS, SAS, StatView, HALWIN
	ChiSq.≠0, P-value≠1 派
	  R(chisq.test), S-PLUS(chisq.test), STATISTICA
	イエーツの修正なんかやらない派
	  JMP, STATA
  1. SPSS は Chisq=0, P-value=1 になる。
  2. HALWIN は SPSS と同じだなぁ。
  3. SAS も SPSS と同じだそうだ。
  4. StatView 5.0.1 のデモ版でも,SPSS と同じになる。正規版でも同じだろうかなぁ。
  5. JMP のデモ版もあるんだけど,どうやって分析するのかわからん。調べたら,イエーツの補正は計算されないみたいだ。
  6. STATA のマニュアルにも,イエーツの補正は記述されていないみたいだ。
  7. S-PLUS の chisq.test は R と同じだが,prop.test は R とは違う。
  8. SSP は,イエーツの補正オプションはない。Smith's Statistical Package

★ S-PLUS の prop.test のヘルプの correct の説明は R より詳しい。

correct:
logical flag: if TRUE, Yates' continuity correction will be applied, but only under certain conditions. When there is only one group, the continuity correction may not exceed in magnitude the difference between the sample proportion x/n and the hypothesized true probability of success. When there are two groups, and p is NULL, then the continuity correction may not exceed in magnitude the difference between the sample proportions. When there are more than two groups, the continuity correction is never used. See Section DETAILS for an algebraic definition of the continuity correction.

 つまり,S-PLUS では,上記のような状況が発生した場合,イエーツの補正はしない。たとえ,引数で指定されてもやらない。


Web 上のオンライン解析を見てみよう

例として,
11 12
13 14
を取り上げる。

R における取り扱いは以下のようである。
イエーツの補正 χ2 P 値
chisq.test あり 0.0683 0.7939
なし 5e-04 0.9819
prop.test あり 0 1
なし 5e-04 0.9819


文献調査の結果

★ スネデカー,コクラン「統計的方法 原書第6版」,岩波書店は古い本だが権威はあるだろう。204ページに「ときどき尋ねられる問題は,|r-np| が 1/2 よりも小さいときにも χ2 に 1/2 補正を適用すべきか否かということである。...そのような場合の答は χ2 の補正値をゼロとすることである。... χ2 = 0。

★ 繁桝,柳井,森編著「Q&Aで知る統計データ解析 DOs and DON'Ts」サイエンス社には「abs(ad-bc)-n/2 がマイナスになったら0にせよ(46ページ)」と書いてある。

★ SPSS が使用しているアルゴリズムについては,ダウンロードできる。そこには,ばっちり SPSS が採用しているアルゴリズムが書いてあった。

algorithm
fij: Sum of cell weights for cases in cell i j
cj: the jth column subtotal 
ri: the ith row subtotal 
W: the grand total


R の correct = TRUE の扱いがおかしいというのを目に見えるようにしよう

以下の二つを,同じに扱っていいわけがない
	5   5		ChiSq = 20*( abs(5*5-5*5) - 20/2 ) ^ 2 / (10*10*10*10) = 0.2
	5   5		abs(5*5-5*5) - 20/2 = 0 - 10 = -10

	4   6		ChiSq = 20*( abs(4*4-6*6) - 20/2 ) ^ 2 / (10*10*10*10) = 0.2
	6   4		abs(4*4-6*6) - 20/2 = 20 -10 = 10


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI