numpy/scipy相当于R ecdf(x)(x)函数?

15 python numpy r scipy

ecdf(x)(x)在Numpy或scipy中,R的R 函数相当于什么?是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)
Run Code Online (Sandbox Code Playgroud)

还是需要其他东西?

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

ece*_*ulm 16

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))

你要么一起去statmodelsECDF,如果你是一个额外的依赖性确定或提供自己的实现.见下文:

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()
Run Code Online (Sandbox Code Playgroud)

ECDF比较


yas*_*ser 14

试试这些链接:

statsmodels.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)
Run Code Online (Sandbox Code Playgroud)

  • 虽然我认为`statsmodels`是OP正在寻找的东西,但是如果你添加了示例代码,它会很好,以使答案自成一体. (6认同)
  • 这对 scipy 是不可能的吗? (5认同)

Tim*_*Tim 6

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 ])
Run Code Online (Sandbox Code Playgroud)

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


Com*_*con 5

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

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

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

有趣的好处:如果您需要从非常大的流数据中创建一个小规模的类 ECDF 对象,您应该查看McDermott 等人的这篇“数据骨架”论文。

  • 现在链接已断开。作者将他的 Python 讲座移至:http://quant-econ.net/py/index.html (4认同)