Python中的极低p值Kolmogorov-Smirnov拟合优度

时间:2017-03-29 12:15:35

标签: python histogram p-value goodness-of-fit kolmogorov-smirnov

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

Histogram in blue, fitting function in red.

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)

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

非常感谢!! 查尔斯

1 个答案:

答案 0 :(得分:2)

这只是意味着您的数据不完全是对数正常的。根据直方图,您可以使用大量数据点进行K-S测试。这意味着如果您的数据与基于具有这些参数的对数正态分布所预期的数据略有不同,则K-S测试将指示数据未从对数正态中提取。

数据来自哪里?如果它来自有机来源,或者除了从对数正态分布中专门绘制随机数之外的任何来源,我会期望极小的p值,即使拟合看起来很好。这当然不是问题,只要适合对你的目的来说足够好。