勉強 3日目
2変数の関係を確認する方法として,クロス集計表と独立性の検定であるχ2検定について学習する。
chap5 <- read.csv("chap5.csv")
table()
を用いてシンプルなクロス表を作成する。
attach(chap5) # データフレーム名を無視
table(sex,regu) # クロス表を作成
regu
sex 0 1
0 10 4
1 3 8
addmargins()
を用いて,クロス表に合計欄を付け加える。
t1 <- table(sex,regu)
addmargins(t1)
regu
sex 0 1 Sum
0 10 4 14
1 3 8 11
Sum 13 12 25
prop.table()
関数で相対度数にできる。 デフォルトでは,全体相対度数となっているが,オプションでmargin = 1
を指定すると行相対度数,margin = 2
を指定すると列相対度数となる。
prop.table(t1)
regu
sex 0 1
0 0.40 0.16
1 0.12 0.32
テキストで紹介されているgmodels
関数を用いると,キレイな表ができるがコードが長くなるので,各自で学習する。
パッケージを読み込む。
# install.packages("gmodels")
library(gmodels)
CrossTable()
関数で作表する。
CrossTable(sex,regu,
expected = F, prop.r = T, prop.c = F,
prop.t = F, prop.chisq = F,
chisq = T, asresid = T, format = "SPSS")
Cell Contents
|-------------------------|
| Count |
| Row Percent |
| Adj Std Resid |
|-------------------------|
Total Observations in Table: 25
| regu
sex | 0 | 1 | Row Total |
-------------|-----------|-----------|-----------|
0 | 10 | 4 | 14 |
| 71.429% | 28.571% | 56.000% |
| 2.194 | -2.194 | |
-------------|-----------|-----------|-----------|
1 | 3 | 8 | 11 |
| 27.273% | 72.727% | 44.000% |
| -2.194 | 2.194 | |
-------------|-----------|-----------|-----------|
Column Total | 13 | 12 | 25 |
-------------|-----------|-----------|-----------|
Statistics for All Table Factors
Pearson's Chi-squared test
------------------------------------------------------------
Chi^2 = 4.811855 d.f. = 1 p = 0.02826461
Pearson's Chi-squared test with Yates' continuity correction
------------------------------------------------------------
Chi^2 = 3.205388 d.f. = 1 p = 0.07339608
Minimum expected frequency: 5.28
\(r\)行かける\(c\)列のクロス表の行要素と列要素の関係の強さを表す尺度の1つにクラメールのV(Cremer’s V)がある。
\[ V = \sqrt{\frac{\chi^2}{N \times \min (r-1,c-1)}} \]
\(r\)行\(c\)列のクロス集計表の\(i\)行\(j\)列の観測度数を\(O_{ij}\),期待度数を\(E_{ij}\), \(i\)行の合計を\(n_{i \cdot}\),\(j\)列の合計を\(n_{\cdot j}\),全データの合計を\(n\)とおくと,分子の\(\chi ^2\)値は次式で計算される。
\[ \chi ^2 = \displaystyle \sum_{i = 1}^r {\displaystyle \sum_{j = 1}^c} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
ここで,期待度数\(E_{ij}\)は次式で求める。
\[ E_{ij} = \frac{n_{i\cdot} \times n_{\cdot j}}{n} \]
クロス表からクラメールのVと\(\chi ^2\)統計量を出力するため,vcd
パッケージのassocstats()
を用いる。
# install.packages("vcd") # first time only
library(vcd)
assocstats(t1)
X^2 df P(> X^2)
Likelihood Ratio 4.9748 1 0.025719
Pearson 4.8119 1 0.028265
Phi-Coefficient : 0.439
Contingency Coeff.: 0.402
Cramer's V : 0.439
クラメールのVは0.439と比較的強い関連性が確認できた。
せっかくなので,上記の関数を使わずに,定義通りに計算して\(\chi ^2\)値とクラメールの\(V\)を計算してみる。 クロス表は,
あり | なし | |
---|---|---|
男 | 10 | 4 |
女 | 3 | 8 |
ここから,期待度数を計算する。
\[ E_{\text{男},\text{あり}} = \frac{14 \times 13}{25} = 7.28\\ E_{\text{男},\text{なし}} = \frac{14 \times 12}{25} = 6.72\\ E_{\text{女},\text{あり}} = \frac{11 \times 13}{25} = 5.72\\ E_{\text{女},\text{なし}} = \frac{11 \times 12}{25} = 5.28 \]
つまり期待度数のクロス表は次のようになる。
あり | なし | |
---|---|---|
男 | 7.28 | 6.72 |
女 | 5.72 | 5.28 |
これをRで計算する。 期待度数を計算して,行列em
を作成する。
m <- matrix(t1, nrow = 2, ncol = 2) # 実際の度数
em <- matrix(nrow=2,ncol=2) # 期待度数
for (i in 1:ncol(m)){
for (j in 1:nrow(m)) {
em[i,j] <- (sum(m[i,]) * sum(m[,j])) / sum(m)
}
}
em
[,1] [,2]
[1,] 7.28 6.72
[2,] 5.72 5.28
ここから\(\chi^2\)値を計算し,chisq.test()
関数の結果と比較する。
(chi2 <- sum( (m - em)^2 / em ))
[1] 4.811855
(res <- chisq.test(t1))
Pearson's Chi-squared test with Yates' continuity correction
data: t1
X-squared = 3.2054, df = 1, p-value = 0.0734
あれ,手計算の4.812と,関数3.205の結果が違う。。
mosaic(t1, shade=TRUE)