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 lme
aus dem nlme
Paket in R bin ich auf einige verwirrende Unterschiede gestoßen. Insbesondere unterscheiden sich die Freiheitsgrade in den verschiedenen Tests zwischen PROC MIXED
und 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)
: ind
als Zufallsfaktor
y ~ trt + (fac(ind))
: fac
verschachtelt ind
als Zufallsfaktor
Beachten Sie, dass das letzte Modell Singularitäten verursachen sollte, da es y
für jede Kombination von ind
und 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 nlme
lauten:
> 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 trt
einen 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 lme4
passt 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
quelle
Antworten:
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
trt
es nicht in gefunden wirdind
. Ich habe es nie versuchtBETWITHIN
und kenne die Details nicht, aber entweder die Satterthwaite-Option (satterth
) oder die Verwendungind*trt
als Zufallseffekt führt zu korrekten Ergebnissen.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 beideind
und hatfac*ind
. (Siehe dazu die Ausgabe der Varianzkomponenten.) Wenn Sie diesetrt
hinzufü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*ind
Begriff eine Beobachtung für jede Ebene enthält und somit dem Fehlerterm äquivalent ist. Dies spiegelt sich in der SAS-Ausgabe wider, bei der derfac*ind
Begriff 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 denfac*ind
Begriff zusätzlich zum Fehlerbegriff gefunden, aber Sie werden feststellen, dass die Summe dieser beiden Abweichungen dem Fehlerbegriff von SAS und nlme ohne denfac*ind
Begriff entspricht. Die SE fürtrt
bleibt jedoch dieselbe (0,1892) wietrt
in verschachteltind
Daher 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:
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.
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.
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.
quelle