Wilcoxon順位和検定

2 つの実験群があり、互いに順序関係が予測される時に、Wilcoxon 順位和検定を利用して検定する。例えば、2 つの実験群のうち、A 群には食欲促進の効果が期待される薬剤 T を 0.2mg、B 群には薬剤 T を 0.5mg を与えたとき、A 群に比べ B 群の方が体重の伸び速いと期待される。例えば、A 群と B 群のラットの体重を量って以下のようになったとする。

ラットの体重
A群320,325,320,330
B群330,325,330,330,325

Wilcoxon 順位和検定ではまず U 値を求める。A 群と B 群のデータをクロス表に書き、データを比べ A 群の方が大きければ +、A 群の方が小さければ - と書く。

U値の求め方
B 群\A 群320325320330
330---
325- -+
330---
330---
325- -+

+ または - の数を数えて、それぞれ U+、U- とする。U 値を U+、U- のうち多くない方とする。

\[ U = \min\{U_{+}, U_{-}\} = \min\{2, 13\} = 2\]

ここで求めた U = 2 は、A 群と B 群のデータを元に求めた検定量である。

次に、A 群と B 群に差がないと仮定して U 値(U0)を求める。A 群と B 群には差がないと仮定したので、両方データを同じ実験群のデータとしてみなす。すなわち、20, 20, 25, 25, 25, 30, 30, 30, 30 の 9 つのデータとなる。

この 9 つのデータから任意に 4 つ選ぶ(A 群は 4 個体、B 群は 5 個体に対応する)。この場合の数は 9C4 = 126 通りである。

これら 126 通りのすべての場合について U 値を求めると、U 値の分布は次のようになる。(計算が面倒くさいから、an や pn と略す。すべての an を足すと 126 となる。また、すべての pn を足すと 1 になる。)

U値の分布
U値012345678910
場合の数a0a1a2a3a4a5a6a7a8a9a10
確率p0p1p2p3p4p5p6p7p8p9p10

ここで、もし二つの群に差がないとするならば、P(U) が 0.05 以上、あるいは 0.95 以下であることが必要(危険率 5 % のとき)。さて、最初に検定を行いたい 2 つの群の間に差がないと仮定する。すると、この2群から得られた P(U) 値が、0.05以上、あるいは0.95以下であることが必要。しかし、U = 2のとき、U の分布表により P(U=2) = p0+p1+p2 = 0.031 となった。つまり、U=2 となる状況がほとんど起こらずに、誤差だと判断して捨てても構わない。言い換えると、最初の仮定「二つの群の間に差がない」を捨てても構わない。すなわち、背理的に「二つの群の間に差がある」といえる。

wilcoxon の順位和検定 - 独立な 2 標本検定 (R)

実験群を 2 群用意し、1 群には薬剤 A を 1.0mg を与え、2 群には薬剤 A を 2.0mg を与えた時、2 つの群の間に順序関係が予測されるときに wilcoxon の順位和検定を行う。

a <- c(21, 32, 23, 28, 30, 24)
b <- c(49, 61, 44, 59, 72, 41)
wilcox.test(a, b)
## 
## 	Wilcoxon rank sum test
## 
## data:  a and b
## W = 0, p-value = 0.002165
## alternative hypothesis: true location shift is not equal to 0

wilcoxon の順位和検定 - 独立な 2 標本検定 (Python)

以下に Python の SciPy モジュールを利用した検定方法を示す。

import numpy as np
from scipy import stats

a = np.array([21, 32, 23, 28, 30, 24])
b = np.array([49, 61, 44, 59, 72, 41])

stats.wilcoxon(a, b)
## (0.0, 0.027707849358079864)