scipy.stats.

mannwhitneyu#

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

對兩個獨立樣本執行曼-惠特尼 U 檢定。

曼-惠特尼 U 檢定是一種無母數檢定,用於檢驗虛無假設:樣本 x 的底層分佈與樣本 y 的底層分佈相同。它通常用作檢定分佈之間位置差異的檢定。

參數:
x, yarray-like

N 維樣本陣列。陣列必須可廣播,除了沿著由 axis 給定的維度。

use_continuitybool,選用

是否應應用連續性校正 (1/2)。當 method'asymptotic' 時,預設為 True;否則無效。

alternative{‘two-sided’, ‘less’, ‘greater’},選用

定義對立假設。預設為 ‘two-sided’。令 SX(u)SY(u) 分別為 xy 底層分佈的存活函數。然後,以下對立假設可用

  • ‘two-sided’:分佈不相等,即對於至少一個 uSX(u) ≠ SY(u)

  • ‘less’:x 的底層分佈在隨機上小於 y 的底層分佈,即對於所有 uSX(u) < SY(u)

  • ‘greater’:x 的底層分佈在隨機上大於 y 的底層分佈,即對於所有 uSX(u) > SY(u)

在更嚴格的假設集下,對立假設可以用分佈的位置來表示;參見 [5] 第 5.1 節。

axisint 或 None,預設值:0

如果是 int,則為計算統計量的輸入軸。輸入的每個軸切片(例如,列)的統計量將出現在輸出的相應元素中。如果為 None,則輸入將在計算統計量之前被展平。

method{‘auto’, ‘asymptotic’, ‘exact’} 或 PermutationMethod 實例,選用

選擇用於計算 p 值的method。預設為 ‘auto’。以下選項可用。

  • 'asymptotic':將標準化檢定統計量與常態分佈進行比較,並校正 ties。

  • 'exact':通過將觀察到的 \(U\) 統計量與虛無假設下 \(U\) 統計量的精確分佈進行比較來計算精確 p 值。不對 ties 進行校正。

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

  • PermutationMethod 實例。在這種情況下,p 值是使用 permutation_test 以及提供的配置選項和其他適當設定計算的。

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

定義如何處理輸入的 NaN。

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

  • omit:在執行計算時將省略 NaN。如果在計算統計量的軸切片中剩餘的資料不足,則輸出的相應條目將為 NaN。

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

keepdimsbool,預設值:False

如果設定為 True,則縮減的軸將保留在結果中,作為大小為一的維度。使用此選項,結果將針對輸入陣列正確廣播。

返回:
resMannwhitneyuResult

包含屬性的物件

statisticfloat

與樣本 x 對應的曼-惠特尼 U 統計量。有關與樣本 y 對應的檢定統計量,請參閱 Notes。

pvaluefloat

所選 alternative 的關聯 p 值。

Notes

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

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

當沒有 ties 且任一樣本大小小於 8 [1] 時,建議使用 method 'exact'。該實作遵循 [3] 中報告的演算法。請注意,精確方法針對 ties 進行校正,但如果資料中存在 ties,mannwhitneyu 不會引發錯誤或警告。如果存在 ties 且任一樣本很小(少於約 10 個觀察值),請考慮傳遞 PermutationMethod 的實例作為 method 以執行置換檢定。

曼-惠特尼 U 檢定是獨立樣本 t 檢定的無母數版本。當來自母體的樣本平均值呈常態分佈時,請考慮 scipy.stats.ttest_ind

從 SciPy 1.9 開始,np.matrix 輸入(不建議用於新程式碼)在執行計算之前會轉換為 np.ndarray。在這種情況下,輸出將是純量或形狀適當的 np.ndarray,而不是 2D np.matrix。同樣地,雖然會忽略遮罩陣列的遮罩元素,但輸出將是純量或 np.ndarray,而不是 mask=False 的遮罩陣列。

參考文獻

[1]

H.B. Mann 和 D.R. Whitney,“關於檢定兩個隨機變數之一是否在隨機上大於另一個”,《數理統計年鑑》,第 18 卷,第 50-60 頁,1947 年。

[2]

曼-惠特尼 U 檢定,維基百科,http://en.wikipedia.org/wiki/Mann-Whitney_U_test

[3]

Andreas Löffler,“Über eine Partition der nat. Zahlen und ihr Anwendung beim U-Test”,Wiss. Z. Univ. Halle,XXXII’83 pp. 87-89。

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

Rosie Shier,“統計:2.3 曼-惠特尼 U 檢定”,數學學習支援中心,2004 年。

[5]

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

範例

我們遵循 [4] 中的範例:九名隨機抽樣的年輕成年人在以下年齡被診斷出患有第二型糖尿病。

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

我們使用曼-惠特尼 U 檢定來評估男性和女性的診斷年齡是否存在統計上的顯著差異。虛無假設是男性診斷年齡的分佈與女性診斷年齡的分佈相同。我們決定需要 95% 的信賴水準才能拒絕虛無假設,轉而支持分佈不同的對立假設。由於樣本數量非常小,且資料中沒有 ties,我們可以將觀察到的檢定統計量與虛無假設下檢定統計量的精確分佈進行比較。

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

mannwhitneyu 始終報告與第一個樣本(在本例中為男性)相關的統計量。這與 [4] 中報告的 \(U_M = 17\) 一致。與第二個統計量相關的統計量可以計算為

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

這與 [4] 中報告的 \(U_F = 3\) 一致。雙尾 p 值可以從任一統計量計算得出,且 mannwhitneyu 產生的值與 [4] 中報告的 \(p = 0.11\) 一致。

>>> print(p)
0.1111111111111111

檢定統計量的精確分佈是漸近常態的,因此範例繼續將精確 p 值與使用常態近似產生的 p 值進行比較。

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

此處 mannwhitneyu 報告的 p 值似乎與 [4] 中給出的值 \(p = 0.09\) 衝突。原因是 [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 檢定來執行分析。

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

在此假設下,p 值將足夠低,足以拒絕虛無假設,轉而支持對立假設。