Unterschiede zwischen PROC Mixed und lme / lmer in R - Freiheitsgraden

12

Hinweis: Diese Frage ist ein Repost, da meine vorherige Frage aus rechtlichen Gründen gelöscht werden musste.


Beim Vergleich von PROC MIXED von SAS mit der Funktion lmeaus dem nlmePaket in R bin ich auf einige verwirrende Unterschiede gestoßen. Insbesondere unterscheiden sich die Freiheitsgrade in den verschiedenen Tests zwischen PROC MIXEDund lme, und ich fragte mich, warum.

Beginnen Sie mit dem folgenden Datensatz (unten angegebener R-Code):

  • ind: Faktor, der die Person angibt, an der die Messung durchgeführt wird
  • fac: Orgel, an der gemessen wird
  • trt: Faktor, der die Behandlung angibt
  • y: eine kontinuierliche Antwortvariable

Die Idee ist, die folgenden einfachen Modelle zu bauen:

y ~ trt + (ind): indals Zufallsfaktor y ~ trt + (fac(ind)): facverschachtelt indals Zufallsfaktor

Beachten Sie, dass das letzte Modell Singularitäten verursachen sollte, da es yfür jede Kombination von indund nur einen Wert gibt fac.

Erstes Modell

In SAS baue ich das folgende Modell:

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

Laut Tutorials sollte dasselbe Modell in R wie folgt nlmelauten:

> require(nlme)
> options(contrasts=c(factor="contr.SAS",ordered="contr.poly"))
> m2<-lme(y~trt,random=~1|ind,data=Data)

Beide Modelle geben die gleichen Schätzungen für die Koeffizienten und ihre SE an, verwenden jedoch bei der Durchführung eines F-Tests für die Auswirkung von trteinen unterschiedlichen Freiheitsgrad:

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

Frage 1: Was ist der Unterschied zwischen beiden Tests? Beide werden mit REML angepasst und verwenden dieselben Kontraste.

ANMERKUNG: Ich habe verschiedene Werte für die Option DDFM = ausprobiert (einschließlich BETWITHIN, die theoretisch die gleichen Ergebnisse liefern sollten wie lme).

Zweites Modell

In SAS:

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

Das äquivalente Modell in R sollte sein:

> m4<-lme(y~trt,random=~1|ind/fac,data=Data)

In diesem Fall gibt es einige sehr merkwürdige Unterschiede:

  • R passt, ohne sich zu beschweren, während SAS feststellt, dass der endgültige Hessische nicht eindeutig positiv ist (was mich nicht ein bisschen überrascht, siehe oben)
  • Die SE auf den Koeffizienten unterscheiden sich (ist kleiner in SAS)
  • Auch hier verwendete der F-Test eine andere Menge an DF (tatsächlich war diese Menge in SAS = 0).

SAS-Ausgabe:

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 . 

R Ausgang:

> 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
...

(Beachten Sie, dass in diesem Fall der F- und der T-Test gleichwertig sind und denselben DF verwenden.)

Interessanterweise lme4passt das Modell in R nicht einmal:

> 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

Frage 2 : Was ist der Unterschied zwischen diesen Modellen mit verschachtelten Faktoren? Sind sie richtig spezifiziert und wenn ja, wie kommt es, dass die Ergebnisse so unterschiedlich sind?


Simulierte Daten 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")

Simulierte Daten:

   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
Joris Meys
quelle
@ Aaron: Bitte finden Sie Ihre Antwort in diesem Beitrag. Wenn Sie das als Antwort kopieren und einfügen könnten, gebe ich Ihnen den Repräsentanten dafür. Es war sehr hilfreich, deshalb möchte ich es hier auf crossvalidated belassen. Nachdem Sie das getan haben, lösche ich Ihre Antwort aus der Frage.
Joris Meys
Ich versuche, das Team dazu zu bringen, Ihr ursprüngliches Q mit dieser unglücklichen, endgültig gelöschten Revision wiederzubeleben - daher besteht eine große Chance, die ursprünglichen Antworten wiederherzustellen und sie hier zusammenzuführen.
@mbq: Das wäre schön, obwohl ich einige Daten (die ich hier verwende) simuliert und die Antwort von Aaron entsprechend bearbeitet habe. Für die andere Antwort ist das etwas komplizierter, aber ich kann es auch versuchen.
Joris Meys
Aarons Antwort ist unglaublich gut. Ich hoffe sie sehen es. Leider wird Ihr @Aaron ihn nicht kontaktieren, es sei denn, er hat an diesem Thread teilgenommen.
Wayne
1
Ja, das war eine schöne Antwort. Hier habe ich einen Link zu dem gelöschten Beitrag gegeben: stats.stackexchange.com/questions/26556/… Ich werde den Link zu diesem Beitrag hinzufügen.
Stéphane Laurent

