Prace dyplomowe · Wybór testu

Chi-kwadrat czy test Fishera? Małe liczebności w tabeli

Krótka odpowiedź z przykładem w R: co mówi reguła Cochrana, kiedy wystarczy zwykły chi-kwadrat, kiedy test Fishera albo symulowane p, co zrobić z tabelą większą niż 2 × 2 i czy łączyć kategorie.

Strona główna / Blog / Chi-kwadrat czy Fisher
W skrócie: Zwykły test chi-kwadrat wystarcza, gdy najwyżej 20% komórek ma liczebność oczekiwaną poniżej 5 i żadna poniżej 1 (reguła Cochrana). Gdy reguła jest złamana, w tabeli 2 × 2 użyj testu Fishera, a w większej – testu Fishera–Freemana–Haltona albo chi-kwadrat z symulowanym p. Wersję testu i ewentualne łączenie kategorii zapisz w planie analizy, zanim zobaczysz wyniki.

Reguła Cochrana: co naprawdę mówi

Test chi-kwadrat daje wartość p z przybliżenia rozkładem χ². Przybliżenie słabnie, gdy w tabeli krzyżowej są komórki z małą liczebnością oczekiwaną, czyli liczbą osób, jakiej należałoby się spodziewać przy braku związku. Liczy się więc liczebność oczekiwana, a nie obserwowana.

Klasyczna reguła pochodzi od Cochrana (1954): najwyżej 20% komórek może mieć liczebność oczekiwaną poniżej 5 i żadna nie może mieć poniżej 1 (Kim, 2017). W tabeli 2 × 2 łamie ją już jedna komórka. Reguła jest umowna. Campbell (2007) przypomina, że według samego Cochrana próg 5 wybrano arbitralnie, a Camilli i Hopkins (1978) stwierdzili, że test Pearsona dla tabel 2 × 2 jest bardzo odporny także przy małych liczebnościach oczekiwanych. Jak policzyć liczebności oczekiwane, pokazujemy w poradniku test chi-kwadrat krok po kroku.

Który test wybrać: krótka ściąga

Wybór testu dla tabeli krzyżowej w zależności od wielkości tabeli i liczebności oczekiwanych
SytuacjaCo zastosowaćFunkcja w R
Dowolna tabela, reguła Cochrana spełnionachi-kwadrat Pearsonachisq.test(tab, correct = FALSE)
Tabela 2 × 2, wszystkie liczebności oczekiwane ≥ 1chi-kwadrat „N − 1” albo Pearsona (Campbell, 2007)χ² × (N − 1)/N z chisq.test()
Tabela 2 × 2, któraś liczebność oczekiwana < 1test dokładny Fisherafisher.test(tab)
Tabela większa niż 2 × 2, reguła Cochrana złamanatest Fishera–Freemana–Haltona albo chi-kwadrat z symulowanym pfisher.test(tab) albo chisq.test(tab, simulate.p.value = TRUE)
Duża tabela i duża próba, fisher.test() liczy zbyt długosymulowane p (Monte Carlo)fisher.test(tab, simulate.p.value = TRUE)
Rzadka kategoria, która merytorycznie pasuje do sąsiedniejpołączenie kategorii zaplanowane przed analiząnowa tabela, potem test jak wyżej

Test Fishera nie jest „zawsze bezpieczniejszy”. Bywa zachowawczy, czyli rzadziej wykrywa prawdziwy związek, dlatego nie używaj go odruchowo przy dużych liczebnościach. Szczegóły i zapis wyniku opisuje hasło o teście Fishera. Szerszy schemat doboru testu znajdziesz w przewodniku po testach statystycznych.

Przykład: tabela 3 × 3 z pilotażu

W badaniu pilotażowym 42 osoby studiujące losowo przydzielono po 14 do treningu uważności, relaksacji i grupy kontrolnej. Po czterech tygodniach oceniono zmianę samopoczucia: poprawa, bez zmian albo pogorszenie (dane symulowane). Poprawę miało 10 z 14 osób po treningu uważności (71.4%), 6 po relaksacji (42.9%) i 3 w grupie kontrolnej (21.4%). Pogorszenie zdarzało się rzadko: 1, 1 i 5 osób.

