Comment simuler des données pour démontrer des effets mixtes avec R (lme4)?

10

En contrepartie de ce poste , j'ai travaillé sur la simulation de données avec des variables continues, se prêtant à des interceptions et des pentes corrélées.

Bien qu'il existe d'excellents articles sur ce sujet sur le site et en dehors du site , j'ai eu du mal à trouver un exemple de bout en bout avec des données simulées parallèles à un scénario simple et réel.

La question est donc de savoir comment simuler ces données et les "tester" avec lmer. Rien de nouveau pour beaucoup, mais peut-être utile à beaucoup d'autres qui cherchent à comprendre des modèles mixtes.

Antoni Parellada
la source

Réponses:

8

Si vous préférez un format d'article de blog, les modèles linéaires hiérarchiques et lmer est un article que j'ai écrit qui présente une simulation avec des pentes et des interceptions aléatoires. Voici le code de simulation que j'ai utilisé:

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
la source
1
Ben, merci pour ta réponse! Je suis vraiment occupé en ce moment, mais je vais l'examiner attentivement dès que j'en aurai l'occasion. + à crédit :-)
Antoni Parellada
1

Les données sont complètement fictives et le code que j'ai utilisé pour les générer se trouve ici .

L'idée est que nous prendrions des mesures sur glucose concentrationsun groupe 30 athletesà la fin de 15 racespar rapport à la concentration du maquillage amino acid A( AAA) dans le sang de ces athlètes.

Le modèle est: lmer(glucose ~ AAA + (1 + AAA | athletes)

Il y a une pente d'effet fixe (concentration de glucose ~ acide aminé A); cependant, les pentes varient également entre les différents athlètes avec un mean = 0et sd = 0.5, tandis que les interceptions pour les différents athlètes sont réparties de manière aléatoire 0avec sd = 0.2. De plus, il existe une corrélation entre les interceptions et les pentes de 0,8 au sein d'un même athlète.

Ces effets aléatoires sont ajoutés à un choisi intercept = 1pour les effets fixes, et slope = 2.

Les valeurs de la concentration de glucose ont été calculées comme alpha + AAA * beta + 0.75 * rnorm(observations), ce qui signifie l'interception pour chaque athlète (c.-à-d. 1 + random effects changes in the intercept) La concentration en acides aminés, la pente pour chaque athlète (c.-à-d. ) ( ), que nous avons configurée pour avoir un .+AAA 2 + random effect changes in slopes for each athlete+ noiseϵsd = 0.75

Les données ressemblent donc à:

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

Des niveaux de glucose irréalistes, mais quand même ...

Le résumé renvoie:

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 corrélation des effets aléatoires est 1au lieu de 0.8. La sd = 2variation aléatoire des intersections est interprétée comme 0.07775. L'écart type de 0.5pour les variations aléatoires des pentes chez les athlètes est calculé comme suit 0.45218. Le bruit créé avec un écart-type a 0.75été renvoyé comme 0.73868.

L'interception d'effets fixes devait être 1, et nous l'avons eu 1.31146. Pour la pente, c'était censé être 2, et l'estimation l'était 1.93785.

Assez proche!

Antoni Parellada
la source
uneN(0,1)