裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

ダメ出し:ベクトルと行列の演算は,場合によって注意が必要

2012年02月23日 | ブログラミング

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

コメント (2)    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« ダメ出し対象募集中 | トップ | 全角数字列を半角数字列に変... »
最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
御指摘多謝 (bob3)
2012-02-23 20:50:14
御指摘多謝です。
確認しようとしたまま放置してしまってました……
返信する
prop.table (kaz_yos)
2012-08-19 01:33:00
本題とは、ずれますがこの例では
prop.table(X, 2)
とやるのが一番安全かと思いました。

内部的にはsweepを使っているようです。
sweep(X, 2, margin.table(X, 2), "/")
返信する

コメントを投稿

ブログラミング」カテゴリの最新記事