12

Pythonのscipy.stats.ranksumsとRのwilcox.testはどちらも、Wilcoxon順位和検定の両側p値を計算することになっています。しかし、同じデータで両方の関数を実行すると、桁違いに異なるp値が得られます。

R:

> x=c(57.07168,46.95301,31.86423,38.27486,77.89309,76.78879,33.29809,58.61569,18.26473,62.92256,50.46951,19.14473,22.58552,24.14309)
> y=c(8.319966,2.569211,1.306941,8.450002,1.624244,1.887139,1.376355,2.521150,5.940253,1.458392,3.257468,1.574528,2.338976)
> print(wilcox.test(x, y))

        Wilcoxon rank sum test

data:  x and y 
W = 182, p-value = 9.971e-08
alternative hypothesis: true location shift is not equal to 0 

Python:

>>> x=[57.07168,46.95301,31.86423,38.27486,77.89309,76.78879,33.29809,58.61569,18.26473,62.92256,50.46951,19.14473,22.58552,24.14309]
>>> y=[8.319966,2.569211,1.306941,8.450002,1.624244,1.887139,1.376355,2.521150,5.940253,1.458392,3.257468,1.574528,2.338976]
>>> scipy.stats.ranksums(x, y)
(4.415880433163923, 1.0059968254463979e-05)

つまり、Rは私に1e-7を与え、Pythonは私に1e-5を与えます。

この違いはどこから来て、どれが「正しい」p値ですか?

4

1 に答える 1

21

これは、オプションの選択によって異なります (連続性補正の有無にかかわらず、正確な近似と通常の近似の比較)。

R のデフォルト:

既定では ('exact' が指定されていない場合)、標本に含まれる有限値が 50 未満で同順位がない場合、正確な p 値が計算されます。それ以外の場合は、正規近似が使用されます。

デフォルト (上記参照):

wilcox.test(x, y)

    Wilcoxon rank sum test

data:  x and y 
W = 182, p-value = 9.971e-08
alternative hypothesis: true location shift is not equal to 0 

連続性補正による正規近似:

> wilcox.test(x, y, exact=FALSE, correct=TRUE)

    Wilcoxon rank sum test with continuity correction

data:  x and y 
W = 182, p-value = 1.125e-05
alternative hypothesis: true location shift is not equal to 0 

連続性補正なしの正規近似:

> (w0 <- wilcox.test(x, y, exact=FALSE, correct=FALSE))

    Wilcoxon rank sum test

data:  x and y 
W = 182, p-value = 1.006e-05
alternative hypothesis: true location shift is not equal to 0 

もう少し精度を上げるには:

w0$p.value
[1] 1.005997e-05

Python が提供する他の値 (4.415880433163923) は Z スコアのようです。

2*pnorm(4.415880433163923,lower.tail=FALSE)
[1] 1.005997e-05

何が起こっているのか知りたいと思うのはありがたいことですが、p=1e-7p=1e-5...の間に実際的な違いはめったにないことも指摘しておきます。

于 2012-10-09T11:45:05.907 に答える