python中的对数正态分布

时间:2014-10-16 13:45:44

标签: python statistics scipy

我在stackoverflow中看到了几个关于如何适应log-normal distribution的问题。我还需要知道两个澄清。

我有一个样本数据,其对数遵循正态分布。所以我可以使用scipy.stats.lognorm.fit(即log-normal distribution

来拟合数据

适合工作正常,也给我标准偏差。这是我的一段代码与结果。

sample = np.log10(data) #taking the log10 of the data

scatter,loc,mean = stats.lognorm.fit(sample) #Gives the paramters of the fit 

x_fit = np.linspace(13.0,15.0,100)
pdf_fitted = stats.lognorm.pdf(x_fit,scatter,loc,mean) #Gives the PDF

print "scatter for data is %s" %scatter
print "mean of data is %s" %mean  

enter image description here 结果

scatter for data is 0.186415047243
mean for data is 1.15731050926

From the image you can clearly see that the mean is around 14.2, but what I get is 1.15??!! 为什么会这样? clearly the log(mean) is also not near 14.2!!

THIS POSTTHIS QUESTION中,提到log(mean)是实际均值。

但是你可以从我上面的代码中看到,我所获得的匹配是使用 sample = log(data) ,它似乎也很合适。但是,当我尝试

sample = data
pdf_fitted = stats.lognorm.pdf(x_fit,scatter,loc,np.log10(mean))

适合似乎不起作用。

1)为什么平均值不是14.2?

2)如何绘制显示1西格玛置信区域的填充/绘制垂直线?

1 个答案:

答案 0 :(得分:7)

你说

  

我有一个样本数据,其对数遵循正态分布。

假设data是包含样本的数组。为了适应这些数据 使用scipy.stats.lognorm进行对数正态分布,使用:

s, loc, scale = stats.lognorm.fit(data, floc=0)

现在假设mu和sigma是平均值和标准差 潜在的正态分布。获得这些值的估计 从这个合适,使用:

estimated_mu = np.log(scale)
estimated_sigma = s

(这些的平均值和标准差的估计值 data中的样本。有关公式,请参阅wikipedia page 对于mu和sigma的对数正态分布的均值和方差。)

要组合直方图和PDF,您可以使用,例如

import matplotlib.pyplot as plt.

plt.hist(data, bins=50, normed=True, color='c', alpha=0.75)
xmin = data.min()
xmax = data.max()
x = np.linspace(xmin, xmax, 100)
pdf = stats.lognorm.pdf(x, s, scale=scale)
plt.plot(x, pdf, 'k')

如果你想查看数据的日志,你可以做类似的事情 下列。请注意,使用了普通分发的PDF 这里。

logdata = np.log(data)
plt.hist(logdata, bins=40, normed=True, color='c', alpha=0.75)
xmin = logdata.min()
xmax = logdata.max()
x = np.linspace(xmin, xmax, 100)
pdf = stats.norm.pdf(x, loc=estimated_mu, scale=estimated_sigma)
plt.plot(x, pdf, 'k')

顺便说一下,适合stats.lognorm的替代方法是适合log(data) 使用stats.norm.fit

logdata = np.log(data)
estimated_mu, estimated_sigma = stats.norm.fit(logdata)

相关问题: