scipy.stats.

fisher_exact#

scipy.stats.fisher_exact(table, alternative=None, *, method=None)[Quelle]#

Führt einen Fisher-Exaktheitstest für eine Kontingenztafel durch.

Für eine 2x2-Tabelle ist die Nullhypothese, dass das wahre Chancenverhältnis der zugrundeliegenden Populationen der Beobachtungen eins ist und die Beobachtungen aus diesen Populationen unter einer Bedingung gezogen wurden: die Randsummen der resultierenden Tabelle müssen denen der beobachteten Tabelle entsprechen. Die Statistik ist die unbedingte Maximum-Likelihood-Schätzung des Chancenverhältnisses, und der p-Wert ist die Wahrscheinlichkeit unter der Nullhypothese, eine Tabelle zu erhalten, die mindestens so extrem ist wie die tatsächlich beobachtete.

Für andere Tabellengrößen oder wenn method angegeben ist, ist die Nullhypothese, dass die Zeilen und Spalten der Tabellen feste Summen haben und unabhängig sind; d.h., die Tabelle wurde aus einer scipy.stats.random_table-Verteilung mit den beobachteten Randsummen gezogen. Die Statistik ist die Wahrscheinlichkeitsmasse dieser Verteilung, ausgewertet an der Stelle table, und der p-Wert ist der Prozentsatz der Population von Tabellen mit einer Statistik, die mindestens so extrem (klein) ist wie die von table. Es ist nur eine Alternative Hypothese verfügbar: die Zeilen und Spalten sind nicht unabhängig.

Es gibt andere mögliche Wahlen für die Statistik und die Definition von zweiseitigen p-Werten, die mit Fishers Exaktheitstest verbunden sind; weitere Informationen finden Sie in den Hinweisen.

Parameter:
tablearray_like von ints

Eine Kontingenztafel. Elemente müssen nicht-negative ganze Zahlen sein.

alternative{‘zweiseitig’, ‘kleiner’, ‘größer’}, optional

Definiert die Alternativhypothese für 2x2-Tabellen; für andere Tabellengrößen ungenutzt. Folgende Optionen sind verfügbar (Standard ist ‘two-sided’)

  • ‘two-sided’: das Chancenverhältnis der zugrundeliegenden Population ist nicht eins

  • ‘less’: das Chancenverhältnis der zugrundeliegenden Population ist kleiner als eins

  • ‘greater’: das Chancenverhältnis der zugrundeliegenden Population ist größer als eins

Weitere Details finden Sie in den Hinweisen.

methodResamplingMethod, optional

Definiert die zur Berechnung des p-Wertes verwendete Methode. Wenn method eine Instanz von PermutationMethod/MonteCarloMethod ist, wird der p-Wert mithilfe von scipy.stats.permutation_test/scipy.stats.monte_carlo_test mit den bereitgestellten Konfigurationsoptionen und anderen geeigneten Einstellungen berechnet. Beachten Sie, dass, wenn method eine Instanz von MonteCarloMethod ist, das Attribut rvs unausgesprochen bleiben muss; Monte-Carlo-Stichproben werden immer mit der rvs-Methode von scipy.stats.random_table gezogen. Andernfalls wird der p-Wert wie in den Hinweisen dokumentiert berechnet.

Hinzugefügt in Version 1.15.0.

Rückgabe:
resSignificanceResult

Ein Objekt, das Attribute enthält

statisticfloat

Für eine 2x2-Tabelle mit Standard- method ist dies das Chancenverhältnis – das vorherige Chancenverhältnis, keine Posterior-Schätzung. In allen anderen Fällen ist dies die Wahrscheinlichkeitsdichte, die beobachtete Tabelle unter der Nullhypothese der Unabhängigkeit mit festen Randsummen zu erhalten.

pvaluefloat

Die Wahrscheinlichkeit unter der Nullhypothese, eine Tabelle zu erhalten, die mindestens so extrem ist wie die tatsächlich beobachtete.

Löst aus:
ValueError

Wenn table nicht zweidimensional ist oder negative Einträge enthält.

Siehe auch

chi2_contingency

Chi-Quadrat-Unabhängigkeitstest von Variablen in einer Kontingenztafel. Dies kann als Alternative zu fisher_exact verwendet werden, wenn die Zahlen in der Tabelle groß sind.

contingency.odds_ratio

Berechnet das Chancenverhältnis (Stichprobe oder bedingtes MLE) für eine 2x2-Kontingenztafel.

barnard_exact

Barndards Exaktheitstest, eine leistungsfähigere Alternative zum Fisher-Exaktheitstest für 2x2-Kontingenztabellen.

boschloo_exact

Boschloos Exaktheitstest, eine leistungsfähigere Alternative zum Fisher-Exaktheitstest für 2x2-Kontingenztabellen.

Fishers exakter Test

Erweitertes Beispiel

Hinweise

Nullhypothese und p-Werte

