python R ecdf(x)(x)函数的numpy/scipy等价式

0pizxfdo  于 2023-02-21  发布在  Python
关注(0)|答案(5)|浏览(168)

在Python中,R的ecdf(x)(x)函数在numpy或scipy中的等价形式是什么?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)

还是需要别的什么?

EDIT如何控制ecdf使用的bin数?

dzhpxtsq

dzhpxtsq1#

ecdf的OP实现是错误的,您不应该对值执行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()

du7egjpx

du7egjpx2#

请尝试以下链接:
statsmodels.ECDF
ECDF in python without step function?
示例代码

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

4c8rllxm3#

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

如图所示,它给出了正态分布的correct 68–95–99.7% probabilities

l7wslrjt

l7wslrjt4#

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

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

ECDF实际上不像直方图那样存在任何“箱”。如果G是使用数据向量Z形成的经验分布函数,则G(x)是Z〈= x出现的次数除以len这不需要“装仓”来确定。因此,存在ECDF保留关于数据集的所有可能信息的意义(因为它必须保留整个数据集以进行计算),而直方图实际上会因为分箱而丢失一些数据集的信息,因此我更喜欢在可能的情况下使用ecdfs而不是直方图。
有趣的是:如果您需要从非常大的流数据中创建一个占用空间小的类似ECDF的对象,您应该阅读McDermott等人的“Data Skeletons“论文。

vtwuwzda

vtwuwzda5#

def ecdf(x):
Sorted = np.sort(x)
Length = len(x)
ecdf = np.zeros(Length)
for i in range(Length):
    ecdf[i] = sum(Sorted <= x[i])/Length
return ecdf

x = np.array([1, 2, 5, 4, 3, 6, 7, 8, 9, 10])
ecdf(x)

相关问题