Как создать поиск общего распределения соответствия двух списков критериев согласия? - PullRequest
0 голосов
/ 07 мая 2020

Я изучил вопрос Графики наилучшего соответствия и обнаружил, что в ответах используется тест Колмогорова-Смирнова, чтобы найти наиболее подходящее распределение. Я также узнал, что существует тест Андерсона-Дарлинга, который также используется для получения наилучшего распределения на основе заданного списка данных. Итак, у меня есть несколько вопросов:

Вопрос 1:

Если у меня есть данные и я передаю их через гистограмму NumPy, какие параметры мне следует использовать и какие вывод, следует ли вводить в дистрибутив?

def get_hist(data, data_size):
#### General code:
bins_formulas = ['auto', 'fd', 'scott', 'rice', 'sturges', 'doane', 'sqrt']
# bins = np.histogram_bin_edges(a=data, bins='scott')
# bins = np.histogram_bin_edges(a=data, bins='auto')
bins = np.histogram_bin_edges(a=data, bins='fd')
# print('Bin value = ', bins)

# Obtaining the histogram of data:
# Hist, bin_edges = histogram(a=data, bins=bins, range=np.linspace(start=np.min(data),end=np.max(data),size=data_size), density=True)
# Hist, bin_edges = histogram(a=data, range=np.linspace(np.min(data), np.max(data), data_size), density=True)
# Hist, bin_edges = histogram(a=data, bins=bins, density=True)
# Hist, bin_edges = histogram(a=data, bins=bins, range=(min(data), max(data)), normed=True, density=True)
# Hist, bin_edges = histogram(a=data, density=True)
Hist, bin_edges = histogram(a=data, range=(min(data), max(data)), density=True)
return Hist

Вопрос 2:

Если я хочу объединить оба теста, как я могу это сделать, когда он ищет максимальное p-значение обоих тестов (найти самое высокое p-значение, которое является общим в обоих тестах, затем я извлекаю общее имя распределения с p-значениями)? какие параметры лучше всего использовать для поиска наилучшего распределения и ранжирования их (как на фото ниже) Тесты соответствия с ранжированием ? Вот моя попытка объединить оба теста.

