Come interpretare questi contrasti personalizzati?


10

Sto realizzando un ANOVA a senso unico (per specie) con contrasti personalizzati.

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

dove confronto intensità 0,5 contro 5, 5 contro 12,5 e così via. Questi sono i dati a cui sto lavorando

inserisci qui la descrizione dell'immagine

con i seguenti risultati

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 è la media globale per "niphargus". In intensità1, sto confrontando i mezzi per intensità 0,5 contro 5.

Se ho capito bene, il coefficiente di intensità1 di 2,2 dovrebbe essere la metà della differenza tra le medie dei livelli di intensità 0,5 e 5. Tuttavia, i miei calcoli con le mani non corrispondono a quelli del sommario. Qualcuno può chip in cosa sto facendo di sbagliato?

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 

Potresti fornire la funzione lm () da R che hai usato per stimare. Come hai usato esattamente la funzione dei contrasti?
Philippe,

btw geom_points(position=position_dodge(width=0.75))risolverà il modo in cui i punti nella trama non si allineano alle caselle.
vola dal

@flies dalla mia domanda, c'è stata un'introduzione di geom_jitter, che è una scorciatoia per tutti i parametri geom_point () che jitter.
Roman Luštrik,

Non ho notato il jitter lì. fa geom_jitter(position_dodge)il lavoro? Ho usato geom_points(position_jitterdodge)per aggiungere punti ai grafici a scatole con schivata.
vola dal

@flies guarda i documenti per geom_jitter qui . Nella mia esperienza dalla mia risposta precedente, trovo superfluo usare i grafici a scatole. Mai. Se ho molti punti, uso trame di violino che mostrano la densità dei punti con dettagli molto più fini rispetto ai grafici a scatole. I grafici a scatole sono stati inventati indietro quando si tracciavano molti punti o la loro densità non era conveniente. Forse è tempo che iniziamo a pensare di abbandonare questa visualizzazione (per disabili).
Roman Luštrik,

Risposte:


10

La matrice specificata per i contrasti è corretta in linea di principio. Per convertirlo in una matrice di contrasto appropriata , è necessario calcolare l'inverso generalizzato della matrice originale.

Se Mè la tua 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 

Ora, calcola l'inverso generalizzato usando ginve trasponi il risultato 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

Il risultato è identico a quello di @Greg Snow. Usa questa matrice per la tua analisi.

Questo è un modo molto più semplice rispetto a farlo manualmente.


C'è un modo ancora più semplice per generare una matrice di differenze di scorrimento (ovvero contrasti ripetuti ). Questo può essere fatto con la funzione contr.sdife il numero di livelli di fattore come parametro. Se hai cinque livelli di fattori, come nel tuo esempio:

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

4

Se la matrice in alto è il modo in cui stai codificando le variabili fittizie (cosa stai passando alla Co alla contrastfunzione in R), allora il primo sta confrontando il 1 ° livello con gli altri (in realtà 0,8 volte il 1o sottratto da 0,2 volte il somma degli altri).

Il secondo termine confronta i primi 2 livelli con gli ultimi 3. Il terzo confronta i primi 3 livelli con gli ultimi2 e il quarto confronta i primi 4 livelli con l'ultimo.

Se vuoi fare i confronti che descrivi (confronta ogni coppia), la variabile fittizia che vuoi codificare è:

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

L'uso di questa matrice inverese generalizzata è necessario anche quando si utilizza al aov()posto di lm()? Sto chiedendo, perché ho letto diversi tutorial, in cui le matrici di contrasto aov()sono costruite proprio come quella data da Roman. Ad esempio, vedere il capitolo 5 in cran.r-project.org/doc/contrib/Vikneswaran-ED_companion.pdf
crsh,

2
La aovfunzione chiama la lmfunzione per eseguire i calcoli principali, quindi cose come le matrici di contrasto avranno lo stesso effetto in entrambi.
Greg Snow,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.