1 pontos por merumeru 2026-03-23 | 1 comentários | Compartilhar no WhatsApp

Fiz um port do pacote R CausalImpact do Google para Python.
O amostrador de Gibbs foi implementado em Rust e chamado a partir do Python com PyO3.
Não precisa de TensorFlow e é cerca de 30 vezes mais rápido que o R.
Motivo para criar isso:
Havia problemas nos ports existentes em Python. O pycausalimpact
usa MLE, então os resultados diferem do R. O tfcausalimpact
exige TensorFlow (3 GB+). E nenhum dos ports
implementava seleção de variáveis spike-and-slab.
Esse é justamente o recurso principal do bsts no R, que
escolhe automaticamente os controles mais adequados entre várias
séries temporais de controle.
Esta biblioteca reproduz o mesmo amostrador de Gibbs do pacote bsts do R.
O filtro de Kalman, o simulation smoother e o prior spike-and-slab
são todos idênticos. A cada commit, a CI executa testes de equivalência numérica
com o R CausalImpact 1.4.1
(efeito pontual ±3%, faixa do IC ±5%).
A parte mais difícil foi o spike-and-slab.
Levei semanas para alinhar a saída com a do R em relação ao
amostragem coordinate-wise e aos valores padrão de StudentSpikeSlabPrior
(expected.r2=0.8, prior.df=50).
Recursos suportados:

  • Seleção de variáveis spike-and-slab (mesmo prior do R bsts)
  • Componente sazonal (nseasons, season_duration)
  • Regressão dinâmica (coeficientes variantes no tempo)
  • Tendência linear local
    Benchmark (T=1000, niter=1000):
  • Sem covariáveis: 0,07 s (R: 2,1 s, 30x)
  • 5 covariáveis: 0,20 s (R: 2,2 s, 11x)
    pip install bsts-causalimpact
    GitHub: https://github.com/YuminosukeSato/bsts-causalimpact
    Documentação: https://yuminosukesato.github.io/bsts-causalimpact/
    Aguardo feedback de quem trabalha com inferência causal em séries temporais.
    Principalmente se houver edge cases que vocês acham que eu deveria testar.

1 comentários

 
shw00 2026-03-24

Muito legal. Não tenho nenhum dado para testar isso agora, mas, se surgir algum, vou experimentar.