sabato 8 dicembre 2018

Test chi-quadrato n righe · n colonne

Il test chi-quadrato può essere nella sua forma più generale esteso a n righe · n colonne. Il problema è che più sono le righe e le colonne e più è difficile individuare il valore (o i valori) che contribuiscono a rendere eventualmente significative le differenze. Per questa ragione in genere le tabelle con più righe e più colonne sono scomposte in tabelle più piccole al fine di valutare meglio i contributi dei valori osservati: per questo tipo di analisi, piuttosto delicata, si rimanda ai testi di statistica.

Qui riporto un esempio di una tabella di 2 righe per 5 colonne tratto da Marubini [1] nella quale si riesce a individuare senza troppe complicazioni il risultato che contribuisce a rendere significativa la differenza tra le frequenze osservate.

Si trattava di valutare l'efficacia di cinque differenti vaccini influenzali. I vaccini vennero inoculati a novembre in 1080 soggetti sani volontari e nel mese di marzo dell'anno successivo vennero contati i casi di influenza tra i vaccinati.

Questi erano stati i risultati della sperimentazione. Da notare che viene riportato il numero dei casi cioè il conteggio dei soggetti affetti da influenza e non affetti da influenza, come richiesto dal test chi-quadrato, nel quale invece non devono mai essere riportati i dati espressi in percentuale:

Esito
Vaccino_1
Vaccino_2
Vaccino_3
Vaccino_4
Vaccino_5
Influenza_si
39
44
20
41
42
Influenza_no
177
166
200
183
168

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

# TEST CHI-QUADRATO - n righe · n colonne
#
cells <- c(39, 44, 20, 41, 42, 177, 166, 200, 183, 168) # genera l'array cells con il numero dei casi
rnames <- c("Influenza_si", "Influenza_no") # genera l'array rnames con i nomi delle righe
cnames <- c("Vaccino_1", "Vaccino_2", "Vaccino_3", "Vaccino_4", "Vaccino_5") # genera l'array cnames con i nomi delle colonne
mydata <- matrix(cells, nrow=2, ncol=5, byrow=TRUE, dimnames=list(rnames, cnames)) # genera la matrice dati
mydata # mostra i dati
chisq.test(mydata) # calcola il chi-quadrato
#

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 viene salvata nell'oggetto mydata, che viene mostrato per un ovvio controllo della corretta immissione e strutturazione dei dati.

Infine con la funzione chisq.test() [2] viene effettuato il calcolo del test.

Questi sono i risultati:

> mydata # mostra i dati
             Vaccino_1 Vaccino_2 Vaccino_3 Vaccino_4 Vaccino_5
Influenza_si        39        44        20        41        42
Influenza_no       177       166       200       183       168
> chisq.test(mydata) # calcola il chi-quadrato

        Pearson's Chi-squared test

data:  mydata
X-squared = 13.678, df = 4, p-value = 0.008395

Il test chi-quadrato riporta un valore elevato della statistica chi-quadrato (13.678) cui corrisponde un valore di probabilità p = 0.008395 che conferma quindi la presenza di una differenza significativa nell'efficacia dei vaccini.

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_rxc.csv (attenzione all'estensione al momento del salvataggio del file).

Esito;Vaccino_1;Vaccino_2;Vaccino_3;Vaccino_4;Vaccino_5
Influenza_si;39;44;20;41;42
Influenza_no;177;166;200;183;168

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

# TEST CHI-QUADRATO - n righe · n colonne
#
mydata <- read.table("C:/Rdati/chi_rxc.csv", header=TRUE, sep=";", row.names="Esito") # importa i dati
mydata # mostra i dati
chisq.test(mydata) # calcola il chi-quadrato
#

Come vedete lo script è più compatto del precedente, le uniche cose da notare sono gli argomenti della funzione read.table():
"C:/Rdati/chi_rxc.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.

Se riprendiamo i casi osservati (Influenza_si / Influenza_no) e li trasformiamo in percentuale

Esito
Vaccino_1
Vaccino_2
Vaccino_3
Vaccino_4
Vaccino_5
Influenza_si
18.1
21.0
9.1
18.3
20.0
Influenza_no
81.9
79.0
90.8
81.7
80.0

vediamo che l'eterogeneità dei risultati evidenziata dal test chi-quadrato è da attribuire al vaccino 3, con il quale si è avuto nei vaccinati un tasso di malattia del 9.1%, a fronte di un tasso di malattia omogeneo e praticamente doppio, che va dal 18.1% al 21.0%, che si è avuto nei soggetti vaccinati con gli altri quattro vaccini.


Un utile complemento all'analisi dei dati può essere realizzato mediante la loro rappresentazione grafica dei dati sotto forma di grafico a barre affiancate e grafico a barre sovrapposte.


----------

[1] Bossi A, Cortinovis I, Duca PG, Marubini E. Introduzione alla statistica medica. La Nuova Italia Scientifica, Roma, 1994, ISBN 88-430-0284-8, pp. 290-291.

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

[3] Digitate help(barplot) nella Console di R per la documentazione della funzione barplot().

Nessun commento:

Posta un commento