目的 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 解説ページ