Làm thế nào để mô phỏng dữ liệu để chứng minh hiệu ứng hỗn hợp với R (lme4)?


10

Là một đối tác của bài đăng này , tôi đã làm việc về việc mô phỏng dữ liệu với các biến liên tục, tự cho vay với các phần tử và độ dốc tương quan.

Mặc dù có những bài viết tuyệt vời về chủ đề này trên trang webngoài trang web , tôi gặp khó khăn khi bắt gặp một ví dụ từ đầu đến cuối với dữ liệu mô phỏng song song với một kịch bản đơn giản, thực tế.

Vì vậy, câu hỏi là làm thế nào để mô phỏng những dữ liệu này và "kiểm tra" nó với lmer. Không có gì mới đối với nhiều người, nhưng có thể hữu ích cho nhiều người khác đang tìm hiểu các mô hình hỗn hợp.

Câu trả lời:


8

Nếu bạn thích một định dạng bài viết blog, mô hình tuyến tính phân cấp và lmer là một bài viết tôi đã viết có tính năng mô phỏng với độ dốc ngẫu nhiên và chặn. Đây là mã mô phỏng tôi đã sử dụng:

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, Cảm ơn bạn đã trả lời! Tôi thực sự bận rộn ngay bây giờ, nhưng tôi sẽ xem xét cẩn thận ngay khi có cơ hội. + về tín dụng :-)
Antoni Parellada

1

Dữ liệu hoàn toàn hư cấu và mã mà tôi đã sử dụng để tạo ra nó có thể được tìm thấy ở đây .

Ý tưởng là chúng tôi sẽ thực hiện các phép đo trên glucose concentrationsmột nhóm 30 athleteskhi hoàn thành 15 racesliên quan đến nồng độ của chất tạo thành amino acid A( AAA) trong máu của các vận động viên này.

Mô hình là: lmer(glucose ~ AAA + (1 + AAA | athletes)

Có độ dốc hiệu ứng cố định (nồng độ glucose ~ axit amin A); tuy nhiên, độ dốc cũng khác nhau giữa các vận động viên khác nhau với một mean = 0sd = 0.5, trong khi các lần chặn cho các vận động viên khác nhau được lan truyền một hiệu ứng ngẫu nhiên xung quanh 0với sd = 0.2. Hơn nữa, có một mối tương quan giữa đánh chặn và độ dốc 0,8 trong cùng một vận động viên.

Những hiệu ứng ngẫu nhiên này được thêm vào một lựa chọn intercept = 1cho các hiệu ứng cố định, và 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

Vì vậy, dữ liệu trông như:

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

Mức glucose không thực tế, nhưng vẫn ...

Tóm tắt trả về:

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

Các mối tương quan hiệu ứng ngẫu nhiên là 1thay vì 0.8. Sự sd = 2thay đổi ngẫu nhiên trong các lần chặn được hiểu là 0.07775. Độ lệch chuẩn của 0.5thay đổi ngẫu nhiên về độ dốc giữa các vận động viên được tính như sau 0.45218. Tiếng ồn được thiết lập với độ lệch chuẩn 0.75được trả về là 0.73868.

Việc chặn các hiệu ứng cố định được cho là 1và chúng tôi đã nhận được 1.31146. Đối với độ dốc nó được cho là 2, và ước tính là 1.93785.

Khá gần!


mộtN(0,1)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.