當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python SciPy stats.mannwhitneyu用法及代碼示例


本文簡要介紹 python 語言中 scipy.stats.mannwhitneyu 的用法。

用法:

scipy.stats.mannwhitneyu(x, y, use_continuity=True, alternative='two-sided', axis=0, method='auto', *, nan_policy='propagate', keepdims=False)#

對兩個獨立樣本執行Mann-Whitney U 秩檢驗。

Mann-Whitney U 檢驗是零假設的非參數檢驗,即樣本 x 的分布與樣本 y 的分布相同。它通常被用作分布之間位置差異的測試。

參數

x, y 類數組

N-d 樣本數組。數組必須是可廣播的,除非沿軸給定的維度。

use_continuity 布爾型,可選

是否應應用連續性校正 (1/2)。默認為 True 時方法'asymptotic';否則沒有任何影響。

alternative {‘雙麵’,‘less’, ‘greater’},可選

定義備擇假設。默認為“雙麵”。令 F(u) 和 G(u) 分別為 x 和 y 基礎分布的累積分布函數。那麽以下替代假設可用:

  • “雙麵”:分布不相等,即對於至少一個 u,F(u) ≠ G(u)。

  • ‘less’:x 的分布隨機小於 y 的分布,即所有 u 的 F(u) > G(u)。

  • ‘greater’:x 的分布隨機大於 y 的分布,即對於所有 u,F(u) < G(u)。

請注意,上述替代假設中的數學表達式說明了基礎分布的 CDF。乍一看,不等式的方向似乎與自然語言說明不一致,但事實並非如此。例如,假設XY是遵循 CDF 分布的隨機變量FG, 分別。如果F(u) > G(u)對所有人u, 樣本取自X往往少於從中抽取的Y.

在一組更具限製性的假設下,替代假設可以用分布的位置來表示;參見 [5] 第 5.1 節。

axis int 或無,默認值:0

如果是 int,則計算統計量的輸入軸。輸入的每個axis-slice(例如行)的統計信息將出現在輸出的相應元素中。如果 None ,輸入將在計算統計數據之前被分解。

method {‘auto’, ‘asymptotic’, ‘exact’},可選

選擇用於計算 p 值的方法。默認為‘auto’。可以使用以下選項。

  • 'asymptotic' :將標準化測試統計量與正態分布進行比較,校正平局。

  • 'exact': 計算準確的p-通過比較觀察到的值\(U\) 統計數據的準確分布\(U\) 零假設下的統計量。沒有對關係進行更正。

  • 'auto' :當其中一個樣本的大小小於或等於8並且沒有平局時,選擇'exact';否則選擇'asymptotic'

nan_policy {‘propagate’, ‘omit’, ‘raise’}

定義如何處理輸入 NaN。

  • propagate :如果計算統計數據的軸切片(例如行)中存在NaN,則輸出的相應條目將為 NaN。

  • omit : 計算時將省略NaNs。如果計算統計數據的軸切片中剩餘的數據不足,則輸出的相應條目將為 NaN。

  • raise :如果存在 NaN,則會引發 ValueError

keepdims 布爾值,默認值:假

如果將其設置為 True,則縮小的軸將作為尺寸為 1 的尺寸留在結果中。使用此選項,結果將針對輸入數組正確廣播。

返回

res MannwhitneyuResult

包含屬性的對象:

統計 浮點數

與樣本 x 對應的Mann-Whitney U 統計量。有關與樣本 y 對應的檢驗統計量,請參見注釋。

p值 浮點數

所選替代方案的相關 p 值。

注意

如果U1是與樣本對應的統計量x,則與樣本對應的統計量yU2 = x.shape[axis] * y.shape[axis] - U1.

mannwhitneyu 用於獨立樣本。對於相關/配對樣本,請考慮 scipy.stats.wilcoxon

方法 'exact'當沒有平局且任一樣本量小於 8 時,建議使用[1].實現遵循最初提出的遞歸關係[1]如中所述[3].請注意,確切的方法是不是糾正了關係,但mannwhitneyu如果數據中存在關聯,則不會引發錯誤或警告。

Mann-Whitney U 檢驗是獨立樣本t-test 的非參數版本。當總體樣本均值呈正態分布時,請考慮 scipy.stats.ttest_ind

從 SciPy 1.9 開始,np.matrix 輸入(不建議用於新代碼)在執行計算之前轉換為 np.ndarray。在這種情況下,輸出將是標量或適當形狀的 np.ndarray 而不是 2D np.matrix 。同樣,雖然屏蔽數組的屏蔽元素被忽略,但輸出將是標量或 np.ndarray 而不是帶有 mask=False 的屏蔽數組。

參考

[1] (1,2)

HB曼恩和 D.R.惠特尼,“關於兩個隨機變量中的一個是否隨機大於另一個的測試”,數理統計年鑒,卷。 18,第 50-60 頁,1947 年。

