首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:逆经验累积分布函数(ECDF)

Python:逆经验累积分布函数(ECDF)
EN

Stack Overflow用户
提问于 2017-05-23 18:42:44
回答 3查看 8.5K关注 0票数 7

我们可以使用以下命令创建ECDF

代码语言:javascript
复制
import numpy as np
from statsmodels.distributions.empirical_distribution import ECDF
ecdf = ECDF([3, 3, 1, 4])

,然后使用以下命令获取ECDF

代码语言:javascript
复制
ecdf(x)

但是,如果我想知道百分位数97.5%的x,该怎么办?

http://www.statsmodels.org/stable/generated/statsmodels.distributions.empirical_distribution.ECDF.html?highlight=ecdf上看,它似乎还没有实现。

有没有办法做到这一点?或者其他库?

EN

回答 3

Stack Overflow用户

发布于 2017-08-28 11:32:15

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

代码语言:javascript
复制
sample = [1, 5, 2, 10, -19, 4, 7, 2, 0, -1]
n = len(sample)
sort = sorted(sample)
print sort[int(n * 0.975)]

这会产生:

代码语言:javascript
复制
10

由于我们记得比离散分布(如经验cdf),分位数函数定义为here,我们意识到我们必须取0.975n(向上舍入)的最大值。

票数 11
EN

Stack Overflow用户

发布于 2017-05-24 23:46:26

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

代码语言:javascript
复制
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))

它会产生以下输出,

代码语言:javascript
复制
97.5 percentile: 6.75

还有这张图。

票数 6
EN

Stack Overflow用户

发布于 2018-06-22 00:21:07

numpy.quantile(x, q=.975)将沿着数组x返回ecdf为0.975的值。

类似地,系列/数据帧也有pandas.quantile(q=0.97)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44132543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档