Como simular dados para demonstrar efeitos mistos com R (lme4)?

10

Como contrapartida deste post , trabalhei na simulação de dados com variáveis ​​contínuas, prestando-se a interceptações e declives correlacionados.

Embora existam ótimas postagens sobre esse tópico no site e fora dele , tive dificuldades em encontrar um exemplo do começo ao fim com dados simulados que se assemelhavam a um cenário simples da vida real.

Portanto, a questão é como simular esses dados e "testá-los" lmer. Nada de novo para muitos, mas possivelmente útil para muitos outros que procuram entender modelos mistos.

Antoni Parellada
fonte

Respostas:

8

Se você preferir um formato de artigo de blog, modelos lineares hierárquicos e lmer é um artigo que escrevi que apresenta uma simulação com inclinações e interceptações aleatórias. Aqui está o código de simulação que eu usei:

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
fonte
11
Ben, obrigado pela sua resposta! Estou muito ocupado agora, mas analisarei cuidadosamente assim que tiver uma chance. + no crédito :-)
Antoni Parellada
1

Os dados são completamente fictícios e o código que eu usei para gerá-los pode ser encontrado aqui .

A idéia é que faríamos medições em glucose concentrationsum grupo 30 athletesno final de 15 racesem relação à concentração da composição amino acid A( AAA) no sangue desses atletas.

O modelo é: lmer(glucose ~ AAA + (1 + AAA | athletes)

Existe uma inclinação de efeito fixo (concentração de glicose ~ aminoácido A); no entanto, as pistas também variar entre diferentes atletas com uma mean = 0e sd = 0.5, enquanto as intercepções para os diferentes atletas estão distribuídos em torno de efeitos aleatórios 0com sd = 0.2. Além disso, existe uma correlação entre interceptações e declives de 0,8 dentro do mesmo atleta.

Esses efeitos aleatórios são adicionados a um escolhido intercept = 1para efeitos fixos, e slope = 2.

Os valores da concentração de glicose foram calculados como alpha + AAA * beta + 0.75 * rnorm(observations), significando a interceptação para cada atleta (ie 1 + random effects changes in the intercept) a concentração de aminoácido, a inclinação para cada atleta (ie ) ( ), que configuramos para ter a .+AAA + ϵ2 + random effect changes in slopes for each athlete+ noiseϵsd = 0.75

Portanto, os dados se parecem com:

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

Níveis irrealistas de glicose, mas ainda ...

O resumo retorna:

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

A correlação de efeitos aleatórios é em 1vez de 0.8. O sd = 2para a variação aleatória nas interceptações é interpretado como 0.07775. O desvio padrão de 0.5mudanças aleatórias nas pistas entre os atletas é calculado como 0.45218. O ruído configurado com um desvio padrão 0.75foi retornado como 0.73868.

A interceptação de efeitos fixos deveria ser 1, e conseguimos 1.31146. Para a inclinação que deveria ser 2, e a estimativa era 1.93785.

Bastante perto!

Antoni Parellada
fonte
O modelo simulado é paralelo ao exemplo aqui dando-lhe um concreto, cenário da vida real e eliminando a variável (que no caso eu simular seria simplesmente um único, aleatório de observação para cada atleta) que foi usado tanto como um regressor em si mesmo, como para gerar interceptações e declives aleatórios, como um passo intermediário. N ( 0 , 1 )aN(0,1)
Antoni Parellada