scipy.stats.

quantile_test#

scipy.stats.quantile_test(x, *, q=0, p=0.5, alternative='two-sided')[原始碼]#

執行分位數檢定並計算分位數的信賴區間。

此函數檢定虛無假設:q 是與機率 p 相關聯的分位數值,此機率 p 是樣本 x 底層母體的機率。例如,使用預設參數,它檢定 x 底層母體的中位數是否為零。此函數會傳回一個物件,其中包含檢定統計量、p 值,以及計算分位數周圍信賴區間的方法。

參數:
xarray_like

一維樣本。

qfloat,預設值:0

假設的分位數值。

pfloat,預設值:0.5

與分位數相關聯的機率;即,小於 q 的母體比例為 p。必須嚴格介於 0 和 1 之間。

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

定義對立假設。以下選項可用(預設為 ‘two-sided’)

  • ‘two-sided’:與機率 p 相關聯的分位數不是 q

  • ‘less’:與機率 p 相關聯的分位數小於 q

  • ‘greater’:與機率 p 相關聯的分位數大於 q

傳回:
resultQuantileTestResult

具有以下屬性的物件

statisticfloat

分位數檢定中可能使用的兩個檢定統計量之一。第一個檢定統計量 T1 是樣本 x 中小於或等於假設分位數 q 的比例。第二個檢定統計量 T2 是樣本 x 中嚴格小於假設分位數 q 的比例。

alternative = 'greater' 時,T1 用於計算 p 值,且 statistic 設定為 T1

alternative = 'less' 時,T2 用於計算 p 值,且 statistic 設定為 T2

alternative = 'two-sided' 時,會同時考慮 T1T2,並使用導致最小 p 值的一個。

statistic_typeint

根據用於計算 p 值的 T1T2,為 12

pvaluefloat

與給定對立假設相關聯的 p 值。

該物件也具有以下方法

confidence_interval(confidence_level=0.95)

計算機率 p 相關聯的母體分位數周圍的信賴區間。信賴區間以 namedtuple 傳回,其中包含欄位 lowhigh。當沒有足夠的觀察值來計算所需信賴度的信賴區間時,值為 nan

註解

此檢定及其計算信賴區間的方法是非參數的。它們僅在觀察值為 i.i.d. 時有效。

檢定的實作遵循 Conover [1]。考慮了兩個檢定統計量。

T1x 中小於或等於 q 的觀察值數量。

T1 = (x <= q).sum()

T2x 中嚴格小於 q 的觀察值數量。

T2 = (x < q).sum()

使用兩個檢定統計量是必要的,以處理 x 是從離散或混合分佈產生的可能性。

檢定的虛無假設為

H0:第 \(p^{\mathrm{th}}\) 個母體分位數為 q

且每個檢定統計量的虛無分佈為 \(\mathrm{binom}\left(n, p\right)\)。當 alternative='less' 時,對立假設為

H1:第 \(p^{\mathrm{th}}\) 個母體分位數小於 q

且 p 值是二項式隨機變數的機率

\[Y \sim \mathrm{binom}\left(n, p\right)\]

大於或等於觀察值 T2

alternative='greater' 時,對立假設為

H1:第 \(p^{\mathrm{th}}\) 個母體分位數大於 q

且 p 值是二項式隨機變數 Y 小於或等於觀察值 T1 的機率。

alternative='two-sided' 時,對立假設為

H1:q 不是第 \(p^{\mathrm{th}}\) 個母體分位數。

且 p 值是 'less''greater' 情況下較小 p 值的兩倍。這兩個 p 值都可能超過相同資料的 0.5,因此該值會被裁剪到區間 \([0, 1]\) 中。

信賴區間的方法歸功於 Thompson [2],後來被證明適用於任何 i.i.d. 樣本集 [3]。計算基於以下觀察:分位數 \(q\) 大於任何觀察值 \(x_m (1\leq m \leq N)\) 的機率可以計算為

\[\mathbb{P}(x_m \leq q) = 1 - \sum_{k=0}^{m-1} \binom{N}{k} q^k(1-q)^{N-k}\]

預設情況下,信賴區間是針對 95% 的信賴度計算的。95% 信賴區間的常見解釋是,如果從同一個母體重複抽取 i.i.d. 樣本,並且每次都形成信賴區間,則信賴區間將在大約 95% 的試驗中包含指定分位數的真實值。

QuantileNPCI R 套件 [4] 中提供了類似的函數。基礎相同,但它通過在樣本值之間進行內插來計算信賴區間邊界,而此函數僅使用樣本值作為邊界。因此,quantile_test.confidence_interval 傳回更保守的區間(即,更大)。

confintr 套件 [5] 中包含相同的分位數信賴區間計算。

雙尾信賴區間不保證是最佳的;也就是說,可能存在更嚴格的區間,該區間可能以大於信賴度的機率包含感興趣的分位數。在沒有對樣本進行進一步假設(例如,底層分佈的性質)的情況下,單尾區間是最佳嚴格的。

參考文獻

[1]
    1. Conover。Practical Nonparametric Statistics,第 3 版。1999 年。

[2]

