logo
生物科学研究所 井口研究室
Laboratory of Biology, Okaya, Nagano, Japan
Home

Kruskal-Wallis 検定を使えば U 検定は不要:漸近と正確検定

井口豊(生物科学研究所,長野県岡谷市)
最終更新:2022 年 10 月 23 日

1. はじめに

Kruskal-Wallis (クラスカル-ウォリス)検定は,2 群以上の平均順位(Mean rank)の差の検定として用いられる。中央値の検定ではない,ことに注意する必要があり,それに関しては,別ページに書いた。

さらに,この検定が 3 群以上と誤って解説されることがあるが, 2 群でも,もちろん適用できる。また,この検定には,漸近検定(近似検定)と正確検定があることも意外に知られていない。実際,医療系の学術論文でこの点を見落としているのではないか,と思われるものがあり,そのデータを再分析してみた結果を 学術論文で気になるケースで示した。

ここでは便宜上,タイ(結び,同点)が無いデータを考え,統計解析ソフト R を用いて,2 群(2 標本,サンプル数 2)の Kruskal-Wallis 検定を行なってみる。多群の検定の場合,その特徴を知るには,2 群比較を行なうのが最適な方法であることは,別の解説ページでも述べた。

以下に R を利用して Kruskal-Wallis 検定の漸近検定(近似検定)と正確検定の違いを調べてみよう。

2. Kruskal-Wallis 漸近検定(近似検定): 2 群の場合

まず一般的に使われる kruskal.test 関数で,以下のような,共に大きさ 4 の 2 標本 a,b の検定をしてみる。なお,くどいようだが,これはサンプル数 2 で,それぞれサンプルサイズ 4 の問題である。サンプル数とサンプルサイズを混同しないでほしい(参照:サンプル数とサンプルサイズ n は意味が違う)。

以下が R の検定スクリプトである。


#############
# Kruskal-Wallis 検定
# データ
x1<- c(1, 3, 5, 6)
x2<- c(2, 4, 7, 9)

dat<- c(x1, x2)
grp<- rep(1:2, c(4, 4))

kruskal.test(dat ~ grp)

################

結果
p = 0.3865

これが,漸近 U 検定における p 値と同値であることは,以下のようにして確認できる。


#############
# Mann-Whitney U (Wilcoxon 順位和) 漸近検定,連続補正なし
wilcox.test(x1, x2, exact=F, correct=F)

################

したがって,これは 2 群の Steel-Dwass 多重検定の結果とも同値であることは,パッケージ NSM3 の中の pSDCFlig 関数を使うと確認できる。


#############
#  2 群の Steel-Dwass 多重検定
library(NSM3)
pSDCFlig(dat, grp, method="Asymptotic")

################

つまり,通常使われる Kruskal-Wallis 検定は,2 群の場合,漸近 U 検定であり,漸近 Steel-Dwass 多重検定なのである。 2 群であっても,多重検定できるのである。

この場合の漸近検定とは,漸近的にカイ二乗検定分布に近似させた検定である。ただし,標準正規分布 N (0,1) に従う確率変数 Z の 2 乗は,自由度 1 のカイ二乗分布になるので,上記のような 2 群の場合は,正規分布近似を行なっていると言っても良い。

3. Kruskal-Wallis 正確検定: 2 群の場合

さきほどと同じデータで正確検定の場合を考える。まず, U 検定を使う場合は,次のようになる。


#############
# Mann-Whitney U (Wilcoxon 順位和) 正確検定
wilcox.test(x1, x2, exact=T)

################

結果
p = 0.4857

当然ながら,さきほどの漸近検定の場合とは,結果が異なる。 p 値を詳しく算出するには以下のようにする。


#############
# p 値取り出し
wilcox.test(x1, x2, exact=T)$p.value

################

結果
p = 0.4857143

これを 2 群の Kruskal-Wallis 検定の正確検定として実行するには,パッケージ kSamples の中の qn.test 関数(Rank Score k-Sample Tests)を使えば良い。


#############
# 2 群のKruskal-Wallis 正確検定
library(kSamples)
qn.test(x1, x2, test="KW", method="exact")

################

この関数は,実に便利な優れものであって,漸近 p 値も,正確 p 値も算出される。

結果
asympt. P-value    exact P-Value 
0.3864762        0.4857143 

したがって,この関数で Kruskal-Wallis 検定を行なえば, Mann-Whitney U 検定は不要であるとも言える。

4. Kruskal-Wallis 漸近検定(近似検定): 3 群の場合

次に, 3 群(3 標本) x1, x2, x3 の場合を考えてみよう。すなわちサンプル数は 3 であり,サンプルサイズを,それぞれ 4, 4, 3 とする。

まず,一般的な Kruskal-Wallis 検定,すなわち,漸近検定を行なう。


#############
# Kruskal-Wallis 漸近検定, 3 群の場合
x1<- c(1, 3, 5, 6)
x2<- c(2, 4, 7, 9)
x3<- c(8, 10, 12)

dat<- c(x1, x2, x3)
grp<- rep(1:3, c(4, 4, 3))

kruskal.test(dat ~ grp)

################

結果
p = 0.06086

これを理論的に算出するには,まずデータ全体の順位を計算し,その中から,各群内の順位和 R1, R2, R3 を取り出し,以下の式に基づいて,検定統計量 H を求める。なお, N は全体の標本サイズ, n1, n2, n3 は各群の標本サイズである。

Kruskal-Wallis 検定統計量 H

