離散一様分布に従うか?(適合度検定)


離散一様分布に従うか?


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する模様。