具有scipy的偏态分布的随机变量

时间:2012-03-25 06:14:35

标签: python statistics scipy skew

尝试从SciPy中的分布中绘制一个随机数,就像使用stats.norm.rvs一样。但是,我试图从我所拥有的经验分布中获取数字 - 这是一个偏斜的数据集,我想将偏斜和峰度融入到我正在绘制的分布中。理想情况下,我只想调用stats.norm.rvs(loc = blah,scale = blah,size = blah),然后除了均值和方差之外还设置skew和kurt。范数函数采用'时刻'参数组成'mvsk'的一些排列,其中s和k代表偏斜和峰度,但显然所有这一切都要求s和k从rv计算,而我想要建立s和k作为分布的参数开始。

无论如何,我不是任何统计专家,也许这是一个简单或误导的问题。非常感谢任何帮助。

编辑:如果四个时刻不足以足够好地定义分布,是否有其他方法可以绘制由经验分布组成的值,如下所示:http://i.imgur.com/3yB2Y.png

4 个答案:

答案 0 :(得分:1)

正态分布只有2个参数,均值和方差。有正态分布的扩展,有4个参数,附加偏斜和峰度。一个例子是Gram-Charlier扩展,但据我记得只有pdf可用于scipy,而不是rvs。

作为替代方案,scipy.stats中的分布有4个参数,如johnsonsu,它们是灵活的但具有不同的参数化。

但是,在您的示例中,分布是针对大于零的值,因此近似正态分布不会很好地工作。正如安德鲁建议的那样,我认为你应该查看scipy.stats中具有零下限的分布,比如gamma,你可能会发现一些接近的东西。

另一种选择,如果你的样本足够大,那就是使用gaussian_kde,它也可以创建随机数。但是gaussian_kde也不是为有限的分布而设计的。

答案 1 :(得分:1)

如果你不担心进入发行的尾巴, 然后,数据是浮点数 你可以从经验分布中抽样。

  • 对数据进行排序。
  • 将0添加到数据中。
  • 设N表示此data_array的长度
  • 计算q = scipy.rand()* N
  • IDX = INT(Q);二= Q-IDX
  • xlo = data_array [idx],xhi = data_array [idx + 1];
  • 返回xlo +(xhi-xlo)* di

基本上,这是在经验CDF中线性插值来获得的 随机变量。

两个潜在的问题是(1)如果你的数据集很小,你可能不代表 分配好,(2)你不会产生大于最大值的值 现有数据集中的一个。

超越那些您需要查看参数分布的内容,例如上面提到的gamma分布。

答案 2 :(得分:0)

也许我误解了,我当然不是统计专家,但你的形象看起来有点像gamma distribution

Scipy包含专门用于伽马分布的代码 - http://www.scipy.org/doc/api_docs/SciPy.stats.distributions.html#gamma

答案 3 :(得分:0)

如果需要,

简短回答替换为其他分发:

n = 100
a_b = [rand() for i in range(n)]
a_b.sort()
# len(a_b[:int(n*.8)])
c = a_b[int(n*.8)]
print c