Commit 938c8ab
authored
feat: horseshoe prior for BSTS regression (Kohns & Bhattacharjee 2022) (#29)
* feat: horseshoe prior for BSTS regression (Kohns & Bhattacharjee 2022)
Add continuous shrinkage alternative to spike-and-slab via PriorType enum.
Makalic & Schmidt (2015) auxiliary variable augmentation: β joint update
through precision matrix, per-covariate λ²/ν and global τ²/ξ sampling.
- HorseshoeState struct with kappa() shrinkage diagnostic
- sample_horseshoe() in both seasonal and non-seasonal Gibbs paths
- PriorType enum (SpikeSlab/Horseshoe) replacing string comparison
- sample_inv_gamma guard against non-finite params (fixes panic on
extreme-scale inputs with standardize_data=False)
- kappa() uses same 1e-30 floor as precision diagonal for consistency
- GibbsSamples.kappa_shrinkage field exposed via PyO3
arXiv:2011.00938, arXiv:1508.02502
* feat: expose horseshoe prior via ModelOptions(prior_type='horseshoe')
- ModelOptions: prior_type field with spike_slab/horseshoe validation
- _normalize_model_args: unknown dict key rejection (fixes silent typo
fallback e.g. prior_typee), routes through ModelOptions.__post_init__
- posterior_shrinkage property: mean kappa_j per covariate (horseshoe only)
- posterior_inclusion_probs returns None for horseshoe (not applicable)
- horseshoe + dynamic_regression/retrospective → ValueError
* test: horseshoe prior specs (47 tests) + options/sampler boundary tests
- test_horseshoe.py: 10 classes, 47 tests covering output shape,
shrinkage behavior, posterior_shrinkage, positivity, backward compat,
numerical stability, validation, Python API, dense DGP, seasonal
- test_options.py: TestPriorTypeBoundary (6 tests) for ModelOptions
- test_rust_sampler.py: TestSamplerKappaShrinkage (3 tests) for PyO3
boundary verification of kappa_shrinkage field
* docs: horseshoe prior usage, shrinkage diagnostics, and theory
- docs/api.md: horseshoe section with usage, diagnostics table, refs
- docs/theory.md: hierarchical model, conditional posteriors, kappa_j
- README.md: horseshoe in feature tables and model arguments
- CHANGELOG.md: feat + fix entries for horseshoe, InvGamma guard,
dict validation, kappa floor consistency
* docs: document rationale for implementation decisions not in papers
Three horseshoe design choices lack prescriptive guidance in the
reference papers (Kohns 2022, Makalic 2015, Carvalho 2010). Document
the reasoning so reviewers can evaluate them independently:
- tau0 heuristic: y_sd / (sqrt(k) * y_norm), chain forgets within warmup
- Numerical clamping on derived precision only (not raw draws) to
preserve posterior fidelity while protecting Cholesky decomposition
- Gibbs ordering difference: horseshoe beta-first (Makalic Alg.1) vs
spike-slab sigma2-first (cold-start avoidance)
* fix: covariate length validation at PyO3 boundary + docs/test cleanup
- lib.rs: reject covariate columns whose length != len(y) with a clear
error message before passing data to the Rust sampler
- api.md: separate mode parameter into its own subsection (mode is
passed via dict, not ModelOptions)
- test_options.py: verify ModelOptions rejects mode kwarg (TypeError)
- test_rust_sampler.py: verify covariate length mismatch raises ValueError
* style: fix E501 line-too-long in test docstrings (ruff 88-char limit)1 parent f9e6d3b commit 938c8ab
13 files changed
Lines changed: 1617 additions & 32 deletions
File tree
- docs
- python/causal_impact
- src
- tests
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
7 | 25 | | |
8 | 26 | | |
9 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
100 | 100 | | |
101 | 101 | | |
102 | 102 | | |
| 103 | + | |
103 | 104 | | |
104 | 105 | | |
105 | 106 | | |
| |||
205 | 206 | | |
206 | 207 | | |
207 | 208 | | |
| 209 | + | |
208 | 210 | | |
209 | 211 | | |
210 | 212 | | |
| |||
223 | 225 | | |
224 | 226 | | |
225 | 227 | | |
| 228 | + | |
226 | 229 | | |
227 | 230 | | |
228 | 231 | | |
| |||
251 | 254 | | |
252 | 255 | | |
253 | 256 | | |
| 257 | + | |
254 | 258 | | |
255 | 259 | | |
256 | 260 | | |
| |||
262 | 266 | | |
263 | 267 | | |
264 | 268 | | |
265 | | - | |
| 269 | + | |
| 270 | + | |
266 | 271 | | |
267 | 272 | | |
268 | 273 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
38 | | - | |
| 38 | + | |
| 39 | + | |
39 | 40 | | |
40 | 41 | | |
41 | 42 | | |
| |||
58 | 59 | | |
59 | 60 | | |
60 | 61 | | |
| 62 | + | |
61 | 63 | | |
62 | | - | |
63 | 64 | | |
64 | 65 | | |
65 | 66 | | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
66 | 80 | | |
67 | 81 | | |
68 | 82 | | |
| |||
86 | 100 | | |
87 | 101 | | |
88 | 102 | | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
89 | 151 | | |
90 | 152 | | |
91 | 153 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
10 | 10 | | |
11 | 11 | | |
12 | 12 | | |
| 13 | + | |
13 | 14 | | |
14 | 15 | | |
15 | 16 | | |
| |||
245 | 246 | | |
246 | 247 | | |
247 | 248 | | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
| 356 | + | |
| 357 | + | |
| 358 | + | |
| 359 | + | |
| 360 | + | |
| 361 | + | |
| 362 | + | |
| 363 | + | |
| 364 | + | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
248 | 409 | | |
249 | 410 | | |
250 | 411 | | |
| |||
0 commit comments