Test esatto di Fisher


Articoli di approfondimento

Test esatto di Fisher

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?”

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