domenica 2 agosto 2009

Studio dei fattori di rischio: il chi-quadro di Mantel-Haenszel

Supponiamo di studiare l'incidenza di una malattia (o di qualsiasi altro evento) in presenza di diversi fattori di rischio.
Si creano i tabelle di contingenza 2x2, ciascuna costruita considerando un certo fattore di rischio. Il nostro obiettivo è quello di verificare se la probabilità che si verifichi l'evento in presenza di un certo fattore di rischio, è uguale alla probabilità in presenza di un altro fattore di rischio.

Con il metodo del chi-quadro di Mantel-Haenszel (o di Cochran-Mantel-Haenszel), in pratica si verifica l'ipotesi di uguaglianza degli odds ratio (OR) delle i tabelle di contingenza in esame (ipotesi nulla), contro l'ipotesi alternativa per cui almeno uno degli OR considerati sia statisticamente differente. In altre parole si esegue un test di omogeneità degli OR di i tabelle di 2x2 in cui le ipotesi sono:



Quindi in generale questo test può essere esteso anche per verificare se gli OR ottenuti da vari studi sperimentali siano tra loro simili.

Consideriamo il seguente esempio. Supponiamo di disporre delle seguenti 3 tabelle di contingenza, e di voler confrontare tra loro i rispettivi odd ratio; F1, F2, ed F3 sono i 3 fattori di rischio considerati.



Innanzitutto vediamo come importare i dati in R. Dobbiamo creare un array tridimensionale. Usiamo la funzione array() inserendo i dati, con le seguenti regole: innanzitutto si definisce un vettore contenente tutti i dati contenuti nelle tabelle, scritti seguendo le colonne; poi si definiscono le dimensioni dell'array: in questo caso abbiamo 3 tabelle 2x2, quindi le dimensioni sono dim=c(2,2,3). Se avessimo voluto creare un array con 4 tabelle 3x3, avremmo scritto dim=c(3,3,4). Quindi si assegnano i nomi alle colonne e alle righe; in Outcome.Level si definiscono i 3 fattori di rischio. Ecco come creare l'array con i dati sopra riportati, e l'output:


x <- array(c(15, 9, 3, 9,
33, 29, 15, 19,
79, 47, 33, 49),
dim = c(2, 2, 3),
dimnames = list(
Esposizione = c("Esposto", "Non esposto"),
Diagnosi = c("Effetto", "Non effetto"),
Outcome.Level = c("Fattore 1", "Fattore 2", "Fattore 3")))

> x
, , Outcome.Level = Fattore 1

Diagnosi
Esposizione Effetto Non effetto
Esposto 15 3
Non esposto 9 9

, , Outcome.Level = Fattore 2

Diagnosi
Esposizione Effetto Non effetto
Esposto 33 15
Non esposto 29 19

, , Outcome.Level = Fattore 3

Diagnosi
Esposizione Effetto Non effetto
Esposto 79 33
Non esposto 47 49



A questo punto possiamo fare l'analisi del chi-quadro di Mantel-Haenszel:


> mantelhaen.test(x, correct=F)

Mantel-Haenszel chi-squared test without continuity correction

data: x
Mantel-Haenszel X-squared = 13.0415, df = 1, p-value = 0.0003047
alternative hypothesis: true common odds ratio is not equal to 1
95 percent confidence interval:
1.449289 3.549717
sample estimates:
common odds ratio
2.268164


A seconda del numero di osservazioni, possiamo scegliere se operare con la correzione di Yates (correct=TRUE, se disponiamo di pochi dati), oppure no (correct=FALSE).
In output ci viene dati il valore del chi quadro di Mantel-Haenszel, in questo caso pari a 13.0415, con p-value < 0.05. Questo significa che rifiutiamo l'ipotesi nulla H0: almeno uno dei 3 fattori di rischio ha effetto sulle nostre rilevazioni.
Nonostante in questo caso gli OR non siamo omogenei, la funzione ci offre in output anche l'OR-sintetico (common odds ratio), o OR di Maentel-Haenszel, nonché il suo intervallo di confidenza, calcolato con il metodo di Miettinen.




Vediamo un esempio in cui è utile considerare l'OR sintetico, e il suo intervallo di confidenza. Supponiamo di voler valutare se l'insorgenza di tumore dipenda dall'assunzione di alcool. Si dispone di due tabelle di contingenza: la prima di soggetti fumatori e la seconda di soggetti non fumatori (l'analisi è completamente inventata, così come i valori riportati, e le conclusioni cui giungeremo, certamente errate: serve solo come esercizio numerico e di interpretazione dei dati):



