scipy.stats.

quantile_test#

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

执行分位数检验并计算分位数的置信区间。

此函数检验零假设:q 是与样本 x 的潜在总体概率 p 相关的分位数的值。例如,使用默认参数,它检验 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

分位数检验中可能使用的两个检验统计量之一。第一个检验统计量 T1x 中小于或等于假设分位数 q 的样本的比例。第二个检验统计量 T2x 中严格小于假设分位数 q 的样本的比例。

alternative = 'greater' 时,T1 用于计算 p 值,并且 statistic 设置为 T1

alternative = 'less' 时,T2 用于计算 p 值,并且 statistic 设置为 T2

alternative = 'two-sided' 时,T1T2 都会被考虑,并且使用导致最小 p 值的那个。

statistic_typeint

取决于使用 T1 还是 T2 来计算 p 值,取值为 12

pvaluefloat

与给定备择假设相关的 p 值。

该对象还具有以下方法

confidence_interval(confidence_level=0.95)

计算概率 p 相关的总体分位数的置信区间。置信区间在具有字段 lowhighnamedtuple 中返回。当没有足够的观察值来计算所需置信度下的置信区间时,值为 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]
    1. Conover. Practical Nonparametric Statistics, 3rd Ed. 1999。

[2]

W. R. Thompson, “On Confidence Ranges for the Median and Other Expectation Distributions for Populations of Unknown Distribution Form,” The Annals of Mathematical Statistics, vol. 7, no. 3, pp. 122-128, 1936, Accessed: Sep. 18, 2019. [Online]. Available: https://www.jstor.org/stable/2957563.

[3]

H. A. David and H. N. Nagaraja, “Order Statistics in Nonparametric Inference” in Order Statistics, John Wiley & Sons, Ltd, 2005, pp. 159-170. Available: https://onlinelibrary.wiley.com/doi/10.1002/0471722162.ch7.

[4]

N. Hutson, A. Hutson, L. Yan, “QuantileNPCI: Nonparametric Confidence Intervals for Quantiles,” R package, https://cran.r-project.cn/package=QuantileNPCI

[5]

M. Mayer, “confintr: Confidence Intervals,” R package, https://cran.r-project.cn/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.,这适用于任何分布和任何分位数。