交叉与嵌套随机效应:它们有什么不同?如何在lme4中正确指定它们?


88

这是我对嵌套随机效应与交叉随机效应的理解:

当较低级别的因子仅出现在较高级别的因子的特定级别内时,会发生嵌套随机效应

  • 例如,班级内的学生在固定的时间点。
  • lme4我看来,我们用两种等效方式中的任一种来表示嵌套数据的随机效应:

    (1|class/pupil)  # or  
    (1|class) + (1|class:pupil)
    

交叉随机效应意味着给定因子出现在上层因子的一个以上水平中。

  • 例如,几年级的班级中有小学生。
  • 在中lme4,我们将这样写:

    (1|class) + (1|pupil)

但是,当我查看特定的嵌套数据集时,我注意到两个模型公式给出的结果相同(下面的代码和输出)。但是,我看到了其他数据集,其中两个公式产生了不同的结果。那么这是怎么回事?

mydata <- read.csv("https://web.archive.org/web/20160624172041if_/http://www-personal.umich.edu/~bwest/classroom.csv")
# (the data is no longer at `http://www-personal.umich.edu/~bwest/classroom.csv`
# hence the link to web.archive.org)
# Crossed version: 
Linear mixed model fit by REML ['lmerMod']
Formula: mathgain ~ (1 | schoolid) + (1 | classid)
   Data: mydata

REML criterion at convergence: 11768.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.6441 -0.5984 -0.0336  0.5334  5.6335 

Random effects:
 Groups   Name        Variance Std.Dev.
 classid  (Intercept)   99.23   9.961  
 schoolid (Intercept)   77.49   8.803  
 Residual             1028.23  32.066  
Number of obs: 1190, groups:  classid, 312; schoolid, 107


# Nested version:
Formula: mathgain ~ (1 | schoolid/classid)

REML criterion at convergence: 11768.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.6441 -0.5984 -0.0336  0.5334  5.6335 

Random effects:
 Groups           Name        Variance Std.Dev.
 classid:schoolid (Intercept)   99.23   9.961  
 schoolid         (Intercept)   77.49   8.803  
 Residual                     1028.23  32.066  
Number of obs: 1190, groups:  classid:schoolid, 312; schoolid, 107

Answers:


148

(这是一个相当长的答案,最后有一个总结)

您对所描述的场景中的嵌套和交叉随机效应的理解是正确的。但是,您对交叉随机效应的定义有点狭窄。交叉随机效应的更一般定义是:不嵌套。我们将在此答案的结尾处查看此问题,但大部分答案将集中于您介绍的学校内教室的场景。

首先要注意的是:

嵌套是数据的属性,或者是实验设计的属性,而不是模型的属性。

也,

嵌套数据可以用至少两种不同的方式进行编码,这是发现问题的核心。

您的示例中的数据集非常大,因此我将使用互联网上的另一个学校示例来说明问题。但首先,请考虑以下过度简化的示例:

在此处输入图片说明

这是我们在学校里嵌套的课程,这是一个熟悉的场景。这里的重点是,即使在嵌套的情况下它们也是不同的,在每所学校之间,这些类具有相同的标识符。Class1出现在School1School2School3。然而,如果数据是嵌套然后Class1School1相同的测量单元如Class1School2School3。如果它们相同,那么我们将遇到这种情况:

在此处输入图片说明

这意味着每个班级都属于每个学校。前者是嵌套设计,而后者是交叉设计(有些人可能也称其为多重成员),我们可以lme4使用以下公式来表示:

(1|School/Class) 或同等 (1|School) + (1|Class:School)

(1|School) + (1|Class)

分别。由于是否存在嵌套或交叉随机效应,因此正确指定模型非常重要,因为这些模型会产生不同的结果,如下所示。而且,仅通过检查数据就不可能知道我们是否嵌套或交叉了随机效应。这只能借助数据知识实验设计来确定。

但是首先让我们考虑一下在学校之间唯一地对Class变量进行编码的情况:

在此处输入图片说明

