Yatesの補正について
院生の相談に乗っていて気付いたが、chisq.test()やprop.test()は、2行2列でないと、correct=TRUEをつけてもYatesの連続性の修正をしてくれない。強引にやらせる方法としては、例えばHitchcock, David B. (2009). Yates and Contingency Tables: 75 Years Later. Retrieved 4/8/2015 from: University of South Carolinaに書かれている式を使うと、
chisqY.test
<- function(.X) {
.EX <- outer(rowSums(.X), colSums(.X))/sum(.X)
# same as chisq.test(.X)$expected
X2Y <-
sum((abs(.X-.EX)-0.5)^2/.EX)
DF <- (NROW(.X)-1)*(NCOL(.X)-1)
# same as chisq.test(.X)$parameter
list(chisq.Yates=X2Y, df= DF, p.value=1-pchisq(X2Y, DF))
}
と関数定義してから、chisqY.test()を使えば、行数か列数、あるいはその両方が3以上でも、強引にYatesの補正をしてくれる。
なお、当初は内部で期待度数と自由度を得るためにchisq.test()を呼び出すとき、期待度数が5より小さいセルがセル数の20%以上あると警告メッセージが表示されたので、chisq.test()を呼ばない形に書き換えた。
また、chisq.test()やprop.test()のYatesの補正では、0.5ではなく、min(0.5, abs(.X - .EX)を補正項としているので、2行2列の場合でも結果は必ずしも一致しない点にも注意。
けれども、前掲Hitchcock (2009)にあるように、そういう場合は素直にfisher.test()を使えば良いので、無理にYatesの補正をするのは筋が良くない。そもそも、Yatesの補正をすべきかどうかについては論戦が繰り広げられてきたところだし、独立性の検定よりも関連性を示した方が情報量が維持されるので良いのではないかとも思われる。
コメント
コメントを投稿