Google CausalImpact R-Paket nach Python portiert (Gibbs-Sampler in Rust)
(github.com/YuminosukeSato)Ich habe das CausalImpact-R-Paket von Google nach Python portiert.
Der Gibbs-Sampler ist in Rust implementiert und wird über PyO3 aus Python aufgerufen.
Kein TensorFlow nötig, gegenüber R etwa 30-mal schneller.
Warum ich es gebaut habe:
Bei den bestehenden Python-Portierungen gab es Probleme. pycausalimpact verwendet
MLE, wodurch die Ergebnisse von R abweichen. tfcausalimpact benötigt
TensorFlow (3GB+). Außerdem implementierte keine der Portierungen
spike-and-slab-Variablenselektion.
Genau das ist die Kernfunktion von bsts in R, die unter mehreren Kontroll-Zeitreihen
automatisch die passenden auswählt.
Diese Bibliothek reproduziert denselben Gibbs-Sampler wie das bsts-Paket in R.
Kalman-Filter, Simulation Smoother und sogar der spike-and-slab-Prior
sind vollständig identisch. Bei jedem Commit laufen in der CI Tests auf numerische Gleichwertigkeit
mit R CausalImpact 1.4.1
(Punkteffekt ±3 %, CI-Bereich ±5 %).
Der schwierigste Teil war spike-and-slab.
Es hat mehrere Wochen gedauert, coordinate-wise Sampling und die Standardwerte von StudentSpikeSlabPrior
(expected.r2=0.8, prior.df=50) an die R-Ausgabe anzupassen.
Unterstützte Funktionen:
spike-and-slab-Variablenselektion (derselbe Prior wie in Rbsts)- Saisonalitätskomponente (
nseasons,season_duration) - Dynamische Regression (zeitvariable Koeffizienten)
- Local linear trend
Benchmark (T=1000, niter=1000): - Ohne Kovariaten: 0,07 Sekunden (R: 2,1 Sekunden, 30x)
- 5 Kovariaten: 0,20 Sekunden (R: 2,2 Sekunden, 11x)
pip install bsts-causalimpact
GitHub: https://github.com/YuminosukeSato/bsts-causalimpact
Dokumentation: https://yuminosukesato.github.io/bsts-causalimpact/
Ich freue mich auf Feedback von allen, die kausale Inferenz mit Zeitreihen machen.
Wenn es insbesondere Edge Cases gibt, die ich testen sollte, sagt bitte Bescheid.
1 Kommentare
Klasse. Ich habe zwar gerade keine Daten, an denen ich es sofort ausprobieren könnte, aber wenn sich welche ergeben, werde ich es einmal testen.