R Language
Formel
Sök…
Grunderna i formeln
Statistiska funktioner i R använder kraftigt den så kallade Wilkinson-Rogers-formelnotationen 1 .
När du kör modellfunktioner som lm
för Linear Regressions , behöver de en formula
. Denna formula
anger vilka regressionskoefficienter som ska uppskattas.
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
På vänster sida av ~
(LHS) specificeras den beroende variabeln, medan den högra sidan (RHS) innehåller de oberoende variablerna. Tekniskt formula
samtalet ovan är överflödig eftersom tilde-operatören är en infix funktion som returnerar ett objekt med formeln Klass:
form <- mpg ~ wt
class(form)
#[1] "formula"
Fördelen med formula
över ~
är att den också gör det möjligt att specificera en miljö för utvärdering:
form_mt <- formula(mpg ~ wt, env = mtcars)
I detta fall visar utgången att en regressionskoefficient för wt
uppskattas, liksom (per standard) en avlyssningsparameter. Avlyssningen kan uteslutas / tvingas vara 0 genom att inkludera 0
eller -1
i formula
:
coef(lm(mpg ~ 0 + wt, data = mtcars))
coef(lm(mpg ~ wt -1, data = mtcars))
Interaktioner mellan variablerna a
och b
kan läggas till med inkluderat a:b
till formula
:
coef(lm(mpg ~ wt:vs, data = mtcars))
Eftersom det (ur statistisk synvinkel) i allmänhet är tillrådligt att inte ha interaktioner i modellen utan huvudeffekter, skulle den naiva metoden vara att utöka formula
till a + b + a:b
. Detta fungerar men kan förenklas genom att skriva a*b
, där *
-operatören indikerar faktorkorsning (när mellan två faktorkolumner) eller multiplikation när en eller båda kolumnerna är "numeriska":
coef(lm(mpg ~ wt*vs, data = mtcars))
Med hjälp av *
notationen utvidgas en term för att inkludera alla lägre ordningseffekter, så att:
coef(lm(mpg ~ wt*vs*hp, data = mtcars))
kommer, utöver avlyssningen, att ge 7 regressionskoefficienter. En för trevägsinteraktion, tre för tvåvägsinteraktioner och tre för huvudeffekter.
Om man till exempel vill utesluta trevägsinteraktionen, men behålla alla tvåvägsinteraktioner finns det två korthänder. Först genom att använda -
vi subtrahera en viss term:
coef(lm(mpg ~ wt*vs*hp - wt:vs:hp, data = mtcars))
Eller så kan vi använda ^
notationen för att ange vilken nivå av interaktion vi behöver:
coef(lm(mpg ~ (wt + vs + hp) ^ 2, data = mtcars))
Dessa två formelspecifikationer bör skapa samma modellmatris.
Slutligen .
är korta för att använda alla tillgängliga variabler som huvudeffekter. I detta fall den data
är argument som används för att erhålla de tillgängliga variabler (som inte är på LHS). Därför:
coef(lm(mpg ~ ., data = mtcars))
ger koefficienter för avlyssning och 10 oberoende variabler. Denna notation används ofta i paket med maskininlärning, där man vill använda alla variabler för att förutsäga eller klassificera. Observera att betydelsen av .
beror på sammanhang (se t.ex. ?update.formula
för en annan betydelse).
- GN Wilkinson och CE Rogers. Journal of the Royal Statistical Society. Serie C (tillämpad statistik) vol. 22, nr 3 (1973), s. 392-399
Skapa linjära, kvadratiska och andra ordning interaktionsvillkor
y ~ .
: Här .
tolkas som alla variabler utom y
i dataramen som används vid montering av modellen. Det motsvarar de linjära kombinationerna av prediktorvariabler. Till exempel y ~ var1 + var2 + var3+...+var15
y ~ . ^ 2
ger alla linjära (huvudeffekter) och andra ordningens interaktionstermer för variablerna i dataramen. Det motsvarar 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)
: Här I(var^2)
indikerar kvadratisk polynom av en variabel i dataramen.
y ~ poly(var1, degree = 2) + poly(var2, degree = 2)+...poly(var15, degree = 2)
eller
y ~ poly(var1, var2, var3, ....var15, degree = 2)
kommer att vara ekvivalent med ovanstående uttryck.
poly(var1, degree = 2)
motsvarar var1 + I(var1^2)
.
Använd degree = 3
i poly()
att få kubiska polynomier.
Det finns en varning när man använder poly
kontra I(var, 2)
, som är efter montering av modellen, var och en av dem kommer att producera olika koefficienter, men de monterade värdena är likvärdiga, eftersom de representerar olika parametreringar av samma modell. Det rekommenderas att använda I(var, 2)
över poly()
att undvika den sammanfattande effekten som ses i poly()
.
Sammanfattningsvis kommer du att ha ett uttryck som för att få linjära, kvadratiska och andra ordning interaktionstermer
y ~ .^2 + I(var1^2) + I(var2^2)+...I(var15^2)
Demo för fyra variabler:
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>