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).

  1. 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>


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow