Prace dyplomowe · Testy statystyczne

Test McNemara – pomiar przed i po dla odpowiedzi tak/nie

Krótka odpowiedź z przykładem w R: jak porównać odpowiedzi tak/nie tych samych osób przed i po, którą wersję testu McNemara wybrać i jak policzyć 95% przedział ufności dla różnicy odsetków w parach.

Strona główna / Blog / Test McNemara przed i po
W skrócie: Gdy te same osoby odpowiadają „tak” albo „nie” przed i po (np. przed warsztatem i po nim), użyj testu McNemara: o wyniku decydują tylko osoby, które zmieniły odpowiedź. Wybierz wersję asymptotyczną bez poprawki albo mid-p, zanim zobaczysz wynik, i obok p podaj różnicę odsetków w punktach procentowych z 95% przedziałem ufności dla danych sparowanych, np. metodą Newcombe’a. Zwykły test chi-kwadrat dla dwóch grup jest tu błędem.

Kiedy test McNemara

Test McNemara stosujesz, gdy te same osoby odpowiadają na pytanie z odpowiedzią tak/nie (zmienna dychotomiczna) dwa razy: przed warsztatem i po nim, przed zabiegiem i po nim albo w dwóch warunkach. McNemar (1947) zaproponował go właśnie do różnicy między skorelowanymi, czyli zależnymi, odsetkami. To odpowiednik testu t dla prób zależnych dla odpowiedzi tak/nie.

Dane ułóż w układzie szerokim: jedna osoba to jeden wiersz, a odpowiedź „przed” i „po” to dwie kolumny. Z nich powstaje tabela par 2 × 2. Liczą się w niej tylko pary niezgodne, czyli osoby, które zmieniły odpowiedź: b (tak → nie) i c (nie → tak). Pembury Smith i Ruxton (2020) podkreślają, że o wyniku decydują wyłącznie te dwie komórki. Wzory i wszystkie warianty testu opisuje hasło test McNemara. Tutaj skupiamy się na dwóch praktycznych decyzjach: którą wersję testu wybrać i jak policzyć przedział ufności dla różnicy.

Przykład: warsztat higieny snu

Studentka psychologii pyta 48 uczestników warsztatu higieny snu: „Czy w ostatnim tygodniu miałeś(-aś) problemy z zasypianiem?”. Pyta przed warsztatem i miesiąc po nim (dane symulowane).

Tabela par: odpowiedzi tych samych 48 osób na pytanie o problemy z zasypianiem przed warsztatem i po nim
Przed warsztatemPo: takPo: nieRazem
Taka = 19b = 1130 (62.5%)
Niec = 3d = 1518 (37.5%)
Razem22 (45.8%)26 (54.2%)48

Odsetek osób z problemami z zasypianiem spadł z 62.5% do 45.8%. Problemy ustąpiły u 11 osób, pojawiły się u 3, a 34 osoby odpowiedziały tak samo. Różnica odsetków (po − przed) to (c − b) / N = (3 − 11) / 48 = −16.7 punktu procentowego.

Która wersja testu? Przykład, w którym to ma znaczenie

Ten sam test ma kilka wersji, a przy małej liczbie par niezgodnych (tu 14) dają one różne wnioski:

Wartości p trzech wersji testu McNemara dla 11 i 3 par niezgodnych
Wersja testuWynikOcena w symulacjach
Asymptotyczna bez poprawkiχ²(1) = 4.57, p = .033zalecana; niewielkie przekroczenia α
Mid-pp = .035zalecana; trzyma poziom α
Dokładna (dwumianowa)p = .057zbyt zachowawcza

Fagerland i in. (2013) porównali wersje testu w 9595 scenariuszach. Test mid-p ani razu nie przekroczył nominalnego poziomu istotności i miał moc prawie taką jak wersja asymptotyczna. Test dokładny warunkowy i wersja z poprawką na ciągłość nie sprawdziły się w żadnym scenariuszu. W późniejszym przeglądzie 24 metod dla danych sparowanych ci sami autorzy zaliczają test asymptotyczny i mid-p do najlepszych (Fagerland i in., 2014).

