scipy.stats.

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))

Для более подробного примера см. Точный критерий Фишера.