No.22708 マンホイットニーのU検定〜同順位の補正〜  【確率は難しい】 2019/04/03(Wed) 14:29

青木先生 どうかよろしくお願いします。

マンホイットニーのU検定について,先生の解説
http://aoki2.si.gunma-u.ac.jp/lecture/Average/U-test.html
を見ると,同順位の場合に補正する数式が掲載されています。
この数式通りやってみたのですが,同順位が全体の中で多いような分布の場合に確率がうまく出ない場合があることに気がつきました。

例えば,満月の日の翌日は雨が降りやすいという仮説に対して,帰無仮説を立てるとして,
16日間観測して,満月の翌日だけに100ミリの雨が降り,あとは雨が降らなかったとします。
第1群 満月の翌日ではない日→雨量0のデータが15個
第2群 満月の翌日→雨量100のデータが1個
これを上記の同順位の数式も含めて計算してみると,確率が0.0001ということになりました。

しかし,満月の日の翌日は平均気温が低くなるということで考えると,小数点以下3桁ぐらいまで平均気温を計算して同順位がないとすると,
第1群 気温9.253,10.865度・・・・など,9度〜11度の日が15個
第2群 気温8.025度のデータが1個(最も低い)
これで計算してみると,確率は0.1ということになりました。

感覚的には,満月の日だけに雨が降ったとしても,確率が0.0001というのはおかしいと思いまして,後者の確率(0.1)の方が感覚に合っているように思います。

この,同順位の式を数学的に理解することは私には難しすぎると思いますが,それはさておき,

こ れを苦肉の策で解決するために,データに適当に小さい乱数(他のデータと逆転しないような十分に小さい乱数)を足して無理に順位をつけるような数字に置き 換えて計算しました。例えば,0の日の雨量を, 0.143,0.054,0.658・・・・というふうに置き換えた計算です。そうすると,同順位がなくなり,気温の例と同じ確率になります。

このように,乱数をプラスして同順位をなくして解決する方が,同点の場合の数式を使うよりも実態に合っているように思うのですが,致命的な問題はありますでしょうか。
また,他に良い解決策はないでしょうか?
よろしくお願いします。

No.22709 Re: マンホイットニーのU検定〜同順位の補正〜  【青木繁伸】 2019/04/03(Wed) 18:03

stats の wilcox.test で,同順位があるために「タイがあるため,正確な p 値を計算することができません」となる場合は,coin パッケージの wilcox_test を使ってみましょう。
library(coin)
x <- c(rep(0, 15), 100)
g <- factor(c(rep("a", 15), "b"))
wilcox_test(x ~ g, distribution="exact")
以下が表示されます。
	Exact Wilcoxon-Mann-Whitney Test

data: x by g (a, b)
Z = -3.873, p-value = 0.0625
alternative hypothesis: true mu is not equal to 0
Z は,同順位補正をしたときの正規近似の Z 値で,表示されている p 値の算出には使われていません。

同時に表示されている p-value = 0.0625 は正確な p 値です。

coin パッケージの出現前には exactRankTests パッケージの wilcox.exact が使われていました。
library(exactRankTests)
wilcox.exact(x ~ g)
以下が表示されます。
	Exact Wilcoxon rank sum test

data: x by g
W = 0, p-value = 0.0625
alternative hypothesis: true mu is not equal to 0
W は wilcoxon 統計量です(どちらを1群にするかで,もう一方の極端な側の W = 15 が返されることもあります)。表示された p 値は,coin:::wilcox_test と同じ 0.0625 です。

もう少し他の道具でも試してみるには,
http://aoki2.si.gunma-u.ac.jp/R/index.html
の中の,
XV. exact 検定とモンテカルロ法による近似検定
3. マン・ホイットニーの U 検定(exact test)
に記載した R プログラム exact.mw を使ってみると以下のようになります。
exact.mw(x=rep(0, 15), y=1)
U = 0, Z = 3.87298, P 値 = 0.000107511
正確な P 値 = 0.0625
査察した分割表の個数は 2 個
示されている U = 0, Z = 3.87298 は,coin:::wilcox_test の Z と同じですね。

次の行に正確な p 値が示されています。0.0625 で,coin:::wilcox_test,exactRankTests:::wilcox.exact の p 値と同じです。

exact.mw は exact.mw(matrix(c(15, 0, 0, 1), 2)) のようにも書けますが,
http://aoki2.si.gunma-u.ac.jp/exact/utest/getpar.html
にオンライン版を用意してあります。
列数を 2 として,次の画面で
15 0
0 1
の2×2分割表を入力すれば, 0.0625 が表示されます。

ということで,正確な p 値は 0.0625 でよいようです。

====================

最後に,「乱数をプラスして同順位をなくして解決する方が,同点の場合の数式を使うよりも実態に合っているように思う」ということですが,乱数を加えて検定を行うという流儀は存在します。
しかし,今回の場合は
stats:::wilcox.test(1:15, 16)

Wilcoxon rank sum test

data: 1:15 and 16
W = 0, p-value = 0.125
alternative hypothesis: true location shift is not equal to 0
とすることと同じなので,わざわざ乱数を加えて同順位をなくすということがどの程度適切か疑問ですね。

No.22710 Re: マンホイットニーのU検定〜同順位の補正〜  【確率は難しい】 2019/04/04(Thu) 10:16

青木先生

アドバイスありがとうございました。
結局のところ,z値を用いて正規分布を用いるのは近似に過ぎないということに尽きるということだと理解しましたが,そういう理解で合ってますでしょうか?

実際に適用して統計分析をしており,同順位が少なく,データ数が多い場合には比較的正確な値に近く,有効に適用できていると思っています。たくさんのケースをエクセルで分析して,機械的にZ値を算出し,正規分布だと仮定してp値を出しているため,
ひとつひとつ統計ソフトに入力するというのは,出来れば避けたいと考えています。

この正確なp値の計算は,エクセルの表計算で単純に行えるようなものではないのでしょうか?

No.22711 Re: マンホイットニーのU検定〜同順位の補正〜  【青木繁伸】 2019/04/04(Thu) 12:19

それぞれのデータを wilcox_test(x ~ g, distribution="exact") で分析する数行のプログラムを書けばよいだけでしょう。

エクセルの表計算のほうが手間が掛かるのでは?

No.22712 Re: マンホイットニーのU検定〜同順位の補正〜  【確率は難しい】 2019/04/04(Thu) 15:28

先生 ありがとうございます。

タイムリーな回答をいただきまして,非常に助かりました。
本当にありがとうございました。

おそらく,「同順位が多くて,近似的なP値と正確なP値が大きく乖離するケース」はそれほど多くないと思いますので,その部分だけプログラムを書くように勉強してみます。

● 「統計学関連なんでもあり」の過去ログ--- 048 の目次へジャンプ
● 「統計学関連なんでもあり」の目次へジャンプ
● 直前のページへ戻る