Jak ustawić niestandardowe kontrasty z lmer w R.

9

Używam lmera w R, aby sprawdzić wpływ warunku ( cond) na jakiś wynik. Oto niektóre skompilowane dane, gdzie s jest identyfikatorem podmiotu i a, bi csą warunkami.

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

Chciałbym porównać

  1. poziom ado średniej poziomów bi ci
  2. poziom bdo poziomu c.

Moje pytanie brzmi: jak ustawić kontrasty, aby zrobić to w taki sposób, aby punkt przecięcia odzwierciedlał średnią z trzech warunków, a dwa obliczone oszacowania bezpośrednio odzwierciedlały różnice zdefiniowane w punktach 1. i 2.?

Próbowałem z

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

gdzie cond2wydaje się być OK, ale cond1nie jest.

Po Jak interpretować te niestandardowe kontrasty? , Zamiast tego próbowałem użyć uogólnionej odwrotności, ale te szacunki też nie mają sensu.

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

Próbowałem też kontrastów Helmerta, ale środki wciąż się nie zgadzają.

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

Jaki jest właściwy sposób to zrobić?

M4RT1NK4
źródło
Brzmi to jak kontrast Helmerta (c to pierwszy poziom, potem b, a następnie a).
Michael M,
Próbowałem też Helmerta, ale liczby nie są tym, czego szukam. Zredagowałem pytanie, aby uwzględnić kontrasty Helmerta, dzięki.
M4RT1NK4

Odpowiedzi:

13

W poniższych krokach potrzebujemy ramki danych w długim formacie. Ramka danych datzawiera zmienną zależną resultkategoryczne predykcyjne cond(poziomy: a, b, a c) i czynnik losowy s.

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

Poniżej zilustruję dwa podejścia do stworzenia matrycy kontrastu odpowiadającej warunkom, które chcesz porównać:

  1. ab+c2
  2. bc

Niestandardowe kontrasty

Matryca matodpowiada różnicom poziomów.

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

Aby utworzyć rzeczywistą macierz kontrastu, obliczamy uogólnioną odwrotność za pomocą ginv(z 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

Ta matryca kontrastu cMatmoże być używana w 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

Jak widać, szacunki efektu stałego odpowiadają różnicom określonym powyżej. Ponadto punkt przecięcia reprezentuje ogólną średnią.

Helmert kontrastuje z contr.helmert

Możesz także użyć wbudowanej contr.helmertfunkcji, aby utworzyć matrycę kontrastu.

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

Jednak zamówienie nie odpowiada zamówieniu podanemu w pytaniu. Dlatego musimy odwrócić kolejność kolumn i wierszy. Pierwsza kolumna odpowiada bvs, aa druga odpowiada cvs. średniej bi a.

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

Porównaj matrycę kontrastu cHelmert2z cMat. Zauważysz, że kolumny są skalowanymi wersjami drugiej matrycy.

Wynikiem lmerjest:

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

Ta matryca kontrastu pozwala na takie same porównania jak niestandardowa matryca kontrastu. Ponieważ jednak wartości w macierzy są różne, współczynniki efektów stałych są również różne. Nic dziwnego, żet-wartości są takie same.

Sven Hohenstein
źródło
Wielkie dzięki! Wystarczy, aby upewnić się, że rozumiem to teraz - jeśli chciałem porównać pierwszy poziom do reszty poziomów w zmiennej 4 poziomu, matbyłaby c(1, -1/3, -1/3, -1/3)? Zawsze więc ustawiam liczby tak, jak byłyby we wzorze (a + (b + c + d) / 3), a następnie ginvodpowiednio skaluję, aby współczynniki bezpośrednio odzwierciedlały różnicę. A kiedy zmieniłeś kolejność w przykładzie Helmerta, to było po prostu dopasowanie do pytania? W przeciwnym razie wyniki powinny być takie same, niezależnie od kolejności kontrastów, prawda?
M4RT1NK4
@ M4RT1NK4 Twoja formuła i odpowiedni kontrast są poprawne. Kolejność kolumn została właśnie zmieniona, aby pasowała do kolejności kolumn w pytaniu. Kolejność wierszy jest jednak ważna, ponieważ pierwszy poziom jest poziomem odniesienia. W twoim przykładzie poziom odniesienia to trzeci poziom.
Sven Hohenstein
@ SvenHohenstein Miałem powiązane pytanie oparte na tej odpowiedzi, czy mógłbyś rzucić okiem? stats.stackexchange.com/questions/357781/…
mat