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'
時,會同時考慮T1
和T2
,並使用導致最小 p 值的一個。- statistic_typeint
根據用於計算 p 值的
T1
或T2
,為 1 或 2。- pvaluefloat
與給定對立假設相關聯的 p 值。
該物件也具有以下方法
- confidence_interval(confidence_level=0.95)
計算機率 p 相關聯的母體分位數周圍的信賴區間。信賴區間以
namedtuple
傳回,其中包含欄位 low 和 high。當沒有足夠的觀察值來計算所需信賴度的信賴區間時,值為 nan。
註解
此檢定及其計算信賴區間的方法是非參數的。它們僅在觀察值為 i.i.d. 時有效。
檢定的實作遵循 Conover [1]。考慮了兩個檢定統計量。
T1
:x 中小於或等於 q 的觀察值數量。T1 = (x <= q).sum()
T2
:x 中嚴格小於 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]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. 即可。