在 R (lme4) 中以直观的方式读取多级模型语法

机器算法验证 r 混合模式 lme4-nlme 重复测量 随机效应模型
2022-03-17 16:50:27

下面,我有 3 个lme4纵向混合模型。自始至终,y是响应变量,group"control"vs的二元指标"treatment"therapist(聚类指标),subjects(聚类指标),并且time是测量时间指标(例如,0, 1, 2, 3)。

问题:我想知道是否有一种直观的方式来理解每个模型描述的数据/设计结构,或者至少有一种方式lme4可以理解每个模型语法的含义?

# FIRST:
lmer(y ~ time * group + 
                (time | therapist:subjects) +
                (time * group || therapist), 
                 data = data)

# SECOND:
lmer(y ~ time * group + 
                (time | therapist:subjects) +
                (time | therapist) +
                (0 + group + time:group | therapist), 
                 data = data)

# THIRD:
lmer(y ~ time * group + 
                (1 | therapist:subjects) +  
                (0 + time | therapist:subjects) +
                (0 + time:group | therapist) + 
                (0 + group | therapist),
                 data = data)
1个回答

直观地说,理解可以从分组变量或分组术语开始。这些是出现在公式右侧|||随机部分中的术语。它们通常是重复测量的因子变量,或一个因子与另一个随机因子(或实际上是一个固定因子)的组合(相互作用)。这些应该是单个术语 - 变量或组合/交互,而不是多个术语(即,您可以拥有(1|A)(1|A:B)不拥有(1|A+B)(那将是无效的)。在所有情况下,它们都可以解释为:存在一些随机变化在变量或变量组合的“级别”数据中。我们通常希望为这些拟合随机截距,这将解释由于这种变化而导致的任何非独立性。

我们可以通过考虑唯一分组项的数量来考虑模型中“级别”的数量。使用单个 groupig 术语,我们有一个 2 级模型,有 3 个术语,一个 3 级模型。这里需要注意,因为这些“级别”可能与多级模型中的级别不对应。在使用因子设计的实验分析中,“级别”并不真正适用,因此您可以有类似的东西, y ~ A + B + (1|id) + (1|id:A) + (1|id:B)并且有 3 个“级别”的变化,但不是多级建模意义上的。有关此问题的更多详细信息,请参阅此答案即使在多级建模中,由于嵌套和交叉因素,这也可能很棘手。有关这方面的更多详细信息,请参见此处嵌套是研究设计的属性,而不是模型的属性。

|左侧的术语||指定允许哪些变量在分组术语的不同级别上变化。在最简单的情况下,它只是“1”,这意味着我们只希望截距发生变化(因此,只是随机截距)。如果我们有其他变量代替“1”,那么这意味着我们希望这些变量(通常是固定效应)在分组项的每个级别上除了截距(即(time|group)与 相同(1 + time|group)之外发生变化。这些是随机斜率。

|如果“0”出现在or的左侧,||则表示适合 groupng 项的随机截距(通常是因为它们由模型中的不同拟合)。

最后,默认情况下lmer将尝试估计随机效应之间的相关性。但是,如果||指定,则不会估计相关性(它们是否固定为零)。这实际上只是简写。例如(time||group)(1|group) + (0+time|group)这意味着我们为 拟合随机截距group,我们为时间拟合随机斜率,但对时间没有随机截距,因此合在一起意味着组的随机截距和时间的斜率,但它们之间没有相关性。这也意味着随机斜率和随机截距在它们位于单个|.

因此,对于您的具体示例:

lmer(y ~ time * group + 
            (time | therapist:subjects) +
            (time * group || therapist), 
            data = data)

首先请注意,我们有 2 个不同的分组术语:therapist:subjects组合和therapist这对于所有 3 个模型都是如此。对于前者,我们还为time(与随机截距相关)拟合随机斜率。对于后者,我们拟合随机斜率,time * group但这些与 的随机截距无关therapist

lmer(y ~ time * group + 
            (time | therapist:subjects) +
            (time | therapist) +
            (0 + group + time:group | therapist), 
            data = data)

与第一个模型一样,我们有 2 个不同的分组项:therapist:subjects组合项和therapist前者time的随机斜率。对于后者,这次我们有time(与 的随机截距相关的随机斜率,以及therapist和 的不相关随机斜率grouptime:group

lmer(y ~ time * group + 
            (1 | therapist:subjects) +  
            (0 + time | therapist:subjects) +
            (0 + time:group | therapist) + 
            (0 + group | therapist),
            data = data)

同样,我们有 2 个不同的分组术语:therapist:subjects组合 和therapist对于前者,我们有 的随机截距therapist:subjectstime(与随机迭代不相关的)的随机斜率。如上所述,这些也可以简写为(time || therapist:subjects). 对于后者,根本没有随机截距(因为 0 出现在左侧的两个公式中),但我们拟合随机斜率time:groupgroup

最后几点强调无效的内容:

lmer(y ~ time * group + (0 | therapist)

无效,因为 . 的左侧不能有一个零|这意味着therapist是一个分组变量(暗示我们想要随机截距),但是“0”意味着不适合随机截距。这是一个冲突,应该会产生一个错误。

lmer(y ~ time * group + (1 | therapist*subject)

是一个错误,因为therapist*subject它不是一个单独的术语 - 它是简写,therapist + subject + therapist:subject所以它相当于

lmer(y ~ time * group + (1 | therapist + subject + therapist:subject)

这是无效的。如果您实际上希望这些术语中的每一个都是分组术语,那么您将使用:

lmer(y ~ time * group + (1 | therapist) + (1 subject) + (1| therapist:subject)