quantile_test#
- scipy.stats.quantile_test(x, *, q=0, p=0.5, alternative='two-sided')[源代码][源代码]#
执行分位数检验并计算分位数的置信区间。
此函数测试零假设,即 q 是与样本 x 所基于的总体的概率 p 相关联的分位数值。例如,使用默认参数,它测试 x 所基于的总体的中位数为零。该函数返回一个包含测试统计量、p 值以及计算分位数置信区间的方法的对象。
- 参数:
- xarray_like
一维样本。
- qfloat, 默认值: 0
假设的分位数值。
- pfloat, 默认值: 0.5
与分位数相关的概率;即,小于 q 的人口比例为 p。必须在 0 和 1 之间严格。
- 替代方案{‘双侧’, ‘小于’, ‘大于’}, 可选
定义备择假设。以下选项可用(默认是’双侧’):
‘双侧’: 与概率 p 相关的分位数不是 q。
‘less’: 与概率 p 相关的分位数小于 q。
‘greater’: 与概率 p 相关的分位数大于 q。
- 返回:
- 结果QuantileTestResult
一个具有以下属性的对象:
- 统计浮动
分位数检验中可能使用的两种检验统计量之一。第一个检验统计量
T1
是 x 中小于或等于假设分位数 q 的样本比例。第二个检验统计量T2
是 x 中小于假设分位数 q 的样本比例。当
alternative = 'greater'
时,使用T1
计算 p 值,并将statistic
设置为T1
。当
alternative = 'less'
时,使用T2
计算 p 值,并将statistic
设置为T2
。当
alternative = 'two-sided'
时,T1
和T2
都会被考虑,并且使用导致最小 p 值的那个。- 统计类型整数
根据用于计算p值的是
T1
还是T2
,选择 1 或 2。- p值浮动
与给定备择假设相关的p值。
该对象还具有以下方法:
- confidence_interval(confidence_level=0.95)
计算与概率 p 相关的人口分位数的置信区间。置信区间以具有 low 和 high 字段的
namedtuple
形式返回。当观测值不足以在所需置信度下计算置信区间时,值为 nan。
注释
此测试及其计算置信区间的方法是非参数的。当且仅当观测值是独立同分布时,它们是有效的。
测试的实现遵循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值是二项随机变量的概率
\[ \begin{align}\begin{aligned}Y \sim \mathrm{binom}\left(n, p\right)\\Y \sim \mathrm{二项分布}\left(n, p\right)\end{aligned}\end{align} \]大于或等于观测值
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],并随后被证明适用于任何一组独立同分布样本 [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%置信区间的一个常见解释是,如果从同一总体中反复抽取独立同分布的样本,并且每次都形成置信区间,那么在约95%的试验中,置信区间将包含指定分位数的真实值。
在 QuantileNPCI R 包中也有类似的功能 [4]。基础原理相同,但它通过在样本值之间进行插值来计算置信区间边界,而此函数仅使用样本值作为边界。因此,
quantile_test.confidence_interval
返回的区间更为保守(即更大)。在 confintr 包中包含了相同的分位数置信区间计算 [5]。
双侧置信区间并不保证是最优的;即,可能存在一个更紧密的区间,该区间包含感兴趣的分位数的概率大于置信水平。在没有对样本进一步假设(例如,潜在分布的性质)的情况下,单侧区间是最优紧密的。
参考文献
[1]Conover. 实用非参数统计, 第三版. 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.org/package=QuantileNPCI
[5]M. Mayer, “confintr: Confidence Intervals,” R package, https://cran.r-project.org/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
只要样本是独立同分布的,这种方法适用于任何分布和任何分位数。