Cómo establecer contrastes personalizados con lmer en R

9

Estoy usando lmer en R para verificar el efecto de la condición ( cond) en algún resultado. Aquí están algunos hechos de seguridad de datos, donde s es el identificador de objeto y a, by cson condiciones.

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

Me gustaria comparar

  1. el nivel ade la media de los niveles by cy
  2. nivel ba nivel c.

Mi pregunta es, ¿cómo configuro los contrastes para hacer esto de tal manera que la intersección refleje la media de las tres condiciones y las dos estimaciones calculadas reflejen directamente las diferencias definidas en 1. y 2.?

Lo intenté con

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

donde cond2parece estar bien, pero cond1no lo está.

Siguiente ¿Cómo interpretar estos contrastes personalizados? , Intenté usar el inverso generalizado, pero estas estimaciones tampoco tienen sentido.

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

También probé los contrastes de Helmert, pero los medios aún no coinciden.

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

¿Cuál es la forma correcta de hacer esto?

M4RT1NK4
fuente
Esto suena como un contraste de Helmert (c es el primer nivel, luego b, luego a).
Michael M
También probé Helmert, pero los números no son el medio que estoy buscando. Edité la pregunta para incluir los contrastes de Helmert, gracias.
M4RT1NK4

Respuestas:

13

Para los siguientes pasos, necesitamos el marco de datos en formato largo. La trama de datos datcontiene la variable dependiente result, el predictor categórico cond(niveles: a, by c), y el factor aleatorio s.

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

A continuación, ilustraré dos enfoques para crear una matriz de contraste correspondiente a las condiciones que desea comparar:

  1. una-si+C2
  2. si-C

Contrastes personalizados

La matriz matcorresponde a las diferencias de nivel.

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

Para crear la matriz de contraste real, calculamos el inverso generalizado con ginv(desde 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

Esta matriz de contraste cMatse puede usar en 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 puede ver, las estimaciones de efectos fijos corresponden a las diferencias especificadas anteriormente. Además, la intersección representa la media general.

Helmert contrasta con contr.helmert

También puede usar la contr.helmertfunción incorporada para crear la matriz de contraste.

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

Sin embargo, el pedido no se corresponde con el que especificó en la pregunta. Por lo tanto, tenemos que invertir el orden de las columnas y filas. La primera columna corresponde a bvs. ay la segunda corresponde a cvs. la media de by a.

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

Compare la matriz de contraste cHelmert2con cMat. Notará que las columnas son versiones escaladas de la otra matriz.

El resultado de lmeres:

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

Esta matriz de contraste permite las mismas comparaciones que la matriz de contraste personalizada. Sin embargo, dado que los valores en la matriz son diferentes, los coeficientes de efectos fijos también son diferentes. No es sorprendente que los valores sean los mismos.t

Sven Hohenstein
fuente
¡Muchas gracias! Solo para asegurarme de que entiendo esto ahora, si quisiera comparar el primer nivel con el resto de los niveles en una variable de 4 niveles, ¿ matlo sería c(1, -1/3, -1/3, -1/3)? Por lo tanto, siempre establezco los números como estarían en la fórmula (a + (b + c + d) / 3) y luego los ginvescalo adecuadamente para que los coeficientes reflejen directamente la diferencia. Y cuando cambiaste el orden en el ejemplo de Helmert, ¿eso solo coincidía con la pregunta? De lo contrario, los resultados deberían ser los mismos, independientemente del orden de los contrastes, ¿verdad?
M4RT1NK4
@ M4RT1NK4 Su fórmula y el contraste correspondiente no son correctos. El orden de las columnas se cambió para coincidir con el orden de las columnas en la pregunta. Sin embargo, el orden de las filas es importante, porque el primer nivel es el nivel de referencia. En su ejemplo, el nivel de referencia es el tercer nivel.
Sven Hohenstein
@SvenHohenstein Tenía una pregunta relacionada basada en esta respuesta, ¿te importaría echar un vistazo? stats.stackexchange.com/questions/357781/…
mat