Wie spezifiziere ich spezifische Kontraste für wiederholte Messungen der ANOVA im Auto?

12

Ich versuche, eine wiederholte Messung von Anova in R durchzuführen, gefolgt von einigen spezifischen Kontrasten für diesen Datensatz. Ich denke, der richtige Ansatz wäre, Anova()das Fahrzeugpaket zu verwenden.

Veranschaulichen wir meine Frage ?Anovaanhand des Beispiels, das aus der Verwendung der OBrienKaiserDaten stammt (Anmerkung: Ich habe den Geschlechtsfaktor aus dem Beispiel weggelassen):
Wir haben ein Design mit einem Faktor zwischen Subjekten, Behandlung (3 Ebenen: Kontrolle, A, B) und 2 Wiederholungen -Maßnahmen (innerhalb der Probanden) Faktoren, Phase (3 Stufen: Vortest, Posttest, Follow-up) und Stunde (5 Stufen: 1 bis 5).

Die Standard-ANOVA-Tabelle ist gegeben durch (im Unterschied zu Beispiel (Anova) habe ich auf Typ 3-Quadratsummen umgestellt, das ist, was mein Feld will):

require(car)
phase <- factor(rep(c("pretest", "posttest", "followup"), c(5, 5, 5)),
levels=c("pretest", "posttest", "followup"))
hour <- ordered(rep(1:5, 3))
idata <- data.frame(phase, hour)
mod.ok <- lm(cbind(pre.1, pre.2, pre.3, pre.4, pre.5, post.1, post.2, post.3, post.4, post.5, fup.1, fup.2, fup.3, fup.4, fup.5) ~ treatment, data=OBrienKaiser)
av.ok <- Anova(mod.ok, idata=idata, idesign=~phase*hour, type = 3)
summary(av.ok, multivariate=FALSE)

Stellen Sie sich nun vor, dass die Interaktion höchster Ordnung signifikant gewesen wäre (was nicht der Fall ist), und wir möchten sie mit den folgenden Kontrasten weiter untersuchen:
Gibt es einen Unterschied zwischen Stunde 1 und 2 gegenüber Stunde 3 (Kontrast 1) und zwischen Stunde 1 und 2 versus Stunden 4 & 5 (Kontrast 2) in den Behandlungsbedingungen (A & B zusammen)?
Mit anderen Worten, wie spezifiziere ich diese Kontraste:

  1. ((treatment %in% c("A", "B")) & (hour %in% 1:2)) gegen ((treatment %in% c("A", "B")) & (hour %in% 3))
  2. ((treatment %in% c("A", "B")) & (hour %in% 1:2)) gegen ((treatment %in% c("A", "B")) & (hour %in% 4:5))

Meine Idee wäre, eine weitere ANOVA durchzuführen, die die nicht benötigte Behandlungsbedingung (Kontrolle) außer Kraft setzt:

mod2 <- lm(cbind(pre.1, pre.2, pre.3, pre.4, pre.5, post.1, post.2, post.3, post.4, post.5, fup.1, fup.2, fup.3, fup.4, fup.5) ~ treatment, data=OBrienKaiser, subset = treatment != "control")
av2 <- Anova(mod2, idata=idata, idesign=~phase*hour, type = 3)
summary(av2, multivariate=FALSE)

Ich habe jedoch immer noch keine Ahnung, wie ich die entsprechende subjektinterne Kontrastmatrix einrichten soll, um die Stunden 1 & 2 mit 3 und 1 & 2 mit 4 & 5 zu vergleichen. Und ich bin mir nicht sicher, ob das Weglassen der nicht benötigten Behandlungsgruppe tatsächlich eine gute Idee ist, da es den allgemeinen Fehlerausdruck ändert.

Bevor Anova()ich loslegte, dachte ich auch darüber nach lme. Es gibt jedoch kleine Unterschiede in den F- und p-Werten zwischen der Lehrbuch-ANOVA und dem Ergebnis, das anove(lme) aufgrund möglicher negativer Abweichungen in der Standard-ANOVA (die nicht zulässig sindlme ) zurückgegeben wird. In ähnlicher Weise hat mich jemand darauf hingewiesen gls, dass es möglich ist, ANOVA mit wiederholten Messungen anzupassen, es gibt jedoch kein Kontrastargument.

