R Language
Formuła
Szukaj…
Podstawy formuły
Funkcje statystyczne w R często wykorzystują tak zwaną notację formuły Wilkinsona-Rogersa 1 .
Podczas uruchamiania funkcji modelu takich jak lm
dla regresji liniowych , potrzebują formula
. Ta formula
określa, które współczynniki regresji należy oszacować.
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
Po lewej stronie ~
(LHS) określona jest zmienna zależna, podczas gdy prawa strona (RHS) zawiera zmienne niezależne. Technicznie powyższe wywołanie formula
jest zbędne, ponieważ operator tyldy jest funkcją infix, która zwraca obiekt z klasą formuły:
form <- mpg ~ wt
class(form)
#[1] "formula"
Zaletą funkcji formula
porównaniu z ~
jest to, że umożliwia także określenie środowiska oceny:
form_mt <- formula(mpg ~ wt, env = mtcars)
W tym przypadku dane wyjściowe pokazują, że szacowany jest współczynnik regresji dla wt
, a także (domyślnie) parametr przechwytujący. Przechwytywanie można wykluczyć / wymusić na 0, włączając do formula
0
lub -1
:
coef(lm(mpg ~ 0 + wt, data = mtcars))
coef(lm(mpg ~ wt -1, data = mtcars))
Interakcje między zmiennymi a
i b
można dodać, dodając a:b
do formula
:
coef(lm(mpg ~ wt:vs, data = mtcars))
Ponieważ (z statystycznego punktu widzenia) generalnie wskazane jest, aby nie oddziaływać w modelu bez głównych efektów, naiwnym podejściem byłoby rozszerzenie formula
na a + b + a:b
. Działa to, ale można to uprościć, pisząc a*b
, gdzie *
operator wskazuje przekroczenie współczynnika (gdy między dwiema kolumnami czynnika) lub pomnożenie, gdy jedna lub obie kolumny są „numeryczne”:
coef(lm(mpg ~ wt*vs, data = mtcars))
Użycie notacji *
rozszerza termin o wszystkie efekty niższego rzędu, takie jak:
coef(lm(mpg ~ wt*vs*hp, data = mtcars))
poda, oprócz przechwytywania, 7 współczynników regresji. Jeden dla interakcji trójstronnej, trzy dla interakcji dwukierunkowej i trzy dla głównych efektów.
Jeśli ktoś chce na przykład wykluczyć interakcję trójstronną, ale zachować wszystkie interakcje dwukierunkowe, istnieją dwa skróty. Po pierwsze, używając -
możemy odjąć dowolny konkretny termin:
coef(lm(mpg ~ wt*vs*hp - wt:vs:hp, data = mtcars))
Lub możemy użyć notacji ^
aby określić wymagany poziom interakcji:
coef(lm(mpg ~ (wt + vs + hp) ^ 2, data = mtcars))
Te dwie specyfikacje formuł powinny stworzyć tę samą matrycę modelu.
Wreszcie .
jest skrótem do wykorzystania wszystkich dostępnych zmiennych jako głównych efektów. W takim przypadku argument data
służy do uzyskania dostępnych zmiennych (których nie ma w LHS). W związku z tym:
coef(lm(mpg ~ ., data = mtcars))
daje współczynniki dla przecięcia i 10 zmiennych niezależnych. Notacja ta jest często używana w pakietach uczenia maszynowego, w których chciałoby się wykorzystywać wszystkie zmienne do przewidywania lub klasyfikacji. Zauważ, że znaczenie .
zależy od kontekstu (patrz np. ?update.formula
dla innego znaczenia).
- GN Wilkinson i CE Rogers. Journal of the Royal Statistics Society. Seria C (Statystyka stosowana) Vol. 22, nr 3 (1973), s. 392–399
Utwórz warunki interakcji liniowe, kwadratowe i drugiego rzędu
y ~ .
: Tutaj .
jest interpretowane jako wszystkie zmienne oprócz y
ramce danych używanej do dopasowania modelu. Jest to równoważne liniowym kombinacjom zmiennych predykcyjnych. Na przykład y ~ var1 + var2 + var3+...+var15
y ~ . ^ 2
da wszystkie liniowe (główne efekty) i warunki interakcji drugiego rzędu zmiennych w ramce danych. Jest to równoważne z 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)
: Tutaj I(var^2)
wskazuje kwadratowy wielomian jednej zmiennej w ramce danych.
y ~ poly(var1, degree = 2) + poly(var2, degree = 2)+...poly(var15, degree = 2)
lub
y ~ poly(var1, var2, var3, ....var15, degree = 2)
będzie równoważny powyższemu wyrażeniu.
poly(var1, degree = 2)
jest równoważny var1 + I(var1^2)
.
Aby uzyskać wielomian sześcienny, użyj degree = 3
w poly()
.
Istnieje zastrzeżenie w stosowaniu poly
versus I(var, 2)
, który jest po dopasowaniu modelu, każdy z nich będzie wytwarzał różne współczynniki, ale dopasowane wartości są równoważne, ponieważ reprezentują różne parametryzacje tego samego modelu. Zaleca się stosowanie I(var, 2)
poly()
aby uniknąć efektu podsumowania widocznego w poly()
.
Podsumowując, aby uzyskać warunki interakcji liniowej, kwadratowej i drugiego rzędu, będziesz mieć wyrażenie podobne do
y ~ .^2 + I(var1^2) + I(var2^2)+...I(var15^2)
Demo dla czterech zmiennych:
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>