R формулы и результирующие имена коэффициентов - PullRequest
7 голосов
/ 06 марта 2012

В следующем примере, скажем, у вас есть модель, где 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 

Очень удобно выполнять преобразования непосредственно в формуле, а не создавать промежуточные данныеустанавливает или изменяет существующий.Например, когда вы используете scale для стандартизации переменных, где важно учитывать пропуски в других переменных, включенных в окончательную модель.Однако, часто получающиеся имена коэффициентов в выходных данных становятся довольно уродливыми.

Мой вопрос: возможно ли указать имя переменной, являющейся результатом выражения, при работе с формулой?Что-то вроде

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 имеет пропуски.

Так что мне остается вопросесть ли способ для интерфейса формул обработать этот случай без раздражающего промежуточного шага использования дополнительной формулы и извлечения фрейма модели, который затем можно «преобразовать».

Я надеюсь, что вопросясно.

1 Ответ

8 голосов
/ 06 марта 2012

Измените его в аргументе data=, а не в аргументе formula=:

lm(len ~ dose + OJ, data = transform(ToothGrowth, OJ = relevel(supp, "VC")))
...