передбачити () функцію для lmer моделей змішаних ефектів


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(емоційна конотація слова, що запам'ятовується), або МГС.з Caffeineзаковтування перед випробуванням.

Ідея полягає в тому, що для дротяних предметів з гіперкофеїном легко запам'ятовується, але ця здатність з часом знижується, можливо, через втому. Слова з негативною конотацією складніше запам’ятати. Освіта має передбачуваний ефект, і навіть аудиторія відіграє певну роль (можливо, хтось був більш галасливим, або менш комфортним). Ось пара дослідницьких сюжетів:


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

Відмінності швидкості виклику як функції Emotional Tone, Auditoriumі Education:

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


Під час встановлення рядків у хмарі даних для дзвінка:

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

Я отримую цей сюжет:

із наступним кодом (зверніть увагу на виклик для <code> predict (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?


EDIT для швидкого доступу ... Формула для обчислення прогнозованого значення (відповідно до прийнятої відповіді буде базуватися на 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 ::: predict.merMod у командному рядку R та перевірити джерело на наявність основних компільованих функцій у пакеті джерела для lme4.
EdM

1
Дякую, я бачу, що є функціонал із випадковими ефектами, які не враховуються або включаються. Чи знаєте ви, де я можу знайти, як це обчислюється? Якщо я надрукую ?predictна консолі [r], я отримаю основний прогноз для {stats} ...
Antoni Parellada

@EdM ... так, це для мене нове ... Дякую. Я не дзвонив predict.merMod, хоча ... Як ви бачите на ОП, я зателефонував просто predict...
Антоні Парелада

1
Завантажте lme4пакунок, а потім введіть lme4 ::: predict.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: Так, представлені дані здаються перекресленими (Time x Subject), а не вкладеною конструкцією, але саме таким чином ОП поставило питання про інтерпретацію lme4результатів. Крім того, представлені дані здаються для ілюстрації, а не справжніми дослідженнями, що підлягають аналізу.
EdM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.