функция предиката () для моделей со смешанными эффектами

27

Проблема:

Я читал в других сообщениях, которые predictнедоступны для lmerмоделей со смешанными эффектами {lme4} в [R].

Я пытался исследовать эту тему с набором игрушечных данных ...

Задний план:

Набор данных адаптирован из этого источника и доступен как ...

require(gsheet)
data <- read.csv(text = 
     gsheet2text('https://docs.google.com/spreadsheets/d/1QgtDcGJebyfW7TJsB8n6rAmsyAnlz1xkT3RuPFICTdk/edit?usp=sharing',
        format ='csv'))

Это первые строки и заголовки:

> head(data)
  Subject Auditorium Education Time  Emotion Caffeine Recall
1     Jim          A        HS    0 Negative       95 125.80
2     Jim          A        HS    0  Neutral       86 123.60
3     Jim          A        HS    0 Positive      180 204.00
4     Jim          A        HS    1 Negative      200  95.72
5     Jim          A        HS    1  Neutral       40  75.80
6     Jim          A        HS    1 Positive       30  84.56

У нас есть несколько повторных наблюдений ( Time) непрерывного измерения, а именно, Recallскорости некоторых слов, и нескольких объясняющих переменных, в том числе случайных эффектов ( Auditoriumгде проходил тест; Subjectимя); и фиксированные эффекты , такие как Education, Emotion(эмоциональная коннотация слова запомнить), или из заглатывании до испытания.mgs.Caffeine

Идея состоит в том, что это легко запомнить для проводников с гипер-кофеином, но способность уменьшается со временем, возможно, из-за усталости. Слова с негативной коннотацией труднее запомнить. Образование имеет предсказуемый эффект, и даже аудитория играет роль (возможно, кто-то был более шумным или менее комфортным). Вот пара поисковых участков:


введите описание изображения здесь

Различия в скорости припоминания как функции Emotional Tone, Auditoriumи Education:

введите описание изображения здесь


При подгонке линий в облаке данных для звонка:

fit1 <- lmer(Recall ~ (1|Subject) + Caffeine, data = data)

Я получаю этот сюжет:

со следующим кодом (обратите внимание на вызов <code> предиката (fit1) </ code> в нем):

library(ggplot2)
p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
  geom_point(size=3) +
  geom_line(aes(y = predict(fit1)),size=1) 
print(p)

пока следующая модель:

fit2 <- lmer(Recall ~ (1|Subject/Time) + Caffeine, data = data)

включение Timeи параллельный код получают удивительный сюжет:

p <- ggplot(data, aes(x = Caffeine, y = Recall, colour = Subject)) +
  geom_point(size=3) +
  geom_line(aes(y = predict(fit2)),size=1) 
print(p)

введите описание изображения здесь


Вопрос:

Как работает predictфункция в этой lmerмодели? Очевидно, что он принимает во внимание Timeпеременную, что приводит к гораздо более плотной подгонке, и зигзагообразному движению, которое пытается отобразить это третье измерение, Timeизображаемое на первом графике.

Если я звоню, predict(fit2)я получаю 132.45609за первую запись, которая соответствует первой точке. Вот headнабор данных с выводом predict(fit2)присоединенного в качестве последнего столбца:

> data$predict = predict(fit2)
> head(data)
  Subject Auditorium Education Time  Emotion Caffeine Recall   predict
1     Jim          A        HS    0 Negative       95 125.80 132.45609
2     Jim          A        HS    0  Neutral       86 123.60 130.55145
3     Jim          A        HS    0 Positive      180 204.00 150.44439
4     Jim          A        HS    1 Negative      200  95.72 112.37045
5     Jim          A        HS    1  Neutral       40  75.80  78.51012
6     Jim          A        HS    1 Positive       30  84.56  76.39385

Коэффициенты для fit2:

$`Time:Subject`
         (Intercept)  Caffeine
0:Jason     75.03040 0.2116271
0:Jim       94.96442 0.2116271
0:Ron       58.72037 0.2116271
0:Tina      70.81225 0.2116271
0:Victor    86.31101 0.2116271
1:Jason     59.85016 0.2116271
1:Jim       52.65793 0.2116271
1:Ron       57.48987 0.2116271
1:Tina      68.43393 0.2116271
1:Victor    79.18386 0.2116271
2:Jason     43.71483 0.2116271
2:Jim       42.08250 0.2116271
2:Ron       58.44521 0.2116271
2:Tina      44.73748 0.2116271
2:Victor    36.33979 0.2116271

$Subject
       (Intercept)  Caffeine
Jason     30.40435 0.2116271
Jim       79.30537 0.2116271
Ron       13.06175 0.2116271
Tina      54.12216 0.2116271
Victor   132.69770 0.2116271

Моя лучшая ставка была ...

> coef(fit2)[[1]][2,1]
[1] 94.96442
> coef(fit2)[[2]][2,1]
[1] 79.30537
> coef(fit2)[[1]][2,2]
[1] 0.2116271
> data$Caffeine[1]
[1] 95
> coef(fit2)[[1]][2,1] + coef(fit2)[[2]][2,1] + coef(fit2)[[1]][2,2] * data$Caffeine[1]
[1] 194.3744

Какую формулу получить вместо этого 132.45609?