Wersję testu zapisz w planie analizy, zanim zobaczysz wynik. Wybór wersji po fakcie, bo „ta daje p < .05”, to ukryta wielokrotność testowania. Pamiętaj też, że funkcja mcnemar.test() w R domyślnie stosuje poprawkę na ciągłość, więc trzeba ją wyłączyć argumentem correct = FALSE.

Przedział ufności dla różnicy odsetków w parach

Sam test mówi tylko, czy zmiana jest istotna. Ile wynosi, mówi różnica odsetków z 95% przedziałem ufności. Przedziału nie licz jak dla dwóch niezależnych grup z wpisu jak porównać odsetki w dwóch grupach: odpowiedzi tej samej osoby są skorelowane i taki przedział byłby zbyt szeroki. Trzy metody dla danych sparowanych dają w przykładzie:

Różnica odsetków po − przed z 95% przedziałami ufności trzech metod dla danych sparowanych
MetodaJak liczy95% CI dla −16.7 pp
Waldróżnica ± 1.96 × SE[−31.2, −2.1]
Agresti–MinWald po dodaniu 0.5 do każdej komórki tabeli[−30.5, −1.5]
Newcombe (metoda 10)łączy przedziały Wilsona obu odsetków z poprawką na korelację par[−30.0, −2.0]

Newcombe (1998) pokazał, że przedział Walda dla danych sparowanych ma słabe pokrycie i może wychodzić poza dopuszczalny zakres, a prosta metoda oparta na przedziałach Wilsona (jego metoda 10) działa dobrze. Agresti i Min (2005) zaproponowali jeszcze prostszą poprawkę przedziału Walda: przed obliczeniem dodaj dwie obserwacje do każdego pomiaru, czyli po 0.5 do każdej komórki. W przykładzie różnice są niewielkie, ale rosną przy małych próbach i odsetkach bliskich 0% lub 100%. Podawaj więc przedział Newcombe’a albo Agrestiego–Mina i zawsze nazwij metodę. Gotowej funkcji w bazowym R nie ma, dlatego w kodzie poniżej obie metody są zapisane wprost.

Trzy częste błędy

  1. Chi-kwadrat dla „dwóch grup”. Zestawienie 30/48 przed i 22/48 po jak dwóch niezależnych grup daje tabelę z 96 „osobami” i χ²(1) = 2.69, p = .101. To błąd, bo każda osoba występuje dwa razy. Test pomija sparowanie i traci moc, a w przykładzie zmienia wniosek.
  2. Wniosek o skuteczności bez grupy kontrolnej. Spadek mógł wynikać z sesji egzaminacyjnej, pory roku albo z regresji do średniej. Bez grupy kontrolnej opisujesz zmianę, a nie efekt warsztatu (zob. trafność wewnętrzna). Jeśli grupa kontrolna jest, porównaj zmianę między grupami, np. w wielopoziomowej regresji logistycznej z interakcją grupa × czas.
  3. Wiele pomiarów albo wiele pytań. Przy trzech i więcej pomiarach tej samej odpowiedzi użyj testu Q Cochrana. Przy wielu pytaniach ankiety, każdym testowanym testem McNemara, przemyśl poprawkę na wielokrotne porównania. Pełny przykład z testem wiedzy i korektą Holma pokazuje poradnik badanie wiedzy przed i po szkoleniu.

Pozostałe schematy z pomiarem przed i po, także dla wyników ilościowych, zebraliśmy w przewodniku badania kliniczne i pomiar przed i po.

Jak to opisać w pracy

Podaj odsetki w obu pomiarach, liczby zmian w każdą stronę, wersję testu, wynik oraz różnicę z przedziałem i metodą:

