Testy post-hoc w multcomp :: glht dla modeli efektów mieszanych (Lme4) z interakcjami

10

Przeprowadzam testy post-hoc na liniowym modelu mieszanych efektów w R( lme4pakiecie). Używam multcomppakietu ( glht()funkcji) do przeprowadzania testów post-hoc.

Mój plan eksperymentalny to powtarzane pomiary z przypadkowym efektem blokowania. Modele są określone jako:

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

Zamiast załączać tutaj moje dane, pracuję nad danymi wywoływanymi warpbreaksw multcomppakiecie.

data <- warpbreaks
warpbreaks$rand <- NA

Dodałem dodatkową zmienną losową, aby naśladować mój efekt „bloku”:

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

To naśladuje mój model:

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

Znam ten przykład z „ Dodatkowych przykładów Multcomp - 2-drożna Anova”. Ten przykład prowadzi do porównania poziomów napięcia w obrębie poziomów wool.

Co jeśli chcę zrobić coś przeciwnego - porównać poziomy w woolobrębie poziomów tension? (W moim przypadku byłoby to porównanie poziomów leczenia (dwa - 0, 1) w ramach poziomów czasu (trzy - czerwiec, lipiec, sierpień).

Wymyśliłem następujący kod, aby to zrobić, ale wydaje się, że nie działa (patrz komunikat o błędzie poniżej).

Po pierwsze, z przykładu (z wooli tensionzamieniły się miejscami):

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 = ":")

Od tego momentu mój własny kod:

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
Ashley Asmus
źródło

Odpowiedzi:

6

O wiele łatwiej jest to zrobić za pomocą pakietu lsmeans

library(lsmeans)
lsmeans(mod, pairwise ~ tension | wool)
lsmeans(mod, pairwise ~ wool | tension)
Russ Lenth
źródło
Świetnie, działa! Dzięki. Uwaga: ten kod działał tylko w przypadku moich danych po zmianie zmiennej wielokrotnej z wartości liczbowych (3 i 6) na wartości alfabetyczne (A i B).
To ma duże znaczenie! Ponieważ jest to inny model z timepredyktorem numerycznym. Podejrzewam, że chciałeś to jako czynnik.
Russ Lenth
Jak mogę uogólnić na więcej predyktorów? jeśli na przykład mam 3 predyktory, jak to działa?
baw się dobrze
1
@havefun Proszę spojrzeć na help("lsmeans", package = "lsmeans")i vignette("using-lsmeans"). Istnieje wiele dokumentacji i wielu przykładów.
Russ Lenth
1
Policz liczbę porównań uzyskanych za pomocą każdej metody, nie są one takie same. Przeczytaj także o korektach wielokrotnego testowania. Gdy masz większą rodzinę testów, skorygowane wartości P są inne niż dla mniejszej rodziny. Gdy używasz zmiennej według, dopasowania są stosowane osobno do każdego zestawu.
Russ Lenth