sabato 22 agosto 2009

Calcolo della tabella ANOVA partendo da dati aggregati

Può capitare di dover eseguire un test per verificare l'uguaglianze delle medie tra più gruppi, di cui però non disponiamo dei dati grezzi (il valore di ogni singolo dato), ma solamente della media, della deviazione standard e della numerosità campionaria di ciascun gruppo. Questo capita frequentemente nel momento in cui vogliamo fare ulteriori analisi sui dati pubblicati in articoli scientifici, che ci forniscono i dati descrittivi dei gruppi, e non i gruppi in sè.
Si possono ricavare facilmente le formule per ottenere la tabella ANOVA partendo dai dati descrittivi (in questo pdf sono presenti le formule per eseguire la one-way ANOVA, e le ANOVA bi- e tridimensionale partendo dai dati descrittivi). Supponiamo di avere i seguenti 4 gruppi:


a <- c(7.4, 6.6, 6.7, 6.1, 6.5, 7.2)
b <- c(7.1, 7.3, 6.8, 6.9, 7)
c <- c(6.8, 6.3, 6.4, 6.7, 6.5, 6.8)
d <- c(6.4, 6.9, 7.6, 6.8, 7.3)


Da questi dati calcoliamo: numerosità campionaria, media e deviazione standard, e raccogliamo tutti i dati in una tabella di riepilogo:


> mean(a)
[1] 6.75
> mean(b)
[1] 7.02
> mean(c)
[1] 6.583333
> mean(d)
[1] 7
>
> length(a)
[1] 6
> length(b)
[1] 5
> length(c)
[1] 6
> length(d)
[1] 5
>
> sd(a)
[1] 0.4764452
> sd(b)
[1] 0.1923538
> sd(c)
[1] 0.2136976
> sd(d)
[1] 0.4636809




Adesso dimentichiamo i dati campionari, e facciamo una ANOVA parametrica sui dati di quest'ultima tabella. Le formule sono:



La GrandMean è la media di tutti i gruppi; la SSB è la devianza tra gruppi, e la SSE è la devianza entro gruppi (o d'errore). Le altre formule sono quelle consuete, che già conoscevamo:



I df sono i gradi di liberta; MSB e MSE sono la varianza tra gruppi e d'errore; F è il valore della statistica test.

Traduciamo questi calcoli in R, e procediamo:


nA <- 6; nB <- 5; nC <- 6; nD <- 5
meanA <- 6.75; meanB <- 7.02; meanC <- 6.58; meanD <- 7
sdA <- .476; sdB <- .192; sdC <- .214; sdD <- .464

GrandMean <- (meanA * nA + meanB * nB + meanC * nC + meanD * nD) / (nA + nB + nC + nD)
> GrandMean
[1] 6.821818

SSB <- (((meanA - GrandMean)^2)*nA) + (((meanB - GrandMean)^2)*nB) + (((meanC - GrandMean)^2)*nC) + (((meanD - GrandMean)^2)*nD)
> SSB
[1] 0.7369273

SSE <- (sdA^2 * (nA-1)) + (sdB^2 * (nB-1)) + (sdC^2 * (nC-1)) + (sdD^2 * (nD-1))
> SSE
[1] 2.3705

dfSSB <- 4 - 1
dfSSE <- (nA+nB+nC+nD) - 4

MSB <- SSB / dfSSB
> MSB
[1] 0.2456424

MSE <- SSE / dfSSE
> MSE
[1] 0.1316944

F <- MSB / MSE
> F
[1] 1.865245


Possiamo calcolare il p-value di una distribuzione F, per prendere la nostra decisione statistica, in questo modo:


p.value <- 1 - pf(F, dfSSB, dfSSE)
> p.value
[1] 0.1716690


Raccogliamo tutti i dati nella classica tabella ANOVA:



Essendo p-value > 0.05, accettiamo l'ipotesi nulla: i 4 gruppi hanno medie uguali.

Adesso vediamo i valori che avremmo ottenuto, se avessimo utilizzato i dati campionari:


a <- c(7.4, 6.6, 6.7, 6.1, 6.5, 7.2)
b <- c(7.1, 7.3, 6.8, 6.9, 7)
c <- c(6.8, 6.3, 6.4, 6.7, 6.5, 6.8)
d <- c(6.4, 6.9, 7.6, 6.8, 7.3)

dati <- c(a,b,c,d)
gruppi = factor(rep(letters[1:4], times=c(length(a),length(b),length(c),length(d))))

anova(lm(dati ~ gruppi))

Analysis of Variance Table

Response: dati
Df Sum Sq Mean Sq F value Pr(>F)
gruppi 3 0.72730 0.24243 1.8402 0.1760
Residuals 18 2.37133 0.13174


Potete confrontare i valori contenuti nella tabella, dopo averla resa leggibile in Latex, con la funzione xtable, disponibile nel pacchetto xtable (converte le tabelle di R in codice LaTeX):

Confrontando i valori, essi risultano molto simili, approssimazioni a parte.

1 commento: