library(rstatix)
data("antismoking", package = "datarium")
xtab <- xtabs(~ before + after, data = antismoking)
xtab after
before non.smoker smoker
non.smoker 25 6
smoker 21 10
Testez si une proportion a changé entre deux mesures appariées — le test catégoriel apparié pour les plans avant/après, avec la version exacte pour les petits échantillons
Apprenez à réaliser le test de McNemar en R — le test pour comparer des proportions appariées, l’équivalent catégoriel du t-test apparié pour un plan avant/après ou apparié. Construisez le tableau apparié 2×2 avec R de base, lancez rstatix mcnemar_test(), et utilisez la version binomiale exacte lorsque les effectifs discordants sont petits.
23 juin 2026
7 juillet 2026
rstatix::mcnemar_test() sur le tableau apparié 2×2.binom_test() sur les effectifs discordants).Le test de McNemar compare deux proportions appariées — les mêmes sujets mesurés deux fois, dans un plan avant/après ou une étude appariée. C’est l’analogue catégoriel du t-test apparié : au lieu de deux groupes indépendants (qui appelleraient un test du khi-deux), les deux mesures proviennent des mêmes personnes.
L’astuce : seuls les sujets qui ont changé (les paires discordantes — oui→non et non→oui) vous indiquent si la proportion a évolué. Le scénario ici : une intervention anti-tabac a-t-elle modifié la proportion de fumeurs, mesurée avant et après ? Cette leçon la réalise avec rstatix sur les données antismoking.
Hypothèses du test de McNemar. En notant B et C les cellules hors diagonale du tableau apparié 2×2 (les deux types de changement), H₀ : B = C (autant de sujets ont changé dans chaque sens → aucun changement net). Hₐ : B ≠ C (la proportion a changé).
Nous utilisons le jeu de données antismoking de datarium — 62 personnes dont le statut tabagique a été enregistré avant et après une intervention. Croisez-les dans le tableau apparié 2×2 avec R de base :
after
before non.smoker smoker
non.smoker 25 6
smoker 21 10
La diagonale (25 sont restés non-fumeurs, 10 sont restés fumeurs) correspond aux paires concordantes — aucun changement. Les cellules hors diagonale sont les paires discordantes : 6 sont passés de non-fumeur → fumeur, et 21 de fumeur → non-fumeur. Le test de McNemar demande si ces deux nombres (6 contre 21) diffèrent.
# A tibble: 1 × 6
n statistic df p p.signif method
* <int> <dbl> <dbl> <dbl> <chr> <chr>
1 62 7.26 1 0.00705 ** McNemar test
Il y a eu un changement significatif du statut tabagique, χ²(1) = 7.26, p = 0.007 — bien plus de personnes ont arrêté (21) qu’il n’y en a commencé (6), donc la proportion de non-fumeurs a augmenté après l’intervention.
Le khi-deux de McNemar est une approximation pour grand échantillon. Lorsque le nombre total de paires discordantes (B + C) est petit (≲ 20), utilisez le test binomial exact — sous H₀, chaque paire discordante a la même probabilité de basculer dans un sens ou dans l’autre, donc l’effectif est testé contre p = 0.5 :
# A tibble: 1 × 6
n estimate conf.low conf.high p p.signif
* <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 27 0.222 0.0862 0.423 0.00592 **
Le test exact concorde (p = 0.006). Ici B + C = 27 donc le khi-deux convient, mais pour moins de paires discordantes la version exacte est le choix sûr.
library(rstatix)
library(ggpubr)
data("antismoking", package = "datarium")
n <- nrow(antismoking)
long <- data.frame(
time = factor(rep(c("before", "after"), each = n), levels = c("before", "after")),
status = c(as.character(antismoking$before), as.character(antismoking$after))
)
stat.test <- mcnemar_test(xtabs(~ before + after, data = antismoking))
ggbarplot(as.data.frame(table(long)), x = "time", y = "Freq", fill = "status",
palette = "jco", ylab = "Count", xlab = NULL) +
labs(subtitle = get_test_label(stat.test, detailed = TRUE))
Un test de McNemar a montré un changement statistiquement significatif du statut tabagique avant vs après l’intervention, χ²(1) = 7.26, p = 0.007 : parmi les participants qui ont changé, 21 ont arrêté de fumer tandis que seulement 6 ont commencé.
La statistique de McNemar n’utilise que les effectifs discordants B et C : \(\chi^2 = \dfrac{(B - C)^2}{B + C}\) (avec une correction de continuité, \(\dfrac{(|B - C| - 1)^2}{B + C}\)), comparée à une distribution du khi-deux à 1 degré de liberté. Les cellules concordantes (A et D) s’annulent car elles ne portent aucune information sur le changement. Sous H₀, les \(B + C\) sujets qui changent se répartissent à 50/50, ce qui correspond exactement à la formulation binomiale exacte.
Réalisez le test de McNemar sur votre propre tableau apparié 2×2 — par exemple l’approbation avant vs après une campagne. Modifiez les effectifs et relancez ; le bac à sable démarre au premier Run.
Demandez à Prova « J’ai mesuré les mêmes sujets avant et après — teste si la proportion a changé avec le test de McNemar » — elle répond avec du code rstatix que vous pouvez exécuter sur votre propre tableau apparié. The runtime is the judge. Demander à Prova →
Vous avez utilisé un test du khi-deux sur des données appariées. Le test du khi-deux ordinaire suppose que les deux groupes sont indépendants. Pour les mêmes sujets mesurés deux fois (avant/après, appariés), utilisez le test de McNemar — il tient compte de l’appariement en ne regardant que ceux qui ont changé.
Vous avez regardé la diagonale. McNemar ignore les paires concordantes (aucun changement) — seuls les effectifs discordants hors diagonale comptent. Un tableau avec d’énormes diagonales mais B ≈ C ne montre aucun changement significatif.
Peu de paires discordantes. Lorsque B + C est petit (≲ 20), l’approximation du khi-deux est fragile — rapportez plutôt le résultat binomial exact.
Le test de McNemar compare deux proportions appariées — les mêmes sujets mesurés deux fois (avant/après) ou des paires appariées, sur un résultat oui/non. Il teste si la proportion a changé entre les deux mesures, ce qui en fait l’équivalent catégoriel du t-test apparié.
Le test du khi-deux d’indépendance compare deux groupes indépendants ; le test de McNemar compare les mêmes sujets mesurés deux fois (données appariées). McNemar n’utilise que les paires discordantes (ayant changé), ce qui est la façon dont il tient compte de l’appariement — utiliser un test du khi-deux sur des données appariées serait incorrect.
Lorsque le nombre total de paires discordantes (B + C) est petit — environ 20 ou moins. La version du khi-deux est une approximation pour grand échantillon ; en dessous, le test binomial exact (chaque paire discordante testée contre p = 0.5) donne la p-value correcte.
Remplissez le blanc avec mcnemar_test. Pour la question 2, rappelez-vous que McNemar ignore la diagonale et dépend de l’écart entre B et C.
Pour la question 2 : non — McNemar n’utilise que les paires discordantes, et B = 8 contre C = 9 sont presque égaux, donc il n’y a aucune preuve de changement net malgré la grande diagonale concordante. Les 200 sujets inchangés sont sans rapport avec le test.
Vous pouvez désormais réaliser le test de McNemar en R : croisez les données appariées avant/après dans un tableau 2×2, lancez mcnemar_test(), et lisez les effectifs discordants — il teste si la proportion a changé entre deux mesures appariées. Utilisez la version binomiale exacte lorsque le nombre de sujets ayant changé est petit, et passez à Q de Cochran pour trois mesures répétées ou plus.
Prouvez que vous savez le faire. Maîtrisez toute la série Analyse catégorielle en R — suivez votre parcours, construisez des projets et obtenez un certificat.
Passez à Pro — Prova illimité sur vos propres données et un certificat vérifiable qui atteste la compétence.
dès 15 $/mois facturé annuellement
✓ Vous êtes Pro — continuez. The runtime is the judge.
Prêt à passer à la vitesse supérieure ?
Recevez les nouvelles leçons R & Python par e-mail
Pratique, reproductible, sans spam. Désinscription à tout moment.
Double opt-in. Nous ne partageons jamais votre e-mail.
Chaque résultat de cette page a été produit par le code montré, exécuté au moment du build contre un environnement R figé — modifiez n’importe quel bloc et faites Run pour le reproduire vous-même.
@online{2026,
author = {},
title = {Test de McNemar en R : comparer des proportions appariées
(avant/après)},
date = {2026-06-23},
url = {https://www.datanovia.com/learn/biostatistics/categorical/mcnemar-test-in-r},
langid = {fr}
}