23

ecdf(x)(x)在 numpy 或 scipy 中,R 的函数在 Python 中的等价物是什么?ecdf(x)(x)与以下基本相同:

import numpy as np
def ecdf(x):
  # normalize X to sum to 1
  x = x / np.sum(x)
  return np.cumsum(x)

还是需要其他东西?

编辑如何控制使用的垃圾箱数量ecdf

4

4 回答 4

26

OP 的实现ecdf是错误的,你不应该接受cumsum()这些值。所以不是ys = np.cumsum(x)/np.sum(x)ys = np.cumsum(1 for _ in x)/float(len(x))或更好ys = np.arange(1, len(x)+1)/float(len(x))

如果您对额外的依赖项没问题,您可以选择statmodels's ECDF,或者提供您自己的实现。见下文:

import numpy as np
import matplotlib.pyplot as plt
from statsmodels.distributions.empirical_distribution import ECDF
%matplotlib inline

grades = (93.5,93,60.8,94.5,82,87.5,91.5,99.5,86,93.5,92.5,78,76,69,94.5,
          89.5,92.8,78,65.5,98,98.5,92.3,95.5,76,91,95,61)


def ecdf_wrong(x):
    xs = np.sort(x) # need to be sorted
    ys = np.cumsum(xs)/np.sum(xs) # normalize so sum == 1
    return (xs,ys)
def ecdf(x):
    xs = np.sort(x)
    ys = np.arange(1, len(xs)+1)/float(len(xs))
    return xs, ys

xs, ys = ecdf_wrong(grades)
plt.plot(xs, ys, label="wrong cumsum")
xs, ys = ecdf(grades)
plt.plot(xs, ys, label="handwritten", marker=">", markerfacecolor='none')
cdf = ECDF(grades)
plt.plot(cdf.x, cdf.y, label="statmodels", marker="<", markerfacecolor='none')
plt.legend()
plt.show()

ECDF 比较

于 2016-06-06T14:55:19.530 回答
21

试试这些链接:

统计模型.ECDF

python中的ECDF没有阶梯函数?

示例代码

import numpy as np
from statsmodels.distributions.empirical_distribution import ECDF
import matplotlib.pyplot as plt

data = np.random.normal(0,5, size=2000)

ecdf = ECDF(data)
plt.plot(ecdf.x,ecdf.y)
于 2013-04-03T16:18:27.230 回答
7

R 中的ecdf函数返回经验累积分布函数,因此完全等效的函数是:

def ecdf(x):
    x = np.sort(x)
    n = len(x)
    def _ecdf(v):
        # side='right' because we want Pr(x <= v)
        return (np.searchsorted(x, v, side='right') + 1) / n
    return _ecdf

np.random.seed(42)
X = np.random.normal(size=10_000)
Fn = ecdf(X)
Fn([3, 2, 1]) - Fn([-3, -2, -1])
## array([0.9972, 0.9533, 0.682 ])

如图所示,它给出了正态分布的正确概率为 68-95-99.7%

于 2019-09-12T18:35:53.123 回答
6

这位作者有一个用户编写的 ECDF 函数的非常好的示例:John Stachurski 的 Python 讲座。他的系列讲座面向计算经济学研究生;然而,对于任何学习 Python 通用科学计算的人来说,它们都是我的首选资源。

编辑:现在已经一岁了,但我想我仍然会回答你问题的“编辑”部分,以防你(或其他人)仍然觉得它有用。

与直方图一样,ECDF 确实没有任何“箱”。如果 G 是使用数据向量 Z 形成的经验分布函数,则 G(x) 实际上是 Z <= x 的出现次数除以 len(Z)。这不需要“分箱”来确定。因此,在某种意义上,ECDF 保留了有关数据集的所有可能信息(因为它必须保留整个数据集以进行计算),而直方图实际上通过分箱丢失了有关数据集的一些信息。出于这个原因,我更喜欢尽可能使用 ecdfs 与直方图。

有趣的奖励:如果您需要从非常大的流数据创建一个类似 ECDF 的小尺寸对象,您应该查看 McDermott 等人的这篇“ Data Skeletons ”论文。

于 2013-06-23T00:36:55.467 回答