Как интерпретировать эти пользовательские контрасты?


10

Я делаю односторонний ANOVA (для каждого вида) с индивидуальными контрастами.

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

где я сравниваю интенсивность 0,5 против 5, 5 против 12,5 и так далее. Это данные, над которыми я работаю

введите описание изображения здесь

со следующими результатами

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 - это глобальное среднее значение для «нифаргуса». По интенсивности1 я сравниваю средства для интенсивности 0,5 против 5.

Если я правильно понял, коэффициент для интенсивности1, равный 2,2, должен быть вдвое меньше разницы между средними уровнями интенсивности 0,5 и 5. Однако мои ручные расчеты не совпадают с данными из краткого изложения. Может кто-нибудь скинуть, что я делаю не так?

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 

Не могли бы вы предоставить функцию lm () из R, которую вы использовали для оценки. Как именно вы использовали функцию контрастов?
Филипп

Кстати geom_points(position=position_dodge(width=0.75)), исправим то, как точки на вашем графике не совпадают с прямоугольниками.
летает

После моего вопроса, @flies, было введение geom_jitter, которое является ярлыком для всех параметров geom_point (), которые дрожат.
Роман Луштрик

Я не заметил дрожание там. делает geom_jitter(position_dodge)работу? Я использую, geom_points(position_jitterdodge)чтобы добавить точки на боксы с уклонением.
летает

@flies увидеть документы для geom_jitter здесь . По моему опыту, так как мой ответ выше, я считаю ненужным использовать boxplots. Когда-либо. Если у меня много точек, я использую графики для скрипки, которые показывают плотность точек в более тонких деталях, чем блокпосты. Boxplots были изобретены еще при построении многих точек или их плотности было неудобно. Возможно, пришло время задуматься об отказе от этой (с ограниченными возможностями) визуализации.
Роман Луштрик

Ответы:


10

Матрица, которую вы указали для контрастов, в принципе верна. Чтобы преобразовать его в соответствующую контрастную матрицу , вам необходимо рассчитать обобщенную обратную величину вашей исходной матрицы.

Если Mваша матрица:

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 

Теперь вычислите обобщенное обратное с использованием ginvи транспонируйте результат, используя 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

Результат идентичен результату @Greg Snow. Используйте эту матрицу для анализа.

Это намного проще, чем делать это вручную.


Есть еще более простой способ генерировать матрицу скользящих различий (или повторяющиеся контрасты ). Это можно сделать с помощью функции contr.sdifи количества уровней факторов в качестве параметра. Если у вас есть пять уровней факторов, как в вашем примере:

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

Если матрица вверху показывает, как вы кодируете фиктивные переменные (то, что вы передаете функции Cили contrastфункции в R), то они сначала сравнивают 1-й уровень с остальными (на самом деле в 0,8 раза 1-й уровень вычитается из 0,2-кратного сумма остальных).

Второй член сравнивает первые 2 уровня с последними 3. Третий сравнивает первые 3 уровня с последними2, а четвертый сравнивает первые 4 уровня с последним.

Если вы хотите выполнить сравнение, которое вы описываете (сравнить каждую пару), то вам нужна кодировка фиктивной переменной:

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

Необходимо ли использование этой обобщенной инверсной матрицы при использовании aov()вместо lm()? Я спрашиваю, потому что я прочитал несколько учебных пособий, в которых контрастные матрицы для aov()построены так же, как тот, который дал Роман. Например, см. Главу 5 в cran.r-project.org/doc/contrib/Vikneswaran-ED_companion.pdf
crsh

2
aovФункция вызывает lmфункцию , чтобы сделать основные вычисления, так как вещи , контрастными матрицы будут иметь тот же эффект в обеих.
Грег Сноу
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.