Я знаю, что эту проблему можно обойти, создав предварительно вычисленные преобразования, но мне бы очень хотелось использовать функциональные возможности формулы R. Вот воспроизводимый пример моей проблемы:
Сгенерируйте (коррелированные) данные игрушек:
set.seed(123)
test<-data.frame(x=rnorm(100,1,.5),z=factor(sample(c('a','b','c'),100,T)))
test$y<-.3*test$x+0*(test$z=='a')-.07*(test$z=='b')-.15*(test$z=='c')+rnorm(100,0,.1)
Запустите линейную модель:
> lm(y ~ x + z, test)
Call:
lm(formula = y ~ x + z, data = test)
Coefficients:
(Intercept) x zb zc
0.02453 0.27484 -0.08279 -0.12868
Выглядит неплохо. Первый факторный уровень «а» опущен, как и должно быть. Теперь включите взаимодействие между числовым значением x и фактором z:
> lm(y ~ x + z + z:x, test)
Call:
lm(formula = y ~ x + z + z:x, data = test)
Coefficients:
(Intercept) x zb zc x:zb x:zc
0.037008 0.262650 -0.134938 -0.118896 0.049068 -0.009225
lm(y ~ poly(x,2) + z:x, test)
Все по-прежнему в порядке. Теперь используйте функцию «poly», чтобы добавить квадратичное преобразование x:
> lm(y ~ poly(x, 2) + z + z:x, test)
Call:
lm(formula = y ~ poly(x, 2) + z + z:x, data = test)
Coefficients:
(Intercept) poly(x, 2)1 poly(x, 2)2 zb zc za:x zb:x zc:x
0.33928 1.23017 -0.18029 -0.15478 -0.15574 -0.02749 0.04165 NA
И вот оно. Вместо того, чтобы исключить первый уровень z 'a' из термина взаимодействия, он включается вместе с двумя другими уровнями. Теперь za:x имеет «псевдоним», потому что модель, конечно, была бы единственной с включением всех трех уровней факторов. Это плохо, потому что не работают такие функции, как 'vif' из пакета 'car':
> vif(lm(y ~ poly(x,2) + z + z:x, test))
Error in vif.lm(lm(y ~ poly(x, 2) + z + z:x, test)) :
there are aliased coefficients in the model
Я пробовал такие вещи, как y ~ poly(x,2) + z + z:poly(x,1) или y ~ poly(x,2) + z + relevel(z, ref='a'):x, но ничего не казалось работать. Это ошибка или кто-то может объяснить этот результат? Есть ли способ избежать этой проблемы и по-прежнему использовать функциональные возможности формулы так, как я предполагал? Спасибо.