Liczebność oczekiwana w kolumnie „pogorszenie” wynosi 2.33 w każdym wierszu. Trzy z dziewięciu komórek (33.3%) mają więc wartość poniżej 5. Reguła Cochrana jest złamana, a R ostrzega: Chi-squared approximation may be incorrect. Trzy podejścia dają:

  • chi-kwadrat Pearsona (przybliżenie): χ²(4, N = 42) = 10.09, p = .039;
  • chi-kwadrat z p z symulacji 10 000 tabel o tych samych sumach brzegowych: p = .040;
  • test Fishera–Freemana–Haltona: p = .052.

V Craméra wynosi .35. Dlaczego wyniki się różnią? Oba testy „dokładne” biorą pod uwagę wszystkie tabele o tych samych sumach w wierszach i kolumnach. Symulacja zachowuje jednak statystykę χ² i tylko zastępuje rozkład χ² rozkładem z losowania. Test Fishera–Freemana–Haltona porządkuje tabele według ich prawdopodobieństwa, jak test Fishera dla 2 × 2. To inna statystyka, więc daje inne p. Mehta i Patel (1983) zauważają, że w tabelach z wieloma małymi liczebnościami test Fishera i test χ² Pearsona często prowadzą do sprzecznych wniosków.

Wniosek praktyczny: test wybierz w planie analizy, zanim zobaczysz wyniki. Wybieranie wersji, która daje p < .05, to p-hacking. A wynik w okolicach .04–.05 przy 42 osobach jest niepewny niezależnie od testu. Pilotaż służy zresztą przede wszystkim do sprawdzenia procedury, a nie do rozstrzygania hipotez.

Łączenie kategorii

Gdy rzadka kategoria merytorycznie pasuje do sąsiedniej, możesz ją z nią połączyć. W przykładzie „bez zmian” i „pogorszenie” dają razem „brak poprawy”. Tabela 3 × 2 ma najmniejszą liczebność oczekiwaną 6.33, więc zwykły test chi-kwadrat jest w porządku: χ²(2, N = 42) = 7.11, p = .029, V = .41. Test Fishera dla tej tabeli daje p = .036.

Łączenie ma dwa warunki:

  1. Reguła łączenia jest zapisana przed analizą, np. „jeśli kategoria »pogorszenie« będzie miała mniej niż 5 osób, połączę ją z »bez zmian«”. Łączenie „aż wyjdzie” to forma p-hackingu.
  2. Połączona tabela odpowiada na inne pytanie. Test 3 × 2 mówi o odsetku poprawy, a nie o tym, czy warunki różnią się też częstością pogorszenia. Napisz to wprost w pracy.

Dlaczego poprawka Yatesa budzi spory

Poprawka Yatesa dotyczy tylko tabel 2 × 2 i miała zbliżyć wynik χ² do testu Fishera. Spór dotyczy tego, czy to w ogóle dobry cel. Camilli i Hopkins (1978) pokazali, że poprawka obniża trafność wartości p, gdy sumy brzegowe nie są ustalone z góry, a tak jest w prawie każdym badaniu ankietowym. Haviland (1990) podsumowuje, że wyniki z poprawką są nadmiernie zachowawcze, a zwykły test Pearsona dobrze kontroluje błąd I rodzaju, i odradza zarówno poprawkę, jak i test Fishera. Pułapka praktyczna: chisq.test() w R stosuje poprawkę w tabeli 2 × 2 domyślnie. Jeśli jej nie chcesz, dodaj correct = FALSE i napisz w pracy, której wersji użyłeś(-aś).

Jak to opisać w pracy

Napisz, dlaczego wybrałeś(-aś) dany test, i podaj odsetki, wynik testu oraz wielkość efektu. Wzór dla przykładu, przy założeniu, że w planie analizy wskazano test Fishera–Freemana–Haltona:

