Поиск…


Основы формулы

Статистические функции в 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 для другого значения).

  1. Г. Н. Уилкинсон и К. Роджерс. Журнал Королевского статистического общества. Серия 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>


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow