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