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>