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.
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, 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 30athletesà la fin de 15racespar 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
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.0060450.07775
AAA 0.2044710.452181.00
Residual 0.5456510.73868
Number of obs:450, groups: athletes,30
Fixed effects:
Estimate Std. Error df t value Pr(>|t|)(Intercept)1.311460.35845401.900003.6590.000287***
AAA 1.937850.0828629.0000023.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.
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 concentrations
un groupe30
athletes
à la fin de15
races
par rapport à la concentration du maquillageamino 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 = 0
etsd = 0.5
, tandis que les interceptions pour les différents athlètes sont réparties de manière aléatoire0
avecsd = 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 = 1
pour les effets fixes, etslope = 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 à:
Des niveaux de glucose irréalistes, mais quand même ...
Le résumé renvoie:
La corrélation des effets aléatoires est
1
au lieu de0.8
. Lasd = 2
variation aléatoire des intersections est interprétée comme0.07775
. L'écart type de0.5
pour les variations aléatoires des pentes chez les athlètes est calculé comme suit0.45218
. Le bruit créé avec un écart-type a0.75
été renvoyé comme0.73868
.L'interception d'effets fixes devait être
1
, et nous l'avons eu1.31146
. Pour la pente, c'était censé être2
, et l'estimation l'était1.93785
.Assez proche!
la source