Más contenido relacionado La actualidad más candente (20) Chisq 017. 6
R による「カイ二乗検定」の実行例:
適合度の検定(2/6)
• 適合度の検定
– 注意(※念のため)
• 帰無仮説:「各特質を持ったエンドウ豆の個数が理論分
布に適合している」
• 得たい結果
– “理論分布に適合している”こと
or
– “理論分布に適合していないとは言えない”こと
• つまり、“帰無仮説が棄却されない”ことを期待している点
に注意が必要
– 適合度の検定が行われる場合はこうしたケースが多い
– そうではない、帰無仮説を棄却する“より普通の検定”のケースも
たまにある
8. 7
R による「カイ二乗検定」の実行例:
適合度の検定(3/6)
• 適合度の検定:スクリプト全文
#=====================================================
# 適合度の検定
#=====================================================
#元データの作成(表12.5;メンデルのエンドウ豆データ)
o.num <- c( 315, 101, 108, 32) #観測度数
th.prob <- c(9/16, 3/16, 3/16, 1/16) #理論確率
#理論度数(あるいは期待度数 Expected frequency)
(e.num <- sum(o.num) * th.prob)
#観測度数と期待度数の差
(oe.gap <- o.num - e.num)
#表(データ・フレーム)を作成してデータを確認
(tbl.0 <- data.frame(o.num, th.prob, e.num, oe.gap))
colnames(tbl.0) <- c("観測度数", "確率", "期待度数", "両度数の差")
col.sum <- colSums(tbl.0)
tbl.12.5 <- rbind(tbl.0, col.sum)
rownames(tbl.12.5) <- c("黄・丸い", "黄・しわ", "緑・丸い", "緑・しわ", "計")
tbl.12.5
#適合度の検定統計量の各要素の計算
# (chsq0 <- oe.gap^2 / e.num)と同じだが、
# 原理の理解のためには下記の式の方が分かりやすい。
(chsq0 <- (o.num - e.num)^2 / e.num)
#適合度の検定統計量(カイ二乗値)の算出
(chisq1 <- sum(chsq0))
#カイ二乗検定の実行
pchisq(chisq1, length(chsq0) - 1, lower.tail = F)
(1)データの作成
(2)見やすさのための整形
※検定の実行には関係ない
(3)検定の実行
9. 8
R による「カイ二乗検定」の実行例:
適合度の検定(4/6)
• 適合度の検定:(1)データの作成
– 帰無仮説:
「各特質を持ったエンドウ豆の個数が理論分布に適合している」
• 各特質 ・・・ 黄・丸い, 黄・しわ, 緑・丸い, 緑・しわ
• 理論分布 ・・・ 9/16, 3/16, 3/16, 1/16
> #元データの作成(表12.5;メンデルのエンドウ豆データ)
> o.num <- c( 315, 101, 108, 32) #観測度数
> th.prob <- c(9/16, 3/16, 3/16, 1/16) #理論確率
>
> #理論度数(あるいは期待度数 Expected frequency)
> (e.num <- sum(o.num) * th.prob)
[1] 312.75 104.25 104.25 34.75
>
> #観測度数と期待度数の差
> (oe.gap <- o.num - e.num)
[1] 2.25 -3.25 3.75 -2.75
期待度数の算出
→全体のデータ件数×各要素の理論確率
◆コンソールへの出力
10. 9
R による「カイ二乗検定」の実行例:
適合度の検定(5/6)
• 適合度の検定:(2)見やすさのための整形
> #表(データ・フレーム)を作成してデータを確認
> (tbl.0 <- data.frame(o.num, th.prob, e.num, oe.gap))
o.num th.prob e.num oe.gap
1 315 0.5625 312.75 2.25
2 101 0.1875 104.25 -3.25
3 108 0.1875 104.25 3.75
4 32 0.0625 34.75 -2.75
> colnames(tbl.0) <- c("観測度数", "確率", "期待度数", "両度数の差")
> col.sum <- colSums(tbl.0)
> tbl.12.5 <- rbind(tbl.0, col.sum)
> rownames(tbl.12.5) <- c("黄・丸い", "黄・しわ", "緑・丸い", "緑・しわ", "計")
> tbl.12.5
観測度数 確率 期待度数 両度数の差
黄・丸い 315 0.5625 312.75 2.25
黄・しわ 101 0.1875 104.25 -3.25
緑・丸い 108 0.1875 104.25 3.75
緑・しわ 32 0.0625 34.75 -2.75
計 556 1.0000 556.00 0.00
◆コンソールへの出力
個別に作成していたベクトルを
まとめてデータ・フレームとする
表形式にして見やすくするため
(だけ)に行っている
テキストの「表12.5」と同じ内容
行と列は入れ替えている
11. 10
R による「カイ二乗検定」の実行例:
適合度の検定(6/6)
• 適合度の検定:(3)検定の実行
> #適合度の検定統計量の各要素の計算
> # (chsq0 <- oe.gap^2 / e.num)と同じだが、
> # 原理の理解のためには下記の式の方が分かりやすい。
> (chsq0 <- (o.num - e.num)^2 / e.num)
[1] 0.01618705 0.10131894 0.13489209 0.21762590
>
> #適合度の検定統計量(カイ二乗値)の算出
> (chisq1 <- sum(chsq0))
[1] 0.470024
>
> #カイ二乗検定の実行
> pchisq(chisq1, length(chsq0) - 1, lower.tail = F)
[1] 0.9254259
◆コンソールへの出力
「(観測 - 期待)^2
/ 期待」を要素ごと
に計算
pchisq(検定統計量, 自由度)
• 検定統計量に基づくp値の算出
• 自由度→ここでは“区分数 - 1”となる
• “lower.tail = F” ・・・ 上側確率の指定
要素ごとに算出された「(観測 - 期待)^2 / 期待」
を合計
⇒検定統計量であるカイ二乗値となる
「理論分布に適合している」という
帰無仮説は棄却されない
⇒“理論に適合”(望みどおり)
13. 12
R による「カイ二乗検定」の実行例:
独立性の検定(1/10)
• 独立性の検定
– 分割表(クロス集計表)の解析の基本の“キ”
• 二つの変数の間に関連があるか?
二つの変数が独立かどうか?
• “二群の割合(比率)の差の検定”と同義
– 表12.9;ある大学の工学部の期末試験の成績
– 注意点
– 注意点1:
非常に小さい標本の場合は、検定結果はやや疑わしくなる
– 注意点2:
大標本の場合、単に検定を行うだけではほとんど意味が無い
– 注意点3:
順序のあるカテゴリの場合は、より適切な検定方法を採ることで検出力
が向上する
14. 13
R による「カイ二乗検定」の実行例:
独立性の検定(2/10)
• 独立性の検定:スクリプト全文(方法1)
#===============================================
# 分割表と独立性の検定
#===============================================
#元データの作成(表12.9;ある大学の工学部の期末試験の成績)
(mat0 <- matrix(c(4, 2, 3, 8, 4, 6, 6, 3, 6),
nrow = 3, ncol = 3, byrow = T))
mat.12.9 <- addmargins(mat0)
rownames(mat.12.9) <- c("代数:優", "代数:良", "代数:可", "計")
colnames(mat.12.9) <- c("解析:優", "解析:良", "解析:可", "計")
mat.12.9
#----------
#方法1:
#関数「chisq.test」を利用して「カイ二乗検定」(独立性の検定)を実行
#----------
#(頻度が5以下のセルがあるため、Warning message が出力される)
chi.out <- chisq.test(mat0)
str(chi.out)
(1)データの作成
(2)「chisq.test」
による検定の実行
15. 14
R による「カイ二乗検定」の実行例:
独立性の検定(3/10)
• 独立性の検定:スクリプト全文(方法2)
#----------
#方法2:
#一つ一つ計算して「カイ二乗検定」を実行
#----------
#周辺確率分布の算出
(all.sum <- sum(mat0))
(p.row <- apply(mat0, 1, function(r, sum = all.sum){sum(r) / sum}))
(p.col <- apply(mat0, 2, function(c, sum = all.sum){sum(c) / sum}))
#期待度数の算出(期待度数=全体のケース数と周辺確率の積)
(e.mat0 <- sum(mat0) * p.row %*% t(p.col))
#カイ二乗検定の実行
(chisq.mat0 <- (mat0 - e.mat0)^2 / e.mat0) #検定統計量の各要素の計算
(chisq2 <- sum(chisq.mat0)) #上記を全てのセルで足し合わせる
(DF <- (nrow(mat0) - 1) * (ncol(mat0) - 1)) #自由度 = (行数 - 1) * (列数 - 1)
pchisq(chisq2, DF, lower.tail = F)
#おまけ(残差分析:調整済み標準化残差の算出)
(r.std <- (mat0 - e.mat0) / sqrt(e.mat0)) #標準化残差(残差)
r.var <- (1 - p.row) %*% t(1 - p.col) #残差分散
(r.std.adj <- (mat0 - e.mat0) / sqrt(e.mat0 * r.var)) #調整済み標準化残差(標準化残差)
16. 15
R による「カイ二乗検定」の実行例:
独立性の検定(4/10)
• 独立性の検定:(1)データの作成
– 表12.9;ある大学の工学部の期末試験の成績
– 帰無仮説:
「代数の成績と解析の成績には関連があるか/独立か?」
「代数の成績が良い(悪い)と解析の成績も良い(悪い)と言えるか?」
> #================================================================
> # 分割表と独立性の検定
> #================================================================
> #元データの作成(表12.9;ある大学の工学部の期末試験の成績)
> (mat0 <- matrix(c(4, 2, 3, 8, 4, 6, 6, 3, 6),
+ nrow = 3, ncol = 3, byrow = T))
[,1] [,2] [,3]
[1,] 4 2 3
[2,] 8 4 6
[3,] 6 3 6
◆コンソールへの出力
17. 16
R による「カイ二乗検定」の実行例:
独立性の検定(5/10)
• 独立性の検定:(1)データの作成
– 表12.9;ある大学の工学部の期末試験の成績
– 帰無仮説:
「代数の成績と解析の成績には関連があるか/独立か?」
「代数の成績が良い(悪い)と解析の成績も良い(悪い)と言えるか?」
> mat.12.9 <- addmargins(mat0)
> rownames(mat.12.9) <- c("代数:優", "代数:良", "代数:可", "計")
> colnames(mat.12.9) <- c("解析:優", "解析:良", "解析:可", "計")
> mat.12.9
解析:優 解析:良 解析:可 計
代数:優 4 2 3 9
代数:良 8 4 6 18
代数:可 6 3 6 15
計 18 9 15 42
◆コンソールへの出力
18. 17
R による「カイ二乗検定」の実行例:
独立性の検定(6/10)
• 独立性の検定:(2)「chisq.test」による検定の実行
– 頻度が5以下のセルがある場合、Warning message が出力
される
→注意点1参照
> #----------
> #方法1:
> #関数「chisq.test」を利用して「カイ二乗検定」(独立性の検定)を実行
> #----------
> #(頻度が5以下のセルがあるため、Warning message が出力される)
> chi.out <- chisq.test(mat0)
Warning message:
In chisq.test(mat0) : Chi-squared approximation may be incorrect
◆コンソールへの出力
19. 18
R による「カイ二乗検定」の実行例:
独立性の検定(7/10)
• 独立性の検定:(2)「chisq.test」による検定の実行
> str(chi.out)
List of 9
$ statistic: Named num 0.187
..- attr(*, "names")= chr "X-squared"
$ parameter: Named int 4
..- attr(*, "names")= chr "df"
$ p.value : num 0.996
$ method : chr "Pearson's Chi-squared test"
$ data.name: chr "mat0"
$ observed : num [1:3, 1:3] 4 8 6 2 4 3 3 6 6
$ expected : num [1:3, 1:3] 3.86 7.71 6.43 1.93 3.86 ...
$ residuals: num [1:3, 1:3] 0.0727 0.1029 -0.169 0.0514 0.0727 ...
$ stdres : num [1:3, 1:3] 0.1086 0.18 -0.2789 0.0655 0.1086 ...
- attr(*, "class")= chr "htest"
◆コンソールへの出力 「chisq.test」の出力内容
(リスト)の内容を確認
→右記参照
★主な出力内容
•statistics:
• カイ二乗統計量
(※名前付き)
•parameter
• 自由度(※名前付き)
•p.value
• p値
•observed
• 観測度数
•expected
• 期待度数
•residuals
• 標準化残差
(or 残差)
•stdres
• 調整済み標準化残差
(or 標準化残差)
20. 19
R による「カイ二乗検定」の実行例:
独立性の検定(8/10)
• 独立性の検定:(3)方法2(期待度数の算出)
> #----------
> #方法2:
> #一つ一つ計算して「カイ二乗検定」を実行
> #----------
> #周辺確率分布の算出
> (all.sum <- sum(mat0))
[1] 42
> (p.row <- apply(mat0, 1, function(r, sum = all.sum){sum(r) / sum}))
[1] 0.2142857 0.4285714 0.3571429
> (p.col <- apply(mat0, 2, function(c, sum = all.sum){sum(c) / sum}))
[1] 0.4285714 0.2142857 0.3571429
>
> #期待度数の算出(期待度数=全体のケース数と周辺確率の積)
> (e.mat0 <- sum(mat0) * p.row %*% t(p.col))
[,1] [,2] [,3]
[1,] 3.857143 1.928571 3.214286
[2,] 7.714286 3.857143 6.428571
[3,] 6.428571 3.214286 5.357143
◆コンソールへの出力
行方向の周辺確率分布
(=行和/総ケース数)
列方向の周辺確率分布
(=列和/総ケース数)
21. 20
R による「カイ二乗検定」の実行例:
独立性の検定(9/10)
• 独立性の検定:(3)方法2(「カイ二乗検定」の実行)
> #「カイ二乗検定」の実行
> (chisq.mat0 <- (mat0 - e.mat0)^2 / e.mat0) #検定統計量の各要素の計算
[,1] [,2] [,3]
[1,] 0.005291005 0.002645503 0.01428571
[2,] 0.010582011 0.005291005 0.02857143
[3,] 0.028571429 0.014285714 0.07714286
> (chisq2 <- sum(chisq.mat0)) #上記を全てのセルで足し合わせる
[1] 0.1866667
> (DF <- (nrow(mat0) - 1) * (ncol(mat0) - 1)) #自由度 = (行数 - 1) * (列数 - 1)
[1] 4
> pchisq(chisq2, DF, lower.tail = F)
[1] 0.9959062
◆コンソールへの出力
「代数の成績と解析の成績には関連があるか/独立か?」
「代数の成績が良い(悪い)と解析の成績も良い(悪い)と言えるか?」
という帰無仮説は棄却されない
⇒「代数の成績が良く(悪く)ても、必ずしも解析の成績も良い(悪い)わけではない」
(むしろ、この二つには全く関連が無く“独立”だという可能性が高い数値)
⇒独立性の検定においては、通常は“望みどおりではない”
(※この調査ではどうだったかは分からない)
22. 21
R による「カイ二乗検定」の実行例:
独立性の検定(10/10)
• 独立性の検定:(3)方法2(おまけ・・・残差分析)
> #おまけ(残差分析:調整済み標準化残差の算出)
> (r.std <- (mat0 - e.mat0) / sqrt(e.mat0)) #標準化残差(残差)
[,1] [,2] [,3]
[1,] 0.0727393 0.05143445 -0.1195229
[2,] 0.1028689 0.07273930 -0.1690309
[3,] -0.1690309 -0.11952286 0.2777460
> r.var <- (1 - p.row) %*% t(1 - p.col) #残差分散
> (r.std.adj <- (mat0 - e.mat0) / sqrt(e.mat0 * r.var)) #調整済み標準化残差(標準化残差)
[,1] [,2] [,3]
[1,] 0.1085565 0.06546203 -0.1681750
[2,] 0.1800206 0.10855649 -0.2788867
[3,] -0.2788867 -0.16817499 0.4320494
◆コンソールへの出力
「chisq.test」では
「residuals」として出力
「chisq.test」では
「stdres」として出力
(二つの変数間に連関がある/独立であるという前提で、)「調整済み標準化残差」による
分析(残差分析)により、 “どのカテゴリー間にどの程度の連関があるのか”が分かる
「二つの変数は連関がある/独立でない」という結論が得られていない(→帰無仮説が
棄却されていない)場合は、上記の残差分析は意味が無い
参考文献[2]等参照