2017年4月13日木曜日

table関数の出力結果をmatrixに変換して、corresp関数で対応分析を行う(R言語)

 ↓この本に載っていた例で、

Rによるデータサイエンス データ解析の基礎から最新手法まで
Rによるデータサイエンス データ解析の基礎から最新手法まで

library(MASS)
caith

       fair red medium dark black
blue    326  38    241  110     3
light   688 116    584  188     4
medium  343  84    909  412    26
dark     98  48    403  681    85

↑このようなデータ(縦に並んでいるのが目の色、横に並んでいるのが髪の色)に対して、↓こんな感じで対応分析を行う、という例が載っていました。

caith.ca <- corresp(caith, nf=4)
biplot(caith.ca)

Rでのcaithデータの対応分析結果

と、ここまでが前置き。

今、手元にあるのが↓こんなデータだった、としましょう。

gender <- c("M","M","M","M","F","F","F","F","F","F")
blood  <- c("A","B","B","O","A","B","A","O","A","AB")

gender.blood <- data.frame(gender, blood)

gender.blood

   gender blood
1       M     A
2       M     B
3       M     B
4       M     O
5       F     A
6       F     B
7       F     A
8       F     O
9       F     A
10      F    AB

このデータに対して対応分析を行いたい、としましょう。

先ほどのデータと違うのは、まだ集計されていないデータであるということ。correspの入力はクロス集計して分割表になったものでしたので、その形式にしてやらなければなりません。

こういうときにはtable関数ですね

gender.blood.tbl <- table(gender.blood)
gender.blood.tbl

      blood
gender A AB B O
     F 3  1 1 1
     M 1  0 2 1

うん、集計されました。でも、これをそのまま corresp(gender.blood.tbl[,]) とやっちゃうと、「invalid table specification」というエラーが出ちゃうんですよね。どうやら、table型は受け付けてくれないようです。

そういうときは、↓こんな風に書いてやると、テーブルがmatrixになるみたいで、corresp関数が入力を受け付けてくれます。

gender.blood.tbl.ca <- corresp(gender.blood.tbl[,], nf=2)
biplot(gender.blood.tbl.ca)

データはデタラメなので、表示結果についてはスルーしてください。