クラスカル・ウォリス検定(Kruskal-Wallis test)について。
【目次】
クラスカル・ウォリス検定(KW検定)は3標本以上を評価するノンパラメトリックな手法。
Wilcoxonの順位和検定・マンホイットニーのU検定(以下、Wilcoxonの順位和検定等)は2標本。
帰無仮説、対立仮設
- 帰無仮説
全ての標本の確率分布に差がない(ズレていない)。
- 対立仮設
何れかの標本の確率分布に差がある(ズレている)。
Wilcoxonの順位和検定等と同じく、確率分布の位置のズレを見る。正規分布に依存しないのが特徴。
計算式等
順位和
統計量の算出前に、先ず、比較したい全標本の観測値に全体順位(Rank)をつけて、標本ごとの合計(順位和)を算出する。観測値にタイ(同一順位)がある場合は、順位の平均値をつける。この方法はWilcoxonの順位和検定等と同じ。
H統計量
H統計量は近似的に 分布(
)に従うため、
分布を使って検定を行う。
また、タイ(同一順位)の補正を行う場合、上で求めたH統計量にタイの補正値(D)を除算する。
Wilcoxonの順位和検定等と同じくタイ(同一順位)の補正式第2項の t が同一値の個数を示す。
例えば、{10,10,11,12,12,12} のデータがあるとき、10が2つ、11が1つ、12が3つになるため、それぞれ となり、
の計算で
になる。タイがない数値は解が0になり、タイにだけ働く。
なお、タイがまったくない場合は第2項の解全体が0になり、D=1-0=1になる。 で等価。
計算例
今回は、架空の4標本に違いがあるか評価する。
A {10,10,11,12,12,12}
B {12,13,14,17,19}
C {12,14,15,19,20}
D {16,17,18,20}
Excelでの計算:
Excelの簡単な説明。
・A列:標本のグループ名。
・B列:観測値。小さい順にならべている。
・C列:同値の数を上から数ている(セルC4:=IF(B3<>B4,1,D3+1))。
・D列:同値の最終行のみ表示している(セルD4:=IF(B4=B5,"",C4))。
・E列:分散の補正項用(セルE4:=IF(D4<>"",D4^3-D4,""))
・G列:標本Aの順位(セルG4:=IF($A4=G$3, RANK.AVG($B4,$B:$B,1), ""))
・H列:標本Bの順位(セルH4:=IF($A4=H$3, RANK.AVG($B4,$B:$B,1), ""))
・I列 :標本Cの順位(セルI4 :=IF($A4=I$3, RANK.AVG($B4,$B:$B,1), ""))
・J列:標本Dの順位(セルJ4:=IF($A4=J$3, RANK.AVG($B4,$B:$B,1), ""))
H統計量:
順位和は だったため、
はそれぞれ
になる(Excel L3:P7)。
全体数はN=20のため、公式通り、H統計量は となる(Excel L9:M15)。
タイの補正:
同一値 t の計算()は 150 になる(Excel D:E, P12)。
(今回は 12 が5つあり、 と大きな値がある。)
公式通り、 となり、このDで除算して
が得られる(Excel P13:P15)。
p値:
計算式等で述べたとおり、H統計量は 分布(
)に従うため、次のようになる。
今回の架空データでは、標本間に差がある(p<0.01)。(タイ補正有無問わず)
Rでの実行:
> ads <- data.frame(
+ AVAL = c(10,10,11,12,12,12,12,12,13,14,14,15,16,17,17,18,19,19,20,20)
+ ,TRT01P = c("A","A","A","A","B","A","A","C","B","B","C","C","D","B","D","D","C","B","C","D"))
> ads$TRT01PF <- factor(ads$TRT01P)
> kruskal_test(AVAL ~ TRT01PF, data=ads, method="exact")
Asymptotic Kruskal-Wallis Test
data: AVAL by TRT01PF (A, B, C, D)
chi-squared = 11.722, df = 3, p-value = 0.0084
> kruskal.test(x=ads$AVAL, g=ads$TRT01PF)
Kruskal-Wallis rank sum test
data: ads$AVAL and ads$TRT01PF
Kruskal-Wallis chi-squared = 11.722, df = 3, p-value = 0.0084
デフォルトで使える kruskal.test、coinパッケージのkruskal_testの2つ関数がありますが、どちらもタイ補正ありの結果を得る。
SASでの実行:
タイ補正ありの結果が得られる。
data ads;
do AVAL=10,10,11,12,12,12; TRT01PN=1; output; end;
do AVAL=12,13,14,17,19; TRT01PN=2; output; end;
do AVAL=12,14,15,19,20; TRT01PN=3; output; end;
do AVAL=16,17,18,20; TRT01PN=4; output; end;
run;
proc sort data=ads: by AVAL TRT01PN; run;
proc npar1way data=ads wilcoxon;
class TRT01PN;
var AVAL;
output out=OutputDS wilcoxon;
run;
プログラムコード
■ Rのコード
#-- coinパッケージ
library(coin)
kruskal_test(AVAL ~ Group, data=ADS, method="exact")
#-- デフォルトのstatsパッケージ
kruskal.test(x=ADS$AVAL, g=ADS$Group)
■ SASのコード
proc npar1way data=[InputDS] wilcoxon;
class Group;
var AVAL;
output out=[OutputDS] wilcoxon; /*_KW_,P_KWを取得。*/
run;
■ Pythonのコード
整備中
2標本でもKW検定
2標本のデータについて、Wilcoxonの順位和検定とKW検定を実行すると、どちらも同じ p値が得られる。
> ads <- data.frame(
+ TRT01P <- c("A","A","A","A","A","A","A","A","B","B","B","A","A","B","B","A","B","B","B","B")
+ ,AVAL <- c(4,9,10,11,12,13,13,15,16,16,17,18,18,19,19,20,22,22,23,25)
+ )
> ads$TRT01PF <- factor(ads$TRT01P)
> wilcox_test(AVAL ~ TRT01PF, data=ads, method="exact")
Asymptotic Wilcoxon-Mann-Whitney Test
data: AVAL by TRT01PF (A, B)
Z = -2.9305, p-value = 0.003384
alternative hypothesis: true mu is not equal to 0
> kruskal_test(AVAL ~ TRT01PF, data=ads)
Asymptotic Kruskal-Wallis Test
data: AVAL by TRT01PF (A, B)
chi-squared = 8.5878, df = 1, p-value = 0.003384
参考
https://www.dataanalytics.org.uk/adjustment-for-tied-ranks-in-the-kruskal-wallis-test/
https://www.lexjansen.com/wuss/2018/26_Final_Paper_PDF.pdf