Sono generalmente d'accordo con l'analisi di Ben, ma lasciatemi aggiungere un paio di osservazioni e un po 'di intuizione.
Innanzitutto, i risultati complessivi:
- I risultati dei test con il metodo Satterthwaite sono corretti
- Anche il metodo Kenward-Roger è corretto e concorda con Satterthwaite
Ben delinea il progetto in cui subnum
è nidificato nel group
mentre direction
e group:direction
sono incrociata con subnum
. Ciò significa che il termine di errore naturale (vale a dire il cosiddetto "strato di errore racchiuso") group
è subnum
mentre mentre lo strato di errore racchiuso negli altri termini (incluso subnum
) sono i residui.
Questa struttura può essere rappresentata in un cosiddetto diagramma fattoriale:
names <- c(expression("[I]"[5169]^{5191}),
expression("[subnum]"[18]^{20}), expression(grp:dir[1]^{4}),
expression(dir[1]^{2}), expression(grp[1]^{2}), expression(0[1]^{1}))
x <- c(2, 4, 4, 6, 6, 8)
y <- c(5, 7, 5, 3, 7, 5)
plot(NA, NA, xlim=c(2, 8), ylim=c(2, 8), type="n", axes=F, xlab="", ylab="")
text(x, y, names) # Add text according to ’names’ vector
# Define coordinates for start (x0, y0) and end (x1, y1) of arrows:
x0 <- c(1.8, 1.8, 4.2, 4.2, 4.2, 6, 6) + .5
y0 <- c(5, 5, 7, 5, 5, 3, 7)
x1 <- c(2.7, 2.7, 5, 5, 5, 7.2, 7.2) + .5
y1 <- c(5, 7, 7, 3, 7, 5, 5)
arrows(x0, y0, x1, y1, length=0.1)
Qui i termini casuali sono racchiusi tra parentesi, 0
rappresenta la media generale (o intercetta), [I]
rappresenta il termine di errore, i numeri del super-script sono il numero di livelli e i numeri del sub-script sono il numero di gradi di libertà che assumono un disegno equilibrato. Il diagramma indica che il termine di errore naturale (che racchiude lo strato di errore) per group
è subnum
e che il numeratore df per subnum
, che equivale al denominatore df per group
, è 18: 20 meno 1 df per group
e 1 df per la media complessiva. Un'introduzione più completa ai diagrammi della struttura dei fattori è disponibile nel capitolo 2 qui: https://02429.compute.dtu.dk/eBook .
Se i dati fossero esattamente bilanciati saremmo in grado di costruire i test F da una decomposizione SSQ come fornito da anova.lm
. Poiché il set di dati è molto bilanciato, possiamo ottenere test F approssimativi come segue:
ANT.2 <- subset(ANT, !error)
set.seed(101)
baseline.shift <- rnorm(length(unique(ANT.2$subnum)), 0, 50)
ANT.2$rt <- ANT.2$rt + baseline.shift[as.numeric(ANT.2$subnum)]
fm <- lm(rt ~ group * direction + subnum, data=ANT.2)
(an <- anova(fm))
Analysis of Variance Table
Response: rt
Df Sum Sq Mean Sq F value Pr(>F)
group 1 994365 994365 200.5461 <2e-16 ***
direction 1 1568 1568 0.3163 0.5739
subnum 18 7576606 420923 84.8927 <2e-16 ***
group:direction 1 11561 11561 2.3316 0.1268
Residuals 5169 25629383 4958
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Qui vengono calcolati tutti i valori F e p supponendo che tutti i termini abbiano i residui come strato di errore che lo racchiude, e questo vale per tutti tranne che per "gruppo". Il test F 'corretto per il bilanciamento' per il gruppo è invece:
F_group <- an["group", "Mean Sq"] / an["subnum", "Mean Sq"]
c(Fvalue=F_group, pvalue=pf(F_group, 1, 18, lower.tail = FALSE))
Fvalue pvalue
2.3623466 0.1416875
dove usiamo la subnum
MS invece della Residuals
MS nel denominatore del valore F.
Nota che questi valori corrispondono abbastanza bene ai risultati di Satterthwaite:
model <- lmer(rt ~ group * direction + (1 | subnum), data = ANT.2)
anova(model, type=1)
Type I Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
group 12065.3 12065.3 1 18 2.4334 0.1362
direction 1951.8 1951.8 1 5169 0.3936 0.5304
group:direction 11552.2 11552.2 1 5169 2.3299 0.1270
Le differenze rimanenti sono dovute al fatto che i dati non sono esattamente bilanciati.
Il PO si confronta anova.lm
con anova.lmerModLmerTest
, il che è ok, ma per fare un paragone con un simile dobbiamo usare gli stessi contrasti. In questo caso c'è una differenza tra anova.lm
e anova.lmerModLmerTest
poiché producono rispettivamente test di Tipo I e III di default, e per questo set di dati c'è una (piccola) differenza tra i contrasti di Tipo I e III:
show_tests(anova(model, type=1))$group
(Intercept) groupTreatment directionright groupTreatment:directionright
groupTreatment 0 1 0.005202759 0.5013477
show_tests(anova(model, type=3))$group # type=3 is default
(Intercept) groupTreatment directionright groupTreatment:directionright
groupTreatment 0 1 0 0.5
Se il set di dati fosse stato completamente bilanciato, i contrasti di tipo I sarebbero stati gli stessi dei contrasti di tipo III (che non sono influenzati dal numero osservato di campioni).
Un'ultima osservazione è che la "lentezza" del metodo Kenward-Roger non è dovuta al rimodellamento del modello, ma perché comporta calcoli con la matrice di varianza-covarianza marginale delle osservazioni / residui (5191x5191 in questo caso) che non è il caso del metodo di Satterthwaite.
Per quanto riguarda il modello 2
Per quanto riguarda model2 la situazione diventa più complessa e penso che sia più facile iniziare la discussione con un altro modello in cui ho incluso l'interazione "classica" tra subnum
e direction
:
model3 <- lmer(rt ~ group * direction + (1 | subnum) +
(1 | subnum:direction), data = ANT.2)
VarCorr(model3)
Groups Name Std.Dev.
subnum:direction (Intercept) 1.7008e-06
subnum (Intercept) 4.0100e+01
Residual 7.0415e+01
Poiché la varianza associata all'interazione è essenzialmente zero (in presenza subnum
dell'effetto principale casuale) il termine di interazione non ha alcun effetto sul calcolo dei gradi di libertà del denominatore, dei valori F e dei valori p :
anova(model3, type=1)
Type I Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
group 12065.3 12065.3 1 18 2.4334 0.1362
direction 1951.8 1951.8 1 5169 0.3936 0.5304
group:direction 11552.2 11552.2 1 5169 2.3299 0.1270
Tuttavia, subnum:direction
è lo strato di errore che lo racchiude in subnum
tal modo se rimuoviamo subnum
tutto il SSQ associato ricade insubnum:direction
model4 <- lmer(rt ~ group * direction +
(1 | subnum:direction), data = ANT.2)
Ora il termine di errore naturale per group
, direction
ed group:direction
è
subnum:direction
e con nlevels(with(ANT.2, subnum:direction))
= 40 e quattro parametri, i gradi di libertà del denominatore per quei termini dovrebbero essere circa 36:
anova(model4, type=1)
Type I Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
group 24004.5 24004.5 1 35.994 4.8325 0.03444 *
direction 50.6 50.6 1 35.994 0.0102 0.92020
group:direction 273.4 273.4 1 35.994 0.0551 0.81583
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Questi test F possono anche essere approssimati con i test F 'bilanciati corretti' :
an4 <- anova(lm(rt ~ group*direction + subnum:direction, data=ANT.2))
an4[1:3, "F value"] <- an4[1:3, "Mean Sq"] / an4[4, "Mean Sq"]
an4[1:3, "Pr(>F)"] <- pf(an4[1:3, "F value"], 1, 36, lower.tail = FALSE)
an4
Analysis of Variance Table
Response: rt
Df Sum Sq Mean Sq F value Pr(>F)
group 1 994365 994365 4.6976 0.0369 *
direction 1 1568 1568 0.0074 0.9319
group:direction 1 10795 10795 0.0510 0.8226
direction:subnum 36 7620271 211674 42.6137 <2e-16 ***
Residuals 5151 25586484 4967
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
ora passiamo al modello2:
model2 <- lmer(rt ~ group * direction + (direction | subnum), data = ANT.2)
Questo modello descrive una struttura di covarianza ad effetto casuale piuttosto complicata con una matrice di covarianza varianza 2x2. La parametrizzazione predefinita non è facile da gestire e siamo meglio con una ri-parametrizzazione del modello:
model2 <- lmer(rt ~ group * direction + (0 + direction | subnum), data = ANT.2)
Se confrontiamo model2
con model4
, hanno ugualmente molti effetti casuali; 2 per ciascuno subnum
, ovvero 2 * 20 = 40 in totale. Mentre model4
stabilisce un singolo parametro di varianza per tutti i 40 effetti casuali, model2
stabilisce che ogni subnum
coppia di effetti casuali ha una distribuzione normale bi-variabile con una matrice di varianza-covarianza 2x2 i cui parametri sono dati da
VarCorr(model2)
Groups Name Std.Dev. Corr
subnum directionleft 38.880
directionright 41.324 1.000
Residual 70.405
Ciò indica un eccesso di adattamento, ma conserviamolo per un altro giorno. Il punto importante qui è che model4
è un caso speciale di model2
e che model
è anche un caso speciale di model2
. Parlare liberamente (e intuitivamente) (direction | subnum)
contiene o cattura la variazione associata all'effetto principale subnum
e l'interazione direction:subnum
. In termini di effetti casuali possiamo pensare a questi due effetti o strutture come a catturare rispettivamente la variazione tra righe e righe per colonne:
head(ranef(model2)$subnum)
directionleft directionright
1 -25.453576 -27.053697
2 16.446105 17.479977
3 -47.828568 -50.835277
4 -1.980433 -2.104932
5 5.647213 6.002221
6 41.493591 44.102056
In questo caso, queste stime di effetti casuali e le stime dei parametri di varianza indicano entrambe che in realtà abbiamo solo un effetto principale casuale subnum
(variazione tra le righe) presente qui. Ciò che porta a tutto ciò è il grado di libertà di quel denominatore Satterthwaite
anova(model2, type=1)
Type I Analysis of Variance Table with Satterthwaite's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
group 12059.8 12059.8 1 17.998 2.4329 0.1362
direction 1803.6 1803.6 1 125.135 0.3638 0.5475
group:direction 10616.6 10616.6 1 125.136 2.1418 0.1458
è un compromesso tra queste strutture di effetto principale e di interazione: il gruppo DenDF rimane a 18 (nidificato in subnum
base alla progettazione) ma il direction
e
group:direction
DenDF sono compromessi tra 36 ( model4
) e 5169 ( model
).
Non credo che nulla indichi che l'approssimazione di Satterthwaite (o la sua implementazione in lmerTest ) sia difettosa.
Dà la tabella equivalente con il metodo Kenward-Roger
anova(model2, type=1, ddf="Ken")
Type I Analysis of Variance Table with Kenward-Roger's method
Sum Sq Mean Sq NumDF DenDF F value Pr(>F)
group 12059.8 12059.8 1 18.000 2.4329 0.1362
direction 1803.2 1803.2 1 17.987 0.3638 0.5539
group:direction 10614.7 10614.7 1 17.987 2.1414 0.1606
Non sorprende che KR e Satterthwaite possano differire, ma per tutti gli scopi pratici la differenza nei valori p è minima. La mia analisi sopra indica che il DenDF
for direction
e group:direction
non dovrebbe essere più piccolo di ~ 36 e probabilmente più grande di quello dato che in pratica abbiamo solo l'effetto principale casuale del direction
presente, quindi se penso che ciò sia un'indicazione che il metodo KR diventa DenDF
troppo basso in questo caso. Ma tieni presente che i dati non supportano realmente la (group | direction)
struttura, quindi il confronto è un po 'artificiale - sarebbe più interessante se il modello fosse effettivamente supportato.
ezAnova
avvertimento in quanto non dovresti eseguire 2x2 anova se in realtà i tuoi dati provengono dal design 2x2x2.