关于嵌套或交叉不再有任何歧义。嵌套是显式的。现在让我们用R中的示例来查看这一点,其中我们有6所学校(标记为I- VI),每所学校中有4个班级(标记ad):

> dt <- read.table("http://bayes.acs.unt.edu:8083/BayesContent/class/Jon/R_SC/Module9/lmm.data.txt",
                   header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE)
> # data was previously publicly available from
> # http://researchsupport.unt.edu/class/Jon/R_SC/Module9/lmm.data.txt
> # but the link is now broken
> xtabs(~ school + class, dt)

        class
school  a  b  c  d
   I   50 50 50 50
   II  50 50 50 50
   III 50 50 50 50
   IV  50 50 50 50
   V   50 50 50 50
   VI  50 50 50 50

从该交叉表中我们可以看到,每个班级的ID都出现在每所学校中,这满足了您对交叉随机效应的定义(在这种情况下,我们拥有完全的交叉随机效应,而不是部分的交叉随机效应,因为每个班级在每所学校都有)。因此,这与上面第一个图中的情况相同。但是,如果数据确实是嵌套的而不是交叉的,那么我们需要明确地告诉lme4

> m0 <- lmer(extro ~ open + agree + social + (1 | school/class), data = dt)
> summary(m0)

Random effects:
 Groups       Name        Variance Std.Dev.
 class:school (Intercept)  8.2043  2.8643  
 school       (Intercept) 93.8421  9.6872  
 Residual                  0.9684  0.9841  
Number of obs: 1200, groups:  class:school, 24; school, 6

Fixed effects:
              Estimate Std. Error t value
(Intercept) 60.2378227  4.0117909  15.015
open         0.0061065  0.0049636   1.230
agree       -0.0076659  0.0056986  -1.345
social       0.0005404  0.0018524   0.292

> m1 <- lmer(extro ~ open + agree + social + (1 | school) + (1 |class), data = dt)
summary(m1)

Random effects:
 Groups   Name        Variance Std.Dev.
 school   (Intercept) 95.887   9.792   
 class    (Intercept)  5.790   2.406   
 Residual              2.787   1.669   
Number of obs: 1200, groups:  school, 6; class, 4

Fixed effects:
             Estimate Std. Error t value
(Intercept) 60.198841   4.212974  14.289
open         0.010834   0.008349   1.298
agree       -0.005420   0.009605  -0.564
social      -0.001762   0.003107  -0.567

正如预期的那样,结果有所不同,因为m0是嵌套模型,m1而是交叉模型。

现在,如果我们为类标识符引入一个新变量:

> dt$classID <- paste(dt$school, dt$class, sep=".")
> xtabs(~ school + classID, dt)

      classID
school I.a I.b I.c I.d II.a II.b II.c II.d III.a III.b III.c III.d IV.a IV.b
   I    50  50  50  50    0    0    0    0     0     0     0     0    0    0
   II    0   0   0   0   50   50   50   50     0     0     0     0    0    0
   III   0   0   0   0    0    0    0    0    50    50    50    50    0    0
   IV    0   0   0   0    0    0    0    0     0     0     0     0   50   50
   V     0   0   0   0    0    0    0    0     0     0     0     0    0    0
   VI    0   0   0   0    0    0    0    0     0     0     0     0    0    0

      classID
school IV.c IV.d V.a V.b V.c V.d VI.a VI.b VI.c VI.d
   I      0    0   0   0   0   0    0    0    0    0
   II     0    0   0   0   0   0    0    0    0    0
   III    0    0   0   0   0   0    0    0    0    0
   IV    50   50   0   0   0   0    0    0    0    0
   V      0    0  50  50  50  50    0    0    0    0
   VI     0    0   0   0   0   0   50   50   50   50

交叉表显示,根据您对嵌套的定义,每个级别的班级仅在一个学校级别上进行。您的数据也是如此,但是由于数据非常稀疏,因此很难显示出来。这两个模型公式现在将产生相同的输出(m0上面的嵌套模型的输出):

> m2 <- lmer(extro ~ open + agree + social + (1 | school/classID), data = dt)
> summary(m2)

