R и коэффициент кодирования в формуле
Как использовать интерфейс формул, если я хочу использовать фиктивные макеты, например, если мне нужны значения 1 и два, а не 0 и 1. Оценка может выглядеть следующим образом: supp
является переменной фактора.
fit <- lm(len ~ dose + supp, data = ToothGrowth)
В этом примере разные значения используются мало, но во многих случаях "переписанной" модели это может быть полезно.
РЕДАКТИРОВАТЬ: На самом деле, у меня есть, например, 3 уровня, и хочу, чтобы два столбца были закодированы по-разному, поэтому один является переменной 1/0, а другой является переменной 1/2. Приведенный выше пример имеет только два уровня.
1 ответ
Вы можете установить контрасты как хотите, создав матрицу, которую хотите использовать, и установив ее на contrasts
аргумент lm
или установив контраст по умолчанию самого фактора.
Некоторые примеры данных:
set.seed(6)
d <- data.frame(g=gl(3,5,labels=letters[1:3]), x=round(rnorm(15,50,20)))
Контрасты, которые вы имеете в виду:
mycontrasts <- matrix(c(0,0,1,0,1,1), byrow=TRUE, nrow=3)
colnames(mycontrasts) <- c("12","23")
mycontrasts
# 12 23
#[1,] 0 0
#[2,] 1 0
#[3,] 1 1
Затем вы используете это в lm
вызов:
> lm(x ~ g, data=d, contrasts=list(g=mycontrasts))
Call:
lm(formula = x ~ g, data = d, contrasts = list(g = mycontrasts))
Coefficients:
(Intercept) g12 g23
58.8 -13.6 5.8
Мы можем проверить, что он делает правильные вещи, сравнивая средства:
> diff(tapply(d$x, d$g, mean))
b c
-13.6 5.8
Контраст по умолчанию - использовать первый уровень в качестве базовой линии:
> lm(x ~ g, data=d)
Call:
lm(formula = x ~ g, data = d)
Coefficients:
(Intercept) gb gc
58.8 -13.6 -7.8
Но это можно изменить с contrasts
команда:
> contrasts(d$g) <- mycontrasts
> lm(x ~ g, data=d)
Call:
lm(formula = x ~ g, data = d)
Coefficients:
(Intercept) g12 g23
58.8 -13.6 5.8