フリードマン検定(plus 多重比較)     Last modified: Aug 21, 2009

目的

R には,friedman.test 関数が用意されている。
ここで定義する関数は,フリードマン検定に引き続いて,多重比較(対比較)を行う

使用法

friedman(dat)

引数

dat	データ行列(一行に複数条件下の測定値)

ソース

インストールは,以下の 1 行をコピーし,R コンソールにペーストする
source("http://aoki2.si.gunma-u.ac.jp/R/src/friedman.R", encoding="euc-jp")

# フリードマン検定(plus 多重比較)
friedman <- function(dat)                                            # データ行列
{
        method <- "フリードマン検定(plus 多重比較)"
        data.name <- deparse(substitute(dat))
        dat <- subset(dat, complete.cases(dat))                              # 欠損値を持つケースを除く
        row <- nrow(dat)                                             # ケース数
        col <- ncol(dat)                                             # 条件数
        df <- col-1                                                  # 自由度
        o <- t(apply(dat, 1, rank))                                  # ケースごとに順位付けする
        R <- colSums(o)                                                      # 条件ごとに順位の和をとる
        chi <- 12*sum(R^2)/(row*col*(col+1))-3*row*(col+1)           # 検定統計量
        p <- pchisq(chi, df, lower.tail=FALSE)                               # P 値
        result1 <- structure(list(statistic=c("chi squared"=chi),    # 検定結果のまとめ
                parameter=c(df=df), p.value=p, method=method,
                data.name=data.name), class="htest")
        R.m <- R/row                                                 # 条件ごとの平均順位
        V <- sum((o-(col+1)/2)^2)                                    # 分散
        S <- combn(col, 2, function(ij) row^2*df*diff(R.m[ij])^2/(2*V))      # 対比較の検定統計量
        p <- pchisq(S, df, lower.tail=FALSE)                         # P 値
        result2 <- cbind("chi sa."=S, "p-value"=p)
        rownames(result2) <- combn(col, 2, paste, collapse=":")
        return(structure(list(result1=result1, result2=result2), class="friedman"))
}
# print メソッド
print.friedman <- function(  obj,                                    # friedman が返すオブジェクト
                                digits=4)                               # 結果の表示桁数
{
        print(obj$result1, digits=digits)                               # 全体として差があるかの検定結果
        cat("多重比較の結果\n\n")
        print(obj$result2, digits=digits)                               # 多重比較の結果
}


使用例

> dat <- matrix(c(	# 8行5列(5条件,8ケース)のデータ行列の例(ファイルから読んでも良い)
+ 	 5, 60, 35, 62, 76,
+ 	24, 44, 74, 63, 76,
+ 	56, 57, 70, 74, 79,
+ 	44, 51, 55, 23, 84,
+ 	 8, 68, 50, 24, 64,
+ 	32, 66, 45, 63, 46,
+ 	25, 38, 70, 58, 77,
+ 	48, 24, 40, 80, 72
+ ), byrow=TRUE, ncol=5)

> friedman(dat)

	フリードマン検定(plus 多重比較)

data:  dat 
chi squared = 15.9, df = 4, p-value = 0.003156

多重比較の結果

    chi sa.  p-value
1:2   3.600 0.462837
1:3   4.225 0.376411
1:4   5.625 0.228958
1:5  15.625 0.003566
2:3   0.025 0.999923
2:4   0.225 0.994127
2:5   4.225 0.376411
3:4   0.100 0.998791
3:5   3.600 0.462837
4:5   2.500 0.644636


R には,friedman.test 関数が用意されている。上述の使用データ例に対して,実行すると以下のような結果が得られる。比較してみるとよい。
(R に用意されている friedman.test では同順位の補正をしているので,行方向に同順位のあるデータでは答えが異なる。SPSS も同じ補正を適用している。しかし,補正の有無が問題となることはほとんどないであろう。)
> friedman.test(dat)

	Friedman rank sum test

data:  dat 
Friedman chi-squared = 15.9, df = 4, p-value = 0.003156

・ 解説ページ


・ 直前のページへ戻る  ・ E-mail to Shigenobu AOKI

Made with Macintosh