Random effects:
 Groups         Name        Variance Std.Dev.
 classID:school (Intercept)  8.2043  2.8643  
 school         (Intercept) 93.8419  9.6872  
 Residual                    0.9684  0.9841  
Number of obs: 1200, groups:  classID:school, 24; school, 6

Fixed effects:
              Estimate Std. Error t value
(Intercept) 60.2378227  4.0117882  15.015
open         0.0061065  0.0049636   1.230
agree       -0.0076659  0.0056986  -1.345
social       0.0005404  0.0018524   0.292

> m3 <- lmer(extro ~ open + agree + social + (1 | school) + (1 |classID), data = dt)
> summary(m3)

Random effects:
 Groups   Name        Variance Std.Dev.
 classID  (Intercept)  8.2043  2.8643  
 school   (Intercept) 93.8419  9.6872  
 Residual              0.9684  0.9841  
Number of obs: 1200, groups:  classID, 24; school, 6

Fixed effects:
              Estimate Std. Error t value
(Intercept) 60.2378227  4.0117882  15.015
open         0.0061065  0.0049636   1.230
agree       -0.0076659  0.0056986  -1.345
social       0.0005404  0.0018524   0.292

值得注意的是,交叉随机效应不必在同一因素内发生-在上面,交叉完全在学校内。但是,并非必须如此,通常不是这样。例如,按照学校的情况,如果我们不是在学校内上课,而是在学校内有学生,并且我们对学生注册的医生也很感兴趣,那么我们也会在医生内嵌套学生。医生内部没有学校的嵌套,反之亦然,因此这也是交叉随机效应的一个例子,我们说学校和医生是交叉的。发生交叉随机效应的类似情况是,单个观测值同时嵌套在两个因素中,通常发生在所谓的重复测量中主题数据。通常,每个对象在不同的​​项目上/在多个项目上进行多次测量/测试,而这些相同的项目由不同的对象进行测量/测试。因此,观测值聚集在主题内项目内,但项目不嵌套在主题内,反之亦然。同样,我们说主题和项目是交叉的

摘要:TL; DR

交叉随机效应和嵌套随机效应之间的区别在于,当一个因子(分组变量)仅出现在另一因子(分组变量)的特定级别内时,就会发生嵌套随机效应。通过以下方式指定lme4

(1|group1/group2)

group2嵌套在哪里group1

交叉随机效应很简单:不嵌套。这可能发生在三个或多个分组变量(因子)中,其中一个因子分别嵌套在另一个变量中,或者两个或两个以上因子,其中单个观测值分别嵌套在两个因子中。这些在以下内容中指定lme4

(1|group1) + (1|group2)


16
+6,这是一个非常不错的答案。几天后提醒我,我会悬赏。
gung

2
很好的解释。是否有可能是第三种类型的实验设计的名称,您在其中为两个因素(可能是嵌套的)创建了唯一的水平,所以如果我跟随同伙从不同城市的不同经销商处购买摩托车,我将如何与读者交流,我基本上创建一个单一的水平因子interaction(city, dealer)
AdamO'8

2
+6,这是一个很好的答案,以至于我觉得我可以和另一个人补充@gung的赏金。顺便说一句,我正在努力解决可能是一个非常基本的困惑(这是我的Q),非常感谢您的帮助。
amoeba

1
@RobertLong似乎分割图(重复测量)设计通常被称为“嵌套”设计,即使它们并不是根据您的答案真正嵌套的。这种术语上的不一致可能导致了我对链接问题的困惑。如果您可以在这里或那里澄清一下,那就太好了。我什至在考虑是否应该针对拆分图中嵌套的内容发布一个单独的(不是面向R的)术语问题。
变形虫

2
更新到我之前的评论。我已经检查了两本关于实验设计的权威著作:Maxwell和Delaney,1990年,《设计实验和分析数据》,以及Montgomery,1976年,《设计和分析实验》。他们俩都在谈论嵌套设计,都在谈论重复测量(又称裂痕图)。两者都在您使用的意义上使用“嵌套”一词,决不将重复的度量称为嵌套。因此,我认为术语毕竟没有任何区别。
amoeba
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.