Poprawę samopoczucia odnotowano u 71.4% osób po treningu uważności, 42.9% osób po relaksacji i 21.4% osób z grupy kontrolnej, a pogorszenie odpowiednio u 7.1%, 7.1% i 35.7% osób. Ponieważ trzy z dziewięciu komórek tabeli (33.3%) miały liczebność oczekiwaną poniżej 5, zgodnie z planem analizy zamiast testu chi-kwadrat zastosowano test dokładny Fishera–Freemana–Haltona. Związek warunku ze zmianą samopoczucia nie był istotny statystycznie, p = .052, V Craméra = .35. W zaplanowanej analizie dodatkowej, po połączeniu kategorii „bez zmian” i „pogorszenie”, odsetek osób z poprawą różnił się między warunkami, χ²(2, N = 42) = 7.11, p = .029, V = .41. Ze względu na małą próbę pilotażową wyniki należy traktować ostrożnie.
Przykład reprodukowalny

Chi-kwadrat i test Fishera w R

Kod odtwarza wszystkie liczby z tekstu: tabelę z odsetkami, liczebności oczekiwane i sprawdzenie reguły Cochrana, test chi-kwadrat z przybliżeniem i z symulowanym p, test Fishera–Freemana–Haltona, V Craméra (pakiet effectsize) oraz analizę tabeli po połączeniu kategorii.

Tabela 3 × 3 z małymi liczebnościami oczekiwanymi

Dane wejściowe: pilotaż, 42 osoby studiujące, po 14 w trzech warunkach (uważność, relaksacja, kontrola); zmiana samopoczucia w trzech kategoriach (dane symulowane, set.seed(3599); symulacja p: set.seed(169)).

Co odczytać: liczebności i odsetki w wierszach, macierz liczebności oczekiwanych, liczbę i odsetek komórek z E < 5, X-squared, df i p-value w trzech testach, Cramer's V, a dla tabeli 3 × 2 – liczebności oczekiwane, wynik testu chi-kwadrat i testu Fishera.

R
# B169 – chi-kwadrat czy test Fishera? Tabela 3 × 3 z małymi liczebnościami oczekiwanymi:
# reguła Cochrana, chi-kwadrat asymptotyczny, chi-kwadrat z symulowanym p,
# test Fishera–Freemana–Haltona, V Craméra i tabela po połączeniu kategorii (3 × 2)
# Dane symulowane: pilotaż, 42 osoby studiujące, po 14 w trzech warunkach.
library(effectsize)
set.seed(3599)
warunek <- factor(rep(c("uważność", "relaksacja", "kontrola"), each = 14),
                  levels = c("uważność", "relaksacja", "kontrola"))
szanse <- list(c(.60, .33, .07), c(.45, .45, .10), c(.20, .58, .22))
zmiana <- unlist(lapply(szanse, function(p)
  sample(c("poprawa", "bez zmian", "pogorszenie"), 14, replace = TRUE, prob = p)))
zmiana <- factor(zmiana, levels = c("poprawa", "bez zmian", "pogorszenie"))
tab <- table(warunek, zmiana)
tab
round(100 * prop.table(tab, 1), 1)          # odsetki w wierszach

# 1. Reguła Cochrana: liczebności oczekiwane
E <- suppressWarnings(chisq.test(tab))$expected
round(E, 2)
c(komorki_E_ponizej_5 = sum(E < 5), odsetek = round(100 * mean(E < 5), 1), min_E = round(min(E), 2))

# 2. Chi-kwadrat Pearsona (przybliżenie asymptotyczne) – R ostrzega o przybliżeniu
chisq.test(tab)

# 3. Chi-kwadrat z p z symulacji Monte Carlo (10 000 tabel o tych samych sumach brzegowych)
set.seed(169)
chisq.test(tab, simulate.p.value = TRUE, B = 10000)

# 4. Test Fishera–Freemana–Haltona (uogólnienie testu Fishera na tabele r × c)
fisher.test(tab)

# 5. Wielkość efektu: V Craméra z 95% CI (bez korekty obciążenia)
cramers_v(tab, adjust = FALSE)

