Differenze tra PROC Mixed e lme / lmer in R - gradi di libertà


12

Nota: questa domanda è una risposta, poiché la mia domanda precedente doveva essere cancellata per motivi legali.


Confrontando PROC MIXED da SAS con la funzione lmedel nlmepacchetto in R, mi sono imbattuto in alcune differenze piuttosto confuse. Più specificamente, i gradi di libertà nei diversi test differiscono tra PROC MIXEDe lmee 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): indcome fattore casuale y ~ trt + (fac(ind)): facnidificato indcome fattore casuale

Nota che l'ultimo modello dovrebbe causare singolarità, in quanto esiste solo 1 valore di yper ogni combinazione di inde 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 nlmedovrebbe 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 lme4in 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

@Aaron: la risposta è inclusa in questo post. Se potessi copiarlo e incollarlo come risposta, ti do il rappresentante. È stato molto utile, quindi voglio davvero tenerlo qui su crossvalidated. Dopo averlo fatto, cancello la tua risposta dalla domanda.
Joris Meys,

Sto cercando di far rivivere il tuo Q originale con questa sfortunata revisione cancellata per sempre - quindi c'è una grande possibilità di ripristinare le risposte originali e unirle qui.

@mbq: Sarebbe bello, anche se ho simulato alcuni dati (che uso qui) e modificato di conseguenza la risposta di Aaron. Per l'altra risposta, sarà un po 'più complicato, ma posso provare anche io.
Joris Meys,

La risposta di Aaron è incredibilmente buona. Spero lo vedano. Sfortunatamente, il tuo @Aaron non lo contatterà a meno che non abbia partecipato a questa discussione.
Wayne,

1
Sì, questa è stata una bella risposta. Qui ho dato un link al post cancellato: stats.stackexchange.com/questions/26556/… Ho intenzione di aggiungere il link al presente post.
Stéphane Laurent,

Risposte:


11

Per la prima domanda, il metodo predefinito in SAS per trovare il df non è molto intelligente; cerca termini nell'effetto casuale che sintatticamente includano l'effetto fisso e lo usa. In questo caso, poiché trtnon si trova in ind, non sta facendo la cosa giusta. Non ho mai provato BETWITHINe non conosco i dettagli, ma l'opzione Satterthwaite ( satterth) o l'utilizzo ind*trtcome effetto casuale danno risultati corretti.

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s ddfm=satterth;
    RANDOM ind /s;
run;

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s;
    RANDOM ind*trt /s;
run;

Per quanto riguarda la seconda domanda, il tuo codice SAS non corrisponde esattamente al tuo codice R; ha solo un termine per fac*ind, mentre il codice R ha un termine per entrambi inde fac*ind. (Vedere l'output dei componenti di varianza per vedere questo.) L'aggiunta di questo fornisce lo stesso SE per trttutti i modelli sia in Q1 che in Q2 (0.1892).

Come notate, questo è un modello strano da adattare poiché il fac*indtermine ha un'osservazione per ogni livello, quindi equivale al termine di errore. Ciò si riflette nell'output SAS, in cui il fac*indtermine ha varianza zero. Questo è anche ciò che ti dice il messaggio di errore di lme4; il motivo dell'errore è che molto probabilmente hai specificato erroneamente qualcosa mentre includi il termine di errore nel modello in due modi diversi. È interessante notare che c'è una leggera differenza nel modello nlme; sta in qualche modo trovando un termine di varianza per il fac*indtermine oltre al termine di errore, ma noterai che la somma di queste due varianze equivale al termine di errore sia da SAS che da nlme senza il fac*indtermine. Tuttavia, la SE per trtrimane la stessa (0,1892) della quale trtè nidificataind, quindi questi termini di varianza inferiore non influiscono su di esso.

Infine, una nota generale sui gradi di libertà in questi modelli: sono calcolati dopo che il modello è stato adattato, e quindi le differenze nei gradi di libertà tra diversi programmi o opzioni di un programma non significano necessariamente che il modello si adatti in modo diverso. Per questo, si devono esaminare le stime dei parametri, sia i parametri a effetto fisso che i parametri di covarianza.

Inoltre, l'uso delle approssimazioni te F con un dato numero di gradi di libertà è abbastanza controverso. Non solo ci sono diversi modi per approssimare il df, alcuni credono che la pratica di farlo non sia comunque una buona idea. Un paio di consigli:

  1. Se tutto è bilanciato, confronta i risultati con il metodo tradizionale dei minimi quadrati, come dovrebbero essere d'accordo. Se è vicino al bilanciamento, calcola tu stesso (assumendo l'equilibrio) in modo da poter assicurarti che quelli che stai usando siano nel campo giusto.

  2. Se si dispone di un campione di grandi dimensioni, i gradi di libertà non contano molto poiché le distribuzioni si avvicinano a un normale e chi-quadrato.

  3. Scopri i metodi di inferenza di Doug Bates. Il suo metodo più vecchio si basa sulla simulazione MCMC; il suo metodo più recente si basa sulla profilazione della probabilità.


In effetti una buona risposta, anche se penso che la profilazione della probabilità risolva una domanda diversa (EC appropriati sui parametri di varianza in cui il profilo non è quadratico) rispetto alla simulazione MCMC (che gestisce sia la correzione delle dimensioni finite sia la non quadraticità). Penso che bootMer (bootstrap parametrico) sia più vicino all'equivalente per mcmcsamp che a confint (profilo (...)) ...
Ben Bolker,

@BenBolker: Certo che potrebbe essere. Doug Bates ha tenuto un discorso qui il mese scorso e ha parlato delle sue idee sulla profilazione della probabilità. Questo è tutto ciò che so finora.
Aaron ha lasciato Stack Overflow il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.