Як встановити власні контрасти з 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. 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

Для створення фактичної контрастної матриці обчислюємо узагальнену обернену ginvMASS).

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

Однак замовлення не відповідає тому, яке ви вказали у питанні. Отже, ми повинні змінити порядок стовпців і рядків. Перший стовпець відповідає bпроти, 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 Ваша формула та відповідний контраст ist коректні. Порядок стовпців було просто змінено, щоб відповідати порядку стовпців у питанні. Порядок рядків, однак, важливий, тому що перший рівень є еталонним рівнем. У вашому прикладі еталонний рівень є третім рівнем.
Свен Хогенштайн

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