如何使用lme4正确计算嵌套随机效果?

时间:2015-05-15 16:59:04

标签: r modeling lme4 random-effects

我的数据框包含subjectwdgroup变量以及value响应变量。每个受试者被分配到一个组,并且在每个工作日进行7次测量。因为每个主题都完全嵌套在一个组中,所以我想使用带有subjectgroup的嵌套随机效果模型,以及为wd添加第三个随机效果。目前,我正在使用它:

model = lmer(value ~ 1+ (1|wd) + (1|group) + (1|subject), 
             data = dframe, REML = 0)

我找到了基于page 40 of this guide的代码。我使用了REML = TRUEREML = 0。但是,当我使用VarCorr(model)$variances时,我会得到

Groups   Name        Std.Dev.  
subject  (Intercept) 94.9534363
wd       (Intercept) 42.5931401
group    (Intercept)  0.0015608
Residual              0.9589836

此组差异与我用于生成数据的代码冲突,该代码具有36.9,28.78和-15.269的组均值。当我查看预测随机效应的“残差”(使用ranef)与真实的随机效应时,我得到的残差与它们所在的群体具有非常高的相关性(如果我建模residuals ~ group, R平方值将超过0.9)。

如何在R中正确拟合嵌套随机效果模型?我更喜欢使用lme4,但任何包都足够了。

以下是我用来生成数据的代码:

library(dplyr)
generate_data <- function(n = 10, g = 3, seed = 1, mean.overall = 300,
                          sigma.g = 50, sigma.wd = 50, 
                          sigma.subject = 100, sigma. = 30) {
    set.seed(seed)
    means.wd = rnorm(7) * sigma.wd
    means.g = rnorm(g) * sigma.g
    means.subject = rnorm(n*g) * sigma.subject
    dframe = data.frame(subject = rep(1:(g*n), each = 7),
                        wd = rep(1:7, g*n), 
                        group = rep(1:g, each = (7*n)))
    dframe = mutate(dframe,
       value = mean.overall + means.wd[wd] +    
           means.subject[subject] + means.g[group] + rnorm(7*g*n),
       subject = factor(subject, levels = 1:(n*g)),
       wd = factor(wd), 
       group = factor(group, levels = 1:g))
    dframe$value = round(pmax(5,dframe$value))
    truefx = list(wd = means.wd, group = means.g, 
                  subject = means.subject)
    list(data = dframe, effects = truefx)
}

dframe = generate_data()$data

1 个答案:

答案 0 :(得分:0)

我猜你想要小组作为一个固定的效果,因为只有几个等级。此外,在主题内的工作日的嵌套感觉不需要,因为每个主题/工作日组合仅有一个观察。如果是这样,你应该需要的只是

lmer(value ~ group + (1|subject), data = dframe)

不清楚工作日是否真正嵌套在主题中;如果所有科目都是相同的工作日,那么其他一些东西可能更合适。对于stats.stackexchange.com而言,这是一个更好的问题。

如果你确实想要嵌套它们,那么这样的东西可能有效。

lmer(value ~ (1|group/subject/wd), data = dframe)