正規性の検定
先のエントリでも触れたように、分布の正規性の検定にはいくつかの種類があります。
参考に、サンプルサイズを変えながらシャピロ・ウィルク検定とコルモゴロフ・スミノルフ検定を実施し、結果の違いを図にしてみました。とりあえず作図しただけで、あまり理解はしてません(あとで勉強します)。
まず、一様乱数に対する正規性の仮定をどのぐらいのサンプルサイズから棄却できるのかを確認してみて、その後に、正規乱数に対して検定するとだいたいOK(棄却されない)なのかどうかをみてみます。
データとしては、0〜100の一様乱数と、平均100、標準偏差50の正規乱数を使います。
以下の結果をみると、一様乱数について正規性の仮定を棄却させる場合、シャピロ・ウィルク検定のほうがコルモゴロフ・スミノルフ検定に比べて、サンプルサイズが小さい時にも厳しく棄却してることが分かります。サンプルが大きい場合はシャピロ・ウィルク検定では違いがあまり出ず、逆にサンプルが小さい場合はコルモゴロフ・スミノルフ検定では違いが出ないという感じ。
正規乱数の正規性仮定を検定した場合は、いずれの検定方法でも「だいたいOK」(だいたい棄却されない)になること、サンプルサイズが大きくても小さくても関係ないということ(乱数発生してヒストグラムを書く場合、サンプルが大きいほうが正規分布っぽい形になるが、一様乱数に対する検定で明らかなように、サンプルが小さいと逆に棄却もしづらい)、シャピロ・ウィルク検定のほうが微妙な乖離に反応して棄却してしまうことが多いことが分かります。
一様乱数に対してks.testを実施(サンプルサイズ10〜1000)
sample.size <- seq(10, 1000, by=10) p.value <- c() for (i in seq(10, 1000, by=10)) { normal <- runif(n=i, min=0, max=100) p.value <- c(p.value, ks.test(normal,"pnorm",mean=mean(normal),sd=sd(normal))$p.value) } d <- cbind(sample.size, p.value) plot(d, pch=21, main="一様乱数に対するks.testの結果の分布", cex.main=0.8) abline(h=0.05, col="red", lwd=1.5) text(x=800, y=0.12, "5%ライン", pos="4", cex=0.8, col="red”)
一様乱数に対してks.testを実施(サンプルサイズ5〜100)
sample.size <- seq(5, 100) p.value <- c() for (i in seq(5, 100)) { normal <- runif(n=i, min=0, max=100) p.value <- c(p.value, ks.test(normal,"pnorm",mean=mean(normal),sd=sd(normal))$p.value) } d <- cbind(sample.size, p.value) plot(d, pch=21, main="一様乱数に対するks.testの結果の分布", cex.main=0.8) abline(h=0.05, col="red", lwd=1.5) text(x=80, y=0.1, "5%ライン", pos="4", cex=0.8, col="red”)
一様乱数に対してshapiro.testを実施(サンプルサイズ10〜1000)
sample.size <- seq(10, 1000, by=10) p.value <- c() for (i in seq(10, 1000, by=10)) { normal <- runif(n=i, min=0, max=100) p.value <- c(p.value, shapiro.test(normal)$p.value) } d <- cbind(sample.size, p.value) plot(d, pch=21, main="一様乱数に対するshapiro.testの結果の分布", cex.main=0.8) abline(h=0.05, col="red", lwd=1.5) text(x=800, y=0.07, "5%ライン", pos="4", cex=0.8, col="red”)
一様乱数に対してshapiro.testを実施(サンプルサイズ5〜100)
sample.size <- seq(5, 100) p.value <- c() for (i in seq(5, 100)) { normal <- runif(n=i, min=0, max=100) p.value <- c(p.value, shapiro.test(normal)$p.value) } d <- cbind(sample.size, p.value) plot(d, pch=21, main="一様乱数に対するshapiro.testの結果の分布", cex.main=0.8) abline(h=0.05, col="red", lwd=1.5) text(x=80, y=0.1, "5%ライン", pos="4", cex=0.8, col="red”)
正規乱数に対してks.testを実施(サンプルサイズ10〜1000)
sample.size <- seq(10, 1000, by=10) p.value <- c() for (i in seq(10, 1000, by=10)) { normal <- rnorm(n=i, mean=100, sd=50) p.value <- c(p.value, ks.test(normal,"pnorm",mean=mean(normal),sd=sd(normal))$p.value) } d <- cbind(sample.size, p.value) plot(d, pch=21, main="正規乱数に対するks.testの結果の分布", cex.main=0.8, ylim=c(0, 1)) abline(h=0.05, col="red", lwd=1.5) text(x=800, y=0.12, "5%ライン", pos="4", cex=0.8, col="red”)
正規乱数に対してks.testを実施(サンプルサイズ5〜100)
sample.size <- seq(5, 100) p.value <- c() for (i in seq(5, 100)) { normal <- rnorm(n=i, mean=100, sd=50) p.value <- c(p.value, ks.test(normal,"pnorm",mean=mean(normal),sd=sd(normal))$p.value) } d <- cbind(sample.size, p.value) plot(d, pch=21, main="正規乱数に対するks.testの結果の分布", cex.main=0.8, ylim=c(0, 1)) abline(h=0.05, col="red", lwd=1.5) text(x=80, y=0.1, "5%ライン", pos="4", cex=0.8, col="red”)
正規乱数に対してshapiro.testを実施(サンプルサイズ10〜1000)
sample.size <- seq(10, 1000, by=10) p.value <- c() for (i in seq(10, 1000, by=10)) { normal <- rnorm(n=i, mean=100, sd=50) p.value <- c(p.value, shapiro.test(normal)$p.value) } d <- cbind(sample.size, p.value) plot(d, pch=21, main="正規乱数に対するshapiro.testの結果の分布", cex.main=0.8, ylim=c(0, 1)) abline(h=0.05, col="red", lwd=1.5) text(x=800, y=0.09, "5%ライン", pos="4", cex=0.8, col="red”)
正規乱数に対してshapiro.testを実施(サンプルサイズ5〜100)
sample.size <- seq(5, 100) p.value <- c() for (i in seq(5, 100)) { normal <- rnorm(n=i, mean=100, sd=50) p.value <- c(p.value, shapiro.test(normal)$p.value) } d <- cbind(sample.size, p.value) plot(d, pch=21, main="正規乱数に対するshapiro.testの結果の分布", cex.main=0.8, ylim=c(0, 1)) abline(h=0.05, col="red", lwd=1.5) text(x=80, y=0.1, "5%ライン", pos="4", cex=0.8, col="red”)