Подтвердить что ты не робот

Тест Chi-Squared в Python

Я использовал следующий код в R, чтобы определить, насколько хорошо наблюдаемые значения (например, 20, 20, 0 и 0) соответствуют ожидаемым значениям/отношениям (например, 25% для каждого из четырех случаев):

> chisq.test(c(20,20,0,0), p=c(0.25, 0.25, 0.25, 0.25))

    Chi-squared test for given probabilities

data:  c(20, 20, 0, 0)

X-squared = 40, df = 3, p-value = 1.066e-08

Как я могу воспроизвести это в Python? Я попытался использовать функцию chisquare из scipy, но полученные результаты были очень разными; Я не уверен, что это даже правильная функция. Я просмотрел документацию scipy, но это довольно сложно, так как оно работает на 1000+ страницах; документация numpy почти на 50% больше.

4b9b3361

Ответ 1

scipy.stats.chisquare ожидает наблюдаемых и ожидаемых абсолютных частот, а не коэффициентов. Вы можете получить то, что хотите, с помощью

>>> observed = np.array([20., 20., 0., 0.])
>>> expected = np.array([.25, .25, .25, .25]) * np.sum(observed)
>>> chisquare(observed, expected)
(40.0, 1.065509033425585e-08)

Хотя в случае, когда ожидаемые значения равномерно распределены по классам, вы можете оставить расчет ожидаемых значений:

>>> chisquare(observed)
(40.0, 1.065509033425585e-08)

Первое возвращаемое значение - это статистика χ², вторая - p-значение теста.

Ответ 2

Просто хотел указать, что, хотя ответ кажется правильным синтаксически, вы не должны использовать дистрибутив Chi-squared с вашим примером, потому что вы наблюдаете частоты, которые слишком малы для точного теста Chi-square.

"Этот тест недействителен, когда наблюдаемые или ожидаемые частоты в каждой категории слишком малы. Типичным правилом является то, что все наблюдаемые и ожидаемые частоты должны быть не менее 5." видеть: http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chisquare.html#scipy.stats.chisquare

Ответ 3

Альтернативой может быть вызов вашего R-кода из python. Вы можете сделать это:

  • выполнив R script как инструмент командной строки. См. эту ссылку для получения дополнительной информации о запуске R-скриптов из командной строки с помощью Rscript. С помощью python вы можете запустить R script, выполнив системный вызов с помощью subprocess или os.system. Любой обмен данными осуществляется через текстовые или двоичные файлы. Мне нравится этот подход, потому что он очень прост, и легко отладить R script отдельно от кода python. Недостатком является то, что все данные проходят через жесткий диск, что может оказаться очень медленным.
  • с помощью rpy или rpy2 для запуска R-кода непосредственно из python. Таким образом, интеграция более жесткая, но эта ссылка также представляет свои собственные небольшие причуды. Например, по моему опыту отладка кода R, вызываемого через rpy, немного сложнее отладить.