【问题标题】:Python: inverse empirical cumulative distribution function (ECDF)?Python:逆经验累积分布函数(ECDF)?
【发布时间】:2017-05-23 10:42:43
【问题描述】:

我们可以用

创建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,好像没有实现。

有没有办法做到这一点?还是其他库?

【问题讨论】:

  • 你也许可以使用sc.stats.rv_discrete(values=([3, 3, 1, 4],[0.25]*4)).ppf(0.975) 到达某个地方,但它似乎有问题(尝试使用0.5 来了解我的意思)
  • 使用数值求解器简单地求解方程ecdf(x)=0.975
  • 您不能将monotone_fn_inverter 申请到ECDF 吗?
  • 哦,亲爱的,阶跃函数没有逆函数,是吗?我们可以同意将您想要的函数定义为 Pr{x
  • @BillBell 是的,这可以是 CDF 逆的定义。我大概可以自己创作。只是想知道这样做的最佳实践。

标签: python numpy statsmodels


【解决方案1】:

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

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.975n 个(向上取整)的最大值。

【讨论】:

    【解决方案2】:

    这是我的建议。线性插值,因为 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
    

    还有这张图。

    【讨论】:

    • 我觉得这对使用几个点很有帮助。不过,在我的实际情况下,我有很多积分(>10000),所以对我来说可能有点过分了。
    【解决方案3】:

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

    同样,Series/DataFrames 也有 pandas.quantile(q=0.97)

    【讨论】:

    • 这里必须小心,因为 numpy 百分位数和分位数函数仅对 x 的最小值和最大值之间的间隔进行插值(默认情况下是线性的),因此它与经验 cdf 的倒数不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2011-09-11
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    相关资源
    最近更新 更多