2016-10-27 6 views
1

Ich denke, ich habe eine ziemlich vernünftige Idee, wie man das erreichen kann, aber ich bin nicht 100% sicher bei allen Schritten. Diese Frage ist hauptsächlich als Plausibilitätsprüfung gedacht, um sicherzustellen, dass ich dies auf die effizienteste Weise mache, und dass meine Mathematik tatsächlich solide ist (da mein Statistikwissen nicht vollkommen perfekt ist).Schnellste Möglichkeit, viele Regressionen in Python zu berechnen?

Anyways, eine Erklärung über das, was ich zu tun habe versucht:

Ich habe eine Menge von Zeitreihendaten, die ich auf einige lineare Regressionen ausführen möchten. Insbesondere habe ich ungefähr 2000 Beobachtungen zu 500 verschiedenen Variablen. Für jede Variable muss ich eine Regression mit zwei erklärenden Variablen durchführen (zwei zusätzliche Vektoren mit ungefähr 2000 Beobachtungen). Also müsste ich für jede von 500 verschiedenen Ys a und b in der folgenden Regression Y = aX_1 + bX_2 + e finden.

Bis zu diesem Punkt habe ich die OLS-Funktion im statsmodels-Paket verwendet, um meine Regressionen durchzuführen. Soweit ich das beurteilen kann, wenn ich das statsmodels-Paket verwenden möchte, um mein Problem zu lösen, müsste ich es hunderte Male aufrufen, was einfach im Allgemeinen ineffizient erscheint.

Also entschied ich mich stattdessen einige Statistiken, die ich seit langer Zeit nicht wirklich berührt habe, noch einmal zu überprüfen. Wenn mein Wissen noch stimmt, kann ich alle meine Beobachtungen in eine große Y-Matrix von etwa 2000 x 500 setzen. Ich kann dann meine erklärenden Variablen in eine X-Matrix von etwa 2000 x 2 stecken und die Ergebnisse von allen erhalten 500 meiner Regressionen durch Berechnung (X'Y)/(X'X). Wenn ich dies mit einfachen numpy stuff (Matrix-Multiplikation mit * und Inversen mit Matrix.I), ich denke, es wird viel schneller sein als Hunderte von statsmodel OLS-Aufrufe.

Hier sind die Fragen, die ich habe:

  • Sind die numpy Sachen, die ich tue, schneller als die frühere Methode des statsmodels oft nennen? Wenn ja, ist es der schnellste/effizienteste Weg, um das zu erreichen, was ich will? Ich gehe davon aus, dass es das ist, aber wenn Sie einen besseren Weg kennen, würde ich mich freuen, es zu hören. (Sicherlich bin ich nicht die erste Person, die viele Regressionen auf diese Weise berechnen muss.)
  • Wie gehe ich mit fehlenden Daten in meinen Matrizen um? Meine Zeitreihendaten werden nicht schön und vollständig sein und gelegentlich werden Werte fehlen. Wenn ich nur versuche, eine regelmäßige Matrixmultiplikation in numpy zu machen, werden sich die NA-Werte ausbreiten, und am Ende werde ich eine Matrix von meist NAs erhalten. Wenn ich jede Regression unabhängig mache, kann ich die Zeilen, die NAs enthalten, einfach fallen lassen, bevor ich meine Regression durchführe, aber wenn ich dies auf der großen 2000 x 500-Matrix mache, werde ich tatsächlich Nicht-NA-Daten von einigen meiner anderen Variablen löschen und das will ich natürlich nicht.
  • Was ist der effizienteste Weg, um sicherzustellen, dass meine Zeitreihendaten tatsächlich richtig ausgerichtet sind, bevor ich sie überhaupt in die Matrizen einfüge? Die Anfangs- und Enddaten für meine Beobachtungen sind nicht notwendigerweise die gleichen, und einige Serien können Tage haben, die andere nicht haben. Wenn ich eine Methode wählen würde, um dies zu tun, würde ich alle Beobachtungen in einen Pandas-Datenrahmen setzen, der durch das Datum indiziert wird. Dann werden Pandas am Ende die ganze Arbeit machen, alles für mich ausrichten und ich kann das zugrunde liegende ndarray extrahieren, nachdem es fertig ist. Ist das die beste Methode, oder haben Pandas irgendeinen Overhead, den ich vermeiden kann, wenn ich die Matrixkonstruktion anders mache?
+0

Vielleicht http://codereview.stackexchange.com/ ist ein besserer Ort für Ihre Frage? Siehe http://codereview.stackexchange.com/tour. – boardrider

Antwort

2

einige kurze Antworten

1) Aufruf statsmodels ist wiederholt nicht der schnellste Weg.Wenn wir nur Parameter, Prädiktion und Residuen brauchen und wir identische erklärende Variablen haben, dann verwende ich normalerweise einfach params = pinv(x).dot(y), wobei y 2-dimensional ist und berechne den Rest von dort. Das Problem besteht darin, dass Inferenz, Konfidenzintervalle und Ähnliches Arbeit erfordern. Wenn also die Geschwindigkeit nicht entscheidend ist und nur eingeschränkte Ergebnisse benötigt werden, ist statsmodels OLS noch praktischer.

Dies funktioniert nur, wenn alle y und x die gleichen Beobachtungsindizes, keine fehlenden Werte und keine Lücken haben.

Beiseite: Das Setup ist ein multivariates lineares Modell, das von Statsmodels in hoffentlich nicht sehr weit Zukunft unterstützt wird.

2) und 3) Die schnelle einfache lineare Algebra von Fall 1) funktioniert nicht, wenn Zellen fehlen oder keine vollständige Überlappung der Beobachtung (Indizes). In den Analog-zu-Panel-Daten erfordert der erste Fall "ausgeglichene" Panels, die anderen Fälle beinhalten "unsymmetrische" Daten. Der Standardweg besteht darin, die Daten mit den erklärenden Variablen in einer blockdiagonalen Form zu stapeln. Da dies den Speicher um einen großen Betrag erhöht, ist die Verwendung von dünn besetzten Matrizen und spärlicher linearer Algebra besser. Es hängt von den spezifischen Fällen ab, ob das Erstellen und Lösen des Sparse-Problems schneller ist als das Schleifen einzelner OLS-Regressionen.

Specialized Code: (Nur ein Gedanke):

Im Fall 2) mit nicht vollständig überlappend oder cellwise Werte fehlen, würden wir noch brauchen alle x'x und x'y Matrizen für alle y zu berechnen, dh 500 davon. Da Sie nur zwei Regressoren haben, benötigen 500 x 2 x 2 immer noch keinen großen Speicher. So könnte es möglich sein, Parameter, Vorhersage und Residuen zu berechnen, indem die nicht fehlende Maske als Gewichtungen in den produktübergreifenden Berechnungen verwendet wird. numpy hat linalg.inv, soweit ich weiß, vektorisiert. Also, ich denke, das könnte mit ein paar vektorisierten Berechnungen gemacht werden.

Verwandte Themen