Як вказати конкретні контрасти для повторних заходів ANOVA за допомогою автомобіля?


12

Я намагаюся виконати повторні заходи Anova in R з деякими специфічними контрастами на цьому наборі даних. Я думаю, що правильним підходом було б використання Anova()з автомобільного пакета.

Проілюструємо моє запитання на прикладі, взятому із ?Anovaвикористання OBrienKaiserданих (Примітка. Я припустив гендерний фактор із прикладу):
У нас є дизайн з одним фактором між предметами, лікуванням (3 рівня: контроль, A, B) та 2 повторення -заходи (в межах суб'єктів) факторів, фаза (3 рівня: попередній тест, післятест, подальший контроль) та година (5 рівнів: від 1 до 5).

Стандартна таблиця ANOVA задана (на відміну від прикладу (Anova), я перейшов до типу 3 Суми квадратів, тобто те, чого хоче моє поле):

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)

Тепер уявіть, що взаємодія найвищого порядку була б значною (що не має місце), і ми хотіли б вивчити її далі за допомогою наступних контрастів:
Чи є різниця між годинами 1 та 2 проти годин 3 (протилежність 1) та між годинами 1 та 2 проти годин 4 і 5 (протилежність 2) в умовах лікування (A&B разом)?
Іншими словами, як вказати ці контрасти:

  1. ((treatment %in% c("A", "B")) & (hour %in% 1:2)) проти ((treatment %in% c("A", "B")) & (hour %in% 3))
  2. ((treatment %in% c("A", "B")) & (hour %in% 1:2)) проти ((treatment %in% c("A", "B")) & (hour %in% 4:5))

Моя ідея полягала б у тому, щоб запустити ще одну ANOVA, опускаючи не потрібні умови лікування (контроль):

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)

Однак я все ще не маю уявлення, як встановити відповідну контрастну матрицю контрастування для предметів, порівнюючи години 1 і 2 з 3 та 1 і 2 з 4 і 5. І я не впевнений, чи справді пропущення непотрібної групи лікування є гарною ідеєю, оскільки це змінює загальний термін помилки.

Перед тим, як їхати, Anova()я теж думав, що йтиму lme. Однак існують невеликі відмінності у значеннях F і p між підручником ANOVA та тим, що повертається з- anove(lme) за можливих негативних відхилень у стандартній ANOVA (які не допускаютьсяlme ). Так само хтось вказував мені на те, glsщо дозволяє встановити повторні заходи ANOVA, однак це не має протилежного аргументу.

Для уточнення: я хочу тест F або t (використовуючи суми квадратів типу III), який відповідає на те, чи бажані контрасти значні чи ні.


Оновлення:

Я вже задавав дуже схоже запитання щодо R-help, відповіді не було .

Подібні запитання виникли на R-help деякий час тому. Однак відповіді також не вирішили проблеми.


Оновлення (2015 р.):

Оскільки це питання все ще породжує деяку активність, уточнюючи тези та в основному всі інші контрасти тепер можна зробити порівняно легко з afexпакетом у поєднанні з lsmeansпакетом, як описано в віньетці afex .


1
Ви вже вирішили проти використання t-тестів? Що я маю на увазі: 1) викинути дані з контрольної групи, 2) ігнорувати різні рівні treatment, 3) для кожної людини в середньому за рівні prePostFup, 4) для кожної людини в середньому за години 1,2 (= група даних 1) а також за години 3,4 (= група даних 2), 5) провести t-тест для 2 залежних груп. Оскільки Maxwell & Delaney (2004), а також Kirk (1995) відмовляють від контрастування з об'єднаним помилковим терміном в рамках дизайну, це може бути простою альтернативою.
каракал

Я хотів би зробити контрастні аналізи та не об'єднати тести. Причина полягає в тому, що контрасти (незважаючи на їх проблеми), здається, є стандартною процедурою в психології і є те, чого хочуть читачі / рецензенти / керівники. Крім того, вони є відносно прямими вперед в SPSS. Однак, незважаючи на те, що я до цього часу був активним користувачем R, я не зміг цього досягти з Р. Зараз мені доведеться виконати деякі контрасти, і я не хочу повертатися до SPSS тільки для цього. Коли R - це майбутнє (яке, на мою думку, є), повинні бути можливі контрасти.
Генрік

Відповіді:


6

Цей метод, як правило, вважається «старомодним», тому, хоча це можливо, синтаксис важкий, і я підозрюю, що менше людей знає, як маніпулювати командами anova, щоб отримати те, що ви хочете. Більш поширеним методом є використання glhtна основі ймовірності моделі з nlmeабо lme4. (Я, безумовно, вітаю, що мене підтвердили неправильні інші відповіді.)