[2]

Mann-Whitney U 測試,維基百科,http://en.wikipedia.org/wiki/Mann-Whitney_U_test

[3]

A. Di Bucchianico,“組合學、計算機代數和Wilcoxon-Mann-Whitney 測試”,統計規劃與推理雜誌,卷。 79,第 349-364 頁,1999。

[4] (1,2,3,4,5,6,7)

Rosie Shier,“統計:2.3 Mann-Whitney U 測試”,數學學習支持中心,2004 年。

[5]

Michael P. Fay 和 Michael A. Proschan。 “Wilcoxon-Mann-Whitney還是t-test?關於假設檢驗的假設和對決策規則的多種解釋。”統計調查,卷。 4,第 1-39 頁,2010 年。https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2857732/

例子

我們遵循[4]中的例子:九名隨機抽樣的年輕人在以下年齡被診斷為II型糖尿病。

>>> males = [19, 22, 16, 29, 24]
>>> females = [20, 11, 17, 12]

我們使用Mann-Whitney U檢驗來評估男性和女性的診斷年齡是否存在統計學上的顯著差異。零假設是男性診斷年齡分布與女性診斷年齡分布相同。我們決定需要 95% 的置信水平來拒絕零假設,以支持分布不同的替代方案。由於樣本數量非常少並且數據中沒有聯係,我們可以將觀察到的檢驗統計量與原假設下檢驗統計量的確切分布進行比較。

>>> from scipy.stats import mannwhitneyu
>>> U1, p = mannwhitneyu(males, females, method="exact")
>>> print(U1)
17.0

mannwhitneyu 始終報告與第一個樣本相關的統計數據,在本例中為男性。這與[4]中報告的 一致。可以計算與第二個統計量相關的統計量:

>>> nx, ny = len(males), len(females)
>>> U2 = nx*ny - U1
>>> print(U2)
3.0

這符合\(U_F = 3\) 報道於[4]。雙麵的p-value 可以從任一統計量中計算出來,並且產生的值是mannwhitneyu同意\(p = 0.11\) 報道於[4].

>>> print(p)
0.1111111111111111

檢驗統計量的精確分布是漸近正態的,因此該示例繼續將精確 p 值與使用正態近似生成的 p 值進行比較。

>>> _, pnorm = mannwhitneyu(males, females, method="asymptotic")
>>> print(pnorm)
0.11134688653314041

這裏mannwhitneyu的報道p-value 似乎與 value 衝突\(p = 0.09\) 給出[4].原因是[4]不應用由執行的連續性校正mannwhitneyu;mannwhitneyu減少檢驗統計量與均值之間的距離\(\mu = n_x n_y / 2\) 0.5 以糾正離散統計量與連續分布進行比較的事實。在這裏,\(U\) 使用的統計量小於平均值,因此我們通過在分子中添加 0.5 來減小距離。

>>> import numpy as np
>>> from scipy.stats import norm
>>> U = min(U1, U2)
>>> N = nx + ny
>>> z = (U - nx*ny/2 + 0.5) / np.sqrt(nx*ny * (N + 1)/ 12)
>>> p = 2 * norm.cdf(z)  # use CDF to get p-value from smaller statistic
>>> print(p)
0.11134688653314041

如果需要,我們可以禁用連續性校正以獲得與 [4] 中報告的結果一致的結果。

>>> _, pnorm = mannwhitneyu(males, females, use_continuity=False,
...                         method="asymptotic")
>>> print(pnorm)
0.0864107329737

無論我們執行精確檢驗還是漸近檢驗,檢驗統計量偶然出現極端或更極端的概率超過 5%,因此我們認為結果不具有統計顯著性。

假設在看到數據之前,我們假設女性往往比男性更年輕地被診斷出來。在這種情況下,很自然地提供女性年齡作為第一個輸入,我們將使用 alternative = 'less' 進行單方麵測試:女性的診斷年齡隨機小於男性。

>>> res = mannwhitneyu(females, males, alternative="less", method="exact")
>>> print(res)
MannwhitneyuResult(statistic=3.0, pvalue=0.05555555555555555)

同樣,在原假設下偶然獲得足夠低的檢驗統計值的概率大於 5%,因此我們不會拒絕原假設以支持我們的替代方案。

如果可以合理地假設來自總體的樣本均值是正態分布的,我們可以使用t-test 來執行分析。

>>> from scipy.stats import ttest_ind
>>> res = ttest_ind(females, males, alternative="less")
>>> print(res)
Ttest_indResult(statistic=-2.239334696520584, pvalue=0.030068441095757924)

在此假設下,p 值將足夠低,足以拒絕原假設並支持替代方案。

相關用法


注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.stats.mannwhitneyu。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。