Zur Verdeutlichung: Ich möchte einen F- oder T-Test (unter Verwendung von Quadratsummen vom Typ III), der beantwortet, ob die gewünschten Kontraste signifikant sind oder nicht.


Aktualisieren:

Ich habe bereits eine sehr ähnliche Frage zu R-help gestellt, auf die es keine Antwort gab .

Eine ähnliche Frage wurde vor einiger Zeit bei R-help gestellt. Die Antworten lösten jedoch auch das Problem nicht.


Update (2015):

Da diese Frage immer noch eine gewisse Aktivität hervorruft , kann das Spezifizieren von Thesen und im Grunde aller anderen Kontraste mit der afexVerpackung in Kombination mit der lsmeansVerpackung, wie in der afex-Vignette beschrieben, jetzt relativ einfach durchgeführt werden .

Henrik
quelle
1
Haben Sie sich schon gegen t-tests entschieden? Was ich meine ist 1) die Daten aus der Kontrollgruppe wegwerfen, 2) die unterschiedlichen Ebenen von treatment, 3) für jede Person durchschnittlich über Ebenen von prePostFup, 4) für jede Person durchschnittlich über Stunden 1,2 (= Datengruppe 1) ignorieren sowie über Stunden 3,4 (= Datengruppe 2), 5) führen Sie einen t-Test für 2 abhängige Gruppen durch. Da Maxwell & Delaney (2004) und Kirk (1995) davon abraten, Kontraste mit einem gepoolten Fehlerbegriff in Innendesigns zu bilden, könnte dies eine einfache Alternative sein.
caracal
Ich möchte Kontrastanalysen und keine gepoolten t-Tests durchführen. Der Grund ist, dass Kontraste (trotz ihrer Probleme) das Standardverfahren in der Psychologie zu sein scheinen und das sind, was die Leser / Rezensenten / Supervisoren wollen. Darüber hinaus sind sie in SPSS relativ unkompliziert. Trotz meiner 2 Jahre als aktiver R-Benutzer war ich bisher nicht in der Lage, dies mit R zu erreichen. Jetzt muss ich einige Kontraste anstellen und möchte nicht nur deshalb auf SPSS zurückgreifen. Wenn R die Zukunft ist (was ich denke), müssen Kontraste möglich sein.
Henrik

Antworten:

6

Diese Methode wird im Allgemeinen als "altmodisch" angesehen, so dass die Syntax möglicherweise schwierig ist und ich vermute, dass weniger Leute wissen, wie man die anova-Befehle manipuliert, um das zu erhalten, was Sie wollen. Die gebräuchlichste Methode ist die Verwendung glhteines Wahrscheinlichkeitsmodells von nlmeoder lme4. (Ich kann mich aber gerne durch andere Antworten als falsch erweisen.)

Das heißt, wenn ich das tun müsste, würde ich mich nicht um die Anova-Befehle kümmern. Ich würde einfach das äquivalente Modell unter Verwendung von lmanpassen, den richtigen Fehlerterm für diesen Kontrast auswählen und den F-Test selbst berechnen (oder äquivalent t testen, da es nur 1 df gibt). Dies setzt voraus, dass alles ausgeglichen ist und eine Kugelform aufweist. Wenn Sie dies jedoch nicht haben, sollten Sie wahrscheinlich ohnehin ein Wahrscheinlichkeitsmodell verwenden. Mit den Greenhouse-Geiser- oder Huynh-Feldt-Korrekturen, die (meiner Meinung nach) dieselbe F-Statistik verwenden, aber den df-Wert des Fehlerterms ändern, können Sie die Nicht-Sphärizität möglicherweise etwas korrigieren.

Wenn Sie wirklich verwenden möchten car, finden Sie möglicherweise die Heplot- Vignetten hilfreich. Sie beschreiben, wie die Matrizen im carPaket definiert sind.

Mit der Caracal-Methode (für die Kontraste 1 & 2 - 3 und 1 & 2 - 4 & 5) erhalte ich

      psiHat      tStat          F         pVal
1 -3.0208333 -7.2204644 52.1351067 2.202677e-09
2 -0.2083333 -0.6098777  0.3719508 5.445988e-01

So würde ich die gleichen p-Werte erhalten:

Verändern Sie die Form der Daten in ein Langformat und führen Sie sie aus lm, um alle SS-Begriffe abzurufen.

