以下,間違えているかもしれませので,適当に流し読みしてください.
2023/2/12追記:このブログ記事は,同順位がない場合(応答データが連続データである場合)で各群の標本サイズが等しい場合しか扱っていません.
入門的な教科書では,Wilcoxon検定の検出力は,通常,F(x) = G(x-θ)と位置パラメータだけがずれているという前提のもとで「H0: θ=0」の検出力の話をするのが,定番です(例えば,竹村彰通(2020)『新装改訂版 現代数理統計学』学術図書 pp.287-291).しかし,平均は等しく,歪度がゼロの状況で,分散が異なる時に検出力がどれぐらいになるかも私は気になりました.
話がややこしいのですが,次のように私の中で考えが変わっていって,そのような状況の検出力が私は気になるようになりました..
- (遠い昔...)母集団分布が正規分布でない時は,Wilcoxon検定をすべきだよ.
- いやいや,2つの母集団分布の違いが位置だけずれているという前提が成立していなければ,つまり,F(x) = G(x-θ)という前提が成立していなければ,H0:θ=0の妥当な検定にWilcoxon検定はならないよ.(つまり,「母中央値の差が0」や,「母平均値の差が0」の検定としてはWilcoxon検定は妥当ではないよ.)
- 母平均が一緒で母歪度がともに0で,分散だけが違う時さえも,H0:θ=0の妥当な検定にはならないよ.
- 母平均と母分散が一緒で,母歪度がともに0でも,H0:θ=0の妥当な検定にならない例を作れるよ.
- だから,Wilcoxon検定は,「母集団分布が2つの群で全く一緒」というのを帰無仮説にした検定と考える方がいいよ.(注:今回の話とは関係ないが,Studentのt検定の帰無仮説も「母集団分布が2つの群で全く一緒」(もしくはFisher sharp hypotheis)とすべきと私は個人的には思っている.)
- 上記 2., 3., 4. のようにいうけれど,そんなに気にすべきことなの? 感度分析した方がいいんじゃない? ← イマココ.
(注:ここでの「妥当」とは,宣言した名目的な有意水準をきちんと保つことを指します.)
このブログ記事では,取り急ぎ,(3)について,最も極端な例で,どこまで実際の有意水準(検定のサイズ)が膨れ上がるか,名目的な有意水準が両側5%の時で調べてみました.
最も極端な例とは,1群における値が,もう一方の群のすべての値よりも50%で小さくなり,50%で大きくなるという例です.例えば,第1群を X〜Unif(-1,1) とした場合,もう一方の群の値がが確率50%でUnif(-3, -2),確率50%でUnif(2, 3)となるような場合を考えます.
なお,この極端な例は2つの点で実用的な例ではありません.
(a) そんな極端なことは,現実ではまず起こり得ないでしょう.
(b) もし母集団がそんなにも違うならば,その違いを検出する検定を使うべきでしょう.
以下が,各群の標本サイズが100, 200, 400, 800, ..., 25600の時の結果です.
名目的な有意水準が両側5%のとき,極端な例に対する検出力(実際の有意水準)は10%前後のようです.間違えているかもしれませんので,是非,各自で確認してみてください.
[ 100 0.0886260801140672]
[ 200 0.103639038437849]
[ 400 0.0988217869165587]
[ 800 0.11155465468006]
[ 1600 0.104132970281548]
[ 3200 0.107674419657684]
[ 6400 0.106845874783091]
[12800 0.109632898727601]
[25600 0.108217176947184]
これは一番,極端な場合での例です.この約10%になるのをどう考えるかは,分野や状況によると思います.(ただ,約10%は検出力としては低すぎなので,Wilcoxon検定が異分散の時は「H0: θ=0」の検定としては妥当でないからと言って,異分散に敏感に検出したい場合には利用するのは得策ではないとは言えると思います.)
付記:以下は,上記の結果を出すのに用いたコードです.
(急いでいるため,マイナーな言語で書いてしまいました... なんとなくで理解してください...)
nvec = [100, 200, 400, 800, 1600, 3200, 6400, 12800, 25600];
alpha = 0.05;
z = Normal Quantile(1-alpha/2);
For(i = 1, i <= NRow(nvec), i++,
m = n = nvec[i];
crit = n*(n+m+1)/2 + z* Sqrt(m*n*(m+n+1)/12);
k = Floor*1;
power = 2 * Binomial Distribution(0.5, n, k);
Print(nvec[i]||power);
);
*1:3*n^2 + n - 2*crit)/(2*n