如何在R中使用Lmer设置自定义对比度


9

我在R中使用lmer来检查条件(cond)对某些结果的影响。这是一些组成的数据,其中s是主题标识符abc是条件。

library("tidyr")
library("dplyr")
set.seed(123)
temp <- data.frame(s = paste0("S", 1:30), 
                   a = rnorm(30, -2, 1), 
                   b = rnorm(30, -3, 1), 
                   c = rnorm(30, -4, 1)) 

我想比较

  1. 级别a的平均水平b,并c
  2. 逐级b升级c

我的问题是,如何设置对比度以使截距反映三个条件的均值,而两个计算出的估计值直接反映1.和2中定义的差异?

我尝试过

c1 <- cbind(c(-0.5, 0.25, 0.25), c(0, -0.5, 0.5))
gather(temp, cond, result, a, b, c) %>%
  lmer(result ~ cond + (1|s), data = ., contrasts = list(cond = c1))

这里cond2似乎是美好的,但cond1并非如此。

以下如何解释这些自定义对比?,我尝试改用广义逆,但是这些估计也没有意义。

c2 <- t(ginv(c1))
gather(temp, cond, result, a, b, c) %>%
  lmer(result ~ cond + (1|s), data = ., contrasts = list(cond = c2))

我也尝试过Helmert对比,但方法仍然不匹配。

gather(temp, cond, result, a, b, c) %>%
  mutate(cond = factor(cond, levels = c("c", "b", "a"))) %>%
  lmer(result ~ cond + (1|s), data = ., contrasts = list(cond = contr.helmert))

正确的方法是什么?


这听起来像是Helmert对比(c是第一个级别,然后是b,然后是a)。
Michael M

我也尝试过Helmert,但数字并不是我想要的手段。我已经编辑了问题,以包括赫尔默特对比,谢谢。
M4RT1NK4 2015年

Answers:


13

对于以下步骤,我们需要长格式的数据帧。数据帧dat包含因变量result,所述分类预测cond(级别:ab,和c),和随机因子s

library(tidyr)
dat <- gather(temp, cond, result, a, b, c)

在下面的内容中,我将说明两种方法来创建与要比较的条件相对应的对比度矩阵:

  1. ab+c2
  2. bc

自定义对比

矩阵mat对应于电平差。

mat <- rbind(c(1, -0.5, -0.5),     # a vs. (b + c) / 2
             c(0, 1, -1))          # b vs. c

为了创建实际的对比度矩阵,我们使用ginv(from MASS)计算广义逆。

library(MASS)
cMat <- ginv(mat)
#            [,1]          [,2]
# [1,]  0.6666667 -7.130169e-17
# [2,] -0.3333333  5.000000e-01
# [3,] -0.3333333 -5.000000e-01

cMat可以在中使用此对比度矩阵lmer

library(lme4)
res <- lmer(result ~ cond + (1|s), data = dat, 
            contrasts = list(cond = cMat))
coef(summary(res))    
#              Estimate Std. Error    t value
# (Intercept) -2.948115  0.0946025 -31.163182
# cond1        1.351517  0.2006822   6.734612
# cond2        1.153918  0.2317279   4.979625

如您所见,固定效果估算值与上面指定的差异相对应。此外,截距代表总体均值。

赫尔默特与 contr.helmert

您也可以使用内置contr.helmert函数创建对比度矩阵。

cHelmert <- contr.helmert(3)
#   [,1] [,2]
# 1   -1   -1
# 2    1   -1
# 3    0    2

但是,该顺序与您在问题中指定的顺序不匹配。因此,我们必须反转列和行的顺序。第一列对应于ba和第二个对应于c相对于平均值的ba

cHelmert2 <- cHelmert[c(3:1), 2:1]
#   [,1] [,2]
# 3    2    0
# 2   -1    1
# 1   -1   -1

将对比矩阵cHelmert2与进行比较cMat。您会注意到这些列是其他矩阵的缩放版本。

结果lmer是:

library(lme4)
res2 <- lmer(result ~ cond + (1|s), data = dat, 
             contrasts = list(cond = cHelmert2))
coef(summary(res2))    
#               Estimate Std. Error    t value
# (Intercept) -2.9481150 0.09460250 -31.163182
# cond1        0.4505056 0.06689407   6.734612
# cond2        0.5769590 0.11586393   4.979625

该对比矩阵允许进行与自定义对比矩阵相同的比较。但是,由于矩阵中的值不同,因此固定效果系数也不同。不出所料,相同。t


十分感谢!只是为了确保我现在就明白了-如果我想将4级变量中的第一级与其余级进行比较,那mat将是c(1, -1/3, -1/3, -1/3)?因此,我总是按照公式(a +(b + c + d)/ 3)中的数字进行设置,然后ginv对其进行适当缩放,以使系数直接反映差异。当您在Helmert示例中更改顺序时,这仅仅是为了匹配问题?否则,无论对比顺序如何,结果都应该相同,对吧?
M4RT1NK4 2015年

@ M4RT1NK4您的公式和相应的对比度正确。只是更改了列的顺序以匹配问题中的列的顺序。但是,行的顺序很重要,因为第一级是参考级。在您的示例中,参考级别是第三级别。
Sven Hohenstein,2015年

@SvenHohenstein我有一个与此相关的问题,想看看吗?stats.stackexchange.com/questions/357781/...
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.