Zoeken…


De basis van formule

Statistische functies in R maken intensief gebruik van de zogenaamde Wilkinson-Rogers formule-notatie 1 .

Bij het uitvoeren van lm zoals lm voor de lineaire regressies , hebben ze een formula . Deze formula geeft aan welke regressiecoëfficiënten moeten worden geschat.

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 

Aan de linkerkant van de ~ (LHS) wordt de afhankelijke variabele gespecificeerd, terwijl de rechterkant (RHS) de onafhankelijke variabelen bevat. Technisch is de bovenstaande formula aanroep overbodig omdat de tilde-operator een infix-functie is die een object met formuleklasse retourneert:

form <- mpg ~ wt
class(form)
#[1] "formula"

Het voordeel van de formula opzichte van ~ is dat hiermee ook een evaluatieomgeving kan worden opgegeven:

form_mt <- formula(mpg ~ wt, env = mtcars)

In dit geval toont de uitvoer dat een regressiecoëfficiënt voor wt wordt geschat, evenals (per standaard) een interceptparameter. Het onderscheppen kan worden uitgesloten / gedwongen worden op 0 door 0 of -1 in de formula :

coef(lm(mpg ~ 0 + wt, data = mtcars))
coef(lm(mpg ~ wt -1, data = mtcars))

Interacties tussen variabelen a en b kunnen worden toegevoegd door a:b te voegen aan de formula :

 coef(lm(mpg ~ wt:vs, data = mtcars))

Aangezien het (statistisch gezien) over het algemeen raadzaam is om geen interacties in het model te hebben zonder de belangrijkste effecten, zou de naïeve aanpak zijn om de formula te breiden naar a + b + a:b . Dit werkt maar kan worden vereenvoudigd door a*b , waarbij de operator * factor overschrijding aangeeft (indien tussen twee factorkolommen) of vermenigvuldiging wanneer een of beide kolommen 'numeriek' zijn:

coef(lm(mpg ~ wt*vs, data = mtcars))

Als u de * -notatie gebruikt, wordt een term uitgebreid met alle effecten van lagere orde, zodat:

coef(lm(mpg ~ wt*vs*hp, data = mtcars))

geeft naast het onderscheppen 7 regressiecoëfficiënten. Een voor de drieweginteractie, drie voor de tweerichtingsinteractie en drie voor de belangrijkste effecten.

Als men bijvoorbeeld de drieweginteractie wil uitsluiten, maar alle tweerichtingsinteracties wil behouden, zijn er twee afkortingen. Als eerste gebruiken we - we kunnen een bepaalde term aftrekken:

coef(lm(mpg ~ wt*vs*hp - wt:vs:hp, data = mtcars))

Of we kunnen de ^ notatie gebruiken om aan te geven welk niveau van interactie we nodig hebben:

coef(lm(mpg ~ (wt + vs + hp) ^ 2, data = mtcars))

Die twee formulespecificaties moeten dezelfde modelmatrix creëren.

Eindelijk . is een afkorting om alle beschikbare variabelen als hoofdeffecten te gebruiken. In dit geval wordt het data gebruikt om de beschikbare variabelen te verkrijgen (die niet op het LHS staan). daarom:

coef(lm(mpg ~ ., data = mtcars))

geeft coëfficiënten voor het onderscheppen en 10 onafhankelijke variabelen. Deze notatie wordt vaak gebruikt in machine learning pakketten, waarbij men alle variabelen wil gebruiken voor voorspelling of classificatie. Merk op dat de betekenis van . hangt af van context (zie bijvoorbeeld ?update.formula voor een andere betekenis).

  1. GN Wilkinson en CE Rogers. Journal of the Royal Statistical Society. Series C (Applied Statistics) Vol. 22, No. 3 (1973), pp. 392-399

Maak lineaire, kwadratische en tweede-orde-interactievoorwaarden

y ~ . : Hier . wordt geïnterpreteerd als alle variabelen behalve y in het gegevensframe dat wordt gebruikt bij het aanpassen van het model. Het is equivalent aan de lineaire combinaties van voorspellende variabelen. Bijvoorbeeld y ~ var1 + var2 + var3+...+var15

y ~ . ^ 2 geeft alle lineaire (hoofdeffecten) en tweede-orde interactietermen van de variabelen in het gegevensframe. Het is equivalent aan 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) : Here I(var^2) geeft kwadratische polynoom aan van één variabele in het gegevensframe.

y ~ poly(var1, degree = 2) + poly(var2, degree = 2)+...poly(var15, degree = 2)

of

y ~ poly(var1, var2, var3, ....var15, degree = 2) is gelijk aan de bovenstaande uitdrukking.

poly(var1, degree = 2) is equivalent aan var1 + I(var1^2) .

Gebruik degree = 3 in poly() om kubieke polynomen te verkrijgen.

Er is een voorbehoud bij het gebruik van poly versus I(var, 2) , wat betekent dat na het passen van het model, elk van hen verschillende coëfficiënten zal produceren, maar de gepaste waarden zijn equivalent, omdat ze verschillende parametriseringen van hetzelfde model vertegenwoordigen. Het wordt aanbevolen om I(var, 2) over poly() om het samenvattingseffect te zien dat wordt gezien in poly() .

Samenvattend, om lineaire, kwadratische en tweede-orde interactietermen te krijgen, heb je een uitdrukking zoals

y ~ .^2 + I(var1^2) + I(var2^2)+...I(var15^2)

Demo voor vier variabelen:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow