Как смоделировать данные, чтобы продемонстрировать смешанные эффекты с R (lme4)?

10

Как аналог этого поста , я работал над моделированием данных с непрерывными переменными, подстраиваясь под коррелированные перехваты и уклоны.

Хотя на сайте и за его пределами есть отличные сообщения на эту тему , у меня возникли трудности с поиском от начала до конца примера с симулированными данными, параллельными простому реальному сценарию.

Поэтому вопрос состоит в том, как смоделировать эти данные и «протестировать» их lmer. Ничего нового для многих, но, возможно, полезного для многих других, стремящихся понять смешанные модели.

Антони Пареллада
источник

Ответы:

8

Если вы предпочитаете формат статьи в блоге, я написал статью об иерархических линейных моделях и lmer , в которой представлена ​​симуляция со случайными наклонами и перехватами. Вот код симуляции, который я использовал:

rm(list = ls())
set.seed(2345)

N <- 30
unit.df <- data.frame(unit = c(1:N), a = rnorm(N))

head(unit.df, 3)
unit.df <-  within(unit.df, {
  E.alpha.given.a <-  1 - 0.15 * a
  E.beta.given.a <-  3 + 0.3 * a
})
head(unit.df, 3)

library(mvtnorm)
q = 0.2
r = 0.9
s = 0.5
cov.matrix <- matrix(c(q^2, r * q * s, r * q * s, s^2), nrow = 2,
                     byrow = TRUE)
random.effects <- rmvnorm(N, mean = c(0, 0), sigma = cov.matrix)
unit.df$alpha <- unit.df$E.alpha.given.a + random.effects[, 1]
unit.df$beta <- unit.df$E.beta.given.a + random.effects[, 2]
head(unit.df, 3)

J <- 30
M = J * N  #Total number of observations
x.grid = seq(-4, 4, by = 8/J)[0:30]

within.unit.df <-  data.frame(unit = sort(rep(c(1:N), J)), j = rep(c(1:J),
                              N), x =rep(x.grid, N))
flat.df = merge(unit.df, within.unit.df)

flat.df <-  within(flat.df, y <-  alpha + x * beta + 0.75 * rnorm(n = M))
simple.df <-  flat.df[, c("unit", "a", "x", "y")]
head(simple.df, 3)

library(lme4)
my.lmer <-  lmer(y ~ x + (1 + x | unit), data = simple.df)
cat("AIC =", AIC(my.lmer))
my.lmer <-  lmer(y ~ x + a + x * a + (1 + x | unit), data = simple.df)
summary(my.lmer)
Бен Огорек
источник
1
Бен, спасибо за ответ! Я сейчас очень занят, но я внимательно посмотрю, как только у меня появится шанс. + в кредит :-)
Антони Пареллада
1

Данные полностью вымышлены, и код, который я использовал для их генерации, можно найти здесь .

Идея состоит в том, что мы будем проводить измерения glucose concentrationsв группе 30 athletesпо завершении 15 racesв отношении концентрации искусственной amino acid A( AAA) в крови этих спортсменов.

Модель является: lmer(glucose ~ AAA + (1 + AAA | athletes)

Существует фиксированный наклон эффекта (концентрация глюкозы ~ аминокислоты A); Однако, склоны также различаются между различными спортсменами с mean = 0и sd = 0.5, в то время как перехватывает для различных спортсменов распространены случайные эффекты вокруг 0с sd = 0.2. Кроме того, существует корреляция между перехватами и уклонами 0,8 в пределах одного и того же спортсмена.

Эти случайные эффекты добавляются к выбранным intercept = 1для фиксированных эффектов, и slope = 2.

Значения концентрации глюкозы были рассчитаны как alpha + AAA * beta + 0.75 * rnorm(observations): значение перехвата для каждого спортсмена (то есть 1 + random effects changes in the intercept) концентрация аминокислоты, наклон для каждого спортсмена (то есть ) ( ), который мы установили, чтобы иметь a .+AAA + ϵ2 + random effect changes in slopes for each athlete+ noiseϵsd = 0.75

Итак, данные выглядят так:

      athletes races      AAA   glucose
    1        1     1  51.79364 104.26708
    2        1     2  49.94477 101.72392
    3        1     3  45.29675  92.49860
    4        1     4  49.42087 100.53029
    5        1     5  45.92516  92.54637
    6        1     6  51.21132 103.97573
    ...

Нереалистичные уровни глюкозы, но все же ...

Резюме возвращается:

Random effects:
 Groups   Name        Variance Std.Dev. Corr
 athletes (Intercept) 0.006045 0.07775      
          AAA         0.204471 0.45218  1.00
 Residual             0.545651 0.73868      
Number of obs: 450, groups:  athletes, 30

Fixed effects:
             Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)   1.31146    0.35845 401.90000   3.659 0.000287 ***
AAA           1.93785    0.08286  29.00000  23.386  < 2e-16 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

Корреляция случайных эффектов 1вместо 0.8. sd = 2Для случайной вариации перехватывает интерпретируется как 0.07775. Стандартное отклонение 0.5для случайных изменений уклонов среди спортсменов рассчитывается как 0.45218. Шум, установленный со стандартным отклонением, 0.75был возвращен как 0.73868.

Перехват фиксированных эффектов должен был быть 1, и мы получили 1.31146. Для склона это должно было быть 2, а оценка была 1.93785.

Довольно близко!

Антони Пареллада
источник
aN(0,1)