# 6. Kategorie połączone zgodnie z planem analizy: „bez zmian” + „pogorszenie” = „brak poprawy”
tab2 <- cbind(poprawa = tab[, "poprawa"], brak_poprawy = tab[, "bez zmian"] + tab[, "pogorszenie"])
tab2
round(chisq.test(tab2)$expected, 2)
chisq.test(tab2)
fisher.test(tab2)
cramers_v(tab2, adjust = FALSE)
Wynik w R
            zmiana
warunek      poprawa bez zmian pogorszenie
  uważność        10         3           1
  relaksacja       6         7           1
  kontrola         3         6           5
            zmiana
warunek      poprawa bez zmian pogorszenie
  uważność      71.4      21.4         7.1
  relaksacja    42.9      50.0         7.1
  kontrola      21.4      42.9        35.7
            zmiana
warunek      poprawa bez zmian pogorszenie
  uważność      6.33      5.33        2.33
  relaksacja    6.33      5.33        2.33
  kontrola      6.33      5.33        2.33
komorki_E_ponizej_5             odsetek               min_E 
               3.00               33.30                2.33 

	Pearson's Chi-squared test

data:  tab
X-squared = 10.091, df = 4, p-value = 0.03892

Warning message:
In chisq.test(tab) : Chi-squared approximation may be incorrect

	Pearson's Chi-squared test with simulated p-value (based on 10000
	replicates)

data:  tab
X-squared = 10.091, df = NA, p-value = 0.0397


	Fisher's Exact Test for Count Data

data:  tab
p-value = 0.05215
alternative hypothesis: two.sided

Cramer's V |       95% CI
-------------------------
0.35       | [0.06, 1.00]

- One-sided CIs: upper bound fixed at [1.00].           poprawa brak_poprawy
uważność        10            4
relaksacja       6            8
kontrola         3           11
           poprawa brak_poprawy
uważność      6.33         7.67
relaksacja    6.33         7.67
kontrola      6.33         7.67

	Pearson's Chi-squared test

data:  tab2
X-squared = 7.1121, df = 2, p-value = 0.02855


	Fisher's Exact Test for Count Data

data:  tab2
p-value = 0.03557
alternative hypothesis: two.sided

