Come simulare i dati per dimostrare effetti misti con R (lme4)?


10

Come controparte di questo post , ho lavorato sulla simulazione di dati con variabili continue, prestandomi a intercettazioni e pendenze correlate.

Sebbene sul sito e al di fuori del sito siano presenti ottimi post su questo argomento , ho avuto difficoltà a trovare un esempio dall'inizio alla fine con dati simulati che si sovrapponevano a uno scenario semplice e reale.

Quindi la domanda è come simulare questi dati e "testarli" con lmer. Niente di nuovo per molti, ma forse utile per molti altri che cercano di capire modelli misti.

Risposte:


8

Se preferisci un formato di articolo per blog, i modelli lineari gerarchici e lmer è un articolo che ho scritto che presenta una simulazione con pendenze e intercettazioni casuali. Ecco il codice di simulazione che ho usato:

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)

1
Ben, grazie per la tua risposta! Sono molto impegnato in questo momento, ma lo esaminerò attentamente non appena avrò la possibilità. + a credito :-)
Antoni Parellada,

1

I dati sono completamente fittizi e il codice che ho usato per generarli può essere trovato qui .

L'idea è che avremmo preso le misure su glucose concentrationsun gruppo 30 athletesal completamento di 15 racesin relazione alla concentrazione del trucco amino acid A( AAA) nel sangue di questi atleti.

Il modello è: lmer(glucose ~ AAA + (1 + AAA | athletes)

C'è una pendenza ad effetto fisso (concentrazione di glucosio ~ aminoacido A); tuttavia, le piste variano anche tra diversi atleti con mean = 0e sd = 0.5, mentre le intercettazioni per i diversi atleti sono distribuite a random effects intorno 0con sd = 0.2. Inoltre esiste una correlazione tra intercettazioni e pendenze di 0,8 all'interno dello stesso atleta.

Questi effetti casuali vengono aggiunti a quelli scelti intercept = 1per effetti fissi e slope = 2.

alpha + AAA * beta + 0.75 * rnorm(observations)1 + random effects changes in the intercept+AAA *2 + random effect changes in slopes for each athlete+ noiseεsd = 0.75

Quindi i dati sembrano:

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

Livelli non realistici di glucosio, ma ancora ...

Il riepilogo restituisce:

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 correlazione degli effetti casuali è 1invece di 0.8. Il sd = 2per la variazione casuale nelle intercettazioni è interpretato come 0.07775. La deviazione standard di 0.5per i cambiamenti casuali nelle piste tra gli atleti è calcolata come 0.45218. Il rumore impostato con una deviazione standard è 0.75stato restituito come 0.73868.

L'intercettazione di effetti fissi doveva essere 1, e abbiamo ottenuto 1.31146. Per la pendenza doveva essere 2, e la stima era 1.93785.

Abbastanza vicino!


un'N(0,1)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.