Creiamo l'array bidimensionale, e avviamo il test:


x <- array(c(7,97,4,114,
21,75,15,78),
dim = c(2, 2, 2),
dimnames = list(
Esposizione = c("Alcohol si", "Alcohol no"),
Diagnosi = c("Tumore", "No tumore"),
Outcome.Level = c("Fumatore", "No fumatore")))

> x

, , Outcome.Level = Fumatore

Diagnosi
Esposizione Tumore No tumore
Alcohol si 7 4
Alcohol no 97 114

, , Outcome.Level = No fumatore

Diagnosi
Esposizione Tumore No tumore
Alcohol si 21 15
Alcohol no 75 78


> mantelhaen.test(x, correct=F)

Mantel-Haenszel chi-squared test without continuity correction

data: x
Mantel-Haenszel X-squared = 2.0934, df = 1, p-value = 0.1479
alternative hypothesis: true common odds ratio is not equal to 1
95 percent confidence interval:
0.845557 2.998689
sample estimates:
common odds ratio
1.592345



Il chi quadro di Mantel-Haenszel è pari a 2.0934 con p-value > 0.05. Accettiamo quindi l'ipotesi nulla: l'OR delle due tabelle è statisticamente uguale. Quindi il fattore di rischio "fumo" non ha influenza sull'insorgenza di tumore nei soggetti alcool-dipendenti e non.
Consideriamo l'OR-comune. Esso è pari a 1.592, e il suo intervallo di confidenza è (0.84, 2.99). Poichè nell'intervallo è compreso il valore 1, se ne deduce che l'OR comune non è statisticamente significativo. Questo significa che il fattore alcool non ha influenza sull'insorgenza del tumore (conclusione fittizia e inventata per questo esempio).

Se qualcuno si vuol divertire a calcolare i vari valori analizzati a mano, in questo pdf sono riassunti i metodi e le formule utilizzate nei vari calcoli.

Un altro modo per analizzare la dipendenza di un evento (avere tumore) da una o più variabili indipendenti (fumo e alcol) è la regressione logistica. In questo post vi sono i principi della regressione logistica semplice, mentre in quest'altro post viene realizzato un modello di regressione logistica multipla sugli stessi valori ottenuti analizzati in questo post.

NOTA.
Tecnicamente parlando, la funzione di R mantelhaen.test() calcola l'odd-ratio comune ed effettua il test statistico per verificare se l'OR-pooled è uguale a 1 (quindi non è significativo), oppure è diverso da 1 (è significativo).
Se vogliamo verificare esclusivamente se due variabili sono tra loro indipendenti, ignorando la stratificazione per la terza variabile, dobbiamo usare la funzione cmh.test() disponibile nel pacchetto lawstat.
In questo caso ad esempio, se vogliamo sapere se alcohol e tumore sono tra loro associati, indipendentemente dal fattore fumo, utilizziamo questo comando:


x <- array(c(7,97,4,114,
21,75,15,78),
dim = c(2, 2, 2),
dimnames = list(
Esposizione = c("Alcohol si", "Alcohol no"),
Diagnosi = c("Tumore", "No tumore"),
Outcome.Level = c("Fumatore", "No fumatore")))

library(lawstat)
cmh.test(x)

Cochran-Mantel-Haenszel Chi-square Test

data: x
CMH statistic = 2.093, df = 1.000, p-value = 0.148, MH Estimate = 1.592,
Pooled Odd Ratio = 1.645, Odd Ratio of level 1 = 2.057, Odd Ratio of level 2
= 1.456


Osserviamo che il valore della statistica test di Cochran-Mantel-Haenszel è pari a 2.093, che è lo stesso valore che avevamo ottenuto applicando la funzione mantelhaen.test(), sebbene le due funzioni svolgano cose differenti.
Questo avviene per un semplice motivo: la statistica test per verificare la significatività dell'OR comune è identica alla statistica test per verificare l'associazione di due variabili, ignorando una terza stratificazione. Solo per questo motivo finora ho utilizzato la funzione mantelhaen.test() per eseguire entrambi i test (verifica d'indipendenza e significatività dell'OR comune), ma è più corretto utilizzare le due funzioni separatamente.

Nessun commento:

Posta un commento