マン・ホイットニーの U 検定     Last modified: Aug 20, 2009

目的

マン・ホイットニーの U 検定を行う
(R には,等価な検定を行う関数 wilcox.test が用意されている)

使用法

二つのデータベクトルを与えるとき
 U.test(x, y, correct=FALSE)
 U.test(x, y)

2 行 k 列の分割表を与えるとき
 U.test(x, correct = FALSE)
 U.test(x)

引数

x        第一群の観測値ベクトルまたは,分割表データ(y=NULL)
y        第二群の観測値ベクトル
correct  連続性の修正を行うかどうかを示す
         correct=FALSE のときには,連続性の修正を行わない
         correct=TRUE のときには,連続性の修正を行う
         この引数が省略されたときは,連続性の修正を行う

ソース

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

# マン・ホイットニーの U 検定
U.test <- function(  x,                              # 第一群の観測値ベクトルまたは,分割表データ(y=NULL)
                        y = NULL,                       # 第二群の観測値ベクトル
                        correct = TRUE)                 # 連続性の補正を行うかどうか
{
        method <- "マン・ホイットニーの U 検定"
        if (is.null(y)) {                               # 2 × C 行列の分割表として与えられたとき
                if (nrow(x) != 2) stop("2 x C matrix is expected.")
                data.name <- paste(deparse(substitute(x)), "as 2 by C matrix")
                nc <- ncol(x)                                # カテゴリー数
                y <- x[2,]                           # 第二群の度数分布
                x <- x[1,]                           # 第一群の度数分布
                tie <- x+y                           # 合計した度数分布(同順位)
                n1 <- sum(x)                         # 第一群のサンプルサイズ
                n2 <- sum(y)                         # 第二群のサンプルサイズ
                n <- n1+n2                           # 合計したサンプルサイズ
                rj <- c(0, cumsum(tie)[-nc])+(tie+1)/2       # カテゴリーに属するものの順位
                U1 <- n1*n2+n1*(n1+1)/2-sum(x*rj)    # 検定統計量
        }
        else {                                          # 2 つのデータベクトルとして与えられたとき
                data.name <- paste(deparse(substitute(x)), "and", deparse(substitute(y)))
                x <- x[!is.na(x)]                    # 欠損値を持つケースを除く
                y <- y[!is.na(y)]                    # 欠損値を持つケースを除く
                n1 <- length(x)                              # 第一群のサンプルサイズ
                n2 <- length(y)                              # 第二群のサンプルサイズ
                n <- n1+n2                           # 合計したサンプルサイズ
                xy <- c(x, y)                                # 両群のデータを結合したもの
                r <- rank(xy)                                # 順位のベクトル
                U1 <- n1*n2+n1*(n1+1)/2-sum(r[1:n1]) # 検定統計量
                tie <- table(r)                              # 同順位の集計
        }
        U <- min(U1, n1*n2-U1)                               # U 統計量
        V <- n1*n2*(n^3-n-sum(tie^3-tie))/12/(n^2-n) # 同順位を考慮した分散
        E <- n1*n2/2                                 # 期待値
        Z <- (abs(U-E)-ifelse(correct, 0.5, 0))/sqrt(V)      # Z 値
        P <- pnorm(Z, lower.tail=FALSE)*2            # 両側 P 値
        return(structure(list(statistic=c(U=U, "E(U)"=E, "V(U)"=V, "Z-value"=Z), p.value=P,
                method=method, data.name=data.name), class="htest"))
}


使用例

二つのデータベクトルを与えるとき

> A <- rep(1:4, c(9, 12, 6, 3)) # 右と同じ c(rep(1, 9), rep(2, 12), rep(3, 6), rep(4, 3))
> B <- rep(1:4, c(4, 9, 11, 5)) # 右と同じ c(rep(1, 4), rep(2, 9), rep(3, 11), rep(4, 5))
> U.test(A, B, correct=FALSE)

	マン・ホイットニーの U 検定

data:  A and B 
U = 310.5000, E(U) = 435.0000, V(U) = 3993.5593, Z-value = 1.9701, p-value = 0.04883

以下と比較のこと
> wilcox.test(A, B, correct=FALSE)

	Wilcoxon rank sum test

data:  A and B
W = 310.5, p-value = 0.04883
alternative hypothesis: true mu is not equal to 0

Warning message:
Cannot compute exact p-value with ties in: wilcox.test.default(A, B, correct = FALSE)

分割表を与えるとき

        C1  C2  C3 合計
第一群  10   5   1  16
第二群  4   7   3    14

> x <- matrix(c(10, 5, 1, 4, 7, 3), byrow=TRUE, nrow=2)
> U.test(x, correct=FALSE)

	マン・ホイットニーの U 検定

data:  x as 2 by C matrix 
U = 70.0000, E(U) = 112.0000, V(U) = 481.9862, Z-value = 1.9131, p-value = 0.05574

・ 解説ページ


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

Made with Macintosh