venerdì 7 dicembre 2018

Test di McNemar

Quando le osservazioni sono organizzate in una tabella di 2 righe · 2 colonne si applica questa regola:
si impiega il test chi-quadrato se le osservazioni sono indipendenti e sono numerose;
si impiega il test di Fisher se le osservazioni  sono indipendenti e sono poche;
si impiega il test di McNemar nel caso di osservazioni non  indipendenti (cioè nel caso dati appaiati). 

Un esempio tipico di applicazione del test di McNemar lo abbiamo in uno studio clinico nel quale lo stesso soggetto viene esposto in tempi diversi a due trattamenti differenti, secondo una sequenza casuale, garantendo che né il paziente né l'operatore sanitario sappiano quale è il trattamento effettuato in quella fase. In questo modo tutti i soggetti, ignorando ogni volta di quale trattamento si tratti, ricevono tutti e due i trattamenti.

Campbell [1] riporta i risultati di uno studio nel quale 250 pazienti sofferenti di artrite erano stati sottoposti ciascuno sia al trattamento con il farmaco A sia al trattamento con il farmaco B. Era stato poi rilevato il grado di soddisfazione dei pazienti rispetto all'uno e all'altro trattamento, con i risultati qui riportati:


In totale 150 soggetti si erano mostrati soddisfatti di entrambi i trattamenti, 50 avevano espresso insoddisfazione per entrambi, mente altri 50 si erano mostrati insoddisfatti chi dell'uno e chi dell'altro.

Questo script prevede di inserire i dati manualmente. Copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# TEST DI MCNEMAR - 2 righe · 2 colonne
#
cells <- c(150, 20, 30, 50) # genera l'array cells con i valori numerici contenuti nelle celle
rnames <- c("Soddisfatto_da_B", "Non_soddisfatto_da_B") # genera l'array rnames con i nomi delle righe
cnames <- c("Soddisfatto_da_A", "Non_soddisfatto_da_A") # genera l'array cnames con i nomi delle colonne
mydata <- matrix(cells, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) # genera la matrice dei dati
mydata # mostra i dati
mcnemar.test(mydata, correct=TRUE) # esegue il test di McNemar
#

Nelle prime tre righe sono generati con la funzione c():
il vettore che contiene i quattro dati (che come si vede devono essere inseriti in sequenza leggendoli da sinistra a destra e dall'alto in basso) che sono salvati nell'oggetto cells;
il vettore che contiene i nomi delle righe, salvato nell'oggetto rnames;
il vettore che contiene i nomi delle colonne, salvato nell'oggetto cnames.

I tre vettori sono combinati a formare la matrice dei dati mediante la funzione matrix() che impiega gli argomenti che indicano:
l'oggetto/vettore contenente i dati (cells);
il numero di righe (nrow) e il numero di colonne (ncol) della matrice;
la modalità di riempimento della matrice, che deve essere riempita per righe (byrow=TRUE) quindi da sinistra a destra e dall'alto in basso;
i nomi da assegnare alle righe e alle colonne (dimnames=list(rnames, cnames)).

La matrice dei dati viene salvata nell'oggetto mydata, che viene mostrato per un ovvio controllo della corretta immissione e strutturazione dei dati.

Infine con la funzione mcnemar.test() [2] viene effettuato il calcolo del test. Da notare che anche nel test di McNemar, che è di fatto una statistica chi-quadrato, viene applicata la correzione di Yates per la continuità [3] ponendo l'argomento correct=TRUE

Questi sono i risultati

> mydata # mostra i dati 
                     Soddisfatto_da_A Non_soddisfatto_da_A
Soddisfatto_da_B                  150                   20
Non_soddisfatto_da_B               30                   50
> matrix <- data.matrix(mydata) # viene generato l'oggetto matrice richiesto dalla fase successiva
> mcnemar.test(matrix, correct=TRUE) # esegue il test di McNemar

        McNemar's Chi-squared test with continuity correction

data:  matrix
McNemar's chi-squared = 1.62, df = 1, p-value = 0.2031

che dimostrano che la differenza tra i gradi di soddisfazione espressi dai pazienti in merito ai due trattamenti non è significativa (p = 0.2031).

In alternativa potete anche copiare le tre righe riportate qui sotto aggiungendo un ↵ Invio al termine dell'ultima riga e salvarle in C:\Rdati\ nel file di testo denominato chi_McNemar.csv (attenzione all'estensione al momento del salvataggio del file).

Esito;Soddisfatto_da_A;Non_soddisfatto_da_A
Soddisfatto_da_B;150;20
Non_Soddisfatto_da_B;30;50

Questo script prevede di eseguire il test di McNemar sui dati letti dal file chi_McNemar.csv. Copiatelo e incollatelo nella Console di R e premete ↵ Invio:

# TEST DI MCNEMAR - 2 righe · 2 colonne
#
mydata <- read.table("C:/Rdati/chi_McNemar.csv", header=TRUE, sep=";", row.names="Esito") # importa i dati
mydata # mostra i dati
matrix <- data.matrix(mydata) # viene generato l'oggetto matrice richiesto dalla fasi successive
mcnemar.test(matrix, correct=TRUE) # esegue il test di McNemar
#

Come vedete lo script è più compatto del precedente, le uniche cose da notare sono gli argomenti della funzione read.table():
"C:/Rdati/chi_McNemar.csv" che specifica nome e posizione del file dal quale importare i dati;
header=TRUE che indica che nella prima riga del file sono contenuti i nomi delle variabili;
sep=";" che specifica il separatore di campo impiegato nel file;
row.names="Esito" che indica che i nomi delle righe sono contenuti nel campo “Esito”.

Anche se ovviamente i risultati sono sempre gli stessi, il senso di queste due alternative è semplice. Se vi va bene intervenire ogni volta sullo script per adattarlo a nuovi dati, potete impiegare la prima. Potete invece impiegare la seconda se volete evitare di mettere mano ogni volta allo script, e preferite intervenire solamente sul file di dati. A voi la scelta, magari dopo averle sperimentate entrambe.

La rappresentazione grafica dei dati può essere effettuata mediante un grafico a barre.



----------

[1] Campbell MJ, Machin D. Medical Statistics. A Commonsense Approach. John Wiley & Sons, New York, 1993, ISBN 0-471-93764-9, pp. 148-150.

[2] Digitate help(mcnemar.test) nella Console di R per la documentazione della funzione mcnemar.test().



Nessun commento:

Posta un commento