from statsmodels.stats.diagnostic import anderson_statistic as adtest
    def get_best_distribution(data):
        dist_names = ['alpha', 'anglit', 'arcsine', 'beta', 'betaprime', 'bradford', 'burr', 'cauchy', 'chi', 'chi2', 'cosine', 'dgamma', 'dweibull', 'erlang', 'expon', 'exponweib', 'exponpow', 'f', 'fatiguelife', 'fisk', 'foldcauchy', 'foldnorm', 'frechet_r', 'frechet_l', 'genlogistic', 'genpareto', 'genexpon', 'genextreme', 'gausshyper', 'gamma', 'gengamma', 'genhalflogistic', 'gilbrat',  'gompertz', 'gumbel_r', 'gumbel_l', 'halfcauchy', 'halflogistic', 'halfnorm', 'hypsecant', 'invgamma', 'invgauss', 'invweibull', 'johnsonsb', 'johnsonsu', 'ksone', 'kstwobign', 'laplace', 'logistic', 'loggamma', 'loglaplace', 'lognorm', 'lomax', 'maxwell', 'mielke', 'moyal', 'nakagami', 'ncx2', 'ncf', 'nct', 'norm', 'pareto', 'pearson3', 'powerlaw', 'powerlognorm', 'powernorm', 'rdist', 'reciprocal', 'rayleigh', 'rice', 'recipinvgauss', 'semicircular', 't', 'triang', 'truncexpon', 'truncnorm', 'tukeylambda', 'uniform', 'vonmises', 'wald', 'weibull_min', 'weibull_max', 'wrapcauchy']
    dist_ks_results = []
    dist_ad_results = []
    params = {}
    for dist_name in dist_names:
        dist = getattr(st, dist_name)
        param = dist.fit(data)
        params[dist_name] = param

        # Applying the Kolmogorov-Smirnov test
        D_ks, p_ks = st.kstest(data, dist_name, args=param)
        print("Kolmogorov-Smirnov test Statistics value for " + dist_name + " = " + str(D_ks))
        # print("p value for " + dist_name + " = " + str(p_ks))
        dist_ks_results.append((dist_name, p_ks))

        # Applying the Anderson-Darling test:
        D_ad = adtest(x=data, dist=dist, fit=False, params=param)
        print("Anderson-Darling test Statistics value for " + dist_name + " = " + str(D_ad))
        dist_ad_results.append((dist_name, D_ad))

        print(dist_ks_results)
        print(dist_ad_results)

        for D in range (len(dist_ks_results)):
           KS_D = dist_ks_results[D][1]
           AD_D = dist_ad_results[D][1]
           if KS_D < 0.25 and AD_D < 0.05:
                best_ks_D = KS_D
                best_ad_D = AD_D
                if dist_ks_results[D][1] == best_ks_D:
                   best_ks_dist = dist_ks_results[D][0]
                if dist_ad_results[D][1] == best_ad_D:
                   best_ad_dist = dist_ad_results[D][0]

            print(best_ks_D)
            print(best_ad_D)
            print(best_ks_dist)
            print(best_ad_dist)

            print('\n################################ Kolmogorov-Smirnov test parameters #####################################')
            print("Best fitting distribution (KS test): " + str(best_ks_dist))
            print("Best test Statistics value (KS test): " + str(best_ks_D))
            print("Parameters for the best fit (KS test): " + str(params[best_ks_dist])
            print('################################################################################\n')
            print('################################ Anderson-Darling test parameters #########################################')
            print("Best fitting distribution (AD test): " + str(best_ad_dist))
            print("Best test Statistics value (AD test): " + str(best_ad_D))
            print("Parameters for the best fit (AD test): " + str(params[best_ad_dist]))
            print('################################################################################\n')

Edit 1:

Я не уверен, но это normal_ad из общей статистики Тест Андерсона-Дарлинга для любого непрерывного распределения вероятностей?

Редактировать 2:

Некоторые распределения имеют одинаковые p-значения, как можно Я нашел наиболее подходящее распределение, если бы p-значения были одинаковыми? Стоит ли мне смотреть в статистику теста?

Edit 3:

Я знаю это в этой строке ниже:

# select the best fitted distribution:
# best_dist, best_p = (max(dist_ks_results, key=lambda item: item[1]))
# best_dist, best_p, best_D = (max(dist_ks_results, key=lambda item: item[1]) and [dist_ks_results, key=lambda item: item[2] if item < 0.05])
best_dist, best_p, best_D = (max(dist_ks_results, key=lambda item: item[1]) and [i[2] for i in dist_ks_results if i[2] < 0.05])
# best_dist, best_p, best_D = (max(dist_ks_results, key=lambda item: item[1]) and min(dist_ks_results, key=lambda item: item[2]))
# best_dist, best_p = (max(dist_ad_results, key=lambda item: item[1]))
# best_dist, best_p, best_D = (max(dist_ks_results, key=lambda item: item[1]) & max(dist_ad_results, key=lambda item: item[1]))
# store the name of the best fit and its p value

Но я не уверен, правильно ли я кодирую

Вопрос 3:

Как я могу получить p-значение для теста Андерсона-Дарлинга?

Вопрос 4:

Поправьте меня, если я ошибаюсь при выполнении теста Goodness-to-Fit, полученное значение p используется для проверки того, значения соответствуют любому из упомянутых распределений. Таким образом, максимальное значение p-значения означает, что p-значение находится ниже значимого уровня% 5, поэтому, например, гамма-распределение соответствует данным. Прав ли я или я не понял основную концепцию теста Goodness-to-Fit?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...