Suche…


Die Grundlagen der Formel

Statistische Funktionen in R machen Gebrauch von der sogenannten Wilkinson-Rogers-Formelnotation 1 .

Wenn Sie Modellfunktionen wie lm für lineare Regressionen ausführen , benötigen sie eine formula . Diese formula gibt an, welche Regressionskoeffizienten geschätzt werden sollen.

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 

Auf der linken Seite der ~ (LHS) wird die abhängige Variable angegeben, während die rechte Seite (RHS) die unabhängigen Variablen enthält. Technisch ist der obige formula überflüssig, da der Tilde-Operator eine Infix-Funktion ist, die ein Objekt mit der Formelklasse zurückgibt:

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

Der Vorteil der formula gegenüber ~ besteht darin, dass auch eine Umgebung zur Auswertung angegeben werden kann:

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

In diesem Fall zeigt die Ausgabe, dass ein Regressionskoeffizient für wt geschätzt wird, sowie (standardmäßig) ein Abschnittsparameter. Der Achsenabschnitt kann durch Angabe von 0 oder -1 in die formula ausgeschlossen / erzwungen werden:

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

Wechselwirkungen zwischen den Variablen a und b können durch Hinzufügen von a:b zur formula hinzugefügt werden:

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

Da es (aus statistischer Sicht) generell ratsam ist, keine Wechselwirkungen im Modell ohne die Haupteffekte zu haben, würde der naive Ansatz darin bestehen, die formula auf a + b + a:b . Dies funktioniert, kann jedoch vereinfacht werden, indem a*b , wobei der Operator * eine Faktorüberkreuzung (wenn zwischen zwei Faktorspalten) oder eine Multiplikation angibt, wenn eine oder beide Spalten 'numerisch' sind:

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

Mit der * -Notation wird ein Begriff erweitert, um alle Effekte niedrigerer Ordnung einzubeziehen, z.

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

gibt zusätzlich zum Intercept 7 Regressionskoeffizienten an. Eine für die Dreiwege-Interaktion, drei für die Zweiwege-Interaktion und drei für die Haupteffekte.

Wenn man zum Beispiel die Dreiwege-Interaktion ausschließen möchte, aber alle Zweiwege-Interaktionen beibehalten möchte, gibt es zwei Abkürzungen. Erstens, mit - wir können jeden bestimmten Begriff abziehen:

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

Oder wir können die ^ -Notation verwenden, um anzugeben, welche Interaktionsebene wir benötigen:

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

Diese beiden Formelspezifikationen sollten dieselbe Modellmatrix erstellen.

Zum Schluss . ist eine Abkürzung, um alle verfügbaren Variablen als Haupteffekte zu verwenden. In diesem Fall wird die data wird Argument verwendet , um die zur Verfügung stehenden Variablen zu erhalten (die nicht auf der LHS ist). Deshalb:

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

gibt Koeffizienten für den Achsenabschnitt und 10 unabhängige Variablen an. Diese Notation wird häufig in maschinellen Lernpaketen verwendet, bei denen alle Variablen zur Vorhersage oder Klassifizierung verwendet werden sollen. Beachten Sie, dass die Bedeutung von . abhängig vom Kontext (siehe zB ?update.formula für eine andere Bedeutung).

  1. GN Wilkinson und CE Rogers. Zeitschrift der Royal Statistical Society. Serie C (Angewandte Statistik) Vol. 3, (1973), S. 392-399

Erstellen Sie lineare, quadratische und zweite Interaktionsbedingungen

y ~ . Hier: . wird als alle Variablen mit Ausnahme von y in dem Datenrahmen interpretiert, der zur Anpassung des Modells verwendet wird. Es entspricht den linearen Kombinationen von Prädiktorvariablen. Zum Beispiel y ~ var1 + var2 + var3+...+var15

y ~ . ^ 2 gibt alle linearen (Haupteffekte) und Interaktionsterme zweiter Ordnung der Variablen im Datenrahmen aus. Es ist gleichbedeutend mit 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) : Hier I(var^2) bezeichnet ein quadratisches Polynom einer Variablen im Datenrahmen.

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

oder

y ~ poly(var1, var2, var3, ....var15, degree = 2) entspricht dem obigen Ausdruck.

poly(var1, degree = 2) ist äquivalent zu var1 + I(var1^2) .

Um kubische Polynome zu erhalten, verwenden Sie in poly() degree = 3 .

Bei der Verwendung von poly gegenüber I(var, 2) gibt es eine Einschränkung, die nach dem Anpassen des Modells unterschiedliche Koeffizienten erzeugt. Die angepassten Werte sind jedoch gleichwertig, da sie unterschiedliche Parametrisierungen des gleichen Modells darstellen. Es wird empfohlen, I(var, 2) über poly() zu verwenden, um den in poly() Zusammenfassungseffekt zu vermeiden.

Zusammenfassend erhalten Sie einen Ausdruck wie, um lineare, quadratische und zweite Interaktionsbedingungen zu erhalten

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

Demo für vier Variablen:

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow