我在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
结果
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 POST和THIS 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西格玛置信区域的填充/绘制垂直线?
答案 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)
相关问题: