Правильным местом для постановки этого вопроса также может быть перекрестная проверка, но я думаю, что это скорее проблема программирования, поэтому я выбрал Stackoverflow.
Настройка
Я сгенерировал 100 тыс. Случайных вариаций из «сжатых» U-образных бета-распределений. Параметры распределения a, b, lo c и масштаб см. https://en.wikipedia.org/wiki/Beta_distribution).
import scipy.stats as stats
from skgof import ks_test, cvm_test, ad_test
from scipy.stats import kstest
gof_tests = [ks_test, cvm_test, ad_test]
params_beta_sqz_u = {'a' : 0.011 , 'b' : 0.040 , 'loc' : 0, 'scale' : 1 }
data_beta_sqz_u = stats.beta.rvs(**params_beta_sqz_u, size=100000)
#from skgof
gofs_beta_sqz_u = [gof_test(data_beta_sqz_u, stats.beta(**params_sqz_u))
for gof_test in gof_tests]
# additional KS-test from scipy.stats
gof_beta_sqz_u = stats.kstest(data_sqz_u, 'beta', (0.011,0.040), alternative='two-sided')
Результат
gofs_beta_sqz_u
[GofResult(statistic=0.04734000000000005, pvalue=1.010521662314634e-05),
GofResult(statistic=3.7501477386841606, pvalue=1.6754093667969983e-09),
GofResult(statistic=inf, pvalue=0.0)]
gof_beta_sqz_u
KstestResult(statistic=0.04734000000000005, pvalue=4.402269988633488e-195)
Вопрос
Почему gof-тесты отклоняют распределение для U-образных данных выборки, хотя данные сопоставляются с распределением, из которого они были получены?
Исследования уже проведены
Гистограмма образца имеет форму | _ |, я называю ее «сжатой» U-образной. Случайные вариации в основном рисуются близко к 0 или 1. Плюс, гистограмма перекошена и имеет больший вес на левом хвосте.
Я много играл с различными настройками. Для «хорошей» U-образной беты (например, a = 0,5, b = 0,5) тесты принимают. Я предполагаю, что эта проблема возникает из-за крутых границ PDF, соответственно, изгибов в CDF.
Причиной может быть то, что тест gof выбирает разные ячейки для данных выборки и теоретического CDF, на котором различия рассчитаны на. Это может привести к большим расстояниям между значениями ECDF и CDF в статистике gof-теста.
Кроме того, в журналах показано RuntimeWarning в рамках AD-теста
...lib\site-packages\skgof\ecdfgof.py:81: RuntimeWarning: divide by zero
encountered in log
return -samples - (factors * log(data * (1 - data[::-1]))).sum() / samples