В следующем примере предположим, что у вас есть модель, в которой supp
является факторной переменной.
lm(len ~ dose + supp, data = ToothGrowth)
но я хочу использовать другой базовый уровень для фактора. Я мог бы указать это прямо в формуле:
lm(len ~ dose + relevel(supp, "VC"), data = ToothGrowth)
и на выходе было бы:
Call:
lm(formula = len ~ dose + relevel(supp, "VC"), data = ToothGrowth)
Coefficients:
(Intercept) dose relevel(supp, "VC")OJ
5.573 9.764 3.700
Очень удобно делать преобразования прямо в формуле, а не делать промежуточные наборы данных или переделывать существующий. Примером может служить использование масштаба
для стандартизации переменных, когда важно учитывать пропуски в других переменных, включенных в окончательную модель. Однако часто результирующие имена коэффициентов на выходе становятся довольно уродливыми.
Мой вопрос: можно ли указать имя переменной, полученной из выражения, при работе с формулой? Что-то вроде
lm(len ~ dose + (OJ = relevel(supp, "VC")), data = Toothgrowth)
(что не работает).
РЕДАКТИРОВАТЬ: хотя решение, предложенное Г. Гротендиком, является хорошим, оно на самом деле дает неверный результат. Следующий пример показывает это:
# Create some data:
df <- data.frame(x1 = runif(10), x2=runif(10))
df <- transform(df, y = x1 + x2 + rnorm(10))
# Introduce some missings.
df$x1[2:3] <- NA
# The wrong result:
lm(formula = y ~ z1 + z2,
data = transform(df, z1 = scale(x1), z2=scale(x2)))
# extract a model frame.
df2 <- model.frame(y ~ x1 + x2, df)
# The right result:
lm(formula = y ~ scale(x1) + scale(x2),
data = df2)
# or:
lm(formula = y ~ z1 + z2,
data = transform(model.frame(y ~ x1 + x2, df),
z1 = scale(x1), z2 = scale(x2)))
Проблема в том, что при понижении значения x2 используются наблюдения, которых нет в окончательной модели, потому что x1 имеет пропущенные значения.
Поэтому для меня остается вопрос, есть ли способ для интерфейса формул обрабатывать этот случай без надоедливого промежуточного шага использования дополнительной формулы и извлечения фрейма модели, который затем можно «преобразовать».
Надеюсь, вопрос ясен.