library(reshape2)
d <- OBrienKaiser
d$id <- factor(1:nrow(d))
dd <- melt(d, id.vars=c(18,1:2), measure.vars=3:17)
dd$hour <- factor(as.numeric(gsub("[a-z.]*","",dd$variable)))
dd$phase <- factor(gsub("[0-9.]*","", dd$variable), 
                   levels=c("pre","post","fup"))
m <- lm(value ~ treatment*hour*phase + treatment*hour*phase*id, data=dd)
anova(m)

Erstellen Sie eine alternative Kontrastmatrix für das Stundensemester.

foo <- matrix(0, nrow=nrow(dd), ncol=4)
foo[dd$hour %in% c(1,2) ,1] <- 0.5
foo[dd$hour %in% c(3) ,1] <- -1
foo[dd$hour %in% c(1,2) ,2] <- 0.5
foo[dd$hour %in% c(4,5) ,2] <- -0.5
foo[dd$hour %in% 1 ,3] <- 1
foo[dd$hour %in% 2 ,3] <- 0
foo[dd$hour %in% 4 ,4] <- 1
foo[dd$hour %in% 5 ,4] <- 0

Überprüfen Sie, ob meine Kontraste die gleiche SS wie die Standardkontraste (und die gleichen wie beim Vollmodell) ergeben.

anova(lm(value ~ hour, data=dd))
anova(lm(value ~ foo, data=dd))

Holen Sie sich die SS und df nur für die beiden Kontraste, die ich will.

anova(lm(value ~ foo[,1], data=dd))
anova(lm(value ~ foo[,2], data=dd))

Holen Sie sich die p-Werte.

> F <- 73.003/(72.81/52)
> pf(F, 1, 52, lower=FALSE)
[1] 2.201148e-09
> F <- .5208/(72.81/52)
> pf(F, 1, 52, lower=FALSE)
[1] 0.5445999

Passen Sie optional die Sphärizität an.

pf(F, 1*.48867, 52*.48867, lower=FALSE)
pf(F, 1*.57413, 52*.57413, lower=FALSE)
Aaron hat Stack Overflow verlassen
quelle
Das geht auch! Und danke für den Link zur heplotsVignette, das ist wirklich eine schöne Zusammenfassung dessen, was im Hinblick auf das allgemeine lineare Modell vor sich geht.
caracal
Danke vielmals. Ich werde diese Antwort akzeptieren (anstelle der anderen guten Antwort), da sie einige Überlegungen zur Korrektur der Sphärizität enthält.
Henrik
Hinweis für zukünftige Leser: Die Sphärizitätskorrektur gilt auch für die andere Lösung.
Aaron hat den Stack Overflow
6

Wenn Sie Kontraste mit dem zusammengefassten Fehlerausdruck aus der entsprechenden ANOVA verwenden möchten / müssen, können Sie Folgendes tun. Leider wird das lange dauern, und ich weiß nicht, wie ich das bequemer machen soll. Dennoch denke ich, dass die Ergebnisse korrekt sind, da sie gegen Maxwell & Delaney verifiziert sind (siehe unten).

Sie möchten Gruppen Ihrer ersten innerhalb des Faktors hourin einem SPF-p.qr-Design vergleichen (Notation von Kirk (1995)): Split-Plot-Factorial-Design 1 zwischen Faktor treatmentmit p-Gruppen, zuerst innerhalb des Faktors hourmit q-Gruppen, zweitens innerhalb des Faktors prePostFupmit r Gruppen). Das Folgende geht von treatmentGruppen gleicher Größe und Sphärizität aus.

Nj    <- 10                                             # number of subjects per group
P     <- 3                                              # number of treatment groups
Q     <- 5                                              # number of hour groups
R     <- 3                                              # number of PrePostFup groups
id    <- factor(rep(1:(P*Nj), times=Q*R))                                  # subject
treat <- factor(rep(LETTERS[1:P], times=Q*R*Nj), labels=c("CG", "A", "B")) # treatment
hour  <- factor(rep(rep(1:Q, each=P*Nj), times=R))                         # hour
ppf   <- factor(rep(1:R, each=P*Q*Nj), labels=c("pre", "post", "fup"))     # prePostFup
DV    <- round(rnorm(Nj*P*Q*R, 15, 2), 2)               # some data with no effects
dfPQR <- data.frame(id, treat, hour, ppf, DV)           # data frame long format

