Проблемы с использованием параметров для теста KS и понимания результата - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь запустить тест KS на некоторых данных.Теперь у меня есть работающий код, но я не уверен, что понял, что происходит, и я также получаю сообщение об ошибке при попытке установить loc.По сути, я получаю значение KS и P-test.Но я не уверен, что полностью понял, достаточно, чтобы использовать результат.

Я использую найденный модуль scipy.stats.ks_2samp здесь .

Этоэто код, который я запускаю

from scipy import stats

np.random.seed(12345678)  #fix random seed to get the same result
n1 = len(low_ni_sample)  # size of first sample
n2 = len(high_ni_sample)  # size of second sample

# Scale is standard deviation
scale = 3

rvs1 = stats.norm.rvs(low_ni_sample[:,0], size=n1, scale=scale)
rvs2 = stats.norm.rvs(high_ni_sample[:,0], size=n2, scale=scale)
ksresult = stats.ks_2samp(rvs1, rvs2)
ks_val = ksresult[0]
p_val = ksresult[1]

print('K-S Statistics ' + str(ks_val))
print('P-value ' + str(p_val))

, который дает это:

K-S Statistics 0.04507948306145837
P-value 0.8362207851676332

Теперь для тех примеров, которые я видел, loc добавляется как:

rvs1 = stats.norm.rvs(low_ni_sample[:,0], size=n1, loc=0., scale=scale)
rvs2 = stats.norm.rvs(high_ni_sample[:,0], size=n2, loc=0.5, scale=scale)

Однако, если я сделаю это, я получу эту ошибку:

Traceback (most recent call last):

  File "<ipython-input-342-aa890a947919>", line 13, in <module>
    rvs1 = stats.norm.rvs(low_ni_sample[:,0], size=n1, loc=0., scale=scale)

  File "/home/kongstad/anaconda3/envs/tensorflow/lib/python3.6/site-packages/scipy/stats/_distn_infrastructure.py", line 937, in rvs
    args, loc, scale, size = self._parse_args_rvs(*args, **kwds)

TypeError: _parse_args_rvs() got multiple values for argument 'loc'

Вот снимок, показывающий содержимое двух используемых наборов данных.low_ni_sample, high_ni_sample.enter image description here

Итак, мои вопросы:

  1. Почему я не могу добавить значение loc и что оно представляет?
  2. Изменениемасштаб значительно меняет результат, почему и что делать?
  3. Как бы я изобразил это так, чтобы это имело смысл?

После запуска предложения Сильмы я наткнулся на новую ошибку.

from scipy import stats

np.random.seed(12345678)  #fix random seed to get the same result
n1 = len(low_ni_sample)  # size of first sample
n2 = len(high_ni_sample)  # size of second sample

# Scale is standard deviation
scale = 3

ndist = stats.norm(loc=0., scale=scale)

rvs1 = ndist.rvs(low_ni_sample[:,0],size=n1)
rvs2 = ndist.rvs(high_ni_sample[:,0],size=n2)

#rvs1 = stats.norm.rvs(low_ni_sample[:,2], size=n1, scale=scale)
#rvs2 = stats.norm.rvs(high_ni_sample[:,2], size=n2, scale=scale)
ksresult = stats.ks_2samp(rvs1, rvs2)
ks_val = ksresult[0]
p_val = ksresult[1]

print('K-S Statistics ' + str(ks_val))
print('P-value ' + str(p_val))

Сэто сообщение об ошибке

    rvs1 = ndist.rvs(low_ni_sample[:,0],size=n1)

TypeError: rvs() got multiple values for argument 'size'

1 Ответ

0 голосов
/ 26 ноября 2018

Ошибка возникает из-за того, что вы должны сначала создать экземпляр нормального распределения перед его использованием:

ndist = stats.norm(loc=0., scale=scale)

, а затем выполнить

rvs1 = ndist.rvs(size=n1)

для генерации n1 выбороквзяты из нормального распределения с центром в 0 и стандартным отклонением scale.Таким образом, местоположение является средним значением вашего распределения.

Изменение масштаба изменяет дисперсию вашего распределения (вы получаете большую изменчивость), поэтому это, очевидно, влияет на тест KS ...

Что касаетсясюжет, я не уверен, что понимаю, что вы имеете в виду ... если вы хотите построить гистограммы, тогда выполните

import matplotlib.pyplot as plt
plt.hist(rvs1)
plt.show()

Или, что еще лучше, установите seaborn и используйте их distplotметоды , например, KDE.

В целом, я бы посоветовал вам попытаться прочитать немного больше о дистрибутивах и тестах KS, прежде чем идти дальше, см., например, страницу википедии .

EDIT приведенный выше код используется для генерации случайных выборок из стандартного распределения (которое, как я предполагал, было вашей целью, сравнить с вашими выборками).

Если вы хотите напрямую сравнить ваши две выборки данных, то все, что вам нужно, это снова

ksresult = stats.ks_2samp(low_ni_sample[:,0], high_ni_sample[:,0])

, это предполагает, что low_ni_sample[:,0] и high_ni_sample[:,0] - это 1D-массивы, содержащие много измеренийколичество янтерест, ср. ks_2samp документация

...