クラスカル・ウォリス検定(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

Made with Macintosh