Почему изменение типа контраста меняет метки строк в сводке R lm?

При контрастах по умолчанию в R (contr.treatment) сводка объекта линейной модели дает имена строк в соответствии с именами уровней. Когда я изменяю контрасты на contr.sum, сводка объекта линейной модели дает имена строк в соответствии с составленными числами.

В приведенном ниже примере кода имена строк для контрастов обработки — xa xb xc xd xe, для контрастов суммы — x1 x2 x3 x4 x5.

Есть ли способ заставить их вести себя одинаково, кроме ручного переименования строк?

ПРИМЕР:

y <- rnorm(10, 0, 1)
x <- factor(rep(letters[1:5], each = 2))

options(contrasts = c("contr.treatment", "contr.poly"))
summary(lm(y ~ x))

options(contrasts = c("contr.sum", "contr.poly"))
summary(lm(y ~ x))

person Jdub    schedule 30.05.2012    source источник
comment
Но они не одинаковы, не так ли? Использование разных контрастов означает, что коэффициенты имеют разные интерпретации, так почему же вы называете их одинаковыми?   -  person joran    schedule 30.05.2012
comment
@joran, изменится ли ваша интерпретация, если строки будут помечены именами групп?   -  person Jdub    schedule 30.05.2012
comment
Ну, интерпретации разные, независимо от того, как они помечены в выводе R. Если вы просто хотите пометить их по-другому, то я думаю, что вы застряли, внося изменения постфактум. Я просто был обеспокоен тем, что вы интерпретируете контрасты суммы так же, как вы интерпретируете контрасты лечения, когда они не совсем одно и то же.   -  person joran    schedule 30.05.2012
comment
Я потратил на это немного времени и проследил до model.matrix. Это применимо только в том случае, если для контрастов установлено значение, отличное от значения по умолчанию. Я согласен с @joran, я думаю, вы застряли. (Вы также можете задать контрасты явно и назвать их столбцы, затем назначить их определенным факторам.)   -  person Ben Bolker    schedule 30.05.2012
comment
Посмотрите на contr.Treatment в пакете car, как сделать функцию контраста с разными именами для контрастов.   -  person Brian Diggs    schedule 31.05.2012
comment
Также см. stackoverflow.com/q/9616742/210673.   -  person Aaron left Stack Overflow    schedule 01.06.2012


Ответы (2)


Я все еще совсем не уверен, что это хорошая идея, я думаю, что вероятность запутаться в том, что означают контрасты, слишком высока. Тем не менее, я бы сделал новую функцию контрастов, которая вычисляет контрасты суммы, но устанавливает имена равными именам по умолчанию из контрастов лечения.

set.seed(5)
n <- 5
y <- c(10 + rnorm(n, 0, 1), 20 + rnorm(n, 0, 1), 30 + rnorm(n, 0, 1))
wFactor <- as.factor(c(rep("A", n), rep("B", n), rep("C", n)))

contr.sumX <- function(...) {
  conT <- contr.treatment(...)
  conS <- contr.sum(...)
  colnames(conS) <- colnames(conT)
  conS
}

Для справки, вот обычный вывод:

> m1 <- lm(y ~ wFactor, contrasts = list(wFactor=contr.sum(n = levels(wFactor))))
> coef(summary(m1))
              Estimate Std. Error     t value     Pr(>|t|)
(Intercept) 19.8218432  0.2481727  79.8711599 9.889455e-18
wFactor1    -9.6079241  0.3509692 -27.3754029 3.480430e-12
wFactor2    -0.1934654  0.3509692  -0.5512319 5.915907e-01

А вот вывод функции contr.sumX.

> m2 <- lm(y ~ wFactor, contrasts = list(wFactor=contr.sumX(n = levels(wFactor))))
> coef(summary(m2))
              Estimate Std. Error     t value     Pr(>|t|)
(Intercept) 19.8218432  0.2481727  79.8711599 9.889455e-18
wFactorB    -9.6079241  0.3509692 -27.3754029 3.480430e-12
wFactorC    -0.1934654  0.3509692  -0.5512319 5.915907e-01

Кроме того, вы можете заранее установить контрасты для определенного фактора:

contrasts(wFactor) <- "contr.sumX"
m3 <- lm(y ~ wFactor)
> coef(summary(m3))
              Estimate Std. Error     t value     Pr(>|t|)
(Intercept) 19.8218432  0.2481727  79.8711599 9.889455e-18
wFactorB    -9.6079241  0.3509692 -27.3754029 3.480430e-12
wFactorC    -0.1934654  0.3509692  -0.5512319 5.915907e-01
person Aaron left Stack Overflow    schedule 01.06.2012

Мне нравится ваше решение @Aaron, и я его реализовал, но я думаю, что оно содержит опасную ошибку. Контраст суммы дает вам разницу между первыми факторами n-1 и общим средним, а не последними факторами n-1, которые возвращает ваш алгоритм именования. См. R Book Кроули, 2-е издание, стр. 442-443.

Таким образом, я считаю, что правильная функция должна быть:

contr.sum.keepnames <- function(...) {
    conS <- contr.sum(...)
    colnames(conS) = rownames(conS)[-length(rownames(conS))]
    conS
}

Кстати, я пытался добавить это как комментарий, но у меня возникли трудности с добавлением блока кода в комментарий.

person Alexander Shenkin    schedule 16.02.2016