Die Nullhypothese ist, dass das wahre Chancenverhältnis der zugrundeliegenden Populationen der Beobachtungen eins ist und die Beobachtungen zufällig aus diesen Populationen unter einer Bedingung gezogen wurden: die Randsummen der resultierenden Tabelle müssen denen der beobachteten Tabelle entsprechen. Äquivalent ist die Nullhypothese, dass die Eingabetabelle aus der hypergeometrischen Verteilung mit den Parametern (wie in hypergeom verwendet) M = a + b + c + d, n = a + b und N = a + c stammt, wobei die Eingabetabelle [[a, b], [c, d]] ist. Diese Verteilung hat die Unterstützung max(0, N + n - M) <= x <= min(N, n) oder, in Bezug auf die Werte in der Eingabetabelle, min(0, a - d) <= x <= a + min(b, c). x kann als das obere linke Element einer 2x2-Tabelle interpretiert werden, sodass die Tabellen in der Verteilung die Form haben

[  x           n - x     ]
[N - x    M - (n + N) + x]

Zum Beispiel, wenn

table = [6  2]
        [1  4]

dann ist die Unterstützung 2 <= x <= 7, und die Tabellen in der Verteilung sind

[2 6]   [3 5]   [4 4]   [5 3]   [6 2]  [7 1]
[5 0]   [4 1]   [3 2]   [2 3]   [1 4]  [0 5]

Die Wahrscheinlichkeit jeder Tabelle wird durch die hypergeometrische Verteilung hypergeom.pmf(x, M, n, N) gegeben. Für dieses Beispiel sind dies (gerundet auf drei signifikante Stellen)

x       2      3      4      5       6        7
p  0.0163  0.163  0.408  0.326  0.0816  0.00466

Diese können berechnet werden mit

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

Der zweiseitige p-Wert ist die Wahrscheinlichkeit, dass unter der Nullhypothese eine Zufallstabelle eine Wahrscheinlichkeit gleich oder kleiner der Wahrscheinlichkeit der Eingabetabelle hat. Für unser Beispiel beträgt die Wahrscheinlichkeit der Eingabetabelle (bei der x = 6) 0,0816. Die x-Werte, bei denen die Wahrscheinlichkeit diesen nicht überschreitet, sind 2, 6 und 7, sodass der zweiseitige p-Wert 0.0163 + 0.0816 + 0.00466 ~= 0.10256 ist.

>>> from scipy.stats import fisher_exact
>>> res = fisher_exact(table, alternative='two-sided')
>>> res.pvalue
0.10256410256410257

Der einseitige p-Wert für alternative='greater' ist die Wahrscheinlichkeit, dass eine Zufallstabelle x >= a hat, was in unserem Beispiel x >= 6 bedeutet, oder 0.0816 + 0.00466 ~= 0.08626.

>>> res = fisher_exact(table, alternative='greater')
>>> res.pvalue
0.08624708624708627

Dies ist äquivalent zur Berechnung der Überlebensfunktion der Verteilung bei x = 5 (eins weniger als x aus der Eingabetabelle, da wir die Wahrscheinlichkeit von x = 6 in die Summe einbeziehen wollen)

>>> hypergeom.sf(5, M, n, N)
0.08624708624708627

Für alternative='less' ist der einseitige p-Wert die Wahrscheinlichkeit, dass eine Zufallstabelle x <= a hat (d.h. x <= 6 in unserem Beispiel), oder 0.0163 + 0.163 + 0.408 + 0.326 + 0.0816 ~= 0.9949.

>>> res = fisher_exact(table, alternative='less')
>>> res.pvalue
0.9953379953379957

Dies ist äquivalent zur Berechnung der kumulativen Verteilungsfunktion der Verteilung bei x = 6

>>> hypergeom.cdf(6, M, n, N)
0.9953379953379957

Chancenverhältnis

Das berechnete Chancenverhältnis unterscheidet sich vom Wert, der von der R-Funktion fisher.test berechnet wird. Diese Implementierung gibt die "Stichprobe" oder die "unbedingte" Maximum-Likelihood-Schätzung zurück, während fisher.test in R die bedingte Maximum-Likelihood-Schätzung verwendet. Um die bedingte Maximum-Likelihood-Schätzung des Chancenverhältnisses zu berechnen, verwenden Sie scipy.stats.contingency.odds_ratio.

Referenzen

[1]

Fisher, Sir Ronald A, „The Design of Experiments: Mathematics of a Lady Tasting Tea.“ ISBN 978-0-486-41151-4, 1935.

[2]

„Fisher’s exact test“, https://en.wikipedia.org/wiki/Fisher’s_exact_test

Beispiele

>>> from scipy.stats import fisher_exact
>>> res = fisher_exact([[8, 2], [1, 5]])
>>> res.statistic
20.0
>>> res.pvalue
0.034965034965034975

Für Tabellen mit anderer Form als (2, 2) geben Sie eine Instanz von scipy.stats.MonteCarloMethod oder scipy.stats.PermutationMethod für den Parameter method an.

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

Ein ausführlicheres Beispiel finden Sie unter Fishers Exaktheitstest.