Cramer's V |       95% CI
-------------------------
0.41       | [0.10, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Bibliografia oprogramowania

Wyniki na tej stronie pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (funkcje chisq.test() i fisher.test() z pakietu stats, cramers_v() z pakietu effectsize). W pracy podaj wersje faktycznie użytych pakietów (sessionInfo()).

  1. R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
  2. effectsize (wersja 1.0.2): Ben-Shachar, M. S., Lüdecke, D., & Makowski, D. (2020). effectsize: Estimation of effect size indices and standardized parameters. Journal of Open Source Software, 5(56), 2815. https://doi.org/10.21105/joss.02815

Najczęstsze pytania

Co zrobić, gdy liczebność oczekiwana w tabeli jest mniejsza niż 5?

Sprawdź, ile takich komórek jest. Jeśli najwyżej 20% i żadna nie ma liczebności oczekiwanej poniżej 1, zwykły test chi-kwadrat jest w porządku. Jeśli więcej, użyj testu Fishera (w tabeli większej niż 2 × 2 – Fishera–Freemana–Haltona), chi-kwadrat z symulowanym p albo połącz rzadkie kategorie, jeśli zaplanowałeś(-aś) to przed analizą.

Czym jest chi-kwadrat z symulowaną wartością p?

To zwykła statystyka χ², której wartość p nie pochodzi z rozkładu χ², tylko z losowania wielu tabel o tych samych sumach w wierszach i kolumnach. W R uzyskasz ją przez chisq.test(tab, simulate.p.value = TRUE, B = 10000). Ustaw set.seed(), żeby wynik dało się powtórzyć, i podaj liczbę losowań.

Czy można łączyć kategorie w tabeli krzyżowej, żeby spełnić warunki testu chi-kwadrat?

Tak, jeśli połączenie ma sens merytoryczny i reguła łączenia została ustalona przed analizą. Pamiętaj, że połączona tabela odpowiada na węższe pytanie, i opisz to w pracy. Łączenie kategorii po obejrzeniu wyników, tak by wyszło p < .05, to p-hacking.

Dlaczego test Fishera i chi-kwadrat dają różne wartości p?

Chi-kwadrat korzysta z przybliżenia rozkładem χ², a test Fishera liczy prawdopodobieństwo wszystkich tabel o tych samych sumach brzegowych i porządkuje je według prawdopodobieństwa, a nie według χ². W tabelach z małymi liczebnościami różnice bywają wyraźne, np. p = .039 wobec .052 w przykładzie z tego wpisu. Dlatego test wybiera się w planie analizy.

Powiązane hasła

Przeczytaj też

Masz małą próbę i nie wiesz, który test wybrać?

Sprawdzimy tabelę i liczebności oczekiwane, dobierzemy test do planu analizy i wyjaśnimy wynik tak, żebyś umiał(a) go samodzielnie opisać i obronić.

Oferta dla studentówWyceń analizę

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Camilli, G., & Hopkins, K. D. (1978). Applicability of chi-square to 2 × 2 contingency tables with small expected cell frequencies. Psychological Bulletin, 85(1), 163–167. https://doi.org/10.1037/0033-2909.85.1.163
  2. Campbell, I. (2007). Chi-squared and Fisher–Irwin tests of two-by-two tables with small sample recommendations. Statistics in Medicine, 26(19), 3661–3675. https://doi.org/10.1002/sim.2832
  3. Cochran, W. G. (1954). Some methods for strengthening the common χ² tests. Biometrics, 10(4), 417–451. https://doi.org/10.2307/3001616
  4. Haviland, M. G. (1990). Yates's correction for continuity and the analysis of 2 × 2 contingency tables. Statistics in Medicine, 9(4), 363–367. https://doi.org/10.1002/sim.4780090403
  5. Kim, H.-Y. (2017). Statistical notes for clinical researchers: Chi-squared test and Fisher's exact test. Restorative Dentistry & Endodontics, 42(2), 152–155. https://doi.org/10.5395/rde.2017.42.2.152 ● Otwarty dostęp
  6. Mehta, C. R., & Patel, N. R. (1983). A network algorithm for performing Fisher’s exact test in r × c contingency tables. Journal of the American Statistical Association, 78(382), 427–434. https://doi.org/10.1080/01621459.1983.10477989

Cytowania BibTeX

@article{camilli1978applicability, author={Camilli, Gregory and Hopkins, Kenneth D.}, title={{Applicability of chi-square to 2 × 2 contingency tables with small expected cell frequencies}}, journal={Psychological Bulletin}, year={1978}, volume={85}, number={1}, pages={163--167}, doi={10.1037/0033-2909.85.1.163}}
@article{campbell2007chisquared, author={Campbell, Ian}, title={{Chi-squared and Fisher–Irwin tests of two-by-two tables with small sample recommendations}}, journal={Statistics in Medicine}, year={2007}, volume={26}, number={19}, pages={3661--3675}, doi={10.1002/sim.2832}}
@article{cochran1954some, author={Cochran, William G.}, title={{Some methods for strengthening the common χ² tests}}, journal={Biometrics}, year={1954}, volume={10}, number={4}, pages={417--451}, doi={10.2307/3001616}}
@article{haviland1990yates, author={Haviland, Mark G.}, title={{Yates's correction for continuity and the analysis of 2 × 2 contingency tables}}, journal={Statistics in Medicine}, year={1990}, volume={9}, number={4}, pages={363--367}, doi={10.1002/sim.4780090403}}
@article{kim2017chi, author={Kim, Hae-Young}, title={{Statistical notes for clinical researchers: Chi-squared test and Fisher's exact test}}, journal={Restorative Dentistry \& Endodontics}, year={2017}, volume={42}, number={2}, pages={152--155}, doi={10.5395/rde.2017.42.2.152}}
@article{mehta1983network, author={Mehta, Cyrus R. and Patel, Nitin R.}, title={{A network algorithm for performing Fisher’s exact test in r × c contingency tables}}, journal={Journal of the American Statistical Association}, year={1983}, volume={78}, number={382}, pages={427--434}, doi={10.1080/01621459.1983.10477989}}
R