Odsetek uczestników zgłaszających problemy z zasypianiem spadł z 62.5% przed warsztatem do 45.8% miesiąc po nim (N = 48). Problemy ustąpiły u 11 osób, a pojawiły się u 3. Test McNemara (wersja asymptotyczna bez poprawki na ciągłość) wykazał, że zmiana była istotna statystycznie, χ²(1, N = 48) = 4.57, p = .033 (mid-p = .035). Różnica odsetków wyniosła −16.7 punktu procentowego, 95% CI [−30.0, −2.0] (metoda Newcombe’a dla danych sparowanych). Ze względu na brak grupy kontrolnej wyniku nie można przypisać wyłącznie udziałowi w warsztacie.
Przykład reprodukowalny

Test McNemara i przedział dla różnicy w R

Kod odtwarza wszystkie liczby z tekstu: tabelę par, odsetki przed i po, trzy wersje testu McNemara (asymptotyczną bez poprawki, dokładną i mid-p), różnicę odsetków z 95% przedziałami Walda, Agrestiego–Mina i Newcombe’a oraz błędny test chi-kwadrat, który traktuje pomiary jak dwie niezależne grupy.

Tabela par, wersje testu i 95% CI dla sparowanej różnicy odsetków

Dane wejściowe: 48 uczestników warsztatu higieny snu, problemy z zasypianiem (tak/nie) przed warsztatem i miesiąc po nim, układ szeroki: kolumny przed i po (dane symulowane, set.seed(1961)).

Co odczytać: komórki b (tak → nie) i c (nie → tak), odsetki „tak” w obu pomiarach, χ² i p wersji asymptotycznej, p wersji dokładnej i mid-p, różnicę w punktach procentowych z trzema przedziałami oraz – dla porównania – wynik błędnego testu dla dwóch grup.

R
# B194 – test McNemara i 95% CI dla różnicy odsetków w pomiarze przed i po
# Dane symulowane: 48 osób przed warsztatem higieny snu i miesiąc po nim odpowiada
# na pytanie „Czy w ostatnim tygodniu miałeś(-aś) problemy z zasypianiem?” (tak/nie).
# Dane w układzie szerokim: jedna osoba = jeden wiersz, dwie kolumny (przed, po).
set.seed(1961)
przed <- rbinom(48, 1, .55)
po <- ifelse(przed == 1, rbinom(48, 1, .65), rbinom(48, 1, .10))
dane <- data.frame(przed = factor(przed, levels = c(1, 0), labels = c("tak", "nie")),
                   po    = factor(po,    levels = c(1, 0), labels = c("tak", "nie")))

# 1. Tabela par i odsetki „tak” w obu pomiarach
tab <- table(przed = dane$przed, po = dane$po)
tab
n <- sum(tab); a <- tab["tak", "tak"]; b <- tab["tak", "nie"]
c <- tab["nie", "tak"]; d <- tab["nie", "nie"]
round(100 * c(przed = (a + b) / n, po = (a + c) / n), 1)

# 2. Test McNemara: asymptotyczny bez poprawki, dokładny i mid-p
mcnemar.test(tab, correct = FALSE)
p_dokladny <- binom.test(b, b + c, p = .5)$p.value
p_midp <- min(1, p_dokladny - dbinom(min(b, c), b + c, .5))
round(c(dokladny = p_dokladny, mid_p = p_midp), 3)

