Angenommen, ich habe eine Antwortvariable und Daten mit drei Kovariaten (als Spielzeugbeispiel):
y = c(1,4,6)
d = data.frame(x1 = c(4,-1,3), x2 = c(3,9,8), x3 = c(4,-4,-2))
Ich möchte eine lineare Regression an die Daten anpassen:
fit = lm(y ~ d$x1 + d$x2 + d$y2)
Gibt es eine Möglichkeit, die Formel zu schreiben, damit ich nicht jede einzelne Kovariate aufschreiben muss? Zum Beispiel so etwas wie
fit = lm(y ~ d)
(Ich möchte, dass jede Variable im Datenrahmen eine Kovariate ist.) Ich frage, weil ich tatsächlich 50 Variablen in meinem Datenrahmen habe, also möchte ich das Ausschreiben vermeiden x1 + x2 + x3 + etc
.
Antworten:
Es gibt einen speziellen Bezeichner, den man in einer Formel verwenden kann, um alle Variablen zu bezeichnen. Es ist der
.
Bezeichner.Sie können auch Folgendes tun, um alle Variablen außer einer zu verwenden (in diesem Fall ist x3 ausgeschlossen):
Technisch
.
bedeutet dies alle Variablen, die nicht bereits in der Formel erwähnt wurden . Beispielsweisewo
.
würde nurx3
als verweisenx1
undx2
sind bereits in der Formel.quelle
.
technisch bedeutet, dass alle Variablendata
nicht bereits in der Formel enthalten sind .data
ist eine Liste, aus der Variablen in der Formel von dieser Liste nachgeschlagen werden, dann ja. Ein Datenrahmen, eine Liste oder eine Umgebung sind akzeptable Optionen für dasdata
Argument. Wenn Sie das nicht meinen, müssen Sie etwas mehr erweitern.lm(d[[1]] ~ d[[3]] + ., data = d)
names
von der Liste; sagen Sie habenll <- list(y = rnorm(10), x = rnorm(10), z = rnorm(10), zz = runif(10))
, dann funktioniert folgendes :lm(y ~ x + ., data = ll)
. Es gibt also nicht viel Grund, Ihre Daten so zu haben, es sei denn, es handelt sich bereits um eine Liste, aber es funktioniert. Die Anforderung, dass die Elemente der Formel dieselbe Länge haben müssen, schränkt die Inhalte einer Liste ein. Komplexere Objekte benötigen wahrscheinlich Code, um die gewünschten Elemente zu extrahieren. Wennd[[1]]
es sich um einen Datenrahmen / eine Matrix handelt, benötigen Sie Code, damit dies funktioniertEin etwas anderer Ansatz besteht darin, Ihre Formel aus einer Zeichenfolge zu erstellen. In dem
formula
Hilfeseite finden Sie folgendes Beispiel:Wenn Sie sich dann die generierte Formel ansehen, erhalten Sie:
quelle
Ja, fügen Sie einfach die Antwort
y
als erste Spalte im Datenrahmen hinzu und rufen Sielm()
sie auf:Außerdem weisen meine Informationen zu R darauf hin, dass eine Zuordnung mit
<-
empfohlen wird=
.quelle
foo(bar <- 1:10)
Arbeit (undbar
erstellt werden) aberfoo(bar = 1:10)
entweder fehlschlagen würden, weil diesbar
kein Argument istfoo
und auch nicht erstellt wirdbar
.x3
NA
?Eine Erweiterung der Methode von juba ist die Verwendung
reformulate
einer Funktion, die explizit für eine solche Aufgabe ausgelegt ist.Für das Beispiel im OP wäre hier die einfachste Lösung
oder
Beachten Sie, dass das Hinzufügen der abhängigen Variablen zum data.frame in
d <- cbind(y, d)
nicht nur bevorzugt wird, weil es die Verwendung von ermöglichtreformulate
, sondern auch, weil es die zukünftige Verwendung deslm
Objekts in Funktionen wie ermöglichtpredict
.quelle
Ich baue diese Lösung,
reformulate
kümmere mich nicht darum, ob Variablennamen Leerzeichen haben.`` `
quelle
Sie können das Paket
leaps
und insbesondere dieregsubsets()
Funktionsfunktionen für die Modellauswahl überprüfen . Wie in der Dokumentation angegeben:Modellauswahl durch umfassende Suche, schrittweise vorwärts oder rückwärts oder sequentielles Ersetzen
quelle