Це говорило, що якщо мені потрібно це зробити, я б не переймався командами anova; Я б просто підходив до еквівалентної моделі, використовуючи lm, підбирати правильний термін помилки для цього контрасту і сам обчислювати тест F (або, що еквівалентно, t тест, оскільки є лише 1 df). Це вимагає, щоб все було врівноваженим і мати сферичність, але якщо у вас цього немає, ви, мабуть, повинні використовувати модель, засновану на вірогідності. Можливо, ви зможете дещо виправити несферичність, скориставшись поправками Greenhouse-Geiser або Huynh-Feldt, які (я вважаю) використовують ту саму статистику F, але змінюють df терміна помилки.

Якщо ви дійсно хочете скористатися car, ви можете знайти корисні віньєтки; вони описують, як визначаються матриці в carпакеті.

Використовуючи метод каракала (для контрастів 1 & 2 - 3 та 1 & 2 - 4 & 5), я отримую

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

Ось як я отримав ті самі p-значення:

Переформатуйте дані у довгий формат та запустіть, lmщоб отримати всі умови SS.

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)

Складіть альтернативну матрицю контрасту на часовий термін.

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

Переконайтесь, що мої контрасти дають той самий SS, що і контраст за замовчуванням (і такий самий, як і для повної моделі).

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

Отримайте SS та df лише для двох контрастів, які я хочу.

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

Отримайте р-значення.

> 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

Необов’язково регулюйте сферичність.

pf(F, 1*.48867, 52*.48867, lower=FALSE)
pf(F, 1*.57413, 52*.57413, lower=FALSE)

Це теж працює! І дякую за посилання на heplotsвіньєтку, це справді хороший підсумок того, що відбувається з точки зору загальної лінійної моделі.
каракал

Дуже дякую. Я прийму цю відповідь (замість іншої чудової відповіді), оскільки вона включає деяку думку про корекцію сферичності.
Генрік

Примітка майбутнім читачам: корекція сферичності однаково застосовна і для іншого рішення.
Аарон залишив стек переповнення

6

Якщо ви хочете / маєте використовувати контрасти зі збірним терміном помилки з відповідної ANOVA, ви можете зробити наступне. На жаль, це буде довго, і я не знаю, як це зробити зручніше. Але я вважаю, що результати є правильними, оскільки вони підтверджені проти Maxwell & Delaney (див. Нижче).

Ви хочете порівняти групи вашого першого в межах фактора hourв дизайні SPF-p.qr (позначення від Кірка (1995)): Спліт -графік-факторний дизайн 1 між фактором treatmentз p групами, перший у факторі hourз q групами, другий у межах фактору prePostFupз r групи). Далі передбачається однакові за розміром treatmentгрупи та сферичність.

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

По-перше, зауважте, що головний ефект для hourоднакового після усереднення prePostFup, таким чином, переходить до більш простої SPF-pq конструкції, яка містить лише treatmentі hourяк IV.

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

Тепер зауважимо, що в SPF-pq ANOVA ефект для hourтестується на взаємодію id:hour, тобто ця взаємодія забезпечує термін помилки для тесту. Тепер контрасти для hourгруп можна перевірити так само, як і в поперечному між суб'єктами ANOVA, просто замінивши термін помилки та відповідні ступені свободи. Найпростіший спосіб отримати SS та df цієї взаємодії - це підходити до моделі 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

Але давайте також тут все обчислимо вручну.

# 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

Тепер, коли у нас є правильний термін помилки, ми можемо побудувати звичайну тестову статистику для планових порівнянь: де - контрастний вектор,- його довжина, - оцінка контрасту, а - середній квадрат для взаємодії (відповідний термін помилки). c| | c| | Ψ=QΣK=1здоМ. kMSEt=ψ^0||c||MSEc||c||ψ^=k=1qckM.kMSEhour:id

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)

Для кількох порівнянь вам доведеться подумати про методи виправлення, наприклад, Бонферроні.α

Відповідні розрахунки для прикладу Maxwell & Delaney (2004) на с. 599f можна знайти тут . Зауважте, що M&D обчислює F-значення, щоб побачити, що результати однакові, ви повинні квадратне значення для t-статистики. Цей код також включає в себе аналіз , зроблений з Anova()від car, а також ручного розрахунку корекцій для основного ефекту внутрішньо-фактора.ϵ^


Гарна відповідь. Це більш-менш те, що я зробив би, якби мав терпіння все це виправити.
Аарон залишив стек переповнення

Дякуємо за детальну відповідь. Хоча на практиці це здається трохи непохитним.
Генрік
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.