Повторные измерения/внутри объекта ANOVA в R
Я пытаюсь запустить ANOVA с повторяющимися комментариями, используя R. Я просмотрел различные примеры на разных сайтах, но они никогда не говорят об ошибке, с которой я сталкиваюсь. Я предполагаю, что я неправильно понимаю что-то важное.
ANOVA Я пытаюсь запустить некоторые данные из эксперимента, используя человеческих участников. Он имеет один DV и три IV. Все уровни всех IV-х выполняются на всех участниках, что делает его трехсторонним повторным измерением/внутри-субъектами ANOVA.
Код, который я запускаю в R, выглядит следующим образом:
aov.output = aov(DV~ IV1 * IV2 * IV3 + Error(PARTICIPANT_ID / (IV1 * IV2 * IV3)),
data=fulldata)
Когда я запустил это, я получаю следующее предупреждение:
Error() model is singular
Любые идеи, что я могу делать неправильно?
Ответы
Ответ 1
Попробуйте использовать функцию lmer в пакете lme4. Функция aov, вероятно, не подходит здесь. Ищите ссылки от Dougles Bates, например. http://lme4.r-forge.r-project.org/book/Ch4.pdf (другие главы тоже велики, но это глава повторных мер, это вступление: http://lme4.r-forge.r-project.org/book/Ch1.pdf). R-код находится в одном и том же месте и для продольных данных, кажется, в наши дни, как правило, считается неправильным, чтобы просто подогнать OLS вместо компонентов модели дисперсии, например, в пакете lme4, или в nlme, который мне кажется в последнее время сильно обогнал lme4. Вы можете отметить ссылку Брайана Рипли, указанную в разделе комментариев выше, просто рекомендует также переключиться на lme.
Кстати, огромное преимущество от прыжка - вы сможете получить оценки уровня каждого эффекта в качестве корректировки среднего значения с типичным синтаксисом:
lmer(DV ~ 1 +IV1*IV2*IV3 +(IV1*IV2*IV3|Subject), dataset))
Обратите внимание, что ваши случайные эффекты будут оцениваться по вектору.
Ответ 2
Я знаю, что ответ был выбран для этого сообщения. Я все же хочу указать, как указать правильный коэффициент ошибки/случайный эффект при подгонке модели aov
или lmer
к многорежимным данным повторных измерений. Я предполагаю, что обе независимые переменные (IV) фиксированы и пересекаются друг с другом и с субъектами, то есть все предметы подвергаются воздействию всех комбинаций IV. Я собираюсь использовать данные, взятые из экспериментального Deisign Kirks: процедуры для поведенческих наук (2013).
library(lme4)
library(foreign)
library(lmerTest)
library(dplyr)
file_name <- "http://www.ats.ucla.edu/stat/stata/examples/kirk/rbf33.dta" #1
d <- read.dta(file_name) %>% #2
mutate(a_f = factor(a), b_f = factor(b), s_f = factor(s)) #3
head(d)
## a b s y a_f b_f s_f
## 1 1 1 1 37 1 1 1
## 2 1 2 1 43 1 2 1
## 3 1 3 1 48 1 3 1
## 4 2 1 1 39 2 1 1
## 5 2 2 1 35 2 2 1
В этом исследовании 5 испытуемых подвергаются двум методам лечения - типу ритма (a) и продолжительности тренировки (b) - по 3 уровня каждый. Переменной результата является отношение к меньшинству. В # 3 я сделал a, b и s в фактор-переменные a_f, b_f и s_f. Пусть p и q - числа уровней для a_f и b_f (3 каждый), а n - размер выборки (5).
В этом примере степени свободы (dfs) для тестов a_f, b_f и их взаимодействия должны быть p-1 = 2, q-1 = 2 и (p-1) * (q-1) = 4, соответственно. Df для члена ошибки s_f является (n-1) = 4, а df для члена ошибки In (s_f: a_f: b_f) является (n-1) (pq-1) = 32. Поэтому правильная модель должна предоставить вам эти dfs.
Использование aov
Теперь попробуйте использовать различные спецификации модели, используя aov
:
aov(y ~ a_f*b_f + Error(s_f), data=d) %>% summary() # m1
aov(y ~ a_f*b_f + Error(s_f/a_f:b_f), data=d) %>% summary() # m2
aov(y ~ a_f*b_f + Error(s_f/a_f*b_f), data=d) %>% summary() # m3
Просто указывая ошибку как Error(s_f)
в m1, вы получите правильные значения dfs и F, соответствующие значениям в книге. m2 также дает то же значение, что и m1, но также печально известная модель "Предупреждение: ошибка()". m3 делает что-то странное. Он далее разбивает внутри остатков в m1 (634.9) на остатки для трех членов ошибки: s_f: a_f (174.2), s_f: b_f (173.6) и s_f: a_f: b_f (287.1). Это неверно, так как мы не получили три условия ошибки, когда мы запускаем двухстороннюю связь между объектами ANOVA! Множественные термины ошибок также противоречат точке использования блок-факториалов, что позволяет использовать тот же самый коэффициент ошибок для теста A, B и AB, в отличие от схем с раздельными графиками, для которых требуется 2 условия ошибки.
Использование lmer
Как мы можем получить те же самые dfs и F-значения, используя lmer? Если ваши данные сбалансированы, приближение Kenward-Roger, используемое в lmerTest
, даст вам точные dfs и F-ratio.
lmer(y ~ a_f*b_f + (1|s_f), data=d) %>% anova() # mem1
lmer(y ~ a_f*b_f + (1|s_f/a_f:b_f), data=d) %>% anova() # mem2
lmer(y ~ a_f*b_f + (1|s_f/a_f*b_f), data=d) %>% anova() # mem3
lmer(y ~ a_f*b_f + (1|s_f:a_f:b_f), data=d) %>% anova() # mem4
lmer(y ~ a_f*b_f + (a_f*b_f|s_f), data=d) %>% anova() # mem5
Снова просто указывая случайный эффект как (1|s_f)
, вы получите правильные dfs и F-отношения (mem1). mem2-5 даже не дал результатов, по-видимому, количество случайных эффектов, которые ему нужно было оценить, было больше, чем размер выборки.