R Language
формула
Поиск…
Основы формулы
Статистические функции в R сильно используют так называемую формулу формулы Уилкинсона-Роджерса 1 .
При выполнении функций модели, таких как lm
для линейных регрессий , им нужна formula
. Эта formula
определяет, какие коэффициенты регрессии должны быть оценены.
my_formula1 <- formula(mpg ~ wt)
class(my_formula1)
# gives "formula"
mod1 <- lm(my_formula1, data = mtcars)
coef(mod1)
# gives (Intercept) wt
# 37.285126 -5.344472
В левой части ~
(LHS) задается зависимая переменная, а правая часть (RHS) содержит независимые переменные. Технически вызов formula
выше избыточен, потому что тильд-оператор является функцией infix, которая возвращает объект с классом формул:
form <- mpg ~ wt
class(form)
#[1] "formula"
Преимущество функции formula
над ~
заключается в том, что она также позволяет указать среду для оценки:
form_mt <- formula(mpg ~ wt, env = mtcars)
В этом случае выход показывает, что коэффициент регрессии для wt
оценивается, а также (по умолчанию) параметр перехвата. Перехват может быть исключен / вынужден быть равным 0, включая 0
или -1
в formula
:
coef(lm(mpg ~ 0 + wt, data = mtcars))
coef(lm(mpg ~ wt -1, data = mtcars))
Взаимодействие между переменными a
и b
может быть добавлено путем включения a:b
в formula
:
coef(lm(mpg ~ wt:vs, data = mtcars))
Поскольку (с статистической точки зрения, вообще-то целесообразно) не иметь взаимодействия в модели без основных эффектов, наивный подход заключался бы в том, чтобы расширить formula
до a + b + a:b
. Это работает, но может быть упрощено путем записи a*b
, где оператор *
указывает пересечение факторов (когда между двумя столбцами факторов) или умножение, когда один или оба столбца являются «числовыми»:
coef(lm(mpg ~ wt*vs, data = mtcars))
Использование нотации *
расширяет термин для включения всех эффектов нижнего порядка, таких, что:
coef(lm(mpg ~ wt*vs*hp, data = mtcars))
даст в дополнение к перехвату 7 коэффициентов регрессии. Один для трехстороннего взаимодействия, три для двухсторонних взаимодействий и три для основных эффектов.
Если вы хотите, например, исключить трехстороннее взаимодействие, но сохранить все двусторонние взаимодействия, то есть два сокращения. Во-первых, используя -
мы можем вычесть любой конкретный термин:
coef(lm(mpg ~ wt*vs*hp - wt:vs:hp, data = mtcars))
Или мы можем использовать обозначение ^
чтобы указать, какой уровень взаимодействия нам требуется:
coef(lm(mpg ~ (wt + vs + hp) ^ 2, data = mtcars))
Эти две спецификации формул должны создавать одну и ту же модельную матрицу.
И, наконец, .
является сокращением использования всех доступных переменных в качестве основных эффектов. В этом случае аргумент data
используется для получения доступных переменных (которые не относятся к LHS). Следовательно:
coef(lm(mpg ~ ., data = mtcars))
дает коэффициенты для перехвата и 10 независимых переменных. Эта нотация часто используется в пакетах машинного обучения, где вы хотите использовать все переменные для прогнозирования или классификации. Обратите внимание, что значение .
зависит от контекста (см., например, « ?update.formula
для другого значения).
- Г. Н. Уилкинсон и К. Роджерс. Журнал Королевского статистического общества. Серия C (прикладная статистика) Vol. 22, № 3 (1973), стр. 392-399
Создание условий линейного, квадратичного и второго порядка взаимодействия
y ~ .
: Здесь .
интерпретируется как все переменные, кроме y
в фрейме данных, используемом при подгонке модели. Это эквивалентно линейным комбинациям предикторных переменных. Например, y ~ var1 + var2 + var3+...+var15
y ~ . ^ 2
даст все линейные (основные эффекты) и условия взаимодействия второго порядка переменных в кадре данных. Это эквивалентно y ~ var1 + var2 + ...+var15 + var1:var2 + var1:var3 + var1:var4...and so on
y ~ var1 + var2 + ...+var15 + I(var1^2) + I(var2^2) + I(var3^2)...+I(var15^2)
: Здесь I(var^2)
указывает квадратичный многочлен одной переменной в кадре данных.
y ~ poly(var1, degree = 2) + poly(var2, degree = 2)+...poly(var15, degree = 2)
или же
y ~ poly(var1, var2, var3, ....var15, degree = 2)
будет эквивалентно приведенному выше выражению.
poly(var1, degree = 2)
эквивалентно var1 + I(var1^2)
.
Чтобы получить кубические полиномы, используйте degree = 3
в poly()
.
Существует предостережение в использовании poly
против I(var, 2)
, которое после установки модели, каждый из которых будет производить разные коэффициенты, но установленные значения эквивалентны, поскольку они представляют собой различные параметризации одной и той же модели. Рекомендуется использовать I(var, 2)
над poly()
чтобы избежать суммарного эффекта, наблюдаемого в poly()
.
Таким образом, чтобы получить термины взаимодействия по линейному, квадратичному и второму порядкам, вы получите выражение типа
y ~ .^2 + I(var1^2) + I(var2^2)+...I(var15^2)
Демо для четырех переменных:
old <- reformulate( 'y ~ x1+x2+x3+x4' )
new <- reformulate( " y ~ .^2 + I(x1^2) + I(x2^2) + I(x3^2) + I(x4^2) ")
tmp <- .Call(stats:::C_updateform, old, new)
terms.formula(tmp, simplify = TRUE )
# ~y ~ x1 + x2 + x3 + x4 + I(x1^2) + I(x2^2) + I(x3^2) + I(x4^2) +
# x1:x2 + x1:x3 + x1:x4 + x2:x3 + x2:x4 + x3:x4
# attr(,"variables")
# list(~y, x1, x2, x3, x4, I(x1^2), I(x2^2), I(x3^2), I(x4^2))
# attr(,"factors")
# x1 x2 x3 x4 I(x1^2) I(x2^2) I(x3^2) I(x4^2) x1:x2 x1:x3 x1:x4 x2:x3 x2:x4 x3:x4
# ~y 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# x1 1 0 0 0 0 0 0 0 1 1 1 0 0 0
# x2 0 1 0 0 0 0 0 0 1 0 0 1 1 0
# x3 0 0 1 0 0 0 0 0 0 1 0 1 0 1
# x4 0 0 0 1 0 0 0 0 0 0 1 0 1 1
# I(x1^2) 0 0 0 0 1 0 0 0 0 0 0 0 0 0
# I(x2^2) 0 0 0 0 0 1 0 0 0 0 0 0 0 0
# I(x3^2) 0 0 0 0 0 0 1 0 0 0 0 0 0 0
# I(x4^2) 0 0 0 0 0 0 0 1 0 0 0 0 0 0
# attr(,"term.labels")
# [1] "x1" "x2" "x3" "x4" "I(x1^2)" "I(x2^2)" "I(x3^2)" "I(x4^2)"
# [9] "x1:x2" "x1:x3" "x1:x4" "x2:x3" "x2:x4" "x3:x4"
# attr(,"order")
# [1] 1 1 1 1 1 1 1 1 2 2 2 2 2 2
# attr(,"intercept")
# [1] 1
# attr(,"response")
# [1] 1
# attr(,".Environment")
# <environment: R_GlobalEnv>