Bagaimana cara mensimulasikan data untuk menunjukkan efek campuran dengan R (lme4)?

10

Sebagai bagian dari posting ini , saya bekerja pada simulasi data dengan variabel kontinu, meminjamkan diri untuk intersep dan lereng berkorelasi.

Meskipun ada posting bagus tentang topik ini di situs , dan di luar situs , saya mengalami kesulitan dalam menemukan contoh awal-ke-akhir dengan data simulasi yang paralel dengan skenario sederhana, kehidupan nyata.

Jadi pertanyaannya adalah bagaimana mensimulasikan data ini, dan "mengujinya" dengan lmer. Tidak ada yang baru bagi banyak orang, tetapi mungkin bermanfaat bagi banyak orang lain yang mencari untuk memahami model campuran.

Antoni Parellada
sumber

Jawaban:

8

Jika Anda lebih suka format artikel blog, model linear hierarki dan lmer adalah artikel yang saya tulis yang menampilkan simulasi dengan kemiringan dan penyadapan acak. Berikut kode simulasi yang saya gunakan:

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
sumber
1
Ben, Terima kasih atas jawaban Anda! Saya benar-benar sibuk sekarang, tetapi saya akan memeriksanya dengan hati-hati segera setelah saya mendapat kesempatan. + kredit :-)
Antoni Parellada
1

Data ini sepenuhnya fiksi dan kode yang saya gunakan untuk menghasilkannya dapat ditemukan di sini .

Idenya adalah bahwa kita akan melakukan pengukuran pada glucose concentrationskelompok 30 athletespada saat penyelesaian 15 racessehubungan dengan konsentrasi make-up amino acid A( AAA) dalam darah atlet ini.

Modelnya adalah: lmer(glucose ~ AAA + (1 + AAA | athletes)

Ada kemiringan efek tetap (konsentrasi glukosa ~ asam amino A); Namun, lereng juga bervariasi antara atlet yang berbeda dengan mean = 0dan sd = 0.5, sementara penyadapan untuk atlet yang berbeda tersebar efek acak di sekitar 0dengan sd = 0.2. Selanjutnya ada korelasi antara intersep dan slope 0,8 dalam atlet yang sama.

Efek acak ini ditambahkan ke yang dipilih intercept = 1untuk efek tetap, dan 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

Jadi datanya terlihat seperti:

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

Tingkat glukosa yang tidak realistis, tetapi masih ...

Ringkasan kembali:

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

Korelasi efek acak 1bukannya 0.8. Untuk sd = 2variasi acak dalam intersep ditafsirkan sebagai 0.07775. Deviasi standar 0.5untuk perubahan acak pada lereng di antara atlet dihitung sebagai 0.45218. Kebisingan yang diatur dengan standar deviasi 0.75dikembalikan sebagai 0.73868.

Mencegah efek tetap seharusnya 1, dan kami mendapatkannya 1.31146. Untuk lereng seharusnya 2, dan perkiraannya adalah 1.93785.

Cukup dekat!

Antoni Parellada
sumber
SebuahN(0,1)