quantile_test#
- scipy.stats.quantile_test(x, *, q=0, p=0.5, alternative='two-sided')[源代码]#
执行分位数检验并计算分位数的置信区间。
此函数检验这样一种零假设:q 是与概率为 p 的样本x 中基础人口相关联的分位数的值。例如,在默认参数中,它会检验基础人口x 的中位数为零。此函数会返回一个对象,其中包括检验统计值、p 值和一个用于计算分位数周围置信区间的计算方法。
- 参数:
- xarray_like
一维样本。
- qfloat,默认值:0
分位数的假定值。
- pfloat,默认值:0.5
与分位数相关联的概率;即小于q 的人口比例为p。必须严格介于 0 和 1 之间。
- 备择{‘双边’, ‘小于’, ‘大于’}, 可选
定义备选假设。以下选项可用(默认选择为‘双边’)
‘双边’:与概率 p 相关的分位数不为 q。
‘小于’:与概率 p 相关的分位数小于 q。
‘大于’:与概率 p 相关的分位数大于 q。
- 返回:
- 结果分位数检验结果
一个具有以下属性的对象
- statistic浮点数
分位数检验中可能使用的两个检验统计量之一。第一个检验统计量
T1
是小于或等于假设分位数 q 的x 中样本的比例。第二个检验统计量T2
是严格小于假设分位数 q 的x 中的样本的比例。当
alternative = 'greater'
,T1
用于计算 p 值,并且statistic
设置为T1
。当
alternative = 'less'
,T2
用于计算 p 值,并且statistic
设置为T2
。当
alternative = 'two-sided'
,则T1
和T2
都被考虑在内,并且使用其中一个导致 p 值最小的那个。- statistic_type整数
根据是
T1
还是T2
用于计算 p 值,它可以为 1 或 2。- pvalue浮点数
与给定的备选方案相关的 p 值。
该对象还有以下方法:
- confidence_interval(confidence_level=0.95)
计算与概率 p 关联的总体分位数周围的一个置信区间。置信区间在
namedtuple
中返回,其中包含字段 low 和 high。如果没有足够的观测值来计算所需置信度下的置信区间,则值为 nan。
注意
此测试及其计算置信区间的方法是非参数化的。仅当观测值是 i.i.d. 时,它们才有效。
此测试的实现遵循 Conover [1]。考虑了两个检验统计量。
T1
:小于或等于 q 的 x 中的观测值的数量。T1 = (x <= q).sum()
T2
:严格小于 q 的 x 中的观测值的数量。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。实用非参数统计,第 3 版。1999。
[2]W. R. Thompson,“关于未知分布形式的人口的中值和其他期望分布的置信区间”数学统计年鉴,卷 7,第 3 期,第 122-128 页,1936 年 9 月 18 日访问,[在线]。网址:https://www.jstor.org/stable/2957563。
[3]H. A. David 和 H. N. Nagaraja,“非参数推论中的顺序统计”在顺序统计中,约翰·威利父子有限公司,2005 年,第 159-170 页。网址:https://onlinelibrary.wiley.com/doi/10.1002/0471722162.ch7。
[4]N. Hutson、A. Hutson、L. Yan,“QuantileNPCI:分位数的非参数置信区间”,R 软件包,https://cran.r-project.org.cn/package=QuantileNPCI
[5]M. Mayer,“confintr:置信区间”,R 软件包,https://cran.r-project.org.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.,它就适用于任何分布和任何分位数。