# 3. Różnica odsetków (po − przed) z 95% CI trzema metodami
z <- qnorm(.975)
roznica <- (c - b) / n
wald <- function(a, b, c, d) {
  n <- a + b + c + d; r <- (c - b) / n
  se <- sqrt((b + c) - (c - b)^2 / n) / n
  c(r - z * se, r + z * se)
}
wilson <- function(x, n) {
  p <- x / n
  srodek <- (p + z^2 / (2 * n)) / (1 + z^2 / n)
  pol <- z * sqrt(p * (1 - p) / n + z^2 / (4 * n^2)) / (1 + z^2 / n)
  c(srodek - pol, srodek + pol)
}
newcombe <- function(a, b, c, d) {          # metoda 10 Newcombe'a (1998)
  n <- a + b + c + d
  p1 <- (a + c) / n; p2 <- (a + b) / n      # p1 = po, p2 = przed
  w1 <- wilson(a + c, n); w2 <- wilson(a + b, n)
  mian <- sqrt((a + b) * (c + d) * (a + c) * (b + d))
  phi <- if (mian == 0) 0 else (a * d - b * c) / mian
  r <- p1 - p2
  c(r - sqrt((p1 - w1[1])^2 - 2 * phi * (p1 - w1[1]) * (w2[2] - p2) + (w2[2] - p2)^2),
    r + sqrt((w1[2] - p1)^2 - 2 * phi * (w1[2] - p1) * (p2 - w2[1]) + (p2 - w2[1])^2))
}
przedzialy <- rbind(
  Wald            = wald(a, b, c, d),
  `Agresti–Min`   = wald(a + .5, b + .5, c + .5, d + .5),   # +0.5 w każdej komórce
  `Newcombe (10)` = newcombe(a, b, c, d))
colnames(przedzialy) <- c("dolna", "gorna")
round(100 * roznica, 1)
round(100 * przedzialy, 1)

# 4. Błąd: te same dane potraktowane jak dwie niezależne grupy (96 „osób”)
blad <- rbind(przed = table(dane$przed), po = table(dane$po))
blad
chisq.test(blad, correct = FALSE)
Wynik w R
     po
przed tak nie
  tak  19  11
  nie   3  15
przed    po 
 62.5  45.8 

	McNemar's Chi-squared test

data:  tab
McNemar's chi-squared = 4.5714, df = 1, p-value = 0.03251

dokladny    mid_p 
   0.057    0.035 
[1] -16.7
              dolna gorna
Wald          -31.2  -2.1
Agresti–Min   -30.5  -1.5
Newcombe (10) -30.0  -2.0
      tak nie
przed  30  18
po     22  26

	Pearson's Chi-squared test

data:  blad
X-squared = 2.6853, df = 1, p-value = 0.1013

Bibliografia oprogramowania

