正規分布への適合度の検定 Last modified: Aug 19, 2009
目的
正規分布への適合度の検定を行う
使用法
normaldist(x, b, w, a)
sumamry.normaldist(obj, digits=5)
plot.normaldist(obj, xlab="", ylab="Frequency", ...)
引数
x 度数ベクトル
b 度数分布表の最初の階級の下限値
w 階級幅
a 測定精度
org normaldist 関数が返すオブジェクト
digits 表示桁数
xlab, ylab 軸の名前
... plot に渡す引数
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/normaldist.R", encoding="euc-jp")
# 正規分布への適合度の検定
normaldist <- function( x, # 度数ベクトル
b, # 最初の階級の下限値
w, # 階級幅
a) # 測定精度
{
data.name <- deparse(substitute(x))
method <- "正規分布への適合度の検定"
n <- sum(x) # データ数
x <- c(0, x, 0) # 上下にそれぞれ 1 階級を追加する
k <- length(x) # 階級数
mid <- seq(b-w/2, b+k*w-w, w)-a/2 # 級中心
xbar <- sum(mid*x)/n # 平均値
variance <- sum(x*(mid-xbar)^2)/n # 分散(不偏分散ではない)
SD <- sqrt(variance) # 標準偏差
result <- c("n"=n, "Mean"=xbar, "Variance"=variance, "S.D."=SD)
z <- ((mid+w/2)-xbar)/SD # 級限界の標準化得点
p <- pnorm(z) # 累積確率
p[k] <- 1 # 最後の累積確率は 1
p <- p-c(0, p[-k]) # 各階級の確率
expectation <- n*p # 各階級の期待値
table <- data.frame(mid, x, z, p, expectation) # 結果をデータフレームにする
rownames(table) <- paste("c-", 1:k, sep="")
while (expectation[1] < 1) { # 期待値が 1 未満の階級を併合
x[2] <- x[2]+x[1]
expectation[2] <- expectation[2]+expectation[1]
x <- x[-1]
expectation <- expectation[-1]
k <- k-1
}
while (expectation[k] < 1) { # 期待値が 1 未満の階級を併合
x[k-1] <- x[k-1]+x[k]
expectation[k-1] <- expectation[k-1]+expectation[k]
x <- x[-k]
expectation <- expectation[-k]
k <- k-1
}
chisq <- sum((x-expectation)^2/expectation) # カイ二乗統計量
df <- k-3 # 自由度
p <- pchisq(chisq, df, lower.tail=FALSE) # P 値
names(chisq) <- "X-squared"
names(df) <- "df"
return(structure(list(statistic=chisq, parameter=df, p.value=p,
estimate=c(n=n, Mean=xbar, Variance=variance, S.D.=SD),
method=method, data.name=data.name, table=table),
class=c("htest", "normaldist")))
}
# summary メソッド
summary.normaldist <- function( obj, # normaldist が返すオブジェクト
digits=5) # 表示桁数
{
table <- obj$table
colnames(table) <- c("級中心", "度数", "標準化得点", "確率", "期待値")
cat("\n適合度\n\n")
print(table, digits=digits, row.names=FALSE)
}
# plot メソッド
plot.normaldist <- function( obj, # normaldist が返すオブジェクト
xlab="", ylab="Frequency", # 軸の名称
...) # plot に渡す引数
{
d <- obj$table
class <- d$mid
w <- diff(class)[1]
class <- class-w/2
k <- length(class)
yo <- d$x
ye <- d$expectation
plot(c(class[1], class[k]+w), c(0, max(c(yo, ye))), type="n", xlab=xlab, ylab=ylab, ...)
rect(class, 0, class+w, yo, col="grey")
Mean <- obj$estimate[2]
SD <- obj$estimate[4]
x <- seq(class[1], class[k]+w, length=2000)
y <- dnorm(x, mean=Mean, sd=SD)*sum(yo)*w
lines(x, y)
x <- d$mid
y <- dnorm(x, mean=Mean, sd=SD)*sum(yo)*w
points(x, y, pch=3)
}
使用例
> x <- c(4, 19, 86, 177, 105, 33, 2)
> (a <- normaldist(x, 40, 5, 0.1)) # 検定結果
正規分布への適合度の検定
data: x
X-squared = 6.0002, df = 4, p-value = 0.1991
sample estimates:
n Mean Variance S.D.
426.000000 57.931221 26.352934 5.133511
> summary(a) # 適合度
適合度
級中心 度数 標準化得点 確率 期待値
37.45 0 -3.50271 0.00023027 0.098096
42.45 4 -2.52872 0.00549367 2.340301
47.45 19 -1.55473 0.05428132 23.123842
52.45 86 -0.58074 0.22070354 94.019709
57.45 177 0.39326 0.37222567 158.568133
62.45 105 1.36725 0.26129165 111.310243
67.45 33 2.34124 0.07616398 32.445853
72.45 2 3.31523 0.00915208 3.898785
77.45 0 4.28922 0.00045784 0.195038
> plot(a) # 図に表示
解説ページ
直前のページへ戻る
E-mail to Shigenobu AOKI