W. R. Thompson,“論中位數和其他未知分佈形式母體的期望分佈的信賴範圍”,The Annals of Mathematical Statistics,第 7 卷,第 3 期,第 122-128 頁,1936 年,存取日期:2019 年 9 月 18 日。[線上]。可於:https://www.jstor.org/stable/2957563

[3]

H. A. David 和 H. N. Nagaraja,“非參數推論中的順序統計量”,載於順序統計量,John Wiley & Sons,Ltd,2005 年,第 159-170 頁。可於:https://onlinelibrary.wiley.com/doi/10.1002/0471722162.ch7

[4]

N. Hutson、A. Hutson、L. Yan,“QuantileNPCI:分位數的非參數信賴區間”,R 套件,https://r-cran.dev.org.tw/package=QuantileNPCI

[5]

M. Mayer,“confintr:信賴區間”,R 套件,https://r-cran.dev.org.tw/package=confintr

範例

假設我們希望檢定母體的中位數等於 0.5 的虛無假設。我們選擇 99% 的信賴度;也就是說,如果 p 值小於 0.01,我們將拒絕虛無假設,轉而支持對立假設。

當檢定來自標準均勻分佈的隨機變量時,該分佈的中位數為 0.5,我們預期資料與虛無假設大多數時間一致。

>>> import numpy as np
>>> from scipy import stats
>>> rng = np.random.default_rng()
>>> rvs = stats.uniform.rvs(size=100, random_state=rng)
>>> stats.quantile_test(rvs, q=0.5, p=0.5)
QuantileTestResult(statistic=45, statistic_type=1, pvalue=0.36820161732669576)

如預期的,p 值未低於我們的 0.01 閾值,因此我們無法拒絕虛無假設。

當檢定來自標準常態分佈的資料時,該分佈的中位數為 0,我們預期虛無假設會被拒絕。

>>> rvs = stats.norm.rvs(size=100, random_state=rng)
>>> stats.quantile_test(rvs, q=0.5, p=0.5)
QuantileTestResult(statistic=67, statistic_type=2, pvalue=0.0008737198369123724)

實際上,p 值低於我們的 0.01 閾值,因此我們拒絕虛無假設,轉而支持預設的「雙尾」對立假設:母體的中位數等於 0.5。

但是,假設我們要針對單尾對立假設(母體的中位數大於 0.5)檢定虛無假設。由於標準常態分佈的中位數小於 0.5,因此我們不預期虛無假設會被拒絕。

>>> stats.quantile_test(rvs, q=0.5, p=0.5, alternative='greater')
QuantileTestResult(statistic=67, statistic_type=1, pvalue=0.9997956114162866)

不出所料,由於 p 值大於我們的閾值,我們不會拒絕虛無假設,轉而支持選擇的對立假設。

分位數檢定可用於任何分位數,而不僅僅是中位數。例如,我們可以檢定樣本底層分佈的第三四分位數是否大於 0.6。

>>> rvs = stats.uniform.rvs(size=100, random_state=rng)
>>> stats.quantile_test(rvs, q=0.6, p=0.75, alternative='greater')
QuantileTestResult(statistic=64, statistic_type=1, pvalue=0.00940696592998271)

p 值低於閾值。我們拒絕虛無假設,轉而支持對立假設:我們樣本底層分佈的第三四分位數大於 0.6。

quantile_test 也可以計算任何分位數的信賴區間。

>>> rvs = stats.norm.rvs(size=100, random_state=rng)
>>> res = stats.quantile_test(rvs, q=0.6, p=0.75)
>>> ci = res.confidence_interval(confidence_level=0.95)
>>> ci
ConfidenceInterval(low=0.284491604437432, high=0.8912531024914844)

當檢定單尾對立假設時,信賴區間包含所有觀察值,如果將這些觀察值作為 q 傳遞,則檢定的 p 值將大於 0.05,因此不會拒絕虛無假設。例如

>>> rvs.sort()
>>> q, p, alpha = 0.6, 0.75, 0.95
>>> res = stats.quantile_test(rvs, q=q, p=p, alternative='less')
>>> ci = res.confidence_interval(confidence_level=alpha)
>>> for x in rvs[rvs <= ci.high]:
...     res = stats.quantile_test(rvs, q=x, p=p, alternative='less')
...     assert res.pvalue > 1-alpha
>>> for x in rvs[rvs > ci.high]:
...     res = stats.quantile_test(rvs, q=x, p=p, alternative='less')
...     assert res.pvalue < 1-alpha

此外,如果針對隨機樣本重複產生 95% 的信賴區間,則信賴區間將在大約 95% 的重複中包含真實的分位數值。

>>> dist = stats.rayleigh() # our "unknown" distribution
>>> p = 0.2
>>> true_stat = dist.ppf(p) # the true value of the statistic
>>> n_trials = 1000
>>> quantile_ci_contains_true_stat = 0
>>> for i in range(n_trials):
...     data = dist.rvs(size=100, random_state=rng)
...     res = stats.quantile_test(data, p=p)
...     ci = res.confidence_interval(0.95)
...     if ci[0] < true_stat < ci[1]:
...         quantile_ci_contains_true_stat += 1
>>> quantile_ci_contains_true_stat >= 950
True

這適用於任何分佈和任何分位數,只要樣本是 i.i.d. 即可。