Очень низкие p-значения в тесте согласия Колмогорова-Смирнова на Python

У меня есть набор данных и соответствующая гистограмма соответствует логарифмически нормальному распределению. Сначала я вычисляю оптимальные параметры для логнормальной функции, а затем строю гистограмму и логнормальную функцию. Это дает неплохие результаты:

Гистограмма выделена синим цветом, функция подгонки выделена красным.

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])

Однако при выполнении теста Колмогорова-Смирнова для данных по сравнению с функцией подбора я получаю слишком низкие значения 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)

Это ненормально, так как по сюжету мы видим, что подгонка достаточно точная... кто-нибудь знает, где я ошибся?

Большое спасибо!! Чарльз


person Charles M.    schedule 29.03.2017    source источник


Ответы (1)


Это просто означает, что ваши данные не совсем логарифмически нормальные. Судя по гистограмме, у вас есть много точек данных для теста KS. Это означает, что если ваши данные равномерно немного отличаются от ожидаемых на основе логарифмически нормального распределения с этими параметрами, тест K-S укажет, что данные не взяты из логарифмически нормального распределения.

Откуда данные? Если это из органического источника или любого другого источника, кроме случайного извлечения случайных чисел из логарифмически нормального распределения, я ожидаю чрезвычайно маленького значения p, даже если совпадения выглядят великолепно. Это, конечно, не проблема, если подгонка достаточно хороша для ваших целей.

person bscan    schedule 03.04.2017
comment
У меня была очень похожая ситуация, когда p-значение K-S для подгонки на полном наборе (88 тыс. точек) находилось в диапазоне e-32, но случайные выборки данных имели гораздо более высокие p-значения почти без изменений в параметрах подгонки. . - person dblclik; 03.10.2018