クラスカル・ウォリス検定(plus 多重比較) Last modified: Aug 21, 2009
目的
R には,kruskal.test 関数が用意されている。
ここで定義する関数は,クラスカル・ウォリス検定に引き続いて,多重比較(対比較)を行う
使用法
kruskal.wallis(data, group=NULL)
引数
data 測定値ベクトルまたはリスト(使用例を参照)
group 群変数ベクトル(data がリストの場合には無視される)
ソース
インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/kruskal_wallis.R", encoding="euc-jp")
# クラスカル・ウォリス検定(plus 多重比較)
kruskal.wallis <- function( data, # 測定値ベクトルまたはリスト
group=NULL) # 群変数ベクトル(data がリストの場合には無視される)
{
method <- "クラスカル・ウォリス検定(plus 多重比較)"
if (is.list(data)) { # 第 1 引数がリストなら,
data.name <- deparse(substitute(data))
group <- factor(rep(1:length(data), sapply(data, length))) # 群変数ベクトルを作る
data <- unlist(data) # リストをベクトルにする
}
else {
data.name <- paste(deparse(substitute(data)), "~", deparse(substitute(group)))
}
OK <- complete.cases(data, group) # 欠損値を持つケースを除く
data <- data[OK]
group <- group[OK]
ni<- table(group) # 各群のデータ数
n <- sum(ni) # 全データ数
r <- rank(data) # 順位付け
Ri <- tapply(r, group, sum) # 群ごとの和をとる
S <- 12*sum(Ri^2/ni)/(n*(n+1))-3*(n+1) # 検定統計量
if (length(unique(data)) != n) { # 同値があるなら
tie <- table(data)
S <- S/(1-sum(tie^3-tie)/(n^3-n)) # 同順位を考慮した検定統計量
}
a <- length(ni) # 群の個数
df <- a-1 # 自由度
p <- pchisq(S, df, lower.tail=FALSE) # P 値
result1 <- structure(list(statistic=c("Kruskal-Wallis chi-squared"=S),
parameter=c(df=df), p.value=p, method=method,
data.name=data.name), class="htest")
a.mean <- (n+1)/2 # 順位の平均値
R.mean <- Ri/ni # 順位和の平均値
V <- sum((r-a.mean)^2)/(n-1) # 分散
S <- combn(a, 2, function(ij) diff(R.mean[ij])^2/sum(V/ni[ij]) ) # 一対比較
p <- pchisq(S, df, lower.tail=FALSE) # P 値
result2 <- cbind("chi sq."=S, "p-value"=p)
rownames(result2) <- combn(a, 2, paste, collapse=":")
return(structure(list(result1=result1, result2=result2), class="kruskal.wallis"))
}
# print メソッド
print.kruskal.wallis <- function( obj, # kruskal.wallis が返すオブジェクト
digits=4) # 結果の表示桁数
{
print(obj$result1, digits=digits) # 全体として差があるかの検定結果
cat("多重比較の結果\n\n")
print(obj$result2, digits=digits) # 多重比較の結果
}
使用例
データベクトルと factor ベクトルで与える場合
> data <- c(
+ 3.42, 3.84, 3.96, 3.76,
+ 3.17, 3.63, 3.47, 3.44, 3.39,
+ 3.64, 3.72, 3.91
+ )
> group <- rep(1:3, c(4, 5, 3))
> kruskal.wallis(data, group)
クラスカル・ウォリス検定(plus 多重比較)
data: data ~ group
Kruskal-Wallis chi-squared = 5.5487, df = 2, p-value = 0.06239
多重比較の結果
chi sq. p-value
1:2 4.104274 0.1285
1:3 0.003663 0.9982
2:3 3.702564 0.1570
リストで与える場合
> x1 <- c(3.42, 3.84, 3.96, 3.76)
> x2 <- c(3.17, 3.63, 3.47, 3.44, 3.39)
> x3 <- c(3.64, 3.72, 3.91)
> kruskal.wallis(list(x1,x2,x3))
クラスカル・ウォリス検定(plus 多重比較)
data: list(x1, x2, x3)
Kruskal-Wallis chi-squared = 5.5487, df = 2, p-value = 0.06239
多重比較の結果
chi sq. p-value
1:2 4.104274 0.1285
1:3 0.003663 0.9982
2:3 3.702564 0.1570
注
R には,kruskal.test 関数が用意されている。上述の使用データ例に対して,実行すると以下のような結果が得られる。比較してみるとよい。
> kruskal.test(data, group)
Kruskal-Wallis rank sum test
data: data and group
Kruskal-Wallis chi-squared = 5.5487, df = 2, p-value = 0.06239
解説ページ
直前のページへ戻る
E-mail to Shigenobu AOKI