So schreiben Sie eine lineare Modellformel mit 100 Variablen in R

22

Gibt es in R eine einfache Möglichkeit, eine lineare Regression über ein Modell mit 100 Parametern in R zu erstellen? Angenommen, wir haben einen Vektor Y mit 10 Werten und einen Datenrahmen X mit 10 Spalten und 100 Zeilen. In mathematischer Notation würde ich schreiben Y = X[[1]] + X[[2]] + ... + X[[100]]. Wie schreibe ich etwas Ähnliches in R-Syntax?

Christian
quelle
1
gibt es 100 oder 1000? Normalerweise sind die Spalten die Variablen und die Zeilen die Beobachtungen (hier scheint es umgekehrt zu sein)
Makro
100 die zusätzliche 0 war ein Tippfehler
Christian
2
"Ja wirklich?" Möchten Sie das wirklich tun? Ich wäre besorgt über Überanpassung und Korrelation zwischen linearen Kombinationen der Prädiktoren. Nicht nur das, mit 100 Prädiktoren, sondern nur 10 Beobachtungen, haben Sie und die lineare Regression wird überhaupt nicht funktionieren. p>n
Aaron - Reinstate Monica

Antworten:

29

Versuche dies

df<-data.frame(y=rnorm(10),x1=rnorm(10),x2=rnorm(10))
lm(y~.,df)
danas.zuokas
quelle
4
Und wenn Sie beispielsweise alle Interaktionen zweiter Ordnung möchten, können Sie schreiben y ~ . + .^2. Und so weiter.
Lutz Prechelt
3
Und wenn Sie nur einige der Interaktionen zweiter Ordnung y ~ . + .:x1wollen, erhalten Sie so etwas wie die Interaktionen jeder Variablen (außer x1) mit x1. Und so weiter; Du hast die Idee.
Lutz Prechelt
21

Tolle Antworten!

Ich würde hinzufügen, dass standardmäßig beim Aufrufen formulavon a data.frameeine additive Formel erstellt wird, um die erste Spalte auf die anderen zu regressieren.

Im Falle der Antwort von @ danas.zuokas können Sie das sogar tun

lm(df)

was richtig interpretiert wird.

gui11aume
quelle
Diese Antwort funktioniert jedoch nicht, wenn Sie Interaktionsbegriffe mischen möchten. Ihre tut (+1).
gui11aume
6
Ich bin immer wieder erstaunt, wie überlastet die meisten RBetreiber sind :)
Makro
19

YnXn×pp=100

Z = as.data.frame(cbind(Y,X))
lm(Y ~ .,data=Z)

Wenn es andere Spalten gibt, die Sie nicht als Prädiktoren einschließen möchten, müssen Sie sie entfernen, Xbevor Sie diesen Trick verwenden oder -in der Modellformel verwenden, um sie auszuschließen. Wenn Sie beispielsweise den 67. Prädiktor (der den entsprechenden Namen hat x67) ausschließen möchten , können Sie schreiben

lm(Y ~ .-x67,data=Z)

Wenn Sie Interaktionen usw. einbeziehen möchten, müssen Sie diese auch manuell hinzufügen als (zum Beispiel).

lm(Y ~ .+X[,1]*X[,2],data=Z)

oder stellen Sie sicher, dass sie als Spalten von eingegeben werden X.

Makro
quelle
19

Sie können auch eine Kombination der Funktionen formulaund pasteverwenden.

Setup-Daten : Stellen Sie sich vor, wir haben einen data.frame, der die Prädiktorvariablen x1to x100und unsere abhängige Variable enthält y, aber auch eine störende Variable asdfasdf. Auch die Prädiktorvariablen sind in einer solchen Reihenfolge angeordnet, dass sie nicht alle im data.frame zusammenhängen.

Data <- data.frame(matrix(rnorm(102 * 200), ncol=102))
names(Data) <- c(paste("x", 1:50, sep=""), 
    "asdfasdf", "y", paste("x", 51:100, sep=""))

Stellen Sie sich auch vor, dass Sie eine Zeichenfolge haben, die die Namen der Prädiktorvariablen enthält. In diesem Fall kann dies einfach mit der pasteFunktion erstellt werden. In anderen Situationen kann jedoch auch grepein anderer Ansatz verwendet werden, um diese Zeichenfolge abzurufen.

PredictorVariables <- paste("x", 1:100, sep="")

Ansatz anwenden : Wir können dann eine Formel wie folgt konstruieren:

Formula <- formula(paste("y ~ ", 
     paste(PredictorVariables, collapse=" + ")))
lm(Formula, Data)
  • Das collapseArgument wird +zwischen die Prädiktorvariablen eingefügt
  • formulakonvertiert den String in ein Objekt der Klassenformel, das für die lmFunktion geeignet ist.

Im Allgemeinen verwende ich die folgende Funktion ziemlich regelmäßig, wenn ich die Prädiktorvariablen als Vektor von Variablennamen bereitstellen möchte.

regression <- function(dv, ivs, data) {
    # run a linear model with text arguments for dv and ivs
    iv_string <- paste(ivs, collapse=" + ")
    regression_formula <- as.formula(paste(dv, iv_string, sep=" ~ "))
    lm(regression_formula, data)

}

Z.B,

regression("y", PredictorVariables, Data)
Jeromy Anglim
quelle
2
+1. Ich benutze diese Technik die ganze Zeit. Gelegentlich kann es jedoch zu Problemen kommen, wenn die Formel in einer Variablen gespeichert ist. Unter stackoverflow.com/a/7668846/210673 erfahren Sie , wie Sie do.calldie Formel vor dem Aufruf auswerten können lm.
Aaron - Reinstate Monica