numpy Python:反经验累积分布函数(ECDF)?

vd8tlhqk  于 9个月前  发布在  Python
关注(0)|答案(4)|浏览(138)

我们可以创建ECDF,

import numpy as np
from statsmodels.distributions.empirical_distribution import ECDF
ecdf = ECDF([3, 3, 1, 4])

字符串
然后在点处获得ECDF,

ecdf(x)


但是,如果我想知道百分位数97.5%的x,该怎么办?
http://www.statsmodels.org/stable/generated/statsmodels.distributions.empirical_distribution.ECDF.html?highlight=ecdf,它似乎没有实现。
有什么方法可以做到这一点吗?或者其他库?

cnh2zyt3

cnh2zyt31#

由于经验CDF只是在每个数据点上放置1/n的质量,因此第97.5分位数就是大于所有其他点的97.5%的数据点。要找到这个值,您可以简单地按升序对数据进行排序,并找到第0.975个最大值。

sample = [1, 5, 2, 10, -19, 4, 7, 2, 0, -1]
n = len(sample)
sort = sorted(sample)
print sort[int(n * 0.975)]

字符串
它产生:

10


因为我们记得对于离散分布(如经验cdf),分位数函数定义为here,我们意识到我们必须取第0.975个(四舍五入)最大值。

6ss1mwsb

6ss1mwsb2#

这是我的建议。线性插值,因为dfs只能从相当大的样本中有效地估计。插值线段可以得到,因为它们的端点出现在样本中的不同值。

import statsmodels.distributions.empirical_distribution as edf
from scipy.interpolate import interp1d
import numpy as np
import matplotlib.pyplot as plt

sample = [1,4,2,6,5,5,3,3,5,7]
sample_edf = edf.ECDF(sample)

slope_changes = sorted(set(sample))

sample_edf_values_at_slope_changes = [ sample_edf(item) for item in slope_changes]
inverted_edf = interp1d(sample_edf_values_at_slope_changes, slope_changes)

x = np.linspace(0.1, 1)
y = inverted_edf(x)
plt.plot(x, y, 'ro', x, y, 'b-')
plt.show()

print ('97.5 percentile:', inverted_edf(0.975))

字符串
它产生以下输出,

97.5 percentile: 6.75


这张图.

kxkpmulp

kxkpmulp3#

numpy.quantile(x, q=.975)将返回沿着数组x的值,其中ecdf为0.975。
类似地,对于Series/DataFrames有pandas.quantile(q=0.97)

jaxagkaj

jaxagkaj4#

它插值是正确的,但在你使用的x周围的2个点之间,而不是x的最小值和最大值。
来自Numpy文档
可选的method参数指定当所需的分位数位于两个索引ij = i + 1之间时使用的方法。
来自Pandas文档
插值:'linear','lower','higher','midpoint','nearest'}此可选参数指定当所需分位数位于两个数据点ij之间时要使用的插值方法:

* linear: `i + (j - i) * fraction`, where `fraction` is the

字符串

相关问题