Jak interpretować te niestandardowe kontrasty?

10

Robię jednokierunkową ANOVA (według gatunków) z niestandardowymi kontrastami.

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

gdzie porównuję intensywność 0,5 z 5, 5 z 12,5 i tak dalej. To dane, nad którymi pracuję

wprowadź opis zdjęcia tutaj

z następującymi wynikami

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 to globalna średnia dla „niphargus”. W intensywności 1 porównuję średnie dla intensywności 0,5 z 5.

Jeśli zrozumiałem to prawo, współczynnik intensywności1 wynoszący 2,2 powinien wynosić połowę różnicy między średnimi poziomami intensywności 0,5 i 5. Jednak moje obliczenia ręki nie pasują do tych z podsumowania. Czy ktoś może wtrącić się w to, co robię źle?

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
źródło
Czy możesz podać funkcję lm () z R, której użyłeś do oszacowania. Jak dokładnie użyłeś funkcji kontrastów?
Philippe,
btw geom_points(position=position_dodge(width=0.75))naprawi sposób, w jaki punkty na twojej działce nie pokrywają się z polami.
lata
@flies od mojego pytania, wprowadzono geom_jitterskrót, który jest skrótem dla wszystkich parametrów geom_point (), które drgają.
Roman Luštrik,
Nie zauważyłem tam drgań. nie geom_jitter(position_dodge)działa? Używam geom_points(position_jitterdodge)dodać kropki boxplots z uniku.
lata
@fly zobaczyć geom_jitter tutaj dokumenty . Z doświadczenia wiem, że od powyższej odpowiedzi uważam, że nie jest konieczne używanie wykresów pudełkowych. Zawsze. Jeśli mam wiele punktów, używam wykresów skrzypcowych, które pokazują gęstość punktów w znacznie drobniejszych szczegółach niż wykresy skrzynkowe. Wykresy pudełkowe zostały wynalezione w przeszłości, gdy wykreślono wiele punktów lub ich gęstość nie była dogodna. Być może nadszedł czas, abyśmy zaczęli myśleć o porzuceniu tej (upośledzonej) wizualizacji.
Roman Luštrik

Odpowiedzi:

10

Macierz określona dla kontrastów jest w zasadzie poprawna. Aby przekonwertować go na odpowiednią macierz kontrastu , musisz obliczyć uogólnioną odwrotność oryginalnej macierzy.

Jeśli Mtwoja matryca:

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 

Teraz obliczyć uogólnioną odwrotność za pomocą ginvi transponować wynik za pomocą 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

Wynik jest identyczny jak w przypadku @Greg Snow. Użyj tej macierzy do analizy.

Jest to o wiele łatwiejszy sposób niż robienie tego ręcznie.


Jest jeszcze łatwiejszy sposób na wygenerowanie matrycy różnic ślizgowych (inaczej powtarzających się kontrastów ). Można tego dokonać za pomocą funkcji contr.sdifi liczby poziomów czynników jako parametru. Jeśli masz pięć poziomów czynników, jak w twoim przykładzie:

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
źródło
4

Jeśli macierz na górze jest sposobem, w jaki kodujesz zmienne fikcyjne (to, co przekazujesz do Club contrastfunkcji w R), to one pierwsze porównują pierwszy poziom z innymi (faktycznie 0,8 razy pierwszy odejmowany od 0,2 razy suma pozostałych).

Drugi semestr porównuje pierwsze 2 poziomy z ostatnimi 3. Trzeci porównuje pierwsze 3 poziomy z ostatnimi 2, a czwarty porównuje pierwsze 4 poziomy z ostatnim.

Jeśli chcesz dokonać porównań, które opisujesz (porównaj każdą parę), to kodowanie zmiennej fikcyjnej to:

      [,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
źródło
Czy użycie tej uogólnionej macierzy inverese jest również konieczne, gdy jest używana aov()zamiast lm()? Pytam, ponieważ przeczytałem kilka samouczków, w których macierze kontrastu aov()są konstruowane tak, jak podane przez Romana. Np. Patrz rozdział 5 w cran.r-project.org/doc/contrib/Vikneswaran-ED_companion.pdf
crsh
2
aovFunkcja wywołuje lmfunkcję do zrobienia główne obliczenia, więc takie rzeczy kontrastu matryc będzie miał ten sam efekt w obu.
Greg Snow