Ich möchte mit der lm()
Funktion eine lineare Regression in R durchführen . Meine Daten sind eine jährliche Zeitreihe mit einem Feld für das Jahr (22 Jahre) und einem anderen für den Staat (50 Staaten). Ich möchte für jeden Zustand eine Regression anpassen, damit ich am Ende einen Vektor von lm-Antworten habe. Ich kann mir vorstellen, für jeden Zustand eine for-Schleife auszuführen, dann die Regression innerhalb der Schleife durchzuführen und die Ergebnisse jeder Regression einem Vektor hinzuzufügen. Das scheint jedoch nicht sehr R-artig zu sein. In SAS würde ich eine 'by'-Anweisung machen und in SQL würde ich eine' group by 'machen. Was ist der R-Weg, um das zu tun?
r
regression
linear-regression
lm
JD Long
quelle
quelle
aggregate
ist nicht richtig ; auch nichttapply
.Antworten:
Hier ist eine Möglichkeit, das
lme4
Paket zu verwenden.quelle
Hier ist ein Ansatz mit dem Plyr- Paket:
quelle
layout(matrix(c(1,2,3,4),2,2)) # optional 4 graphs/page
und dann erhaltenl_ply(models, plot)
Sie auch jedes der Residuen-Diagramme. Ist es möglich, jedes der Diagramme mit der Gruppe zu kennzeichnen (z. B. "Zustand" in diesem Fall)?Seit 2009
dplyr
wurde veröffentlicht, was tatsächlich eine sehr gute Möglichkeit bietet, diese Art der Gruppierung durchzuführen, die der von SAS sehr ähnlich ist.Um die Koeffizienten und Rsquared / p.value abzurufen, kann man das
broom
Paket verwenden. Dieses Paket bietet:quelle
rowwise(fitted_models) %>% tidy(model)
, um das Besenpaket zum Laufen zu bringen, aber ansonsten eine großartige Antwort.d %>% group_by(state) %>% do(model = lm(response ~ year, data = .)) %>% rowwise() %>% tidy(model)
Meiner Meinung nach ist ein gemischtes lineares Modell ein besserer Ansatz für diese Art von Daten. Der unten angegebene Code im festen Effekt gibt den Gesamttrend wieder. Die zufälligen Effekte zeigen an, wie sich der Trend für jeden einzelnen Staat vom globalen Trend unterscheidet. Die Korrelationsstruktur berücksichtigt die zeitliche Autokorrelation. Schauen Sie sich Pinheiro & Bates (Modelle mit gemischten Effekten in S und S-Plus) an.
quelle
Eine nette Lösung mit
data.table
wurde hier in CrossValidated von @Zach gepostet. Ich möchte nur hinzufügen, dass es möglich ist, iterativ auch den Regressionskoeffizienten r ^ 2 zu erhalten:sowie alle anderen Ausgaben von
summary(lm)
:quelle
Ich denke, es lohnt sich, den
purrr::map
Ansatz für dieses Problem hinzuzufügen .Weitere Ideen zur Verwendung des
broom
Pakets mit diesen Ergebnissen finden Sie in der Antwort von @Paul Hiemstra .quelle
quelle
Ich jetzt meine Antwort kommt etwas spät, aber ich suchte nach einer ähnlichen Funktionalität. Es scheint, dass die eingebaute Funktion 'by' in R auch die Gruppierung einfach durchführen kann:
? by enthält das folgende Beispiel, das pro Gruppe passt und die Koeffizienten mit sapply extrahiert:
quelle
Die
lm()
obige Funktion ist ein einfaches Beispiel. Ich stelle mir übrigens vor, dass Ihre Datenbank die Spalten wie folgt enthält:Jahreszustand var1 var2 y ...
Aus meiner Sicht können Sie den folgenden Code verwenden:
quelle
Die Frage scheint zu sein, wie Regressionsfunktionen mit Formeln aufgerufen werden, die innerhalb einer Schleife geändert werden.
So können Sie dies tun (mithilfe des Diamanten-Datensatzes):
quelle