2011-05-21 ■Rでクロス集計表の残差分析 にて
# クロス集計表の入力
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
これに対して,「縦方向%が間違っているんじゃないか」というコメントがある
これは,コメントした人が正解。
round(X / apply(X,2,sum) *100, 1) は,まちがい
X / apply(X,2,sum) は,正しいベクトル演算をやるためには t(t(X) / apply(X,2,sum)) でなければならない。
t(t(foo) ...) は,冗長に見えるかも知れないが,必須。
また,apply(X,2,sum) は colSums(X) とするのが,吉。
で,正解は以下の通り。
> round(t(t(X) / colSums(X)) * 100, 1)
男性 女性
賛成 73.4 42.2
中立 13.9 30.1
反対 12.7 27.7
蛇足ながら,あたりまえだけど,横%は t(t(foo) ...) は不要。
> round(X / rowSums(X) * 100, 1)
男性 女性
賛成 62.4 37.6
中立 30.6 69.4
反対 30.3 69.7