Тест хи-квадрат в Python - PullRequest
       7

Тест хи-квадрат в Python

26 голосов
/ 17 февраля 2012

Я использовал следующий код в 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% больше.

Ответы [ 3 ]

35 голосов
/ 17 февраля 2012

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 -значение теста.

7 голосов
/ 17 декабря 2012

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

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

2 голосов
/ 17 февраля 2012

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

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