【问题标题】:ECDF in python without step function?python中的ECDF没有阶梯函数?
【发布时间】:2012-12-10 00:01:00
【问题描述】:

我一直在使用 statsmodels.distributions 中的 ECDF(经验累积分布函数)来绘制一些数据的 CDF。但是,ECDF 使用阶跃函数,因此我得到了锯齿状的图。

所以我的问题是:scipy 或 statsmodels 是否有一个没有阶跃函数的 ECDF 烘焙?

顺便说一句,我知道我可以这样做:

hist, bin_edges = histogram(b_oz, normed=True)
plot(np.cumsum(hist))

但我没有得到正确的比例。

谢谢!

【问题讨论】:

  • 如果您担心数据本身,R 的 ecdf 函数是一个很好的健全性检查。如果您对 R 感到满意,请将这些数据拉入 R 并运行“plot(ecdf(your_data))”,这应该会给您一个可靠的图片。
  • ECDF 根据定义是一个阶跃函数,反映了实际数据。绘制的函数似乎都不是“真正的”ECDF。说“没有阶跃函数的 ECDF”似乎是自相矛盾的。
  • 这个问题真的很老了,但我想我的意思是描述(或近似)真正的累积分布函数,它不是由阶跃函数组成的。
  • 您可以将核密度估计集成到所需的结果中。
  • 它不是内置的,但this answer 中的一个衬垫可以满足您的需求。

标签: python scipy statsmodels


【解决方案1】:

如果您只想更改绘图,则可以让 matplotlib 在观察值之间进行插值。

>>> xx = np.random.randn(nobs)
>>> ecdf = sm.distributions.ECDF(xx)
>>> plt.plot(ecdf.x, ecdf.y)
[<matplotlib.lines.Line2D object at 0x07A872D0>]
>>> plt.show()

或对原始数据进行排序并绘图

>>> xx.sort()
>>> plt.plot(xx, ecdf(xx))
[<matplotlib.lines.Line2D object at 0x07A87090>]
>>> plt.show()

这和直接绘制是一样的

>>> a=0; plt.plot(xx, np.arange(1.,nobs+1)/(nobs+a))
[<matplotlib.lines.Line2D object at 0x07A87D30>]
>>> plt.show()

注意:根据您希望 ecdf 在边界处的行为方式以及居中方式,常用的“绘图位置”有不同的规范化,例如我添加的参数 a 作为示例a=1 是一个常见的选择。

除了使用经验 cdf,您还可以使用插值或平滑 ecdf 或直方图,或核密度估计。

【讨论】:

  • 是的,这里的问题是数据不像使用 randn() 创建的样本那么变化,所以我仍然得到一个锯齿状图,因为分布在值之间应用了阶跃函数。因此,即使我使用 ecdf.x 和 ecdf.y(顺便说一句,不错的提示......我不知道我能做到这一点),我得到的结果完全相同(有 9000 多个数据点)。跨度>
  • ECDF 仅将阶跃函数应用于原始观测点之间的点。与观察点不同的点将由阶跃函数定义为 ecdf 的定义。当您仅绘制原始点时,如果您的原始数据看起来像图中的步长,则可能会被分箱。如果您想要一个非步进 cdf,那么您可以使用 ecdf 点(观察值)的线性插值代替 ecdf,这将对应于直方图中的分段线性密度。
  • 有趣。我认为原始点有很多重复点,它的分布不如 randn() 好。是的,我将看看插值 ecdf 点。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多