Jakob Richter

Formeln in R (Teil 1)

Formeln (formula) werden in R an vielen verschiedenen Stellen genutzt. Natürlich für die lineare (lm()) und logistische Regression (glm(type="logit")), aber auch für die Survivalanalyse und das Cox-Modell (library("survival"); coxph()) um nur einige Beispiele zu nennen.

Zuerst der ganz allgemeine Aufbau einer formel
abhängige Variable ~ erklärende Variablen
(Ein kleiner Tipp für Mac-Nutzer an dieser Stelle: ~ lässt sich schreiben mit [alt] + N)
Die Formel y ~ x kann also verstanden werden als x erklärt y oder y ist abhängig von x.

Sicherlich bekannt ist, dass wir mehrere erklärende Variablen (EV) mit + verbinden können: y ~ x1 + x2
Doch es gibt zahlreiche weitere Möglichkeiten die rechte Seite der Formel aufzubauen:

Symbol Beispiel Bedeutung
+ +a Füge EV hinzu
-a Entferne EV
: a:b Füge Wechselwirkung hinzu
* a*b Füge EV und Wechselwirkung hinzu. Das Beispiel entspricht also: a + b + a:b
/ a/b b ist in a verschachtelt. Bezogen auf das Beispiel entspricht dies: a + a:b
x^n (a+b+c)^3 Füge alle EV hinzu, sowie alle Wechselwirkungen bis zum n-ten Grad.
poly(x,n) poly(a,3) Fügt eine polynomiale Anpassung n-ten Grades für die EV ein. (Funktioniert auch in lm())
Error() Error(block) Nur für aov() anwendbar. Siehe ?aov
I() I(a*b) Fügt eine neue Variable ein, welche aus der Rechnung in I() hervorgeht. Hier also a multipliziert mit b.
1 -1 Entfernt den Intercept. Schätzung geht durch Koordinatenursprung. Alternativ: y~x+0
as.factor() as.factor(a) Sollte a numerisch sein, aber nicht kardinalskaliert (Abstände lassen sich also nicht Interpretieren), so ist dies wichtig um a als Faktor zu behandeln.

Ich möchte an dieser Stelle nicht verschweigen, dass ich mich hier inspirieren lassen habe.

Tipp: Schreibarbeit sparen

Häufig erstellt man Modelle mit sehr vielen Einflussvariablen. Diese alle mit einem + in das Modell einzufügen ist Mühsam und Tippfehleranfällig. Dafür gibt es den . auf der rechten Seite der Formel. Betrachten wir folgendes Beispiel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
X <- matrix(runif(40,0,20),ncol=5)
daten <- as.data.frame(X)
colnames(daten) <- letters[seq_len(ncol(daten))] #geben den Spalten Buchstaben als Namen (a b c ...)
daten$c <- rep(1:2,length.out=nrow(daten))
daten$Y <- daten$c * (X %*% c(0.2,0.4,0,0.8,1))
head(daten)
 
#das Umständlichste:
lm(daten$Y ~ daten$a + daten$b + daten$c + daten$d + daten$e)
 
#schon schlanker:
lm(Y ~ 0+a+b+c+d+e, data=daten)
 
#geht das nicht kürzer?
lm(Y ~ 0 + . , data=daten)
 
#aber die Faktoren!
lm(Y ~ 0+a+b+ as.factor(c) +d+e,data=daten)
 
#aber jetzt ist es wieder so lang! Geht auch kürzer:
lm(Y ~ 0 + . - c + as.factor(c),data=daten)
 
#Manchmal kann auch folgendes Konstrukt hilfreich sein, wenn man nur einen Teil haben will.
lm(Y ~ ., data=daten[,c(1:2,6)]) #in Spalte 6 steht Y

Im nächsten Beitrag widme ich mich den Möglichkeiten Formeln zu speichern und zu modifizieren, sodass man mit ein wenig Programmierarbeit viele Modelle ausprobieren kann.

Leave a Reply