Äquivalenz zwischen einem Anova-Modell mit wiederholten Messungen und einem gemischten Modell: lmer vs lme und zusammengesetzte Symmetrie

9

Ich habe einige Probleme, gleichwertige Ergebnisse zwischen einem aovModell zwischen wiederholten Messungen und einem lmergemischten Modell zu erhalten.

Meine Daten und mein Skript sehen wie folgt aus

data=read.csv("https://www.dropbox.com/s/zgle45tpyv5t781/fitness.csv?dl=1")
data$id=factor(data$id)
data
   id  FITNESS      TEST PULSE
1   1  pilates   CYCLING    91
2   2  pilates   CYCLING    82
3   3  pilates   CYCLING    65
4   4  pilates   CYCLING    90
5   5  pilates   CYCLING    79
6   6  pilates   CYCLING    84
7   7 aerobics   CYCLING    84
8   8 aerobics   CYCLING    77
9   9 aerobics   CYCLING    71
10 10 aerobics   CYCLING    91
11 11 aerobics   CYCLING    72
12 12 aerobics   CYCLING    93
13 13    zumba   CYCLING    63
14 14    zumba   CYCLING    87
15 15    zumba   CYCLING    67
16 16    zumba   CYCLING    98
17 17    zumba   CYCLING    63
18 18    zumba   CYCLING    72
19  1  pilates   JOGGING   136
20  2  pilates   JOGGING   119
21  3  pilates   JOGGING   126
22  4  pilates   JOGGING   108
23  5  pilates   JOGGING   122
24  6  pilates   JOGGING   101
25  7 aerobics   JOGGING   116
26  8 aerobics   JOGGING   142
27  9 aerobics   JOGGING   137
28 10 aerobics   JOGGING   134
29 11 aerobics   JOGGING   131
30 12 aerobics   JOGGING   120
31 13    zumba   JOGGING    99
32 14    zumba   JOGGING    99
33 15    zumba   JOGGING    98
34 16    zumba   JOGGING    99
35 17    zumba   JOGGING    87
36 18    zumba   JOGGING    89
37  1  pilates SPRINTING   179
38  2  pilates SPRINTING   195
39  3  pilates SPRINTING   188
40  4  pilates SPRINTING   189
41  5  pilates SPRINTING   173
42  6  pilates SPRINTING   193
43  7 aerobics SPRINTING   184
44  8 aerobics SPRINTING   179
45  9 aerobics SPRINTING   179
46 10 aerobics SPRINTING   174
47 11 aerobics SPRINTING   164
48 12 aerobics SPRINTING   182
49 13    zumba SPRINTING   111
50 14    zumba SPRINTING   103
51 15    zumba SPRINTING   113
52 16    zumba SPRINTING   118
53 17    zumba SPRINTING   127
54 18    zumba SPRINTING   113

Grundsätzlich wurden 3 x 6 Probanden ( id) jeweils drei verschiedenen FITNESSTrainingsschemata unterzogen und PULSEnach Durchführung von drei verschiedenen Arten von Ausdauer gemessen TEST.

Ich habe dann folgendes aovModell montiert :

library(afex)
library(car)
set_sum_contrasts()
fit1 = aov(PULSE ~ FITNESS*TEST + Error(id/TEST),data=data)
summary(fit1)
Error: id
          Df Sum Sq Mean Sq F value   Pr(>F)    
FITNESS    2  14194    7097   115.1 7.92e-10 ***
Residuals 15    925      62                     
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Error: id:TEST
             Df Sum Sq Mean Sq F value   Pr(>F)    
TEST          2  57459   28729   253.7  < 2e-16 ***
FITNESS:TEST  4   8200    2050    18.1 1.16e-07 ***
Residuals    30   3397     113                     
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Das Ergebnis erhalte ich mit

set_sum_contrasts()
fit2=aov.car(PULSE ~ FITNESS*TEST+Error(id/TEST),data=data,type=3,return="Anova")
summary(fit2)

ist damit identisch.

Ein gemischter Modelllauf mit nlmeergibt ein direkt äquivalentes Ergebnis, z. B lme.:

library(lmerTest)    
lme1=lme(PULSE ~ FITNESS*TEST, random=~1|id, correlation=corCompSymm(form=~1|id),data=data)
anova(lme1)
             numDF denDF   F-value p-value
(Intercept)      1    30 12136.126  <.0001
FITNESS          2    15   115.127  <.0001
TEST             2    30   253.694  <.0001
FITNESS:TEST     4    30    18.103  <.0001


summary(lme1)
Linear mixed-effects model fit by REML
 Data: data 
       AIC      BIC    logLik
  371.5375 393.2175 -173.7688

Random effects:
 Formula: ~1 | id
        (Intercept) Residual
