値のリコードとクロス表分析

 リコード作業に入る前に欠損値の指定をおこなう。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)


 リコードは群馬大学の青木先生が作成された関数を使って*1

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

 この\chi^2値をもとに、クラマーのVを計算。

 

だから

vnum <- 35.148	#分子
vden <- 1054*(2-1)	#分母
v <- sqrt(vnum/vden)

で求まる。

> v
[1] 0.1826123

 たいした手間ではないが、直接、クラマーのVを出せるコマンドがあったらいいな、と思っていたらこんなのを発見。

# クラマー係数を関数として定義
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)))
 }

 簡単にV係数をえることができる。

> cr(t1)
X-squared 
0.1826122 

*1:関数は青木先生のページ(http://aoki2.si.gunma-u.ac.jp/R/recode.html)で公開されています。もとの関数の名前はrecodeですが、recodeという関数は他にもあるので、利用に際して関数名を変えさせていただきました。