Nota: questa domanda è una risposta, poiché la mia domanda precedente doveva essere cancellata per motivi legali.
Confrontando PROC MIXED da SAS con la funzione lme
del nlme
pacchetto in R, mi sono imbattuto in alcune differenze piuttosto confuse. Più specificamente, i gradi di libertà nei diversi test differiscono tra PROC MIXED
e lme
e mi chiedevo perché.
Inizia dal seguente set di dati (codice R riportato di seguito):
- ind: fattore che indica l'individuo in cui viene presa la misurazione
- fac: organo in cui viene eseguita la misurazione
- trt: fattore che indica il trattamento
- y: alcune variabili a risposta continua
L'idea è quella di costruire i seguenti semplici modelli:
y ~ trt + (ind)
: ind
come fattore casuale
y ~ trt + (fac(ind))
: fac
nidificato ind
come fattore casuale
Nota che l'ultimo modello dovrebbe causare singolarità, in quanto esiste solo 1 valore di y
per ogni combinazione di ind
e fac
.
Primo modello
In SAS, creo il seguente modello:
PROC MIXED data=Data;
CLASS ind fac trt;
MODEL y = trt /s;
RANDOM ind /s;
run;
Secondo i tutorial, lo stesso modello in R usando nlme
dovrebbe essere:
> require(nlme)
> options(contrasts=c(factor="contr.SAS",ordered="contr.poly"))
> m2<-lme(y~trt,random=~1|ind,data=Data)
Entrambi i modelli forniscono le stesse stime per i coefficienti e il loro SE, ma quando eseguono un test F per l'effetto di trt
, usano una diversa quantità di gradi di libertà:
SAS :
Type 3 Tests of Fixed Effects
Effect Num DF Den DF F Value Pr > F
trt 1 8 0.89 0.3724
R :
> anova(m2)
numDF denDF F-value p-value
(Intercept) 1 8 70.96836 <.0001
trt 1 6 0.89272 0.3812
Domanda 1: Qual è la differenza tra entrambi i test? Entrambi sono montati usando REML e usano gli stessi contrasti.
NOTA: ho provato valori diversi per l'opzione DDFM = (incluso BETWITHIN, che teoricamente dovrebbe dare gli stessi risultati di lme)
Secondo modello
In SAS:
PROC MIXED data=Data;
CLASS ind fac trt;
MODEL y = trt /s;
RANDOM fac(ind) /s;
run;
Il modello equivalente in R dovrebbe essere:
> m4<-lme(y~trt,random=~1|ind/fac,data=Data)
In questo caso, ci sono alcune differenze molto strane:
- R si adatta senza lamentarsi, mentre SAS nota che l'assia finale non è definita positiva (il che non mi sorprende un po ', vedi sopra)
- La SE sui coefficienti differisce (è più piccola in SAS)
- Ancora una volta, il test F ha utilizzato una quantità diversa di DF (in effetti, in SAS tale quantità = 0)
Uscita SAS:
Effect trt Estimate Std Error DF t Value Pr > |t|
Intercept 0.8863 0.1192 14 7.43 <.0001
trt Cont -0.1788 0.1686 0 -1.06 .
Uscita R:
> summary(m4)
...
Fixed effects: y ~ trt
Value Std.Error DF t-value p-value
(Intercept) 0.88625 0.1337743 8 6.624963 0.0002
trtCont -0.17875 0.1891855 6 -0.944840 0.3812
...
(Si noti che in questo caso, i test F e T sono equivalenti e utilizzano lo stesso DF.)
È interessante notare che quando si utilizza lme4
in R il modello non si adatta nemmeno:
> require(lme4)
> m4r <- lmer(y~trt+(1|ind/fac),data=Data)
Error in function (fr, FL, start, REML, verbose) :
Number of levels of a grouping factor for the random effects
must be less than the number of observations
Domanda 2 : Qual è la differenza tra questi modelli con fattori nidificati? Sono specificati correttamente e, in tal caso, come mai i risultati sono così diversi?
Dati simulati in R:
Data <- structure(list(y = c(1.05, 0.86, 1.02, 1.14, 0.68, 1.05, 0.22,
1.07, 0.46, 0.65, 0.41, 0.82, 0.6, 0.49, 0.68, 1.55), ind = structure(c(1L,
2L, 3L, 1L, 3L, 4L, 4L, 2L, 5L, 6L, 7L, 8L, 6L, 5L, 7L, 8L), .Label = c("1",
"2", "3", "4", "5", "6", "7", "8"), class = "factor"), fac = structure(c(1L,
1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L), .Label = c("l",
"r"), class = "factor"), trt = structure(c(2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Cont",
"Treat"), class = "factor")), .Names = c("y", "ind", "fac", "trt"
), row.names = c(NA, -16L), class = "data.frame")
Dati simulati:
y ind fac trt
1.05 1 l Treat
0.86 2 l Treat
1.02 3 l Treat
1.14 1 r Treat
0.68 3 r Treat
1.05 4 l Treat
0.22 4 r Treat
1.07 2 r Treat
0.46 5 r Cont
0.65 6 l Cont
0.41 7 l Cont
0.82 8 l Cont
0.60 6 r Cont
0.49 5 l Cont
0.68 7 r Cont
1.55 8 r Cont