この H が,群数 − 1 の自由度(ここでは, 3 − 1 = 2) のカイ二乗分布に近似的に従うことを利用して p 値を求めることができる。前述のデータを利用した R のスクリプトは以下のようになる。


#############
# 計算式に基づく Kruskal-Wallis 漸近検定
# 全体の順位 
rk<- rank(dat)

# 各群内の順位和
r1<- sum(rk[1: 4])
r2<- sum(rk[5: 8])
r3<- sum(rk[9: 11])

# Kruskal-Wallis 検定統計量
h<- 12/(11*12)*(r1^2/4+r2^2/4+r3^2/3)-3*(11+1)

# カイ二乗分布を用いた p 値の算出
pchisq(h, 2, lower=F)

################

当然ながら,前述の kruskal.test 関数を用いた場合と同じ近似結果になる。

6. Kruskal-Wallis 正確検定: 3 群の場合

3 群で Kruskal-Wallis 正確検定をするためは,2 群の場合と同じく, qn.test 関数を使えば良い。ただし,正確と言っても,この場合は,シミュレーションで反復回数を多くして計算することになる。


#############
# Kruskal-Wallis 正確検定
library(kSamples)
qn.test(x1, x2, x3, test="KW", Nsim = 1000000, method="exact")

################

結果
asympt. P-value    exact P-Value 
        0.06086          0.04866

前述のとおり,漸近 p 値である asympt. P-value は,通常の Kruskal-Wallis 検定の p 値である。この結果は,5%有意水準とすると,カイ二乗近似による漸近検定では有意差無しだが,正確検定では有意差ありとなり,異なった結論になるのである。

Steel-Dwass 検定の場合と同じく,問題は,自分が使うソフトやプログラムが,どちらの方法を採っているか知らずに,あるいは,区別があることすら知らずに,それらを使う場合である。例えば, R ベースの有名なフリーソフト EZR の Kruskal-Wallis 検定も漸近法である。

8. 学術論文で気になるケース

漸近検定か正確検定か,それを考慮せずに Kruskal-Wallis 検定を利用したように思われるの医学論文が藤本保志ほか(1997)である。文献は,末尾に挙げた。

Kruskal-Wallis 検定が行なわれた表 3 のデータで,私が気になったのは,項目 D 「逆流」の結果である。

患者を舌切除範囲によって,なし・部切・半切・亜全摘または全摘の 4 群に分けている。 部切は10例となっているが,表 1 を見ると,部切は 9 例しかなく,たぶん,表 1 が間違えていて,症例 8 は,なし,ではなく,部切,であろう。

実際に,この逆流項目Dを,Kruskal-Wallis 漸近検定と正確検定で調べてみよう。


#############
## 藤本ら(1997)データ
# 症例番号(表1)
ex<- 1:22

# 舌切除範囲(表1)
# 0:なし, 1:部切, 2:半切, 3:亜全摘・全摘
r<- c(
1, 1, 1, 0, 0, 0, 1, 1, 1, 1,
1, 1, 1, 2, 2, 2, 2, 2, 2, 3,
3, 3
)

# 逆流スコアD(表2)
D<- c( 
8, 5, 8, 8, 9, 10, 8, 8, 8, 8,
4, 10, 10, 10, 3, 6, 8, 6, 8, 6,
4, 2
)

# データフレーム
dat<- data.frame(ex, r, D)

まず,Dの平均と標準偏差をチェックする。

# 平均
tapply(dat$D, dat$r, mean)

# 標準偏差
tapply(dat$D, dat$r, sd)

################

結果
平均
       0        1        2        3 
9.000000 7.700000 6.833333 4.000000

標準偏差
       0        1        2        3 
1.000000 1.888562 2.401388 2.000000 

それぞれ,論文の表 3 の D の統計量に一致することが確認できる。

次に, Kruskal-Wallis 検定を実行する。先に述べたように, qn.test 関数を使えば,漸近検定でも正確検定でも,その結果が出力される。ただし,データをリスト化して渡すことに注意する。


#############
# Kruskal-Wallis 検定,漸近と正確
library(kSamples)

dat.lt<- tapply(dat$D, dat$r, list) # D データのリスト化
qn.test(dat.lt, test="KW", Nsim = 1000000, method="exact")

################

結果
asympt. P-value     sim. P-Value 
        0.05549          0.04130 

5%水準で,漸近検定では有意差無し,正確検定では有意差有り,となる。

論文の表 3 を見ると, D は, p < 0.05 のアスタリスク*が付いていないので,おそらく漸近検定で分析したものだろうと推測される。本文でも,総合点のみ有意差を認めた,というような表現になっている。

この正確検定の結果が,藤本ら(1997)の結論を変えるものではない。しかしながら,通常の検定が漸近検定であることに気づいていなかったとしたら,データ解析上の問題点として挙げられる部分である。

6. Kruskal-Wallis 漸近検定(近似検定)の必要標本サイズ

Kruskal-Wallis 検定が近似計算するために必要となる標本サイズについては,別ページに解説した。

それによると, 1 群あたり 20 個以上のデータが必要である。前述の藤本ら(1997)のデータの場合, 4 群で合計 n = 22 なので, Kruskal-Wallis 漸近検定(近似検定)としては,標本が小さすぎる。

参考文献

藤本保志・松浦秀博・田山二朗・中山敏・長谷川泰久(1997)
口腔・中咽頭癌治療後えん下機能評価基準の提案とその評価成績
日本気管食道科学会会報, 48(3), 234-241.

Home