scipy.stats.

quantile#

scipy.stats.quantile(x, p, *, method='linear', axis=0, nan_policy='propagate', keepdims=None)[source]#

计算指定轴上的数据的 p 分位数。

参数:
x实数的类数组

数据数组。

p浮点数的类数组

要计算的分位数的概率或概率序列。值必须介于 0 和 1 之间(包括 0 和 1)。除非 keepdims=True,否则沿 axis 的长度必须为 1。

methodstr,默认值:‘linear’

用于估计分位数的方法。可用的选项,按照它们在 [1] 中出现的编号,是

  1. ‘inverted_cdf’

  2. ‘averaged_inverted_cdf’

  3. ‘closest_observation’

  4. ‘interpolated_inverted_cdf’

  5. ‘hazen’

  6. ‘weibull’

  7. ‘linear’ (默认)

  8. ‘median_unbiased’

  9. ‘normal_unbiased’

‘harrell-davis’ 也可用于根据 [2] 计算分位数估计。有关详细信息,请参见 Notes。

axisint 或 None,默认值:0

计算分位数的轴。None 在执行计算之前将 xp 都展开,而不检查原始形状是否兼容。

nan_policystr,默认值:‘propagate’

定义如何处理输入数据 x 中的 NaN。

  • propagate:如果在计算统计量的轴切片(例如,行)中存在 NaN,则输出的相应切片将包含 NaN。

  • omit:执行计算时将忽略 NaN。如果在计算统计量的轴切片中剩余的数据不足,则输出的相应切片将包含 NaN。

  • raise:如果存在 NaN,则会引发 ValueError

如果 p 中存在 NaN,则会引发 ValueError

keepdimsbool,可选

考虑 x 是 1-D 且 p 是标量的情况:分位数是一个降维统计量,默认行为是返回一个标量。如果将 keepdims 设置为 True,则不会缩减该轴,结果将是一个具有一个元素的一维数组。

一般情况更为微妙,因为可能会为 x 的每个轴切片请求多个分位数。例如,如果 xp 都是 1-D 且 p.size > 1,则无法缩减任何轴;必须有一个轴来包含由 p.size 给出的分位数数量。因此

  • 默认情况下,如果可能(即,如果每个 x 的轴切片都有一个 q 元素),则会缩减该轴。

  • 如果将 keepdims 设置为 True,则不会缩减该轴。

  • 如果将 keepdims 设置为 False,则如果可能,将缩减该轴,否则将引发错误。

返回值:
quantile标量或 ndarray

生成的分位数。dtype 是 xp 的结果 dtype。

备注

给定来自基础分布的样本 xquantile 提供累积分布函数逆的非参数估计。

默认情况下,这是通过在 y 中相邻元素之间进行插值来完成的,yx 的排序副本

(1-g)*y[j] + g*y[j+1]

其中索引 j 和系数 gp * (n-1) 的整数和分数分量,而 n 是样本中元素的数量。

这是 H&F [1] 的公式 1 的一个特例。更一般地,

  • j = (p*n + m - 1) // 1,并且

  • g = (p*n + m - 1) % 1,

其中 m 可以根据几种不同的约定来定义。可以使用 method 参数选择首选约定

方法

H&F 中的数字

m

interpolated_inverted_cdf

4

0

hazen

5

1/2

weibull

6

p

linear (默认)

7

1 - p

median_unbiased

8

p/3 + 1/3

normal_unbiased

9

p/4 + 3/8

请注意,当公式的结果超出允许的非负索引范围时,索引 jj + 1 被裁剪到范围 0n - 1。当 j 被裁剪为零时,g 也设置为零。jg 公式中的 -1 解释了 Python 的基于 0 的索引。

上表仅包括来自 [1] 的作为概率 p 的连续函数的估计量(估计量 4-9)。 SciPy 还提供了来自 [1] 的三个不连续估计量(估计量 1-3),其中 j 定义如上,m 定义如下,当 index = p*n + m - 1 小于 0 时,g0,否则定义如下。

  1. inverted_cdfm = 0g = int(index - j > 0)

  2. averaged_inverted_cdfm = 0g = (1 + int(index - j > 0)) / 2

  3. closest_observationm = -1/2g = 1 - int((index == j) & (j%2 == 1))

来自 [2] 的一种不同的分位数计算策略 method='harrell-davis' 使用所有元素的加权组合。权重计算为

\[w_{n, i} = I_{i/n}(a, b) - I_{(i - 1)/n}(a, b)\]

其中 \(n\) 是样本中元素的数量,\(i\) 是排序元素的索引 \(1, 2, ..., n-1, n\)\(a = p (n + 1)\)\(b = (1 - p)(n + 1)\)\(p\) 是分位数的概率,而 \(I\) 是正则化的下不完全贝塔函数 (scipy.special.betainc)。

参考文献

[1] (1,2,3,4)

R. J. Hyndman 和 Y. Fan,“统计软件包中的样本分位数”,The American Statistician,50(4),第 361-365 页,1996 年

[2] (1,2)

Harrell, Frank E. 和 C. E. Davis。“一种新的无分布分位数估计量。”Biometrika 69.3 (1982): 635-640。

示例

>>> import numpy as np
>>> from scipy import stats
>>> x = np.asarray([[10, 8, 7, 5, 4],
...                 [0, 1, 2, 3, 5]])

沿最后一个轴取中位数。

>>> stats.quantile(x, 0.5, axis=-1)
array([7.,  2.])

沿每个轴取不同的分位数。

>>> stats.quantile(x, [[0.25], [0.75]], axis=-1, keepdims=True)
array([[5.],
       [3.]])

沿每个轴取多个分位数。

>>> stats.quantile(x, [0.25, 0.75], axis=-1)
array([[5., 8.],
       [1., 3.]])