Точный тест Фишера. Python против R
Jul. 27th, 2016 02:41 pmЯ понимаю, что для ответа на мой вопрос самым правильным было бы посмотреть исходники R, но прежде чем погрузиться в разбор чужого кода, я хотел бы задать вопрос здесь: а вдруг кто-нибудь из моих друзей уже знает ответ? Проблема возникла из-за того, что мне понадобилось заменить скрипт на R скриптом на Perl. Реализация функции, вычисляющей точный тест Фишера, есть в библиотеке Python и в библиотеке R, но её нет в Perl. Поэтому я написал следующий тестовый код на Perl (он приводится под катом).
Результаты работы этого теста совпадают с результатами работы стандартной функции из библиотеки Python, но расходятся с результатами, выдаваемыми стандартной функцией из R.
Тестовый вывод приведенной под катом программы:
A = |30 60|
|10 70|
Fisher exact test, Perl
P two-sided = 0.00187
Odds ratio = 3.500
Confidence Interval: 1.581...7.746
P one-sided less = 0.99972
P one sided greater = 0.00109
P hypergeom = 0.00081
Для сравнения привожу тестовый вывод с теми же данными результатов работы стандартной библиотечной функции Python stats.fisher_exact:
Python's library function stats.fisher_exact
P two-sided = 0.00187
Odds ratio = 3.500
P one-sided less = 0.99972
P one-sided greater = 0.00109
Однако результаты работы функции fisher.test из библиотеки R несколько отличаются от реализации на Perl, выполненной в соответствии с описанием в учебниках, и от реализации в статистической библиотеке Python. Отличающиеся значения выделены красным цветом:
R: Fisher's Exact Test for Count Data
P two-sided = 0.001871
Odds ratio = 3.475
Confidence Interval: 1.503...8.655
P one-sided less = 0.99972
P one-sided greater = 0.00109
В документации R написано, что при расчете отношения шансов и доверительного интервала используется дополнительная «подгонка» результатов с использованием метода наилучшего соответствия. Есть ещё вот такая статья по расчету отношения шансов: http://www.people.fas.harvard.edu/~mparzen/published/parzen17.pdf, но в R всё равно используется что-то другое. Может ли кто-нибудь вкратце описать алгоритм работы функции R или всё же придётся лезть в исходники?
Upd.: Вкратце: мне нужно понять, как «руками» получить такое же отношение шансов (odds ratio), которое возвращает функция R, потому что сами вероятности я считаю правильно.
( Реализация алгоритма точного теста Фишера на Perl )
Результаты работы этого теста совпадают с результатами работы стандартной функции из библиотеки Python, но расходятся с результатами, выдаваемыми стандартной функцией из R.
Тестовый вывод приведенной под катом программы:
A = |30 60|
|10 70|
Fisher exact test, Perl
P two-sided = 0.00187
Odds ratio = 3.500
Confidence Interval: 1.581...7.746
P one-sided less = 0.99972
P one sided greater = 0.00109
P hypergeom = 0.00081
Для сравнения привожу тестовый вывод с теми же данными результатов работы стандартной библиотечной функции Python stats.fisher_exact:
Python's library function stats.fisher_exact
P two-sided = 0.00187
Odds ratio = 3.500
P one-sided less = 0.99972
P one-sided greater = 0.00109
Однако результаты работы функции fisher.test из библиотеки R несколько отличаются от реализации на Perl, выполненной в соответствии с описанием в учебниках, и от реализации в статистической библиотеке Python. Отличающиеся значения выделены красным цветом:
R: Fisher's Exact Test for Count Data
P two-sided = 0.001871
Odds ratio = 3.475
Confidence Interval: 1.503...8.655
P one-sided less = 0.99972
P one-sided greater = 0.00109
В документации R написано, что при расчете отношения шансов и доверительного интервала используется дополнительная «подгонка» результатов с использованием метода наилучшего соответствия. Есть ещё вот такая статья по расчету отношения шансов: http://www.people.fas.harvard.edu/~mparzen/published/parzen17.pdf, но в R всё равно используется что-то другое. Может ли кто-нибудь вкратце описать алгоритм работы функции R или всё же придётся лезть в исходники?
Upd.: Вкратце: мне нужно понять, как «руками» получить такое же отношение шансов (odds ratio), которое возвращает функция R, потому что сами вероятности я считаю правильно.
( Реализация алгоритма точного теста Фишера на Perl )