Archivio tag: overlapping

Stima della sovrapposizione tra due distribuzioni empiriche con il pacchetto ‘overlapping’

In questo post vogliamo illustrare con alcuni semplici esempi come utilizzare la funzione overlap() del pacchetto overlapping per stimare il grado di sovrapposizione tra due distribuzioni empiriche.

Esempio 1


Supponiamo di avere raccolto dei dati in due gruppi di 100 soggetti ciascuno rispetto ad una generica variabile Y, espressa da punteggi teoricamente compresi tra 0 e 30, e di essere interessati a valutare se i due gruppi possano considerarsi campioni provenienti da popolazioni con la stessa media.

Di seguito si riporta il codice per la costruzione di un data frame che include la variabile Y, che contiene i punteggi, e la variabile group, che definisce a quale dei due gruppi fa riferimento ogni osservazione.

Y <- data.frame(
    Y = c(10,10,13,9,9,11,9,10,10,9,8,10,10,10,7,9,10,9,10,12,8,9,9,11,11,10,10,
        9,10,9,7,9,12,10,11,9,10,9,10,10,9,11,10,11,9,11,11,10,12,11,10,10,11,10,
        9,11,9,9,11,11,11,11,8,10,9,9,9,10,9,10,9,10,9,11,11,8,10,8,9,11,12,9,11,
        9,9,11,11,11,11,10,8,11,10,10,11,9,8,11,10,10,8,6,10,3,9,26,13,5,9,5,9,20,
        10,5,9,16,7,4,17,13,8,9,8,8,8,5,6,13,9,5,15,5,7,8,6,11,13,10,12,5,6,5,10,
        11,16,10,7,7,12,5,12,7,7,8,11,8,17,7,10,9,7,3,11,10,12,15,11,6,5,6,8,12,8,
        5,10,12,12,7,23,8,14,8,10,11,13,6,6,10,9,11,27,9,8,10,6,12,4,6,10,9),
    group = gl(2,100,labels=c("G1","G2"))
)

Nel primo campione i punteggi variano tra 7 e 13, con media 9.88 e dev. st. 1.12, nel secondo campione variano tra 3 e 27, con media 9.5 e dev. st. 4.33. Le medie sono effettivamente molto simili, ma notiamo che la variabilità associata ai due gruppi di punteggi è molto diversa, nel secondo gruppo è circa 4 volte quella del primo.

Rappresentando graficamente le distribuzioni otteniamo la seguente figura:

histogram(~Y|group,data=Y,n=50,type="count",xlab="punteggi",ylab="frequenze",border="#0080ff",xlim=c(-2,32))

Da tale figura abbiamo la conferma diretta della disomogeneità delle varianze nei punteggi dei due gruppi; inoltre, possiamo constatare che nel secondo gruppo la distribuzione dei punteggi è piuttosto asimmetrica con una evidente coda nella parte destra. In un caso di questo tipo, il confronto statistico tra le medie può essere improprio e poco informativo; ad esempio con un t-test, corretto per la non-omogeneità, otteniamo il seguente risultato: t(112.22)=0.85, p=0.397, da cui non possiamo trarre alcuna conclusione.

A questo punto proviamo a cambiare i termini del problema: piuttosto che valutare la somiglianza dei due gruppi sulla base delle sole medie (e deviazioni standard) vogliamo utilizzare tutta l’informazione disponibile nei dati. Si tratta in pratica di stimare quanta parte delle distribuzioni di punteggi nei due gruppi siano sovrapponibili; ci aspettiamo che 0% indichi l’assenza di sovrapposizione e 100% la perfetta sovrapposizione tra le due distribuzioni. Possiamo utilizzare il pacchetto overlapping nel seguente modo:

> library(overlapping)
> dataList <- list(G1=Y1,G2=Y2)
> dataList <- overlap(dataList)$OV

    G1-G2 
0.4732179 

Y1 e Y2 sono i vettori contenenti i punteggi osservati, creiamo una lista (dataList) e la passiamo alla funzione overlap(); il valore che otteniamo in output (0.4732179) è una stima della percentuale di sovrapposizione tra le distribuzioni dei punteggi Y1 e Y2. Se vogliamo avere una rappresentazione grafica delle densità stimate delle due distribuzioni con relativa area di sovrapposizione aggiungiamo l’opzione plot=TRUE:

> overlap(dataList,plot=TRUE)

La linea azzurra è la densità stimata della distribuzione di punteggi del primo gruppo, la linea magenta la densità stimata per il secondo gruppo, l’area in verde indica la porzione di sovrapposizione tra le due densità, pari a circa il 47.32%.

Con la stessa funzione si può ottenere anche un altro tipo di grafico:

> overlap(dataList,partial.plot=TRUE)

Questa seconda rappresentazione, più grezza, disegna con due linee continue (rossa e nera) le densità stimate e con una linea verde (più spessa) la parte di densità che rappresenta la sovrapposizione; le linee verticali tratteggiate rossa e nera sono poste in corrispondenza del valore massimo di densità di ciascuna curva, le linee grigie rappresentano i punti in cui la densità è la stessa per le due curve.

Esempio 2


La funzione overlap() consente di confrontare anche più coppie di distribuzioni, indipendentemente dal numero di osservazioni di ciascuna di esse. Proviamo a generare quattro distribuzioni di dati campionate dalle seguenti densità: normale (rnorm), χ2 (rchisq), esponenziale (rexp) e uniforme (runif):

> n <- 100
> set.seed(20160108)
> Y1 <- rnorm(n,10)
> Y2 <- rchisq(n,10)
> Y3 <- rexp(n,1/10)
> Y4 <- c(runif(n,0,20))
> dataList <- list(Y1,Y2,Y3,Y4)
> overlap(dataList,plot=TRUE)

Dato che ci sono 4 diverse distribuzioni, avremo 6 possibili aree di sovrapposizione, come si vede nella figura seguente:

Ciascun pannello è relativo al confronto tra le densità stimate su una coppia di distribuzioni (Yi vs Yj) rappresentate con le linee continue mentre l’area in verde indica la sovrapposizione, il cui valore stimato è riportato nel pannello stesso.

In sintesi, la funzione overlap() riceve in input una lista composta da k vettori di valori (numerici), stima la densità associata alla distribuzione di valori di ciascun vettore e quindi confronta a coppie tali densità stimando per ciascuna coppia il grado di sovrapposizione. In aggiunta permette di rappresentare graficamente le densità messe a confronto. Un primo obiettivo per le prossime versioni del pacchetto è di aggiungere opzioni che consentano all’utente una maggiore flessibilità per la rappresentazione grafica.