РЕДАКТИРОВАТЬ для быстрого доступа ... Формула для расчета прогнозируемого значения (в соответствии с принятым ответом будет основываться на ranef(fit2)выходных данных:

> ranef(fit2)
$`Time:Subject`
         (Intercept)
0:Jason    13.112130
0:Jim      33.046151
0:Ron      -3.197895
0:Tina      8.893985
0:Victor   24.392738
1:Jason    -2.068105
1:Jim      -9.260334
1:Ron      -4.428399
1:Tina      6.515667
1:Victor   17.265589
2:Jason   -18.203436
2:Jim     -19.835771
2:Ron      -3.473053
2:Tina    -17.180791
2:Victor  -25.578477

$Subject
       (Intercept)
Jason   -31.513915
Jim      17.387103
Ron     -48.856516
Tina     -7.796104
Victor   70.779432

... для первой точки входа:

> summary(fit2)$coef[1]
[1] 61.91827             # Overall intercept for Fixed Effects 
> ranef(fit2)[[1]][2,]   
[1] 33.04615             # Time:Subject random intercept for Jim
> ranef(fit2)[[2]][2,]
[1] 17.3871              # Subject random intercept for Jim
> summary(fit2)$coef[2]
[1] 0.2116271            # Fixed effect slope
> data$Caffeine[1]
[1] 95                   # Value of caffeine

summary(fit2)$coef[1] + ranef(fit2)[[1]][2,] + ranef(fit2)[[2]][2,] + 
                    summary(fit2)$coef[2] * data$Caffeine[1]
[1] 132.4561

Код для этого поста здесь .

Антони Пареллада
источник
3
Обратите внимание, что predictв этом пакете была функция с версии 1.0-0, выпущенной 2013-08-01. Смотрите страницу новостей пакета в CRAN . Если бы не было, вы бы не смогли получить никаких результатов predict. Не забывайте, что вы можете увидеть код R с помощью lme4 ::: Forex.merMod в командной строке R и проверить исходный код на предмет наличия каких-либо базовых скомпилированных функций в пакете с исходным кодом lme4.
EdM
1
Спасибо, я вижу, что есть функциональность со случайными эффектами, игнорируемыми или включенными. Вы знаете, где я могу найти, как это рассчитывается? Если я ?predict
наберу на
@ EDM ... да, это для меня в новинку ... Спасибо. Я не звонил predict.merMod, хотя ... Как вы можете видеть на OP, я звонил просто predict...
Антони Пареллада
1
Загрузите lme4пакет, затем введите lme4 ::: Forext.merMod, чтобы увидеть версию для конкретного пакета. Выходные данные lmerхранятся в объекте класса merMod.
EdM
4
Одна из прелестей R в том, что подобная функция predictзнает, что делать в зависимости от класса объекта, на который она призвана воздействовать. Ты звонил predict.merMod, ты просто не знал этого.
EdM

Ответы:

25

Легко запутаться в представлении коэффициентов, когда вы звоните coef(fit2). Посмотрите на сводку fit2:

> summary(fit2)
Linear mixed model fit by REML ['lmerMod']
Formula: Recall ~ (1 | Subject/Time) + Caffeine
   Data: data
REML criterion at convergence: 444.5

Scaled residuals: 
 Min       1Q   Median       3Q      Max 
-1.88657 -0.46382 -0.06054  0.31430  2.16244 

Random effects:
 Groups       Name        Variance Std.Dev.
 Time:Subject (Intercept)  558.4   23.63   
 Subject      (Intercept) 2458.0   49.58   
 Residual                  675.0   25.98   
Number of obs: 45, groups:  Time:Subject, 15; Subject, 5

Fixed effects:
Estimate Std. Error t value
(Intercept) 61.91827   25.04930   2.472
Caffeine     0.21163    0.07439   2.845

Correlation of Fixed Effects:
 (Intr)
Caffeine -0.365

Для модели существует общий перехват 61,92 с коэффициентом кофеина 0,212. Таким образом, для кофеина = 95 вы прогнозируете в среднем 82,06 отзыва.

Вместо использования coefиспользуйте ranefдля получения разницы каждого перехвата со случайным эффектом от среднего перехвата на следующем более высоком уровне вложенности:

> ranef(fit2)
$`Time:Subject`
         (Intercept)
0:Jason    13.112130
0:Jim      33.046151
0:Ron      -3.197895
0:Tina      8.893985
0:Victor   24.392738
1:Jason    -2.068105
1:Jim      -9.260334
1:Ron      -4.428399
1:Tina      6.515667
1:Victor   17.265589
2:Jason   -18.203436
2:Jim     -19.835771
2:Ron      -3.473053
2:Tina    -17.180791
2:Victor  -25.578477
$Subject
       (Intercept)
Jason   -31.513915
Jim      17.387103
Ron     -48.856516
Tina     -7.796104
Victor   70.779432

Значения для Джима во время = 0 будут отличаться от этого среднего значения 82,06 на сумму его Subject и его Time:Subjectкоэффициентов:

82.06+17.39+33.04=132.49

который, я думаю, находится в пределах ошибки округления 132,46.

coefКажется, что возвращаемые значения перехвата представляют общий перехват плюс Subjectили Time:Subjectконкретные различия, поэтому с ними сложнее работать; если вы попытаетесь выполнить вышеуказанный расчет со coefзначениями, вы будете дважды считать общий перехват.

магистр педагогических наук
источник
Спасибо! Это было замечательно! Я не думаю , что есть какая - либо точка оставить его открыть ... Это ответ, не так ли?
Антони Пареллада
Я получил подсказку ranefот изучения кода R в lme4. Я уточнил презентацию в нескольких местах.
EdM
(+1) Примечание: временные случайные эффекты, вложенные в человека, выглядят странно.
Майкл М
@MichaelM: Да, представленные данные представляются скорее скрещенными (время х субъект), а не вложенным дизайном, но именно таким образом OP поднял вопрос о том, как интерпретировать lme4вывод. Кроме того, представленные данные, по-видимому, были для иллюстрации, а не для реального исследования, которое нужно проанализировать.
EdM