Comment interpréter ces contrastes personnalisés?

10

Je fais une ANOVA à sens unique (par espèce) avec des contrastes personnalisés.

     [,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

où je compare l'intensité 0,5 contre 5, 5 contre 12,5 et ainsi de suite. Ce sont les données sur lesquelles je travaille

entrez la description de l'image ici

avec les résultats suivants

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 est la moyenne mondiale pour "niphargus". En intensité1, je compare les moyennes de l'intensité 0,5 à 5.

Si j'ai bien compris, le coefficient d'intensité1 de 2,2 devrait être la moitié de la différence entre les moyennes des niveaux d'intensité 0,5 et 5. Cependant, mes calculs manuels ne correspondent pas à ceux du résumé. Quelqu'un peut-il intervenir dans ce que je fais 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
la source
Pourriez-vous fournir la fonction lm () de R que vous avez utilisée pour estimer. Comment avez-vous utilisé la fonction contrastes exactement?
Philippe
btw geom_points(position=position_dodge(width=0.75))corrigera la façon dont les points de votre tracé ne s'alignent pas avec les cases.
vole le
@flies depuis ma question, il y a eu une introduction de geom_jitter, qui est un raccourci pour tous les paramètres geom_point () qui tremblent.
Roman Luštrik
Je n'ai pas remarqué la gigue là-bas. ça geom_jitter(position_dodge)marche? J'ai utilisé geom_points(position_jitterdodge)pour ajouter des points aux boxplots avec esquive.
vole
@flies voir les documents geom_jitter ici . D'après mon expérience depuis ma réponse ci-dessus, je trouve inutile d'utiliser des boîtes à moustaches. Déjà. Si j'ai plusieurs points, j'utilise des tracés de violon qui montrent la densité des points dans des détails beaucoup plus fins que les tracés de boîte. Les boîtes à moustaches ont été inventées lorsque le tracé de nombreux points ou leur densité n'était pas pratique. Il est peut-être temps que nous commencions à penser à abandonner cette visualisation (handicapée).
Roman Luštrik

Réponses:

10

La matrice que vous avez spécifiée pour les contrastes est correcte en principe. Pour le convertir en une matrice de contraste appropriée , vous devez calculer l'inverse généralisé de votre matrice d'origine.

Si Mest votre matrice:

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 

Maintenant, calculez l'inverse généralisé en utilisant ginvet transposez le résultat en utilisant 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

Le résultat est identique à celui de @Greg Snow. Utilisez cette matrice pour votre analyse.

C'est un moyen beaucoup plus simple que de le faire manuellement.


Il existe un moyen encore plus simple de générer une matrice de différences glissantes (alias contrastes répétés ). Cela peut être fait avec la fonction contr.sdifet le nombre de niveaux de facteur comme paramètre. Si vous avez cinq niveaux de facteurs, comme dans votre exemple:

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
la source
4

Si la matrice en haut est la façon dont vous encodez les variables fictives (ce que vous passez à la fonction Cou contrastdans R), alors le premier compare le 1er niveau aux autres (en fait, 0,8 fois le 1er soustrait de 0,2 fois le somme des autres).

Le deuxième terme compare les 2 premiers niveaux aux 3 derniers. Le 3ème compare les 3 premiers niveaux au dernier2 et le 4ème compare les 4 premiers niveaux au dernier.

Si vous voulez faire les comparaisons que vous décrivez (comparer chaque paire), alors l'encodage de variable fictive que vous voulez est:

      [,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
la source
L'utilisation de cette matrice inversée généralisée est-elle également nécessaire lors de l'utilisation à la aov()place de lm()? Je pose la question, car j'ai lu plusieurs tutoriels, dans lesquels les matrices de contraste pour aov()sont construites exactement comme celle donnée par Roman. Par exemple, voir le chapitre 5 dans cran.r-project.org/doc/contrib/Vikneswaran-ED_companion.pdf
crsh
2
La aovfonction appelle la lmfonction pour effectuer les calculs principaux, donc des choses comme les matrices de contraste auront le même effet dans les deux.
Greg Snow