StdDev:    1.699959 9.651662

Correlation Structure: Compound symmetry
 Formula: ~1 | id 
 Parameter estimate(s):
       Rho 
-0.2156615 
Fixed effects: PULSE ~ FITNESS * TEST 
                                 Value Std.Error DF   t-value p-value
(Intercept)                   81.33333  4.000926 30 20.328628  0.0000
FITNESSpilates                 0.50000  5.658164 15  0.088368  0.9308
FITNESSzumba                  -6.33333  5.658164 15 -1.119327  0.2806
TESTJOGGING                   48.66667  6.143952 30  7.921069  0.0000
TESTSPRINTING                 95.66667  6.143952 30 15.570868  0.0000
FITNESSpilates:TESTJOGGING   -11.83333  8.688861 30 -1.361897  0.1834
FITNESSzumba:TESTJOGGING     -28.50000  8.688861 30 -3.280062  0.0026
FITNESSpilates:TESTSPRINTING   8.66667  8.688861 30  0.997446  0.3265
FITNESSzumba:TESTSPRINTING   -56.50000  8.688861 30 -6.502579  0.0000

Oder mit gls:

library(lmerTest)    
gls1=gls(PULSE ~ FITNESS*TEST, correlation=corCompSymm(form=~1|id),data=data)
anova(gls1)

Das Ergebnis, das ich mit lme4's erhalte, lmerist jedoch anders:

set_sum_contrasts()
fit3=lmer(PULSE ~ FITNESS*TEST+(1|id),data=data)
summary(fit3)
Linear mixed model fit by REML ['lmerMod']
Formula: PULSE ~ FITNESS * TEST + (1 | id)
   Data: data

REML criterion at convergence: 362.4

Random effects:
 Groups   Name        Variance Std.Dev.
 id       (Intercept)  0.00    0.0     
 Residual             96.04    9.8     
...

Anova(fit3,test.statistic="F",type=3)
Analysis of Deviance Table (Type III Wald F tests with Kenward-Roger df)

Response: PULSE
                    F Df Df.res    Pr(>F)    
(Intercept)  7789.360  1     15 < 2.2e-16 ***
FITNESS        73.892  2     15 1.712e-08 ***
TEST          299.127  2     30 < 2.2e-16 ***
FITNESS:TEST   21.345  4     30 2.030e-08 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Hat jemand irgendwelche Gedanken, was ich mit dem lmerModell falsch mache ? Oder woher kommt der Unterschied? Könnte es etwas damit zu tun haben, lmernegative Korellationen innerhalb der Klasse oder ähnliches nicht zuzulassen? Da nlme‚s glsund lmeSie das richtige Ergebnis zurückgeben, aber ich frage mich , wie das ist anders in glsund lme? Ist es so, dass die Option dazu führt, correlation=corCompSymm(form=~1|id)dass sie die Intraclass-Korrelation, die entweder positiv oder negativ sein kann, direkt schätzen, während sie lmereine Varianzkomponente schätzt, die nicht negativ sein kann (und in diesem Fall als Null geschätzt wird)?

Tom Wenseleers
quelle
Was macht set_sum_contrasts()das
Smillig
Ha es ist aus der Bibliothek afex - es setzt die Effektcodierung unter Verwendung von Optionen (contrasts = c ("contr.sum", "contr.poly"))
Tom Wenseleers
1
Die Hypothese in Ihrem letzten Satz ist genau richtig.
Ben Bolker
Ha vielen Dank dafür! Ich erinnere mich, dass Sie einmal erwähnt haben, dass es auf Github eine hochmoderne Entwicklungsversion von lme4 'flexLambda' gibt, die Korrelationsstrukturen vom Typ corCompSymm zulässt. Ist das immer noch der Fall und könnte diese Version das Ergebnis zufällig zurückgeben?
Tom Wenseleers

Antworten:

14

Wie Ben Bolker bereits in den Kommentaren erwähnt hat, liegt das Problem wie Sie vermuten: Das lmer()Modell wird ausgelöst, weil es versucht, ein Varianzkomponentenmodell zu schätzen, wobei die Varianzkomponentenschätzungen nicht negativ sein dürfen. Ich werde versuchen, ein etwas intuitives Verständnis dafür zu vermitteln, was zu Ihrem Datensatz führt und warum dies ein Problem für Varianzkomponentenmodelle verursacht.

Hier ist eine grafische Darstellung Ihres Datensatzes. Die weißen Punkte sind die tatsächlichen Beobachtungen und die schwarzen Punkte sind die Mittel des Subjekts.

Geben Sie hier die Bildbeschreibung ein

