3

我有一组数据并通过对数正态分布拟合相应的直方图。我首先计算对数正态函数的最佳参数,然后绘制直方图和对数正态函数。这给出了相当好的结果:

蓝色直方图,红色拟合函数。

import scipy as sp
import numpy as np
import matplotlib.pyplot as plt

num_data = len(data)

x_axis = np.linspace(min(data),
                 max(data),num_data)

number_of_bins = 240
histo, bin_edges = np.histogram(data, number_of_bins, normed=False)

shape, location, scale = sp.stats.lognorm.fit(data)

plt.hist(data, number_of_bins, normed=False);


# the scaling factor scales the normalized lognormal function up to the size
# of the histogram: 
scaling_factor = len(data)*(max(data)-min(data))/number_of_bins

plt.plot(x_axis,scaling_factor*sp.stats.lognorm.pdf(x_axis, shape,
              location,   scale),'r-')

# adjust the axes dimensions:
plt.axis([bin_edges[0]-10,bin_edges[len(bin_edges)-1]+10,0, histo.max()*1.1])

但是,在对数据与拟合函数进行 Kolmogorov-Smirnov 检验时,我得到的 p 值太低(大约为 e-32):

lognormal_ks_statistic, lognormal_ks_pvalue = 
       sp.stats.kstest(
       data, 
       lambda k: sp.stats.lognorm.cdf(k, shape, location, scale),
       args=(), 
       N=len(data), 
       alternative='two-sided', 
       mode='approx')

print(lognormal_ks_statistic)
print(lognormal_ks_pvalue)

这是不正常的,因为我们从图中看到拟合非常准确......有人知道我在哪里犯了错误吗?

非常感谢!!查尔斯

4

1 回答 1

2

这仅仅意味着您的数据不完全是对数正常的。根据直方图,您有很多数据点可供 KS 测试使用。这意味着,如果您的数据与基于这些参数的对数正态分布所预期的略有不同,KS 检验将表明数据不是从对数正态中提取的。

数据来自哪里?如果它来自有机来源,或者不是专门从对数正态分布中提取随机数的任何来源,我会期望 p 值非常小,即使拟合看起来不错。这当然不是问题,只要适合您的目的足够好。

于 2017-04-03T21:15:33.620 回答