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

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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow