¿Cómo interpretar estos contrastes personalizados?

10

Estoy haciendo un ANOVA unidireccional (por especie) con contrastes personalizados.

     [,1] [,2] [,3] [,4]
0.5    -1    0    0    0
5       1   -1    0    0
12.5    0    1   -1    0
25      0    0    1   -1
50      0    0    0    1

donde comparo la intensidad 0.5 contra 5, 5 contra 12.5 y así sucesivamente. Estos son los datos en los que estoy trabajando

ingrese la descripción de la imagen aquí

con los siguientes resultados

Generalized least squares fit by REML
  Model: dark ~ intensity 
  Data: skofijski.diurnal[skofijski.diurnal$species == "niphargus", ] 
       AIC      BIC    logLik
  63.41333 67.66163 -25.70667

Coefficients:
            Value Std.Error  t-value p-value
(Intercept) 16.95 0.2140872 79.17334  0.0000
intensity1   2.20 0.4281744  5.13809  0.0001
intensity2   1.40 0.5244044  2.66970  0.0175
intensity3   2.10 0.5244044  4.00454  0.0011
intensity4   1.80 0.4281744  4.20389  0.0008

 Correlation: 
           (Intr) intns1 intns2 intns3
intensity1 0.000                      
intensity2 0.000  0.612               
intensity3 0.000  0.408  0.667        
intensity4 0.000  0.250  0.408  0.612 

Standardized residuals:
       Min         Q1        Med         Q3        Max 
-2.3500484 -0.7833495  0.2611165  0.7833495  1.3055824 

Residual standard error: 0.9574271 
Degrees of freedom: 20 total; 15 residual

16.95 es la media global para "niphargus". En intensidad1, estoy comparando las medias de intensidad 0.5 contra 5.

Si entendí bien, el coeficiente de intensidad1 de 2.2 debería ser la mitad de la diferencia entre las medias de los niveles de intensidad 0.5 y 5. Sin embargo, mis cálculos manuales no coinciden con los del resumen. ¿Alguien puede intervenir en lo que estoy haciendo mal?

ce1 <- skofijski.diurnal$intensity
levels(ce1) <- c("0.5", "5", "0", "0", "0")
ce1 <- as.factor(as.character(ce1))
tapply(skofijski.diurnal$dark, ce1, mean)
       0    0.5      5 
  14.500 11.875 13.000 
diff(tapply(skofijski.diurnal$dark, ce1, mean))/2
      0.5       5 
  -1.3125  0.5625 
Roman Luštrik
fuente
¿Podría proporcionar la función lm () de R que solía estimar? ¿Cómo usaste exactamente la función de contrastes?
Philippe
BTW geom_points(position=position_dodge(width=0.75))arreglará la forma en que los puntos en su diagrama no se alinean con los cuadros.
vuela el
@flies desde mi pregunta, ha habido una introducción de geom_jitter, que es un acceso directo para todos los parámetros de geom_point () que fluctúan.
Roman Luštrik
No noté la inquietud allí. hace geom_jitter(position_dodge)el trabajo? He estado usando geom_points(position_jitterdodge)para agregar puntos a los gráficos de caja con esquivar.
vuela el
@flies ver los documentos por geom_jitter aquí . En mi experiencia desde mi respuesta anterior, encuentro innecesario usar boxplots. Nunca. Si tengo muchos puntos, uso gráficos de violín que muestran la densidad de puntos en detalles mucho más finos que los gráficos de caja. Los gráficos de caja se inventaron cuando trazar muchos puntos o sus densidades no eran convenientes. Quizás es hora de que empecemos a pensar en abandonar esta visualización (para discapacitados).
Roman Luštrik

Respuestas:

10

La matriz que especificó para los contrastes es correcta en principio. Para convertirlo en una matriz de contraste adecuada , debe calcular el inverso generalizado de su matriz original.

Si Mes tu matriz:

M

#     [,1] [,2] [,3] [,4]
#0.5    -1    0    0    0
#5       1   -1    0    0
#12.5    0    1   -1    0
#25      0    0    1   -1
#50      0    0    0    1 

Ahora, calcule el inverso generalizado usando ginvy transponga el resultado usando t:

library(MASS)
t(ginv(M))

#     [,1] [,2] [,3] [,4]
#[1,] -0.8 -0.6 -0.4 -0.2
#[2,]  0.2 -0.6 -0.4 -0.2
#[3,]  0.2  0.4 -0.4 -0.2
#[4,]  0.2  0.4  0.6 -0.2
#[5,]  0.2  0.4  0.6  0.8

El resultado es idéntico al de @Greg Snow. Use esta matriz para su análisis.

Esta es una manera mucho más fácil que hacerlo manualmente.


Hay una forma aún más fácil de generar una matriz de diferencias deslizantes (también conocido como contrastes repetidos ). Esto se puede hacer con la función contr.sdify el número de niveles de factores como parámetro. Si tiene cinco niveles de factores, como en su ejemplo:

library(MASS)
contr.sdif(5)

#   2-1  3-2  4-3  5-4
#1 -0.8 -0.6 -0.4 -0.2
#2  0.2 -0.6 -0.4 -0.2
#3  0.2  0.4 -0.4 -0.2
#4  0.2  0.4  0.6 -0.2
#5  0.2  0.4  0.6  0.8
Sven Hohenstein
fuente
4

Si la matriz en la parte superior es cómo está codificando las variables ficticias (lo que está pasando a la función Co contrasten R), entonces la primera compara el primer nivel con las otras (en realidad 0.8 veces la primera resta de 0.2 veces la suma de los otros).

El segundo término compara los primeros 2 niveles con el último 3. El tercero compara los primeros 3 niveles con el último2 y el cuarto compara los primeros 4 niveles con el último.

Si desea hacer las comparaciones que describe (compare cada par), la codificación de variable ficticia que desea es:

      [,1] [,2] [,3] [,4]
[1,] -0.8 -0.6 -0.4 -0.2
[2,]  0.2 -0.6 -0.4 -0.2
[3,]  0.2  0.4 -0.4 -0.2
[4,]  0.2  0.4  0.6 -0.2
[5,]  0.2  0.4  0.6  0.8
Greg Snow
fuente
¿El uso de esta matriz inverese generalizada también es necesario cuando se usa en aov()lugar de lm()? Lo pregunto porque he leído varios tutoriales, en los que las matrices de contraste aov()se construyen exactamente como la que da Roman. Por ejemplo, véase el Capítulo 5 de cran.r-project.org/doc/contrib/Vikneswaran-ED_companion.pdf
CRSH
2
La aovfunción llama a la lmfunción para hacer los cálculos principales, por lo que cosas como las matrices de contraste tendrán el mismo efecto en ambos.
Greg Snow