Как установить пользовательские контрасты с помощью lmer в R


9

Я использую lmer в R, чтобы проверить влияние условия ( cond) на некоторый результат. Вот некоторые составные данные, где s - идентификатор субъекта a, bи c- условия.

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

Я тоже попробовал контрасты Хельмерта, но средства все равно не совпадают.

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

Как правильно это сделать?


Это звучит как контраст Гельмерта (c - первый уровень, затем b, затем a).
Майкл М

Я тоже пробовал Хельмерта, но цифры - не то, что я ищу. Я отредактировал вопрос, чтобы включить контрасты Гельмерта, спасибо.
M4RT1NK4

Ответы:


13

Для следующих шагов нам понадобится фрейм данных в длинном формате. Кадр данных datсодержит зависимую переменную result, категорического предиктор cond(уровни: a, b, и c), а также случайный фактор s.

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

Далее я проиллюстрирую два подхода для создания контрастной матрицы, соответствующей условиям, которые вы хотите сравнить:

  1. a-б+с2
  2. б-с

Пользовательские контрасты

Матрица matсоответствует разности уровней.

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

Чтобы создать фактическую контрастную матрицу, мы вычисляем обобщенное обратное с ginv(из 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

Однако порядок не соответствует указанному в вопросе. Следовательно, мы должны изменить порядок столбцов и строк. Первый соответствует столбцу к bVS. , aа второй соответствует cпротив средних bи a.

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масштабирую их соответствующим образом, чтобы коэффициенты напрямую отражали разницу. А когда вы изменили порядок в примере с Гельмертом, это было просто для соответствия вопросу? В противном случае результаты должны быть одинаковыми, независимо от порядка контрастов, верно?
M4RT1NK4

@ M4RT1NK4 Ваша формула и соответствующий контраст не верны. Порядок столбцов был просто изменен, чтобы соответствовать порядку столбцов в вопросе. Порядок строк, однако, важен, потому что первый уровень является опорным уровнем. В вашем примере эталонный уровень - это третий уровень.
Свен Хоэнштайн,

@SvenHohenstein У меня был связанный вопрос, основанный на этом ответе, не против взглянуть? stats.stackexchange.com/questions/357781/…
мат
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.