Последующее тестирование в multcomp :: glht для моделей со смешанными эффектами (lme4) с взаимодействиями

10

Я выполняю специальные тесты на линейной модели смешанных эффектов в R( lme4пакет). Я использую multcompпакет ( glht()функцию) для выполнения специальных тестов.

Мой экспериментальный дизайн - повторные измерения со случайным эффектом блока. Модели указаны как:

mymod <- lmer(variable ~ treatment * time + (1|block), data = mydata, REML = TRUE)

Вместо того, чтобы прикреплять мои данные здесь, я работаю с данными, вызываемыми warpbreaksв multcompпакете.

data <- warpbreaks
warpbreaks$rand <- NA

Я добавил дополнительную случайную переменную, чтобы имитировать мой эффект «блока»:

warpbreaks$rand <- rep(c("foo", "bar", "bee"), nrow(warpbreaks)/3)

Это имитирует мою модель:

mod <- lmer(breaks ~ tension * wool + (1|rand), data = warpbreaks) 

Мне известен пример в « Дополнительных примерах Multcomp - 2 Way Anova». Этот пример приводит вас к сравнению уровней напряжения внутри уровней wool.

Что если я захочу сделать обратное - сравнить уровни woolвнутри уровней tension? (В моем случае это будет сравнение уровней лечения (два - 0, 1) в пределах уровней времени (три - июнь, июль, август).

Я придумал следующий код для этого, но он не работает (см. Сообщение об ошибке ниже).

Сначала из примера (с местами woolи tensionместами):

tmp <- expand.grid(wool = unique(warpbreaks$wool), tension = unique(warpbreaks$tension))
X <- model.matrix(~ tension * wool, data = tmp)
glht(mod, linfct = X)

Tukey <- contrMat(table(warpbreaks$wool), "Tukey")

K1 <- cbind(Tukey, matrix(0, nrow = nrow(Tukey), ncol = ncol(Tukey)))
rownames(K1) <- paste(levels(warpbreaks$tension)[1], rownames(K1), sep = ":")

K2 <- cbind(matrix(0, nrow = nrow(Tukey), ncol = ncol(Tukey)), Tukey)
rownames(K2) <- paste(levels(warpbreaks$tension)[2], rownames(K2), sep = ":")

Отсюда мой собственный код:

K3 <- cbind(matrix(0, nrow = nrow(Tukey), ncol = ncol(Tukey)), Tukey)
rownames(K2) <- paste(levels(warpbreaks$tension)[3], rownames(K3), sep = ":")

K <- rbind(K1, K2, K3)
colnames(K) <- c(colnames(Tukey), colnames(Tukey))

> summary(glht(mod, linfct = K %*% X))
Error in summary(glht(mod, linfct = K %*% X)) : 
  error in evaluating the argument 'object' in selecting a method for function 'summary': Error in K %*% X : non-conformable arguments
Эшли Асмус
источник

Ответы:

6

Это намного проще сделать с помощью пакета lsmeans

library(lsmeans)
lsmeans(mod, pairwise ~ tension | wool)
lsmeans(mod, pairwise ~ wool | tension)
Русь Лент
источник
Отлично, это работает! Спасибо. Примечание: этот код работал только для моих данных после изменения моей переменной повтора с числовых значений (3 и 6) на алфавитные значения (A & B).
Ну, это очень важно! Потому что это другая модель с timeчисловым предиктором. Я подозреваю, что вы хотели это как фактор.
Расс Лент
Как я могу обобщить больше предсказателей? если, например, у меня есть 3 предиктора, как это работает?
весело
1
@havefun Пожалуйста, посмотрите на help("lsmeans", package = "lsmeans")и vignette("using-lsmeans"). Там много документации и много примеров.
Расс Лент
1
Подсчитайте количество сравнений, которые вы получаете с каждым методом, они не совпадают. Также ознакомьтесь с настройками множественного тестирования. Если у вас большее семейство тестов, скорректированные значения P отличаются от значений для меньшего семейства. Когда вы используете переменную by, корректировки применяются отдельно к каждому набору.
Расс Лент