値のリコードとクロス表分析
リコード作業に入る前に欠損値の指定をおこなう。SPSSでデータを作るとき、NAやDKに“9”や“99”を振ることが多い。分析の際、この“9”や“99”を必要に応じて欠損値扱いにする。Rでも“9”や“99”をそのままにしておくと普通の値として計算されてしまうので、欠損値であることを明確にしておく。
sex <- replace(d1$q1, which(d1$q1==9), NA) # q1は性別 age <- replace(d1$q2, which(d1$q2==99), NA) # q2は年齢 vol <- replace(d1$q12, which(d1$q12==97), NA) # q12はボランティア参加の程度 vol <- replace(vol, which(vol==99), NA)
sex、age、volをデータフレームに追加。
d1 <- cbind(d1, sex, age, vol)
欠損データをデータフレームから除去。
d2 <- na.omit(d1)
age5 <- ctgr(d2$age, c(30, 40, 50, 60), # 区切り値 c("20代", "30代", "40代", "50代", "60代以上")) # ラベル
n個の区切り値でn+1個の区間に区切る。区切り値は区間の左端に含まれる。たとえば、volの値は1「積極的に参加している」から4「参加していない」の4分位なので
vol2 <- ctgr(d2$vol, c(4), c("参加している","参加していない"))
とすれば、1から3までと4のふたつの区間に区切られる(区切り値は4)。
なお、この関数を使うとリコード後の変数は質的変数になる。carパッケージのrecode関数を利用すれば、連続変数のまま複数の値を統合することが可能。
リコードしたage5とvol2をクロス集計する。
t1 <- table(age5, vol2)
出力を確認。
> t1 vol2 age5 参加している 参加していない 20代 19 104 30代 42 107 40代 66 126 50代 100 179 60代以上 137 174
セル度数だけだと分かりにくいので、周辺度数を追加。
t2 <- addmargins(t1, c(1, 2))
> t2 vol2 age5 参加している 参加していない Sum 20代 19 104 123 30代 42 107 149 40代 66 126 192 50代 100 179 279 60代以上 137 174 311 Sum 364 690 1054
行%の計算は次のようにする。
t3 <- 100*prop.table(t1, 1)
> t3 vol2 age5 参加している 参加していない 20代 15.44715 84.55285 30代 28.18792 71.81208 40代 34.37500 65.62500 50代 35.84229 64.15771 60代以上 44.05145 55.94855
> chisq.test(t1) Pearson's Chi-squared test data: t1 X-squared = 35.148, df = 4, p-value = 4.331e-07
この値をもとに、クラマーのを計算。
だから
vnum <- 35.148 #分子 vden <- 1054*(2-1) #分母 v <- sqrt(vnum/vden)
で求まる。
> v [1] 0.1826123
たいした手間ではないが、直接、クラマーのを出せるコマンドがあったらいいな、と思っていたらこんなのを発見。
# クラマー係数を関数として定義 cr <- function(x) { if (dim(x)[1] > dim(x)[2] ) return(sqrt(chisq.test(x)$statistic/sum(x)/(dim(x)[2]-1))) else return(sqrt(chisq.test(x)$statistic/sum(x)/(dim(x)[1]-1))) }
簡単に係数をえることができる。
> cr(t1) X-squared 0.1826122
*1:関数は青木先生のページ(http://aoki2.si.gunma-u.ac.jp/R/recode.html)で公開されています。もとの関数の名前はrecodeですが、recodeという関数は他にもあるので、利用に際して関数名を変えさせていただきました。