【发布时间】:2012-02-10 20:40:16
【问题描述】:
我一直在尝试使用Scipy 获得lognormal 分发的结果。我已经有了 Mu 和 Sigma,所以我不需要做任何其他准备工作。如果我需要更具体(并且我试图以我对统计数据的有限了解),我会说我正在寻找累积函数(Scipy 下的 cdf)。问题是我无法弄清楚如何仅使用 0-1 范围内的平均值和标准差来做到这一点(即返回的答案应该是 0-1 的值)。我也不确定应该使用 dist 中的哪种方法来获得答案。我已尝试阅读文档并查看 SO,但相关问题(如 this 和 this)似乎没有提供我正在寻找的答案。
这是我正在使用的代码示例。谢谢。
from scipy.stats import lognorm
stddev = 0.859455801705594
mean = 0.418749176686875
total = 37
dist = lognorm.cdf(total,mean,stddev)
更新:
所以经过一些工作和一些研究,我走得更远了。但我仍然得到错误的答案。新代码如下。根据 R 和 Excel,结果应该是 .7434,但这显然不是正在发生的事情。有没有我遗漏的逻辑缺陷?
dist = lognorm([1.744],loc=2.0785)
dist.cdf(25) # yields=0.96374596, expected=0.7434
更新 2: 产生正确 0.7434 结果的工作 lognorm 实现。
def lognorm(self,x,mu=0,sigma=1):
a = (math.log(x) - mu)/math.sqrt(2*sigma**2)
p = 0.5 + 0.5*math.erf(a)
return p
lognorm(25,1.744,2.0785)
> 0.7434
【问题讨论】:
-
您能解释一下您对“分配的结果”的理解吗?
-
@joaquin 我添加了一个代码示例,显示了我所拥有的以及我期望它产生的结果。
-
@EricLubow:我认为您可能误解了在这种情况下 mean 和 stddev 的含义。对于对数正态分布,它们是变量的对数的平均值和标准差 。如果一个变量是对数正态分布的,则意味着该变量的对数是正态分布的。
-
@talonmies 我知道使用平均值和标准差意味着使用变量日志的平均值和标准差。我在 Python 中手动编写了 lognorm 函数(见上文),并且能够得到正确的答案。这就是让我相信 SciPy 的实现可能会有所不同的原因,因为我在 R 和 Excel 中得到了正确的答案。如果我的实施有误,我肯定想知道。
-
@EricLubow:您几乎重新实现了what scipy uses internally Lucas 的答案似乎是正确的。有关使用示例,请参阅 my answer。
标签: python statistics scipy