Wie simuliere ich Daten, um gemischte Effekte mit R (lme4) zu demonstrieren?

10

Als Gegenstück zu diesem Beitrag habe ich daran gearbeitet, Daten mit kontinuierlichen Variablen zu simulieren und mich für korrelierte Abschnitte und Steigungen zu eignen.

Obwohl es auf der Website und außerhalb der Website großartige Beiträge zu diesem Thema gibt , hatte ich Schwierigkeiten, ein Anfang-zu-Ende-Beispiel mit simulierten Daten zu finden, das einem einfachen, realen Szenario entspricht.

Die Frage ist also, wie man diese Daten simuliert und mit ihnen "testet" lmer. Für viele nichts Neues, aber möglicherweise für viele andere nützlich, die nach gemischten Modellen suchen.

Antoni Parellada
quelle

Antworten:

8

Wenn Sie ein Blog-Artikelformat bevorzugen, ist Hierarchical Linear Models and Lmer ein Artikel, den ich geschrieben habe und der eine Simulation mit zufälligen Steigungen und Abschnitten enthält. Hier ist der Simulationscode, den ich verwendet habe:

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
quelle
1
Ben, danke für deine Antwort! Ich bin gerade sehr beschäftigt, aber ich werde es mir genau ansehen, sobald ich eine Chance bekomme. + auf Kredit :-)
Antoni Parellada
1

Die Daten sind vollständig fiktiv und der Code, mit dem ich sie generiert habe, finden Sie hier .

Die Idee ist, dass wir Messungen an glucose concentrationseiner Gruppe von 30 athletesam Ende von 15 racesin Bezug auf die Konzentration des Make-up amino acid A( AAA) in diesen Athleten Blut durchführen würden.

Das Modell ist: lmer(glucose ~ AAA + (1 + AAA | athletes)

Es gibt eine feste Effektsteigung (Konzentration von Glucose ~ Aminosäure A); Die Steigungen variieren jedoch auch zwischen verschiedenen Athleten mit einem mean = 0und sd = 0.5, während die Abschnitte für die verschiedenen Athleten zufällige Effekte 0mit verteilen sd = 0.2. Ferner besteht eine Korrelation zwischen Abschnitten und Steigungen von 0,8 innerhalb desselben Athleten.

Diese zufälligen Effekte werden zu einem intercept = 1für feste Effekte ausgewählten hinzugefügt , und slope = 2.

Die Werte der Glukosekonzentration wurden berechnet als alpha + AAA * beta + 0.75 * rnorm(observations), dh der Achsenabschnitt für jeden Athleten (dh 1 + random effects changes in the intercept) die Aminosäurekonzentration, die Steigung für jeden Athleten (dh ) ( ), die wir für a eingerichtet haben .+AAA + ϵ2 + random effect changes in slopes for each athlete+ noiseϵsd = 0.75

Die Daten sehen also so aus:

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

Unrealistische Glukosespiegel, aber immer noch ...

Die Zusammenfassung gibt Folgendes zurück:

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

Die Zufallseffektkorrelation ist 1statt 0.8. Die sd = 2für die zufällige Variation in Abschnitten wird interpretiert als 0.07775. Die Standardabweichung 0.5für zufällige Änderungen der Steigungen unter Athleten wird berechnet als 0.45218. Das mit einer Standardabweichung eingestellte Rauschen 0.75wurde als zurückgegeben 0.73868.

Das Abfangen fester Effekte sollte sein 1, und wir haben 1.31146. Für die Steigung sollte es sein 2, und die Schätzung war 1.93785.

Ziemlich nah!

Antoni Parellada
quelle
Das simulierte Modell parallel zum Beispiel hier ein konkretes, reales Szenario zu geben und die Beseitigung des Variable (die im Fall ich simulieren würde einfach eine einzelne, zufällig für jeden Athleten Beobachtung) , das war wird sowohl als eigenständiger Regressor als auch zur Erzeugung zufälliger Abschnitte und Steigungen als Zwischenschritt verwendet. N ( 0 , 1 )aN(0,1)
Antoni Parellada