Розглянемо дані сонливого дослідження, включені до lme4. Бейтс обговорює це у своїй онлайн- книзі про lme4. У главі 3 він розглядає дві моделі даних.
М0 : Реакція ∼ 1 + днів + ( 1 | тема ) + ( 0 + днів | тема )
і
МA : Реакція ∼ 1 + днів + ( днів | тема )
У дослідженні брали участь 18 суб'єктів, які вивчалися протягом 10 днів, позбавлених сну. Часи реакцій обчислювались за базовою лінією та наступними днями. Існує чіткий ефект між часом реакції та тривалістю позбавлення сну. Існують також значні відмінності між предметами. Модель A передбачає можливість взаємодії між випадковими перехопленнями та нахилами: уявіть, скажімо, що люди з поганим часом реакції гостріше страждають від наслідків позбавлення сну. Це означатиме позитивну кореляцію випадкових ефектів.
У прикладі Бейтса не було явної кореляції з графіком Решітки і не було суттєвої різниці між моделями. Однак, щоб дослідити поставлене вище питання, я вирішив взяти відповідні значення сонника, підняти кореляцію і подивитися на ефективність двох моделей.
Як видно із зображення, тривалі реакційні часи пов'язані з більшою втратою продуктивності. Кореляція, використана для моделювання, становила 0,58
Я моделював 1000 зразків, використовуючи метод імітації в lme4, спираючись на відповідні значення моїх штучних даних. Я підходив до M0 та Ma до кожного і дивився на результати. Початковий набір даних мав 180 спостережень (10 для кожного з 18 суб'єктів), а модельовані дані мають однакову структуру.
Суть полягає в тому, що різниці є дуже мало.
- Фіксовані параметри мають однакові значення в обох моделях.
- Випадкові ефекти дещо відрізняються. Для кожного модельованого зразка існує 18 випадкових ефектів перехоплення та 18 нахилів. Для кожного зразка ці ефекти змушені додавати до 0, що означає, що середня різниця між двома моделями становить (штучно) 0. Але дисперсії та коваріації відрізняються. Середня коваріація за МА становила 104, проти 84 під М0 (фактичне значення, 112). Дисперсії укосів та перехрестів були меншими за М0, ніж МА, імовірно, для отримання додаткової махової кімнати, необхідної за відсутності параметра вільної коваріації.
- Метод ANOVA для lmer дає F-статистику для порівняння моделі Slope з моделлю лише з випадковим перехопленням (ніякого ефекту через депривацію сну). Зрозуміло, що це значення було дуже великим для обох моделей, але воно було типово (але не завжди) більшим за МА (середнє значення 62 проти середнього значення 55).
- Коваріація та дисперсія фіксованих ефектів різні.
- Близько половини часу знає, що МА є правильним. Середнє значення p для порівняння M0 з MA становить 0,0442. Незважаючи на наявність значущої кореляції та 180 збалансованих спостережень, правильну модель обрали б лише приблизно в половині часу.
- Прогнозовані значення відрізняються в двох моделях, але дуже незначно. Середня різниця між прогнозами - 0, з sd 2,7. Sd самих передбачуваних значень становить 60,9
То чому це відбувається? @gung обґрунтовано здогадувався, що невключення можливості кореляції змушує випадкові ефекти бути некорельованими. Можливо, так і слід; але в цій реалізації дозволено співвідносити випадкові ефекти, що означає, що дані здатні витягувати параметри в потрібному напрямку, незалежно від моделі. Помилковість неправильної моделі виявляється, ймовірно, саме тому ви можете (іноді) розрізняти дві моделі на цьому рівні. Модель змішаних ефектів в основному відповідає лінійним регресіям для кожного суб'єкта, під впливом того, що модель вважає, що вони повинні бути. Неправильна модель примушує відповідати менш правдоподібним значенням, ніж ви отримуєте за правильної моделі. Але в кінці дня параметри регулюються відповідно до фактичних даних.
Ось мій дещо незграбний код. Ідея полягала в тому, щоб пристосувати дані дослідження сну, а потім побудувати модельований набір даних із тими ж параметрами, але більша кореляція випадкових ефектів. Цей набір даних подавали для simulate.lmer () для імітації 1000 зразків, кожен з яких відповідав обом способам. Після того, як я поєднав вмонтовані предмети, я міг витягнути різні функції пристосування та порівняти їх, використовуючи t-тести чи що завгодно.
# Fit a model to the sleep study data, allowing non-zero correlation
fm01 <- lmer(Reaction ~ 1 + Days +(1+Days|Subject), data=sleepstudy, REML=FALSE)
# Now use this to build a similar data set with a correlation = 0.9
# Here is the covariance function for the random effects
# The variances come from the sleep study. The covariance is chosen to give a larger correlation
sigma.Subjects <- matrix(c(565.5,122,122,32.68),2,2)
# Simulate 18 pairs of random effects
ranef.sim <- mvrnorm(18,mu=c(0,0),Sigma=sigma.Subjects)
# Pull out the pattern of days and subjects.
XXM <- model.frame(fm01)
n <- nrow(XXM) # Sample size
# Add an intercept to the model matrix.
XX.f <- cbind(rep(1,n),XXM[,2])
# Calculate the fixed effects, using the parameters from the sleep study.
yhat <- XX.f %*% fixef(fm01 )
# Simulate a random intercept for each subject
intercept.r <- rep(ranef.sim[,1], each=10)
# Now build the random slopes
slope.r <- XXM[,2]*rep(ranef.sim[,2],each=10)
# Add the slopes to the random intercepts and fixed effects
yhat2 <- yhat+intercept.r+slope.r
# And finally, add some noise, using the variance from the sleep study
y <- yhat2 + rnorm(n,mean=0,sd=sigma(fm01))
# Here is new "sleep study" data, with a stronger correlation.
new.data <- data.frame(Reaction=y,Days=XXM$Days,Subject=XXM$Subject)
# Fit the new data with its correct model
fm.sim <- lmer(Reaction ~ 1 + Days +(1+Days|Subject), data=new.data, REML=FALSE)
# Have a look at it
xyplot(Reaction ~ Days | Subject, data=new.data, layout=c(6,3), type=c("p","r"))
# Now simulate 1000 new data sets like new.data and fit each one
# using the right model and zero correlation model.
# For each simulation, output a list containing the fit from each and
# the ANOVA comparing them.
n.sim <- 1000
sim.data <- vector(mode="list",)
tempReaction <- simulate(fm.sim, nsim=n.sim)
tempdata <- model.frame(fm.sim)
for (i in 1:n.sim){
tempdata$Reaction <- tempReaction[,i]
output0 <- lmer(Reaction ~ 1 + Days +(1|Subject)+(0+Days|Subject), data = tempdata, REML=FALSE)
output1 <- lmer(Reaction ~ 1 + Days +(Days|Subject), data=tempdata, REML=FALSE)
temp <- anova(output0,output1)
pval <- temp$`Pr(>Chisq)`[2]
sim.data[[i]] <- list(model0=output0,modelA=output1, pvalue=pval)
}