Задание линейной модели в R без пересечения с контрастами - PullRequest
0 голосов
/ 13 июня 2019

Я пытаюсь запустить линейную модель в R, которая не определяет перехват.Причина заключается в том, чтобы в итоге вычислить суммы квадратов, уменьшенных при добавлении перехвата.Тем не менее, я получаю разные результаты при указании этой модели с использованием встроенного фактора контрастов по сравнению с явным указанием значений контрастности (то есть, -.5 и .5).

Более конкретно, использование contrasts() приводит к модели с 2 членами (без перехвата), в то время как явное указание значений контрастности через вектор столбца приводит к правильной модели (без перехвата и 1 члена, определяющего контраст).

group <- rep(c("c", "t"), each = 5)
group_cont <- rep(c(-.5, .5), each = 5)
var1 <- runif(10)
var2 <- runif(10)

test_data <- data.frame(
  group = factor(group), 
  group_cont = group_cont,
  y = var1, 
  x = var2
  )
contrasts(test_data$group) <- cbind(grp = c(-.5, .5))

summary(lm(y ~ 1 + group, data = test_data))      # full model
summary(lm(y ~ 0 + group, data = test_data))      # weird results
summary(lm(y ~ 0 + group_cont, data = test_data)) # expected

Есть ли способ указать линейную модель без перехвата, но все же использовать contrasts() для указания контраста?

1 Ответ

0 голосов
/ 13 июня 2019

lm() запрашивает фрейм данных и имена столбцов в качестве входных данных.Когда вы используете contrasts(), вы назначаете атрибут для столбца в вашем фрейме данных, который вы можете вызвать напрямую, используя функцию contrast или attr.Однако вы не меняете сам тип данных.Используя приведенный выше пример:

> str(test_data)
  'data.frame': 10 obs. of  4 variables:
 $ group     : Factor w/ 2 levels "c","t": 1 1 1 1 1 2 2 2 2 2 #### still a factor ####
  ..- attr(*, "contrasts")= num [1:2, 1] -0.5 0.5  #### NOTE The contrast attribute ####
  .. ..- attr(*, "dimnames")=List of 2
  .. .. ..$ : chr  "c" "t"
  .. .. ..$ : chr "grp"
 $ group_cont: num  -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5
 $ y         : num  0.161 0.518 0.417 0.335 0.301 ...
 $ x         : num  0.34 0.729 0.766 0.629 0.191 ...

> attr(test_data$group, "contrasts")

   grp
c -0.5
t  0.5

Итак, attr было добавлено, но тип все еще является фактором.Так что lm рассматривает это как фактор, предоставляя вам коэффициент для каждого уровня.Более того, предоставление contrast или вызов attr внутри lm приведет к ошибке.В зависимости от того, как вы хотите до конца выглядеть, вам может понадобиться изучить другой пакет, например контраст lm также есть аргумент contrast, но я не уверен на 100%, что это то, что вы действительно ищете.Подробнее об этом см. ?lm.

...