Il test esatto di Fisher è un test per la verifica d’ipotesi utilizzato nell’ambito della statistica non parametrica in situazioni con due variabili nominali dicotomiche e campioni piccoli, porta il nome del suo ideatore Ronald Fisher.
Questo test non parametrico è usato per verificare se i dati dicotomici di due campioni riassunti in una tabella di contingenza 2X2 siano compatibili con l’ipotesi nulla (\(H_0\)) che le popolazioni di origine dei due campioni abbiano la stessa suddivisione dicotomica e che le differenze osservate con i dati campionari siano dovute semplicemente al caso.
Se i campioni sono sufficientemente grandi (ma nessuna cella ha un valore inferiore a 5) allora si può usare il test chi quadrato con 1 grado di libertà. Mentre quest’ultimo test è esatto solo asintoticamente per dimensioni molto grandi dei campioni, il presente test proposto da Fisher è, come dice il nome, sempre esatto, quindi va bene per camiponi di piccole dimensioni.
Il test esatto di Fisher richiede di avere due variabili nominali divise ciascuna in due sole categorie.
(Fonte)
In base a quanto detto sopra guardiamo un esempio e partiamo ponendoci una domanda: “Le jelly beans (delle caramelle americane) causano l’acne?”
Gli scienziati hanno analizzato selezionando casualmente \(n = 10000\) soggetti
Ai soggetti è stata data in modo casuale delle jelly beans ( \(n_1=5000\) ) oppure delle caramelle placebo (che non hanno nessuna proprietà) ( \(n_0=5000\) )
alla fine del mese n cui i soggetti dovevano testarla è stato assegnato 1 se c’era presenza di acne nel soggetto mentre 0 se non c’era
Simuliamo in modo verosimile i dati per l’esperimento (non sono dati reali)
jellybeans<-read.csv("https://giacomosaccaggi.github.io/jellybeans.csv")
n0 = sum(jellybeans$treatment=="jellybean")
n1 = sum(jellybeans$treatment=="placebo")
y = sum(jellybeans$acne[jellybeans$treatment=="jellybean"])
s = sum(jellybeans$acne)
tab = matrix(c(
y, n0-y,
s-y, n1-s+y
), ncol=2, byrow=TRUE)
colnames(tab) = c("acne","noacne")
rownames(tab) = c("jellybean","placebo")
addmargins(tab)
## acne noacne Sum
## jellybean 988 4012 5000
## placebo 961 4039 5000
## Sum 1949 8051 10000
… adesso andiamo a valutare se le due v.c. hanno la stessa suddivisione dicotomica, ossia se i soggetti che hanno l’acne sono gli stessi che mangiano le caramelle jelly beans
Acne | no acne | Sum | |
---|---|---|---|
Jelly beans | \(Y\) | \(N_{1} - Y\) | \(N_{1}\) |
Placebo | \(S-Y\) | \(N_{0} - S + Y\) | \(N_{0}\) |
Sum | \(S\) | \(N_{1} + N_{0}-S\) | \(N_{1} + N_{0}\) |
\[ = \frac{{N_{1}}! {N_{0}}! {S}! ({N_{1}}+ {N_{0}}- {S}!)} { Y!(S-Y)!({N_{1}}-Y)!({N_{0}}-S+Y)! }\]
plot(0:s,dhyper(0:s, m=n1, n=n0, k=s), type="h", xlab="y", ylab="Probability")
points(y,0,col=2,pch=19)
fisher.test(tab, alternative="greater")$p.value
## [1] 0.2557994
Questo risultato esprime la probabilità che le due popolazioni non abbiano la stessa suddivisione dicotomica infatti se faccio lo stesso test sull’acne soltanto (non ha senso ma è solo per capire) ottengo:
fisher.test(table(jellybeans$acne,jellybeans$acne), alternative="greater")$p.value
## [1] 0
Approfondimento: Correlazione tetracorica
Nel caso di variabili ordinali a due categorie (come in questo caso), spesso viene utilizzato il coefficiente di correlazione tetracorica. Tale coefficiente stima la correlazione tra le due variabili assumendo che la loro natura dicotomica derivi dalla discretizzazione di un processo in realtà continuo. Ciò significa che il fenomeno sottoposto a misurazione sarebbe per sua natura misurato come una variabile continua, ma per esigenze di misurazione questa è stata ridotta a soli due valori, cioè dicotomizzata. (Fonte1;Fonte2)
library(psych)
tr<-ifelse(jellybeans$treatment=="jellybean",1,0)
tetrachoric(data.frame(jellybeans$acne,tr))
## Call: tetrachoric(x = data.frame(jellybeans$acne, tr))
## tetrachoric correlation
## jlly. tr
## jellybeans.acne 1.00
## tr 0.01 1.00
##
## with tau of
## jellybeans.acne tr
## 0.86 0.00