R_ftableの属性 のバックアップ(No.13) - アールメカブ

アールメカブ


R_ftableの属性 のバックアップ(No.13)


Rの備忘録

ftable()とは,こんな関数.
x <- rep(c("A","B"), 3)
x
[1] "A" "B" "A" "B" "A" "B"
y <- rep(c("a","b"), 3)
y
[1] "a" "b" "a" "b" "a" "b"
z <- rep(c("z","w"), 3)
z
[1] "z" "w" "z" "w" "z" "w"
zz <- rep(c("aa","bb","cc"), 2)
zz
[1] "aa" "bb" "cc" "aa" "bb" "cc"
ftable(xtabs(~ x + y + z+ zz))
        zz aa bb cc
x y z            
A a w     0  0  0
      z     1  1  1
   b w     0  0  0
      z     0  0  0
B a w     0  0  0
      z     0  0  0
   b w     1  1  1
      z     0  0  0
str(ftable(xtabs(~ x + y + z+ zz)))
 ftable [1:8, 1:3] 0 1 0 0 0 0 1 0 0 1 ...
 - attr(*, "row.vars")=List of 3
  ..$ x: chr [1:2] "A" "B"
  ..$ y: chr [1:2] "a" "b"
  ..$ z: chr [1:2] "w" "z"
 - attr(*, "col.vars")=List of 1
  ..$ zz: chr [1:3] "aa" "bb" "cc"

勘違い.ftable の結果も,ちゃんと関数 corresp() の引数になります.

dat.t1 <-ftable(xtabs(~ E1W2 + Sex + Q1A3 + gobi, data = dat))
str(dat.t1)
## # 行と列に名前をつけて
dimnames(dat.t1) <- 
   list(c("EM1", "EM2", ""WF4",  "WF5" ),   levels(dat$gobi)  )
# 反応の無い行を除く
dat.t2 <- dat.t1[rowSums(dat.t1) != 0, ]
dat.corr <- corresp(dat.t2, nf = min(nrow(dat.t2), ncol(dat.t2) ))
biplot(dat.corr,cex = c(1.2, 0.8))

よって以下は勘違い

ftable は,一部の関数(例えばMASSライブラリの対応分析,すなわちコレスポンデンス分析用の関数 corresp() の入力にならない.そこで,強引に変換したが,もっとスマートな方法があるのではないか?

# フラットな表形式に変換
dat.t1 <-ftable(xtabs(cbind(Q1A1, Q2A1, Q3A1, Q4A1) ~ 
            E1W2 + factor(dat$Age) + Sex, data = dat))
# 構造を見るとクラスは ftable クラスなので
# このままではcorrespのインプットには使えない.
str(dat.t1$Age)

# そこでクラス属性を「行列」に替え
class(dat.t1) <- "matrix"
# 行や列のカテゴリをリセットする
attr(dat.t1, "row.vars") <- NULL
attr(dat.t1, "col.vars") <- NULL
dat.t1
# 行と列に名前をつけて
dimnames(dat.t1) <- list(c("E10M", "E10F", "E20M", "E20F",  "W10M",
    "W10F", "W20M", "W20F"), c("Q1A1", "Q2A1", "Q3A1", "Q4A1"))

## コレスポンデンス分析を実行
library(MASS)
dat.corr <- corresp(dat.t1, nf = min(nrow(dat.mat), ncol(dat.mat)))
biplot(dat.corr)
dev.copy2eps(file = "nihongo.eps")