Antworten:

11

Bei der ersten Frage ist die Standardmethode in SAS zum Ermitteln des df nicht sehr intelligent. Es sucht nach Begriffen im Zufallseffekt, die den festen Effekt syntaktisch einschließen, und verwendet diesen. In diesem Fall tut es nicht das Richtige , da trtes nicht in gefunden wird ind. Ich habe es nie versucht BETWITHINund kenne die Details nicht, aber entweder die Satterthwaite-Option ( satterth) oder die Verwendung ind*trtals Zufallseffekt führt zu korrekten Ergebnissen.

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;

Was die zweite Frage betrifft, stimmt Ihr SAS-Code nicht ganz mit Ihrem R-Code überein. Es hat nur einen Begriff für fac*ind, während der R-Code einen Begriff für beide indund hat fac*ind. (Siehe dazu die Ausgabe der Varianzkomponenten.) Wenn Sie diese trthinzufügen, erhalten Sie für alle Modelle in Q1 und Q2 die gleiche SE (0,1892).

Wie Sie bemerken, ist dies ein ungerades Modell, da der fac*indBegriff eine Beobachtung für jede Ebene enthält und somit dem Fehlerterm äquivalent ist. Dies spiegelt sich in der SAS-Ausgabe wider, bei der der fac*indBegriff keine Varianz aufweist. Dies sagt Ihnen auch die Fehlermeldung von lme4; Der Grund für den Fehler ist, dass Sie höchstwahrscheinlich etwas falsch angegeben haben, da Sie den Fehlerbegriff auf zwei verschiedene Arten in das Modell aufgenommen haben. Interessanterweise gibt es einen kleinen Unterschied im nlme-Modell; Irgendwie wird ein Abweichungsbegriff für den fac*indBegriff zusätzlich zum Fehlerbegriff gefunden, aber Sie werden feststellen, dass die Summe dieser beiden Abweichungen dem Fehlerbegriff von SAS und nlme ohne den fac*indBegriff entspricht. Die SE für trtbleibt jedoch dieselbe (0,1892) wie trtin verschachteltindDaher haben diese Terme mit geringerer Varianz keinen Einfluss darauf.

Abschließend noch eine allgemeine Anmerkung zu den Freiheitsgraden in diesen Modellen: Sie werden berechnet, nachdem das Modell angepasst wurde. Unterschiede in den Freiheitsgraden zwischen verschiedenen Programmen oder Optionen eines Programms bedeuten also nicht unbedingt, dass das Modell unterschiedlich angepasst wird. Dazu muss man sich die Schätzungen der Parameter ansehen, sowohl der Parameter mit festem Effekt als auch der Parameter mit Kovarianz.

Auch die Verwendung der t- und F-Approximation mit einer bestimmten Anzahl von Freiheitsgraden ist ziemlich umstritten. Es gibt nicht nur mehrere Möglichkeiten, den df anzunähern, sondern einige glauben, dass dies ohnehin keine gute Idee ist. Ein paar Ratschläge:

  1. Wenn alles ausgeglichen ist, vergleichen Sie die Ergebnisse mit der traditionellen Methode der kleinsten Quadrate, da diese übereinstimmen sollten. Wenn es in der Nähe des Gleichgewichts liegt, berechnen Sie es selbst (unter der Annahme des Gleichgewichts), damit Sie sicherstellen können, dass sich die von Ihnen verwendeten im richtigen Ballpark befinden.

  2. Wenn Sie eine große Stichprobengröße haben, spielen die Freiheitsgrade keine große Rolle, da sich die Verteilungen einem Normalwert und einem Chi-Quadrat annähern.

  3. Schauen Sie sich die Methoden von Doug Bates an, um Schlüsse zu ziehen. Seine ältere Methode basiert auf der MCMC-Simulation; Seine neuere Methode basiert auf der Profilierung der Wahrscheinlichkeit.

Aaron hat Stack Overflow verlassen
quelle
In der Tat eine gute Antwort, obwohl ich der Meinung bin , dass das Profilieren der Wahrscheinlichkeit eine andere Frage löst (geeignete CIs zu Varianzparametern, bei denen das Profil nicht quadratisch ist) als das Ausführen einer MCMC-Simulation (die sowohl die Korrektur endlicher Größen als auch die Nichtquadratizität behandelt). Ich denke, bootMer (parametric bootstrap) ist näher an der Entsprechung für mcmcsamp als confint (profile (...)) ...
Ben Bolker
@BenBolker: Klar könnte das sein. Doug Bates hielt letzten Monat hier einen Vortrag und sprach über seine Ideen zur Profilierung der Wahrscheinlichkeit. Das ist ungefähr alles, was ich bisher darüber weiß.
Aaron verließ den Stack Overflow am