il test di significatività dei cambiamenti di McNemar


Si tratta di un test  adatto a verificare se vi sia stata una variazione tra le osservazioni di n variabili aleatorie indipendenti nominali (0 - 1). Dunque i possibili valori da testare sono le coppie (0,0), (0,1), (1,0) e (1,1). Ad esempio indichiamo con 0 i Democratici ed 1 i Repubblicani, relativamente ad un campione di n = 100 intervistati circa il loro atteggiamento di voto
prima e dopo un discorso di un candidato:

prima <- c(0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0)

dopo <- c(0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0)


Si costruisce una tavola di contingenza nel modo seguente:



Determiniano le frequenze marginali:

RP <- sum(prima)
RD <- sum(dopo)
DP <- 100 - RP
DD <- 100 - RD


calcoliamo ora d, il numero dei repubblicani che non hanno cambiato idea, (1,1):

d <- sum(prima*dopo)

e per differenza determiniamo le altre celle:

c <- RP - d
b <- RD - d
a <- DP - b


Il test di McNemar prevede la distinzione nel caso di "grandi campioni" o "piccoli campioni", a seconda se b + c sia maggiore oppure minore o uguale a 20.



"grandi" campioni

Nel caso in cui b + c > 20 (nel nostro esempio b + c = 25) il consuntivo T si definisce nel modo seguente:

T <-  ( b - c )^2 / (b + c)

mentre il quantile segue (asintoticamente) la distribuzione del Chi-Quadro a (2-1)(2-1) = 1 gradi di libertà

qchisq(0.95,1)

Nel nostro esempio T = 11.56 >  3.841 = qchisq(0.95,1), quindi rifiutiamo l'ipotesi nulla di non differenza tra il prima e il dopo, ossia affermiamo che vi è differenza significativa.


Possiamo anche utilizzare il comando
mcnemar.test in sostituzione dell'approccio consuntivo-quantile:

DemRep <-  matrix(c(a, c, b, d), nr = 2, dimnames = list("prima" = c("Dem", "Rep"), "dopo" = c("Dem", "Rep")))
DemRep
mcnemar.test(DemRep)


da cui si evince che il p-value è 0.001374



"piccoli campioni"

Nel caso di piccoli campioni, b + c minore o uguale a 20, il consuntivo T si riduca al valore di una cella:

T <-  b

mentre il quantile segue la distribuzione binomiale di dimensione b + c con p = 0.5. Determiniamo la regione di accettazione

inf <- qbinom(0.025, b+c, 0.5)
sup <- qbinom(0.975, b+c, 0.5)

e rifiutiamo l'ipotesi nulla se T = b è minore di inf o maggiore di sup.



Con questo foglio MS Excel è possibile modificare i valori di b e c per provare il test anche su piccoli campioni. Siccome MS Excel non dispone della funzione esplicita per calcolare il quantile della distribuzione binomiale, si deve agire su una barra di scorrimento per determinare il livello alfa di significatività desiderato.

Bibliografia: W. J. Conover, Practical Nonparametric Statistics, John Wiley and Sons, 1999(3).