Um die Sache einfacher zu machen, aber ohne den Geist des Problems zu ändern, werde ich die festen Effekte (dh die FITNESSund TEST-Effekte sowie den Mittelwert) subtrahieren und die Restdaten als einseitiges Zufallseffektproblem behandeln . So sieht der neue Datensatz aus:

Geben Sie hier die Bildbeschreibung ein

Schauen Sie sich die Muster in dieser Handlung genau an. Überlegen Sie, wie sich Beobachtungen von demselben Subjekt von Beobachtungen von verschiedenen Subjekten unterscheiden. Beachten Sie insbesondere das folgende Muster: Da eine der Beobachtungen für ein Subjekt höher (oder niedriger) über (oder unter) dem Subjektmittelwert liegt, befinden sich die anderen Beobachtungen von diesem Subjekt tendenziell auf der gegenüberliegenden Seite des Subjektmittelwerts. Und je weiter die Beobachtung vom Mittelwert des Subjekts entfernt ist, desto weiter sind die anderen Beobachtungen tendenziell vom Mittelwert des Subjekts auf der gegenüberliegenden Seite entfernt. Dies weist auf eine negative Korrelation innerhalb der Klasse hin. Zwei Beobachtungen, die von demselben Subjekt gemacht wurden , sind im Durchschnitt weniger ähnlich als zwei rein zufällig aus dem Datensatz gezogene Beobachtungen.

Eine andere Möglichkeit, über dieses Muster nachzudenken, besteht in den relativen Größen der Varianz zwischen Subjekt und innerhalb des Subjekts. Es scheint, dass es innerhalb des Subjekts eine wesentlich größere Varianz gibt als zwischen den Subjekten. Wir erwarten natürlich, dass dies bis zu einem gewissen Grad geschieht. Schließlich basiert die Varianz innerhalb des Subjekts auf der Variation der einzelnen Datenpunkte, während die Varianz zwischen den Subjekten auf der Variation der Mittelwerte der einzelnen Datenpunkte (dh des Subjekts) basiert , und wir wissen, dass die Varianz von Ein Mittelwert nimmt tendenziell ab, wenn die Anzahl der gemittelten Dinge zunimmt. Aber in diesem Datensatz ist der Unterschied ziemlich auffällig: Es gibt einen Wegmehr subjektinterne als subjektübergreifende Variationen. Tatsächlich ist dieser Unterschied genau der Grund, warum eine negative Korrelation innerhalb der Klasse auftritt.

yij=uj+eijujjth Thema. Überlegen wir uns also, was passieren würde, wenn die Subjekteffekte wirklich 0 Varianzen aufweisen würden - mit anderen Worten, wenn die wahre Varianzkomponente zwischen Subjekten 0 wäre. Wenn wir anhand eines tatsächlichen Datensatzes, der unter diesem Modell generiert wurde, Stichprobenmittelwerte berechnen würden Für die beobachteten Daten jedes Subjekts hätten diese Stichprobenmittel immer noch eine Varianz ungleich Null, aber sie würden nur die Fehlervarianz und keine "wahre" Subjektvarianz widerspiegeln (weil wir angenommen haben, dass es keine gibt).

var(X¯)=var(Xi)/nn

34810.84.3. Und darin liegt das Problem. Die Daten implizieren, dass es irgendwie eine negative Varianzkomponente gibt, aber die Software erlaubt (vernünftigerweise) keine negativen Schätzungen von Varianzkomponenten, da eine Varianz tatsächlich niemals negativ sein kann. Die anderen Modelle, die Sie anpassen, vermeiden dieses Problem, indem sie die Korrelation innerhalb der Klasse direkt schätzen, anstatt ein einfaches Varianzkomponentenmodell anzunehmen.

Wenn Sie sehen möchten, wie Sie tatsächlich die von Ihrem Datensatz implizierte negative Varianzkomponentenschätzung erhalten können, können Sie das Verfahren verwenden, das ich (mit dem zugehörigen RCode) in dieser anderen aktuellen Antwort von mir illustriere . Dieses Verfahren ist nicht ganz trivial, aber auch nicht zu schwierig (für ein ausgewogenes Design wie dieses).

Jake Westfall
quelle
Hallo Jake, vielen Dank für diese sehr klare Erklärung! Aber ich bin in Ordnung, wenn ich das lme-Modell mit zusammengesetzter Symmetrie (oder einer allgemeinen Korrelationsstruktur) verwende, oder? Und der Rho in diesem lme-Modell, -0.2156615, wäre die negative Intraclass-Korrelation, oder?
Tom Wenseleers
@ TomWenseleers Yep (zu beiden)
Jake Westfall
1
+1. Es ist eine ausgezeichnete pädagogische Antwort, und es ist schade, dass es so wenige positive Stimmen gibt.
Amöbe