Como interpretar esses contrastes personalizados?

10

Estou fazendo uma ANOVA de sentido único (por espécie) com 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

onde eu comparo a intensidade 0,5 contra 5, 5 contra 12,5 e assim por diante. Estes são os dados em que estou trabalhando

insira a descrição da imagem aqui

com os seguintes 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 é a média global para "nifhargus". Na intensidade1, estou comparando médias da intensidade 0,5 contra 5.

Se eu entendi direito, o coeficiente de intensidade1 de 2,2 deve ser metade da diferença entre as médias dos níveis de intensidade 0,5 e 5. No entanto, meus cálculos manuais não coincidem com os do resumo. Alguém pode chip no que estou fazendo errado?

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
fonte
Você poderia fornecer a função lm () de R que você costumava estimar. Como exatamente você usou a função contrastes?
Philippe
btw geom_points(position=position_dodge(width=0.75))corrigirá a maneira como os pontos em seu gráfico não se alinham com as caixas.
voa
@fly desde a minha pergunta, houve uma introdução de geom_jitter, que é um atalho para todos os parâmetros geom_point () que tremem.
Roman Luštrik
Eu não notei o tremor lá. faz geom_jitter(position_dodge)o trabalho? Eu tenho usado geom_points(position_jitterdodge)para adicionar pontos aos boxplots com esquivando.
voa
@fly veja os documentos geom_jitter aqui . Na minha experiência desde a minha resposta acima, acho desnecessário usar boxplots. Sempre. Se tenho muitos pontos, utilizo gráficos de violino que mostram densidade de pontos em detalhes muito mais finos que os gráficos de caixa. Os boxplots foram inventados quando a plotagem de muitos pontos ou suas densidades não eram convenientes. Talvez seja a hora de começarmos a abandonar essa visualização (deficiente).
Roman Luštrik 14/09/19

Respostas:

10

A matriz que você especificou para os contrastes está correta em princípio. Para convertê-lo em uma matriz de contraste apropriada , é necessário calcular o inverso generalizado da sua matriz original.

Se Mé sua 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 

Agora, calcule o inverso generalizado usando ginve transponha o 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

O resultado é idêntico ao de @Greg Snow. Use essa matriz para sua análise.

Essa é uma maneira muito mais fácil do que fazer manualmente.


Existe uma maneira ainda mais fácil de gerar uma matriz de diferenças deslizantes (também conhecidas como contrastes repetidos ). Isso pode ser feito com a função contr.sdife o número de níveis de fator como parâmetro. Se você tiver cinco níveis de fator, como no seu exemplo:

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
fonte
4

Se a matriz na parte superior é como você está codificando as variáveis ​​fictícias (o que você está passando para Cou contrastfunciona em R), então a primeira delas está comparando o 1º nível com os outros (na verdade, 0,8 vezes o 1º subtraído de 0,2 vezes o soma dos demais).

O segundo termo compara os primeiros 2 níveis aos últimos 3. O terceiro compara os primeiros 3 níveis aos últimos2 e o quarto compara os primeiros 4 níveis ao último.

Se você deseja fazer as comparações que você descreve (compare cada par), a codificação da variável dummy que você deseja é:

      [,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
fonte
O uso dessa matriz inverese generalizada também é necessário quando usado em aov()vez de lm()? Estou perguntando, porque li vários tutoriais, nos quais as matrizes de contraste aov()são construídas exatamente como a apresentada por Roman. Por exemplo, consulte o Capítulo 5 em cran.r-project.org/doc/contrib/Vikneswaran-ED_companion.pdf
crsh
2
A aovfunção chama a lmfunção para fazer os cálculos principais, portanto, coisas como matrizes de contraste terão o mesmo efeito em ambas.
Greg Neve