Rでクロス集計表の残差分析

ぼやーっとツイッターを眺めていたら、[twitter:@R_Linux]先生のツイートが目に留まった。


んん、ということはクロス集計表の残差分析がさくっとできそうだな。


クロス集計表の残差分析はあまりメジャーではないかもしれませんが、χ二乗検定の下位検定として位置付けられています。
端的に言うと「ある一つのセルの観測値が期待値に比べて有意に大きいか小さいか」を検定する手法です。


詳細な解説は下記を参照してください。
群馬大青木先生による解説
雪本さんによる解説


Rでの残差分析には id:langstat さんも挑戦しています(id:langstat:20110319)。
青木先生謹製の関数もあります。 カイ二乗分布を用いる独立性の検定

ただ、どちらも調整済み残差を出力するところまでに留まっているので、ここではp値の算出と多重比較によるp値の調整までを行ってみたいと思います。
サンプルデータは クロス集計表の有意差検定 から引用させていただきます。

# クロス集計表の入力
X <- matrix(c(58, 11, 10, 35, 25, 23), nrow=3,
            dimnames=list(c("賛成", "中立", "反対"), c("男性", "女性")))
X
#      男性 女性
# 賛成   58   35
# 中立   11   25
# 反対   10   23

# 比率(縦%)を確認
round(X / apply(X,2,sum) *100, 1)
#      男性 女性
# 賛成 73.4 42.2
# 中立 13.3 31.6
# 反対 12.7 27.7

# カイ二乗検定
RES <- chisq.test(X)

# 調整残差
RES$stdres
#           男性      女性
# 賛成  4.020507 -4.020507
# 中立 -2.478523  2.478523
# 反対 -2.377772  2.377772

# 残差分析のp値を算出
p.value.matrix <- pnorm(abs(RES$stdres), lower.tail=FALSE)*2
round(p.value.matrix, 4)
#        男性   女性
# 賛成 0.0001 0.0001
# 中立 0.0132 0.0132
# 反対 0.0174 0.0174

# ホルムの方法による有意水準の調整(多重比較)
Dim <- dim(X)
p.value.matrix.holm <- matrix(p.adjust(p.value.matrix), Dim[1], Dim[2])
dimnames(p.value.matrix.holm) <- dimnames(X) 
round(p.value.matrix.holm, 4)
#        男性   女性
# 賛成 0.0003 0.0003
# 中立 0.0528 0.0528
# 反対 0.0528 0.0528

探索的な分析に結構使い勝手が良いのですよねー。