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] 中出现的编号,是
‘inverted_cdf’
‘averaged_inverted_cdf’
‘closest_observation’
‘interpolated_inverted_cdf’
‘hazen’
‘weibull’
‘linear’ (默认)
‘median_unbiased’
‘normal_unbiased’
‘harrell-davis’ 也可用于根据 [2] 计算分位数估计。有关详细信息,请参见 Notes。
- axisint 或 None,默认值:0
计算分位数的轴。
None
在执行计算之前将 x 和 p 都展开,而不检查原始形状是否兼容。- 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 的每个轴切片请求多个分位数。例如,如果 x 和 p 都是 1-D 且
p.size > 1
,则无法缩减任何轴;必须有一个轴来包含由p.size
给出的分位数数量。因此默认情况下,如果可能(即,如果每个 x 的轴切片都有一个 q 元素),则会缩减该轴。
如果将 keepdims 设置为 True,则不会缩减该轴。
如果将 keepdims 设置为 False,则如果可能,将缩减该轴,否则将引发错误。
- 返回值:
- quantile标量或 ndarray
生成的分位数。dtype 是 x 和 p 的结果 dtype。
备注
给定来自基础分布的样本 x,
quantile
提供累积分布函数逆的非参数估计。默认情况下,这是通过在
y
中相邻元素之间进行插值来完成的,y
是 x 的排序副本(1-g)*y[j] + g*y[j+1]
其中索引
j
和系数g
是p * (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
请注意,当公式的结果超出允许的非负索引范围时,索引
j
和j + 1
被裁剪到范围0
到n - 1
。当j
被裁剪为零时,g
也设置为零。j
和g
公式中的-1
解释了 Python 的基于 0 的索引。上表仅包括来自 [1] 的作为概率 p 的连续函数的估计量(估计量 4-9)。 SciPy 还提供了来自 [1] 的三个不连续估计量(估计量 1-3),其中
j
定义如上,m
定义如下,当index = p*n + m - 1
小于0
时,g
为0
,否则定义如下。inverted_cdf
:m = 0
且g = int(index - j > 0)
averaged_inverted_cdf
:m = 0
且g = (1 + int(index - j > 0)) / 2
closest_observation
:m = -1/2
且g = 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
)。参考文献
示例
>>> 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.]])