離散一様分布に従うか?
class1〜class4という4つの属性による違いはあるのか?
それとも、違いはない、離散一様分布に従うと考えることはできるのか?
# グラフ
library(dplyr)
d <-data.frame(
observe = c(rep("class1",330), rep("class2",305),
rep("class3",263),rep("class4",247))
)
d %>% table() %>% barplot(ylim=c(0,350),col="4")
abline(h = 1145/4, col="red", lwd=3)
離散一様分布との適合度
$H_0:$属性による違いはない(離散一様分布に従う)
$H_1:$属性による違いがある
$H_0$を仮定した場合、理論的には データ数×1/属性数 の離散一様分布になる。
ただ、実際には偶然を考えて完全な等分散にはならない。
では、偶然性を考慮した上で、離散一様分布に従っているか?
観測したデータを観測度数のテーブル
$H_0$に基づいた期待度数のテーブル
この2つを作る。
(期待度数の最小値 $<$ 5 の場合、近似がうまくいかないので注意)
観測度数と期待度数のズレの和を考える
このズレの和はカイ二乗値と等しくなる。
適合度検定
$H_0$が正しければ、nが大きい場合、
$$\chi^2=\sum\frac{(O_i-E_i)^2}{E_i}$$
が$k-1$のカイ二乗分布に従う。
$O_i$:観測度数テーブル$O$のi番目
$E_i$:期待度数テーブル$E$のi番目
$k$:属性数
$H_0$のもとでこの値は小さいはず。
小さいならば$H_0$が支持
大きいなら$H_0$を棄却し、$H_1$を支持。
R
d <-data.frame(
observe = c(rep("class1",330), rep("class2",305),rep("class3",263),rep("class4",247))
)
# 格納確認
dim(d)
head(d)
names(d)
summary(d)
# table関数からクロス集計表を作る
(obs_tabs <- table(d))
# xtabsを使ってもtableを作れる
# (obs_tabs <- xtabs(~observe,d))
# 合計付きの集計表へ
(f_tabs <- addmargins(obs_tabs))
# 期待度数のtableを作る
(Expected <- obs_tabs) # 観測度数の表とdiimensionが同じになるので、いったん格納して
(Expected <- obs_tabs*0) # 期待度数を入れるために初期化
# sumを拾う
(n <- f_tabs["Sum"])
# 離散一様分布なので割合は 1/属性数 で一律
(p <- 1/dim(obs_tabs))
# 期待度数のtableを作る
for (i in 1:dim(obs_tabs)) Expected[i] <- n*p
Expected
# (期待度数の最小値) ≧ 5 なのでこのまま推定
# 観察度数と期待度数のズレの和
chisq = sum((obs_tabs-Expected)^2/Expected)
chisq
$\chi^2=15.18515$
$H_0$:離散一様分布に従っている、について
両側5%水準で検討する。
自由度:$4-1=3$のカイ二乗分布の上側$5$%点が$7.81$
棄却限界値$7.81$よりもカイ二乗値が大きいので$H_0$は棄却され、$H_1$が支持される。
テーブルをそのままchisq.testに通す
chisq.test(obs_tabs)
Chi-squared test for given probabilities
data: obs_tabs
X-squared = 15.185, df = 3, p-value = 0.001665
たぶん、dim(obs_tabs) で 1行で4というように返ってくるテーブルに対しては離散一様分布のChi-squared test がrunする模様。