summary(aov(DV ~ treat*hour*ppf + Error(id/(hour*ppf)), data=dfPQR)) # SPF-p.qr ANOVA

Beachten Sie zunächst, dass der Haupteffekt für hournach dem Mitteln derselbe ist prePostFup, und wechseln Sie daher zum einfacheren SPF-pq-Design, das nur treatmentund hourals IVs enthält .

dfPQ <- aggregate(DV ~ id + treat + hour, FUN=mean, data=dfPQR)  # average over ppf
# SPF-p.q ANOVA, note effect for hour is the same as before
summary(aov(DV ~ treat*hour + Error(id/hour), data=dfPQ))

Beachten Sie nun, dass in der SPF-pq-ANOVA der Effekt für hourdie Interaktion getestet wird id:hour, dh diese Interaktion liefert den Fehlerterm für den Test. Jetzt können die Kontraste für hourGruppen wie bei einer Einbahnstraßen-ANOVA durch einfaches Ersetzen des Fehlerbegriffs und entsprechender Freiheitsgrade getestet werden. Der einfache Weg, um die SS und df dieser Interaktion zu erhalten, besteht darin, das Modell mit anzupassen lm().

(anRes <- anova(lm(DV ~ treat*hour*id, data=dfPQ)))
SSE    <- anRes["hour:id", "Sum Sq"]     # SS interaction hour:id -> will be error SS
dfSSE  <- anRes["hour:id", "Df"]         # corresponding df

Aber lassen Sie uns hier auch alles manuell berechnen.

# substitute DV with its difference to cell / person / treatment group means
Mjk   <- ave(dfPQ$DV,           dfPQ$treat, dfPQ$hour, FUN=mean)  # cell means
Mi    <- ave(dfPQ$DV, dfPQ$id,                         FUN=mean)  # person means
Mj    <- ave(dfPQ$DV,           dfPQ$treat,            FUN=mean)  # treatment means
dfPQ$IDxIV <- dfPQ$DV - Mi - Mjk + Mj                             # interaction hour:id
(SSE  <- sum(dfPQ$IDxIV^2))               # SS interaction hour:id -> will be error SS
dfSSE <- (Nj*P - P) * (Q-1)               # corresponding df
(MSE  <- SSE / dfSSE)                     # mean square

t=ψ^-0||c||MSE wo c ist der Kontrastvektor, ||c|| ist seine Länge, ψ^=k=1qckM.k ist die Kontrastschätzung und MSEist das mittlere Quadrat für die hour:idWechselwirkung (der geeignete Fehlerterm).

Mj     <- tapply(dfPQ$DV, dfPQ$hour, FUN=mean)  # group means for hour
Nj     <- table(dfPQ$hour)                      # cell sizes for hour (here the same)
cntr   <- rbind(c(1, 1, -2,  0, 0),
                c(1, 1, -1, -1, 0))             # matrix of contrast vectors
psiHat <- cntr   %*% Mj                         # estimates psi-hat
lenSq  <- cntr^2 %*% (1/Nj)                     # squared lengths of contrast vectors
tStat  <- psiHat / sqrt(lenSq*MSE)              # t-statistics
pVal   <- 2*(1-pt(abs(tStat), dfSSE))           # p-values
data.frame(psiHat, tStat, pVal)

Für mehrere Vergleiche müsste man überlegen α-Korrekturmethoden, zB Bonferroni.

Die entsprechenden Berechnungen für das Beispiel von Maxwell & Delaney (2004) auf S. 22. 599f finden Sie hier . Beachten Sie, dass M & D den F-Wert berechnet. Um zu sehen, dass die Ergebnisse identisch sind, müssen Sie den Wert für die t-Statistik quadrieren. Dieser Code enthält auch die mit Anova()from durchgeführte Analyse carsowie eine manuelle Berechnung derϵ^ Korrekturen für den Haupteffekt des Innenfaktors.

caracal
quelle
Gute Antwort. Das ist mehr oder weniger das, was ich getan hätte, wenn ich die Geduld gehabt hätte, alles auszuarbeiten.
Aaron hat Stack Overflow
Danke für deine ausführliche Antwort. Obwohl es in der Praxis etwas unhandlich erscheint.
Henrik