2017-12-23 10 views
0

Ich entschuldige mich, wenn diese Frage schlecht formuliert war, aber nach stundenlanger Suche im Internet fühle ich mich sicher, dass diese Frage nicht zuvor beantwortet wurde. Ich werde mein Bestes geben, um genau zu beschreiben, was dieses Problem beinhaltet.Dynamisch Referenz Spalte Name in mehreren linearen Regression (lm())

Datensatzzusammenfassung: Bei den verwendeten Daten handelt es sich um Finanzdaten (Öffnen, Hoch, Niedrig, Schließen), die aus Python-Code abgerufen und in einzelnen CSV-Dokumenten gespeichert wurden. Unter Verwendung von lapply wurden die Dokumente dann gelesen und gespeichert. Um die Dinge einfach zu halten, konzentriere ich mich nur auf die tägliche prozentuale Veränderung oder (Close/shift (Close)) - 1. Für die Zwecke dieses Problems habe ich alle NA s sowie nicht vollständige Ticker aus den Daten entfernt.

Ich habe einen Datenrahmen (konvertiert aus der Liste) von 98 Spalten (die Ticker), überspannend 1000 Zeilen (die Tage). Die Werte innerhalb des Datenrahmens/der Matrix sind die täglichen prozentualen Änderungen für jeden Ticker an jedem Tag.

Ziel: Ich möchte wissen, wie die lm() Formel über jede Spalte anwenden durch den Spaltennamen dynamisch Referenzierung, alle anderen Spalten unter Verwendung von (~ .).

Beispieldatensatz:

aapl_pct_chg <- c(.02, .03, .01, -.05, -.01) 
tmus_pct_chg <- c(-.01, -.02, .05, .01, -.03) 
akam_pct_chg <- c(.1, -.2, .3, -.03, -.07) 
intc_pct_chg <- c(.01, .03, .02, .01, .1) 
de_pct_chg <- c(-.01, -.05, .05, .1, -.03) 

df <- as.data.frame(cbind(aapl_pct_chg, tmus_pct_chg, akam_pct_chg, intc_pct_chg, de_pct_chg)) 

names(df) <- c("AAPL", "TMUS", "AKAM", "INTC", "DE") 

Es ist einfach genug, Folgendes zu tun:

lm_aapl <- lm(AAPL ~ ., data=df) 

Aber ich nicht in der Lage gewesen, einen Weg zu finden, DYNAMISCH die Spaltennamen, ohne in Fehler referenzieren . Was ich damit meine, ist, dass ich im Idealfall eine Formel ausführen könnte, die das Modell lm() in jeder Spalte erfasst und jede zweite Spalte verwendet.

Es gibt einige beantwortete Fragen, die geholfen haben (und ich entschuldige mich, ich bin unorganisiert und habe dies auf 500 verschiedene Arten versucht), aber keine, die es gelöst haben. Das, was mir am nächsten kommt, ist eine Formel, die das macht, was ich will, aber sie wird die AAPL-Werte bei der Vorhersage von AAPL enthalten - was zu einem guten Modell führt, aber nicht zu dem, was ich will.

Antwort

0

Sie können eine dynamische Anweisung erstellen und eval() verwenden und parse() es

names(df) <- c("AAPL", "TMUS", "AKAM", "INTC", "DE") 
for (n in names(df)) { 
    code <- paste0("lm_", n , " <- lm(", n, " ~ ., data=df)") 
    eval(parse(text=code)) 
} 
+0

Es ist eine wirklich schlechte Idee, Code als Text speichern (und damit 'eval (parse (text = ...))'). Selbst wenn Sie mit der Sprache arbeiten, ist es normalerweise besser, mit einem Ausdruck oder einem anderen Sprachobjekt zu arbeiten. – alistaire

+0

@alistaire Ich stimme zu, aber das ist, was mir eingefallen ist. –

1

zu interpretieren Da Sie . in einer Modellformel verwenden können alle verbleibenden Variablen darstellen, können Sie einfach einen Vektor von Formeln als Strings konstruieren mit paste. Der übliche nächste Schritt besteht darin, mit lapply oder ähnlichem über ihn hinweg zu iterieren, wobei (der nicht vektorisiert ist) in der Zeichenkette aufgerufen wird und dann die Formel angewendet wird. Alle zusammen

df <- data.frame(AAPL = c(0.02, 0.03, 0.01, -0.05, -0.01), 
       TMUS = c(-0.01, -0.02, 0.05, 0.01, -0.03), 
       AKAM = c(0.1, -0.2, 0.3, -0.03, -0.07), 
       INTC = c(0.01, 0.03, 0.02, 0.01, 0.1), 
       DE = c(-0.01, -0.05, 0.05, 0.1, -0.03)) 

models <- lapply(paste(names(df), '~ .'), 
       function(f){ lm(as.formula(f), data = df) }) 

models[[1]] 
#> 
#> Call: 
#> lm(formula = as.formula(f), data = df) 
#> 
#> Coefficients: 
#> (Intercept)   TMUS   AKAM   INTC   DE 
#>  0.01941  0.52529  0.02116  -0.33372  -0.70687 

Beachten Sie die Anrufe sind nicht sehr hübsch, wenn Sie also in der Formel spleißbar möchten, verwenden Sie substitute und eval der resultierende Ausdruck:

models <- lapply(paste(names(df), '~ .'), function(f){ 
    eval(substitute(lm(frm, data = df), 
        list(frm = as.formula(f)))) 
}) 

models[[2]] 
#> 
#> Call: 
#> lm(formula = TMUS ~ ., data = df) 
#> 
#> Coefficients: 
#> (Intercept)   AAPL   AKAM   INTC   DE 
#> -0.03694  1.90370  -0.04028  0.63530  1.34566 
+0

Das hat perfekt funktioniert, danke. Wie würden Sie für die Zukunft die Speicherung der angepassten Werte, Koeffizienten usw. empfehlen?die Zugänglichkeit verbessern und gleichzeitig den Code kurz halten? Schätzen Sie Ihre Hilfe – ThatsMrLongCut

+0

Sie können sie in der anonymen Funktion extrahieren, wenn Sie möchten, aber normalerweise ist es am besten, die Liste der Modelle zu speichern, damit Sie später herausgreifen können, was Sie brauchen, z. mit 'lapply (Modelle, Besen :: ordentlich)' und 'lapply (Modelle, broom :: glance)' oder nur 'lapply (Modelle, coef)' – alistaire

Verwandte Themen