fisher_exact#
- scipy.stats.fisher_exact(таблица, альтернатива=None, *, метод=None)[источник]#
Выполнить точный тест Фишера на таблице сопряжённости.
Для таблицы 2x2 нулевая гипотеза состоит в том, что истинное отношение шансов популяций, лежащих в основе наблюдений, равно единице, и наблюдения были взяты из этих популяций при условии: маргиналы результирующей таблицы должны равняться маргиналам наблюдаемой таблицы. Статистика — это безусловная оценка максимального правдоподобия отношения шансов, а p-значение — вероятность при нулевой гипотезе получения таблицы, по крайней мере, столь же экстремальной, как фактически наблюдаемая.
Для других размеров таблиц, или если метод предоставлена, нулевая гипотеза заключается в том, что строки и столбцы таблиц имеют фиксированные суммы и независимы; т.е. таблица была выбрана из
scipy.stats.random_tableраспределение с наблюдаемыми маргиналами. Статистика — это вероятностная мера этого распределения, вычисленная в таблица, и p-значение — это процент таблиц в популяции со статистикой не менее экстремальной (малой), чем у таблица. Доступна только одна альтернативная гипотеза: строки и столбцы не являются независимыми.Существуют другие возможные варианты статистики и определения двустороннего p-значения, связанные с точным тестом Фишера; подробнее см. в Примечаниях.
- Параметры:
- таблицаarray_like из целых чисел
Таблица сопряженности. Элементы должны быть неотрицательными целыми числами.
- альтернатива{‘two-sided’, ‘less’, ‘greater’}, необязательный
Определяет альтернативную гипотезу для таблиц 2x2; не используется для других размеров таблиц. Доступны следующие опции (по умолчанию 'two-sided'):
'two-sided': отношение шансов в базовой популяции не равно единице
'less': отношение шансов в основной совокупности меньше единицы
‘greater’: отношение шансов в основной популяции больше единицы
См. примечания для более подробной информации.
- методResamplingMethod, опционально
Определяет метод, используемый для вычисления p-значения. Если метод является экземпляром
PermutationMethod/MonteCarloMethod, p-значение вычисляется с использованиемscipy.stats.permutation_test/scipy.stats.monte_carlo_testс предоставленными параметрами конфигурации и другими соответствующими настройками. Обратите внимание, что если метод является экземпляромMonteCarloMethod,rvsатрибут должен оставаться неуказанным; выборки Монте-Карло всегда извлекаются с использованиемrvsметодscipy.stats.random_table. В противном случае p-значение вычисляется, как описано в примечаниях.Добавлено в версии 1.15.0.
- Возвращает:
- resSignificanceResult
Объект, содержащий атрибуты:
- статистикаfloat
Для таблицы 2x2 по умолчанию метод, это отношение шансов - априорное отношение шансов, а не апостериорная оценка. Во всех остальных случаях это плотность вероятности получения наблюдаемой таблицы при нулевой гипотезе независимости с фиксированными маргиналами.
- p-значениеfloat
Вероятность при нулевой гипотезе получения таблицы, по крайней мере, столь же экстремальной, как фактически наблюдаемая.
- Вызывает:
- ValueError
Если таблица не является двумерным или содержит отрицательные элементы.
Смотрите также
chi2_contingencyКритерий хи-квадрат независимости переменных в таблице сопряжённости. Может использоваться как альтернатива
fisher_exactкогда числа в таблице большие.contingency.odds_ratioВычислить отношение шансов (выборочное или условное MLE) для таблицы сопряженности 2x2.
barnard_exactТочный тест Барнарда, который является более мощной альтернативой точному тесту Фишера для таблиц сопряжённости 2x2.
boschloo_exactТочный тест Босхлоо, который является более мощной альтернативой точному тесту Фишера для таблиц сопряженности 2x2.
- Точный критерий Фишера
Расширенный пример
Примечания
Нулевая гипотеза и p-значения
Нулевая гипотеза состоит в том, что истинное отношение шансов популяций, лежащих в основе наблюдений, равно единице, и наблюдения были выбраны случайным образом из этих популяций при условии: маргиналы результирующей таблицы должны равняться маргиналам наблюдаемой таблицы. Эквивалентно, нулевая гипотеза состоит в том, что входная таблица взята из гипергеометрического распределения с параметрами (как используется в
hypergeom)M = a + b + c + d,n = a + bиN = a + c, где входная таблица[[a, b], [c, d]]. Это распределение имеет носительmax(0, N + n - M) <= x <= min(N, n), или, в терминах значений во входной таблице,min(0, a - d) <= x <= a + min(b, c).xможет интерпретироваться как верхний левый элемент таблицы 2x2, поэтому таблицы в распределении имеют вид:[ x n - x ] [N - x M - (n + N) + x]
Например, если:
table = [6 2] [1 4]
тогда носитель равен
2 <= x <= 7, а таблицы в распределении:[2 6] [3 5] [4 4] [5 3] [6 2] [7 1] [5 0] [4 1] [3 2] [2 3] [1 4] [0 5]
Вероятность каждой таблицы задаётся гипергеометрическим распределением
hypergeom.pmf(x, M, n, N). Для этого примера они (округлены до трех значащих цифр):x 2 3 4 5 6 7 p 0.0163 0.163 0.408 0.326 0.0816 0.00466
Их можно вычислить с помощью:
>>> import numpy as np >>> from scipy.stats import hypergeom >>> table = np.array([[6, 2], [1, 4]]) >>> M = table.sum() >>> n = table[0].sum() >>> N = table[:, 0].sum() >>> start, end = hypergeom.support(M, n, N) >>> hypergeom.pmf(np.arange(start, end+1), M, n, N) array([0.01631702, 0.16317016, 0.40792541, 0.32634033, 0.08158508, 0.004662 ])
Двустороннее p-значение — это вероятность того, что при нулевой гипотезе случайная таблица будет иметь вероятность, равную или меньшую, чем вероятность входной таблицы. Для нашего примера вероятность входной таблицы (где
x = 6) равно 0.0816. Значения x, где вероятность не превышает это, равны 2, 6 и 7, поэтому двустороннее p-значение равно0.0163 + 0.0816 + 0.00466 ~= 0.10256:>>> from scipy.stats import fisher_exact >>> res = fisher_exact(table, alternative='two-sided') >>> res.pvalue 0.10256410256410257
Одностороннее p-значение для
alternative='greater'это вероятность того, что случайная таблица имеетx >= a, что в нашем примереx >= 6, или0.0816 + 0.00466 ~= 0.08626:>>> res = fisher_exact(table, alternative='greater') >>> res.pvalue 0.08624708624708627
Это эквивалентно вычислению функции выживания распределения в
x = 5(на единицу меньше, чемxиз входной таблицы, потому что мы хотим включить вероятностьx = 6в сумме):>>> hypergeom.sf(5, M, n, N) 0.08624708624708627
Для
alternative='less', одностороннее p-значение — это вероятность того, что случайная таблица имеетx <= a, (т.е.x <= 6в нашем примере), или0.0163 + 0.163 + 0.408 + 0.326 + 0.0816 ~= 0.9949:>>> res = fisher_exact(table, alternative='less') >>> res.pvalue 0.9953379953379957
Это эквивалентно вычислению функции кумулятивного распределения распределения в
x = 6:>>> hypergeom.cdf(6, M, n, N) 0.9953379953379957
Отношение шансов
Вычисленное отношение шансов отличается от значения, вычисленного функцией R
fisher.test. Эта реализация возвращает «выборочную» или «безусловную» оценку максимального правдоподобия, в то время какfisher.testв R использует оценку условного максимального правдоподобия. Чтобы вычислить оценку условного максимального правдоподобия для отношения шансов, используйтеscipy.stats.contingency.odds_ratio.Ссылки
[1]Фишер, сэр Рональд А., «Планирование экспериментов: Математика дегустации чая леди». ISBN 978-0-486-41151-4, 1935.
[2]“Точный критерий Фишера”, https://en.wikipedia.org/wiki/Fisher’s_exact_test
Примеры
>>> from scipy.stats import fisher_exact >>> res = fisher_exact([[8, 2], [1, 5]]) >>> res.statistic 20.0 >>> res.pvalue 0.034965034965034975
Для таблиц с формой, отличной от
(2, 2), предоставьте экземплярscipy.stats.MonteCarloMethodилиscipy.stats.PermutationMethodдля метод параметр:>>> import numpy as np >>> from scipy.stats import MonteCarloMethod >>> rng = np.random.default_rng() >>> method = MonteCarloMethod(rng=rng) >>> fisher_exact([[8, 2, 3], [1, 5, 4]], method=method) SignificanceResult(statistic=np.float64(0.005782), pvalue=np.float64(0.0603))
Для более подробного примера см. Точный критерий Фишера.