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/MonteCarloMethodist, wird der p-Wert mithilfe vonscipy.stats.permutation_test/scipy.stats.monte_carlo_testmit den bereitgestellten Konfigurationsoptionen und anderen geeigneten Einstellungen berechnet. Beachten Sie, dass, wenn method eine Instanz vonMonteCarloMethodist, das Attributrvsunausgesprochen bleiben muss; Monte-Carlo-Stichproben werden immer mit derrvs-Methode vonscipy.stats.random_tablegezogen. 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_contingencyChi-Quadrat-Unabhängigkeitstest von Variablen in einer Kontingenztafel. Dies kann als Alternative zu
fisher_exactverwendet werden, wenn die Zahlen in der Tabelle groß sind.contingency.odds_ratioBerechnet das Chancenverhältnis (Stichprobe oder bedingtes MLE) für eine 2x2-Kontingenztafel.
barnard_exactBarndards Exaktheitstest, eine leistungsfähigere Alternative zum Fisher-Exaktheitstest für 2x2-Kontingenztabellen.
boschloo_exactBoschloos 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
hypergeomverwendet)M = a + b + c + d,n = a + bundN = a + cstammt, wobei die Eingabetabelle[[a, b], [c, d]]ist. Diese Verteilung hat die Unterstützungmax(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).xkann 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-Wert0.0163 + 0.0816 + 0.00466 ~= 0.10256ist.>>> 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 Zufallstabellex >= ahat, was in unserem Beispielx >= 6bedeutet, oder0.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 alsxaus der Eingabetabelle, da wir die Wahrscheinlichkeit vonx = 6in 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 Zufallstabellex <= ahat (d.h.x <= 6in unserem Beispiel), oder0.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.testberechnet wird. Diese Implementierung gibt die "Stichprobe" oder die "unbedingte" Maximum-Likelihood-Schätzung zurück, währendfisher.testin R die bedingte Maximum-Likelihood-Schätzung verwendet. Um die bedingte Maximum-Likelihood-Schätzung des Chancenverhältnisses zu berechnen, verwenden Siescipy.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 vonscipy.stats.MonteCarloMethododerscipy.stats.PermutationMethodfü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.