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.
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, 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 30athletesno final de 15racesem relação à concentração da composição amino acid A( AAA) no sangue desses atletas.
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
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
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.
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)
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 concentrations
um grupo30
athletes
no final de15
races
em relação à concentração da composiçãoamino 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 = 0
esd = 0.5
, enquanto as intercepções para os diferentes atletas estão distribuídos em torno de efeitos aleatórios0
comsd = 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 = 1
para efeitos fixos, eslope = 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 (ie1 + 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:
Níveis irrealistas de glicose, mas ainda ...
O resumo retorna:
A correlação de efeitos aleatórios é em
1
vez de0.8
. Osd = 2
para a variação aleatória nas interceptações é interpretado como0.07775
. O desvio padrão de0.5
mudanças aleatórias nas pistas entre os atletas é calculado como0.45218
. O ruído configurado com um desvio padrão0.75
foi retornado como0.73868
.A interceptação de efeitos fixos deveria ser
1
, e conseguimos1.31146
. Para a inclinação que deveria ser2
, e a estimativa era1.93785
.Bastante perto!
fonte