Wyniki na tej stronie pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (funkcje mcnemar.test(), binom.test() i chisq.test() z pakietu stats; przedziały Agrestiego–Mina i Newcombe’a zapisano wprost według wzorów). W pracy podaj wersję R (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/

Najczęstsze pytania

Jak policzyć przedział ufności dla różnicy odsetków przed i po?

Różnica to (c − b) / N, gdzie b i c to liczby osób, które zmieniły odpowiedź w każdą stronę. Przedział licz metodą dla danych sparowanych: metodą 10 Newcombe’a albo przedziałem Walda po dodaniu 0.5 do każdej komórki tabeli par (Agresti–Min). Przedział dla dwóch niezależnych grup jest tu niewłaściwy, bo pomija sparowanie.

Czy wynik testu McNemara może być istotny w jednej wersji, a nieistotny w innej?

Tak, gdy osób, które zmieniły odpowiedź, jest niewiele. W przykładzie z 14 takimi osobami wersja asymptotyczna dała p = .033, mid-p – p = .035, a test dokładny – p = .057. Dlatego wersję testu ustal w planie analizy i nie zmieniaj jej po zobaczeniu wyniku.

Jak ułożyć dane do testu McNemara?

W układzie szerokim: jedna osoba to jeden wiersz, a odpowiedź przed i po to dwie kolumny z tymi samymi kodami (np. tak/nie). Z tych dwóch kolumn program tworzy tabelę par 2 × 2. Nie układaj danych jak dwóch grup jedna pod drugą, bo zgubisz informację, kto jest kim.

Czy test McNemara wystarczy, gdy w badaniu jest grupa kontrolna?

Nie. Test McNemara w każdej grupie osobno nie odpowiada na pytanie, czy zmiana w grupie eksperymentalnej była większa niż w kontrolnej. Porównaj zmianę między grupami, np. w regresji logistycznej dla pomiarów powtarzanych z interakcją grupa × czas.

Powiązane hasła

Przeczytaj też

Masz odpowiedzi tak/nie przed i po?

Sprawdzimy, czy test McNemara pasuje do Twojego schematu badania, policzymy różnicę z przedziałem ufności i pomożemy opisać wynik w rozdziale wyników.

Oferta dla studentówWyceń analizę

Bibliografia i dalsza literatura naukowa (APA 7)

  1. Agresti, A., & Min, Y. (2005). Simple improved confidence intervals for comparing matched proportions. Statistics in Medicine, 24(5), 729–740. https://doi.org/10.1002/sim.1781
  2. Fagerland, M. W., Lydersen, S., & Laake, P. (2013). The McNemar test for binary matched-pairs data: Mid-p and asymptotic are better than exact conditional. BMC Medical Research Methodology, 13(1), Article 91. https://doi.org/10.1186/1471-2288-13-91 ● Otwarty dostęp
  3. Fagerland, M. W., Lydersen, S., & Laake, P. (2014). Recommended tests and confidence intervals for paired binomial proportions. Statistics in Medicine, 33(16), 2850–2875. https://doi.org/10.1002/sim.6148
  4. McNemar, Q. (1947). Note on the sampling error of the difference between correlated proportions or percentages. Psychometrika, 12(2), 153–157. https://doi.org/10.1007/BF02295996
  5. Newcombe, R. G. (1998). Improved confidence intervals for the difference between binomial proportions based on paired data. Statistics in Medicine, 17(22), 2635–2650. https://doi.org/10.1002/(sici)1097-0258(19981130)17:22<2635::aid-sim954>3.0.co;2-c
  6. Pembury Smith, M. Q. R., & Ruxton, G. D. (2020). Effective use of the McNemar test. Behavioral Ecology and Sociobiology, 74(11), Article 133. https://doi.org/10.1007/s00265-020-02916-y ● Otwarty dostęp

Cytowania BibTeX

@article{agresti2005simple, author={Agresti, Alan and Min, Yongyi}, title={{Simple improved confidence intervals for comparing matched proportions}}, journal={Statistics in Medicine}, year={2005}, volume={24}, number={5}, pages={729--740}, doi={10.1002/sim.1781}}
@article{fagerland2013mcnemar, author={Fagerland, Morten W. and Lydersen, Stian and Laake, Petter}, title={{The McNemar test for binary matched-pairs data: Mid-p and asymptotic are better than exact conditional}}, journal={BMC Medical Research Methodology}, year={2013}, volume={13}, number={1}, eid={91}, doi={10.1186/1471-2288-13-91}}
@article{fagerland2014recommended, author={Fagerland, Morten W. and Lydersen, Stian and Laake, Petter}, title={{Recommended tests and confidence intervals for paired binomial proportions}}, journal={Statistics in Medicine}, year={2014}, volume={33}, number={16}, pages={2850--2875}, doi={10.1002/sim.6148}}
@article{mcnemar1947note, author={McNemar, Quinn}, title={{Note on the sampling error of the difference between correlated proportions or percentages}}, journal={Psychometrika}, year={1947}, volume={12}, number={2}, pages={153--157}, doi={10.1007/bf02295996}}
@article{newcombe1998improved, author={Newcombe, Robert G.}, title={{Improved confidence intervals for the difference between binomial proportions based on paired data}}, journal={Statistics in Medicine}, year={1998}, volume={17}, number={22}, pages={2635--2650}, doi={10.1002/(sici)1097-0258(19981130)17:22<2635::aid-sim954>3.0.co;2-c}}
@article{pemburysmith2020effective, author={Pembury Smith, Matilda Q. R. and Ruxton, Graeme D.}, title={{Effective use of the McNemar test}}, journal={Behavioral Ecology and Sociobiology}, year={2020}, volume={74}, number={11}, eid={133}, doi={10.1007/s00265-020-02916-y}}
R