Como definir contrastes personalizados com lmer em R

9

Estou usando o lmer no R para verificar o efeito da condição ( cond) em algum resultado. Aqui estão alguns dados compostos, onde s é o identificador de sujeito e a, be csão condições.

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

Eu gostaria de comparar

  1. nível apara a média dos níveis be ce
  2. nível bpara nível c.

Minha pergunta é: como defino os contrastes para fazer isso de tal maneira que a interceptação reflita a média das três condições e as duas estimativas computadas reflitam diretamente as diferenças, conforme definido em 1. e 2.?

Eu tentei com

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

onde cond2parece estar bem, mas cond1não está.

A seguir Como interpretar esses contrastes personalizados? , Tentei usar o inverso generalizado, mas essas estimativas também não fazem sentido.

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

Também tentei os contrastes de Helmert, mas os meios ainda não combinam.

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

Qual é a maneira correta de fazer isso?

M4RT1NK4
fonte
Isso soa como um contraste de Helmert (c é o primeiro nível, depois b, depois a).
Michael M
Também tentei Helmert, mas os números não são os meios que estou procurando. Editei a pergunta para incluir os contrastes de Helmert, obrigado.
M4RT1NK4

Respostas:

13

Para as etapas a seguir, precisamos do quadro de dados no formato longo. A estrutura de dados datcontém a variável dependente result, o preditor categórica cond(níveis: a, b, e c), e o factor aleatório s.

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

A seguir, ilustrarei duas abordagens para criar uma matriz de contraste correspondente às condições que você deseja comparar:

  1. uma-b+c2
  2. b-c

Contrastes personalizados

A matriz matcorresponde às diferenças de nível.

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

Para criar a matriz de contraste real, calculamos o inverso generalizado com ginv(de 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

Essa matriz de contraste cMatpode ser usada em 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

Como você pode ver, as estimativas de efeito fixo correspondem às diferenças especificadas acima. Além disso, a interceptação representa a média geral.

Helmert contrasta com contr.helmert

Você também pode usar a contr.helmertfunção interna para criar a matriz de contraste.

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

No entanto, o pedido não corresponde ao que você especificou na pergunta. Portanto, temos que reverter a ordem das colunas e linhas. A primeira coluna corresponde a bvs. ae a segunda corresponde a cvs. a média de be a.

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

Compare a matriz de contraste cHelmert2com cMat. Você notará que as colunas são versões em escala da outra matriz.

O resultado 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

Sven Hohenstein
fonte
Ótimo, obrigado! Só para ter certeza de que eu entendo isso agora - se eu quisesse comparar o primeiro nível com o restante dos níveis em uma variável de 4 níveis, matseria c(1, -1/3, -1/3, -1/3)? Portanto, eu sempre defino os números como estariam na fórmula (a + (b + c + d) / 3) e então os ginvdimensiono adequadamente para que os coeficientes reflitam diretamente a diferença. E quando você mudou a ordem no exemplo Helmert, isso foi apenas para corresponder à pergunta? Caso contrário, os resultados devem ser os mesmos, independentemente da ordem dos contrastes, certo?
M4RT1NK4 27/08/2015
@ M4RT1NK4 Sua fórmula e o contraste correspondente não estão corretos. A ordem das colunas foi alterada para corresponder à ordem das colunas na pergunta. A ordem das linhas, no entanto, é importante, porque o primeiro nível é o nível de referência. No seu exemplo, o nível de referência é o terceiro nível.
Sven Hohenstein
@SvenHohenstein Eu tive uma pergunta relacionada com base nesta resposta, importa dar uma olhada? stats.stackexchange.com/questions/357781/…
mat