Противоречивые результаты теста Колмогорова-Смирнова (КС) на Python

#python #python-3.x #scipy #normal-distribution #scipy.stats

Вопрос:

Я пытаюсь вычислить тест KS, указав CDF в виде массива, однако я столкнулся с неожиданными результатами. При дальнейшей оценке я обнаружил различные результаты, основанные на том, указал ли я CDF в качестве вызываемого, строки или массива. Мой код выглядит следующим образом:

 import scipy.stats as st

random_variables = st.norm.rvs(loc=1, scale=1,size=1000000)
cdf_data = st.norm.cdf(random_variables, loc=1,scale=1)
params = st.norm.fit(data=random_variables)
display(params)
print('n')

#test 1
out = kstest(rvs=random_variables,cdf='norm',args=params)
display(out, out[0], out[1])
print('n')

#test 2
out = kstest(rvs=random_variables,cdf=st.norm.cdf,args=params)
display(out, out[0], out[1])
print('n')

#test 3
out = kstest(rvs=random_variables,cdf=cdf_data)
display(out, out[0], out[1])
 

Результаты этого кода являются:

 (1.0004825310590526, 0.9996641807017618)


KstestResult(statistic=0.0007348981302804924, pvalue=0.6523439724424506)
0.0007348981302804924
0.6523439724424506


KstestResult(statistic=0.0007348981302804924, pvalue=0.6523439724424506)
0.0007348981302804924
0.6523439724424506


KstestResult(statistic=0.500165, pvalue=0.0)
0.500165
0.0
 

Учитывая, что данные большой выборки сравниваются с точным распределением, из которого была сгенерирована выборка, я ожидаю, что не удастся отвергнуть нулевую гипотезу. Это относится к тестам 1 и 2, но это не относится к тесту 3. Я хочу иметь возможность повторить этот тест, используя аргумент массива для аргумента «cdf». Любая помощь относительно того, что я делаю неправильно для теста 3, была бы очень полезна. Мой numpy-версия 1.19.2, а scipy-1.5.2. Спасибо!

Ответ №1:

Я думаю, что есть две вещи, которые могут способствовать вашему замешательству.

  1. Я не думаю, что ты хочешь, чтобы тебя сравнивали cdf_data = st.norm.cdf(random_variables, loc=1,scale=1) . Это возвращает значение функции кумулятивного распределения при всех значениях x random-variables . В тесте KS вы сравниваете два распределения, и ваши cdf_data и random_variable являются двумя очень разными распределениями, поэтому вы ожидали бы получить значение p, равное 0. Я предлагаю вам заменить cdf_data что-то вроде random_variable_2 = st.norm.rvs(loc=1,scale=1, size=size)
  2. Кроме того, вы выполняете два разных теста KS между первыми двумя (один образец) и третьим (два образца) тестом. В первых двух вы сравниваете свои данные с фиксированной функциональной формой, чтобы проверить, соответствуют ли данные этому функциональному распределению. Поскольку у вас одинаковые данные и распределение между первым и вторым случаями, вы ожидаете, что результат будет одинаковым. Однако в случае трех вы тестируете два независимых дистрибутива, чтобы убедиться, что они согласуются друг с другом. Поскольку cdf_data это должны быть просто другие нормально распределенные точки данных, вы должны обнаружить, что два распределения согласованы, но это не обязательно должно дать вам тот же самый ответ, что и в двух предыдущих случаях, просто статистика теста и значение p, которое предполагает, что два набора данных получены из одного и того же базового распределения.