Skip to contents

mcnemar_test() tests whether paired proportions have changed between two dichotomous measurements. Use this for before/after comparisons of categorical outcomes.

Think of it as:

  • A paired comparison test for binary (yes/no) data

  • The categorical equivalent of a paired t-test

  • Tests whether the proportion of "changers" is symmetric

The test tells you:

  • Whether paired proportions changed significantly

  • Both asymptotic and exact p-values for maximum reliability

  • The number of discordant pairs (who actually changed)

Usage

mcnemar_test(data, var1, var2, weights = NULL, correct = TRUE, ...)

Arguments

data

Your survey data (data frame or tibble)

var1

First dichotomous variable (0/1 or two-level factor)

var2

Second dichotomous variable (0/1 or two-level factor)

weights

Optional survey weights for population-representative results

correct

Logical, whether to apply continuity correction (default: TRUE)

...

Additional arguments (currently unused)

Value

Test results showing whether paired proportions changed, including:

  • McNemar chi-square statistic (chi_squared, with continuity correction)

  • Asymptotic p-value

  • Exact binomial p-value (two-sided)

  • 2x2 contingency table

  • Discordant pair counts (b and c)

Details

Understanding the Results

P-value: If p < 0.05, the paired proportions are significantly different

  • p < 0.001: Very strong evidence of change

  • p < 0.01: Strong evidence of change

  • p < 0.05: Moderate evidence of change

  • p >= 0.05: No significant change found

Exact vs Asymptotic: The exact binomial p-value is more reliable for small samples. For large samples, both p-values will be very similar.

Discordant Pairs: Only pairs where the two measurements differ (b and c) contribute to the test. If b approximately equals c, there is no evidence of systematic change.

When to Use This

Use McNemar's test when:

  • You have paired or matched binary data

  • You're comparing before/after proportions

  • Both variables must be dichotomous (exactly 2 levels)

The McNemar Statistic

For a 2x2 table with discordant cells b and c: $$\chi^2 = \frac{(|b - c| - 1)^2}{b + c}$$ (with continuity correction)

The exact test uses a binomial test on the discordant pairs.

Relationship to Other Tests

  • For unpaired categorical data: Use chi_square() instead

  • For paired ordinal/continuous data: Use wilcoxon_test() instead

  • For paired data with more than 2 levels: Consider the Bowker test of symmetry

SPSS Equivalent

SPSS: CROSSTABS /STATISTICS=MCNEMAR

References

McNemar, Q. (1947). Note on the sampling error of the difference between correlated proportions or percentages. Psychometrika, 12(2), 153-157.

See also

chi_square for independence tests.

wilcoxon_test for paired non-parametric tests on ordinal data.

Other hypothesis_tests: ancova(), binomial_test(), chi_square(), chisq_gof(), factorial_anova(), fisher_test(), friedman_test(), kruskal_wallis(), mann_whitney(), oneway_anova(), t_test(), wilcoxon_test()

Examples

# Load required packages and data
library(dplyr)
data(survey_data)

# Create dichotomous variables
test_data <- survey_data %>%
  mutate(
    trust_gov_high = as.integer(trust_government >= 4),
    trust_media_high = as.integer(trust_media >= 4)
  )

# McNemar test
test_data %>%
  mcnemar_test(var1 = trust_gov_high, var2 = trust_media_high)
#> McNemar Test: trust_gov_high x trust_media_high
#>   chi2 = 15.116, p < 0.001 (asymp), p < 0.001 (exact) ***, N = 2227
#> Use summary() for detailed output.

# Grouped analysis
test_data %>%
  group_by(region) %>%
  mcnemar_test(var1 = trust_gov_high, var2 = trust_media_high)
#> [region = 1]
#> McNemar Test: trust_gov_high x trust_media_high
#>   chi2 = 8.255, p = 0.004 (asymp), p = 0.004 (exact) **, N = 435
#> [region = 2]
#> McNemar Test: trust_gov_high x trust_media_high
#>   chi2 = 8.242, p = 0.004 (asymp), p = 0.004 (exact) **, N = 1792
#> Use summary() for detailed output.