¿Cómo simular datos para demostrar efectos mixtos con R (lme4)?

10

Como contraparte de esta publicación , trabajé en la simulación de datos con variables continuas, prestándome a intercepciones y pendientes correlacionadas.

Aunque hay excelentes publicaciones sobre este tema en el sitio y fuera del sitio , tuve dificultades para encontrar un ejemplo de principio a fin con datos simulados que fueran paralelos a un escenario simple de la vida real.

Entonces, la pregunta es cómo simular estos datos y "probarlos" con ellos lmer. Nada nuevo para muchos, pero posiblemente útil para muchos otros que buscan comprender modelos mixtos.

Antoni Parellada
fuente

Respuestas:

8

Si prefiere un formato de artículo de blog, Modelos lineales jerárquicos e Imer es un artículo que escribí que presenta una simulación con pendientes e intercepciones aleatorias. Aquí está el código de simulación que utilicé:

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)
Ben Ogorek
fuente
1
Ben, gracias por tu respuesta! Estoy realmente ocupado en este momento, pero lo examinaré cuidadosamente tan pronto como tenga la oportunidad. + a crédito :-)
Antoni Parellada
1

Los datos son completamente ficticios y el código que usé para generarlos se puede encontrar aquí .

La idea es que tomaríamos medidas en glucose concentrationsun grupo de 30 athletesal finalizar 15 racesen relación con la concentración del maquillaje amino acid A( AAA) en la sangre de estos atletas.

El modelo es: lmer(glucose ~ AAA + (1 + AAA | athletes)

Hay una pendiente de efecto fijo (concentración de glucosa ~ aminoácido A); Sin embargo, las pendientes también varían entre los diferentes atletas con una mean = 0y sd = 0.5, mientras que las intersecciones de los diferentes atletas se extienden unos efectos aleatorios alrededor 0con sd = 0.2. Además, existe una correlación entre las intersecciones y las pendientes de 0.8 dentro del mismo atleta.

Estos efectos aleatorios se agregan a un elegido intercept = 1para efectos fijos, y slope = 2.

Los valores de la concentración de glucosa se calcularon como alpha + AAA * beta + 0.75 * rnorm(observations), lo que significa la intercepción para cada atleta (es decir 1 + random effects changes in the intercept) la concentración de aminoácidos, la pendiente para cada atleta (es decir ) ( ), que configuramos para tener a .+AAA + ϵ2 + random effect changes in slopes for each athlete+ noiseϵsd = 0.75

Entonces los datos se ven así:

      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
    ...

Niveles poco realistas de glucosa, pero aún así ...

El resumen devuelve:

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

La correlación de efectos aleatorios es en 1lugar de 0.8. La sd = 2variación aleatoria en las intersecciones se interpreta como 0.07775. La desviación estándar de 0.5los cambios aleatorios en las pendientes entre los atletas se calcula como 0.45218. El ruido creado con una desviación estándar 0.75se devolvió como 0.73868.

Se suponía que la intercepción de efectos fijos era 1, y lo conseguimos 1.31146. Para la pendiente se suponía que era 2, y la estimación era 1.93785.

¡Bastante cerca!

Antoni Parellada
fuente
El modelo simulado es paralelo al ejemplo aquí dándole un hormigón, escenario de la vida real y la eliminación de la variable (que en el caso simulo sería simplemente una única, al azar de observación para cada atleta) que era utilizado tanto como regresor por derecho propio, como para generar intercepciones aleatorias y pendientes, como un paso intermedio. N ( 0 , 1 )aN(0,1)
Antoni Parellada