Skip to content

Validation matrix

Correctness is the contract. Nothing lands in tsecon without a golden fixture it has to reproduce to a stated tolerance — a JSON file of reference values (in fixtures/) that the Rust crate tests, and in most cases the Python binding tests, must hit on every run. This page is the map: for each method family it names the reference the golden is measured against, the fixture file, the test that enforces the match, and the tolerance it is held to.

The reference is honest about its own strength. There are three kinds, and the table says which one each row is:

  • Independent package. The golden values come from a mature, independently written library — statsmodels, SciPy, arch, linearmodels, scikit-learn, or ArviZ — computing the same estimand through a completely separate code path. Reproducing it is a genuine cross-implementation check.
  • Documented-formula golden. No package computes the quantity, so the generator transcribes the published closed form directly into NumPy (the formula is written out in the generator's docstring) and pins the crate to it. This proves the Rust reproduces the documented algebra; it does not by itself prove the algebra is the statistically right choice — that claim is carried by the crate's seeded Monte-Carlo property tests, noted where it applies. A few of these are cross-implementation goldens (an independent NumPy re-implementation of the same estimator, not an independent authority); the table flags those explicitly.
  • Property / simulation-recovery. Where no reference of either kind exists (multivariate DCC dynamics, dynamic probit), the object is validated by invariants it must satisfy — positive-definiteness, correlation targeting, parameter recovery on simulated data within Monte-Carlo bands — rather than a golden. The table says so plainly rather than overclaiming a package match.

Tolerances below are the asserted bounds in the test source. Many are far tighter than the crate spec requires and the achieved agreement is tighter still (frequently machine precision); where the two differ the table quotes the asserted bound.


Estimator families

Family Validated against Fixture Test Tolerance
Diagnostics — acf, pacf, ljung_box, jarque_bera, arch_lm statsmodels (acf, pacf, acorr_ljungbox, het_arch) + scipy.stats — independent package diagnostics.json tsecon-diag/…/golden.rs 1e-12 rel (spec floor 1e-8)
Unit root & stationarity — adf, kpss, check_stationarity statsmodels adfuller, kpss + MacKinnon p-value grid — independent package unitroot.json tsecon-diag/…/unitroot_golden.rs ADF stat 1e-8 / p 1e-7; KPSS stat 1e-8 / p 1e-6
Phillips-Perron & Phillips-Ouliaris — phillips_perron, phillips_ouliaris arch PhillipsPerron (Z-tau/Z-alpha) and cointegration.phillips_ouliaris (Zt/Za) — independent package — for the statistics; MacKinnon (1996/2010) N-surfaces (arch/statsmodels ADF surfaces at N=1 for PP; statsmodels cointegration surfaces at N=1+ncols(x) for PO-Zt) for p-values/critical values. PO-Za is statistic-only (arch's proprietary surface deliberately not shipped) phillips.json tsecon-diag/…/phillips_golden.rs, phillips_properties.rs stat & crit 1e-8 rel (achieved < 1e-13 vs arch); p-value atol 1e-12 / rtol 1e-8
Volatility (GARCH) — garch_fit arch (Sheppard) arch_model — independent package garch.json tsecon-garch/…/golden.rs fixed-param loglike 1e-8; QMLE params 1e-3, loglike ≥ arch − 1e-6
Score-driven volatility (GAS/DCS) — gas_volatility documented closed form (Creal-Koopman-Lucas 2013), NumPy tsecon-gas.json tsecon-gas/…/golden.rs 1e-10
Multivariate GARCH — ccc_garch, dcc_garch no external DCC reference: univariate stage arch-pinned (via tsecon-garch); DCC dynamics property-validated (every R_t/H_t PD, correlation targeting) + single-realization recovery mgarch.json (simulated DCC-GARCH(1,1), true params attached) tsecon-mgarch/…/mgarch.rs property bounds (PD 1e-8…1e-14); loose MC recovery
VAR / SVAR — var_fit, var_irf, var_fevd, var_granger, var_forecast statsmodels VAR — independent package var.json tsecon-var/…/golden.rs 1e-8 (params, sigma_u, IRF, FEVD, forecast); Granger p 1e-6
VAR IRF confidence bands — var_irf_bands asymptotic: statsmodels IRAnalysis.stderr and cum_effect_stderr (orth False/True) — independent package; bootstrap: no external golden — property-validated (seed reproducibility, residual-bootstrap structure) + Monte-Carlo coverage var_irf_bands.json, var_irf_bootstrap.json tsecon-var/…/irf_bands_golden.rs, irf_bootstrap_props.rs delta-method SE 1e-6 asserted (achieved ~1e-15 vs statsmodels), point IRF 1e-8; bootstrap property bounds + MC coverage
FAVAR / factor extraction — favar NumPy SVD / PCA — documented favar.json tsecon-favar/…/golden.rs 1e-6 (eigenvalues, |PC|, |loadings|)
Connectedness (Diebold-Yilmaz) — connectedness self-authored GFEVD (Diebold-Yilmaz 2012), documented from a VAR connect.json tsecon-connect/…/golden.rs GFEVD matrix 1e-8; to/from/total 1e-6
Local projections — lp, lp_iv, lp_state statsmodels OLS + Newey-West HAC and linearmodels IV2SLS (kernel-HAC) — independent package lp.json tsecon-lp/…/golden.rs OLS β 1e-10 / HAC se 1e-8; IV β 1e-8 / se 1e-6
LP integral multiplier — lp_multiplier no package computes this estimand: independent NumPy re-implementation of the just-identified 2SLS (same sample, same control set) + the published Ramey-Zubairy (2018) headline on the authors' vendored data + a known-multiplier DGP and an outcome-only-trap regression guard ramey_zubairy.csv tsecon-lp/…/properties.rs + test_lp_multiplier.py + test_replication_ramey_zubairy.py 2SLS = reduced-form ratio 1e-9 rel; RZ multiplier in (0.5, 0.8) at h ∈ {4,8,12,16,20}; known-DGP recovery ±0.15
Sign-restricted SVAR — sign_restricted_svar no external fixture exists for the scheme: property / simulation-recovery — Haar-uniform rotation moments (Mezzadri 2007), sign-checker behavior (flips, bands, infeasible patterns), and a simulated-DGP check that the identified-set bands cover the true structural IRF, infeasible restrictions report zero acceptance, and output is bit-exact reproducible and max_tries-batching invariant at a fixed seed none — in-test simulated VAR(1) with a known impact matrix tsecon-ident/…/haar.rs, sign.rs, dgp_validation.rs property bounds; seed reproducibility bit-exact
Zero + sign SVAR — zero_sign_svar documented-formula cross-implementation golden (the generator transcribes Theta_h = Psi_h chol_lower(Sigma) from the pure companion-power MA recursion in NumPy, never importing tsecon): the primary anchor is the recursive/Cholesky recovery — strict-upper-triangle impact zeros, no signs, positive-diagonal normalization — which the RWZ null-space recursion reproduces deterministically (ARW weight = 1), validating cholesky_irf and the recursion at once; an end-to-end binding check confirms the same pattern matches var_irf(orth=True) through the Minnesota-NIW posterior. Sign behavior, feasibility, and seed reproducibility are property-tested zero_sign_svar.json tsecon-ident/…/zero_sign.rs theta 1e-10; recursive ≡ Cholesky; reproducibility bit-exact
Structural identification (advanced) — long_run_svar, max_share_svar, proxy_svar, hetero_svar documented-formula cross-implementation goldens (each generator transcribes the published closed form in independent NumPy/SciPy and never imports tsecon): Blanchard-Quah via NumPy LU inverse + Cholesky (vars::BQ); max-share via numpy.linalg.lstsq/cholesky + eigensolver (leading eigenvector); proxy via statsmodels VAR MA-rep + NumPy method-of-moments; heteroskedasticity via pooled OLS + the NumPy generalized eigenproblem recovering a known B long_run_svar.json, max_share_svar.json, proxy_svar.json, hetero_svar.json tsecon-ident/…/long_run.rs, max_share.rs, proxy.rs, hetero.rs long-run 1e-10 & max-share 1e-10 (crate golden; 1e-8 fed through the reduced-form binding); proxy 1e-9 rel / 1e-11 abs; hetero B 1e-8 / IRF 1e-7; variance-ratio MC recovery 5e-2
Non-Gaussian / ICA SVAR — nongaussian_svar documented-formula cross-implementation golden with an independent-package cross-check: the generator runs a self-contained NumPy FastICA (numpy.linalg.lstsq OLS, numpy.linalg.eigh whitening inverse-sqrt + decorrelation, numpy.tanh log-cosh contrast) that never imports tsecon, and additionally matches sklearn.decomposition.FastICA to ~4e-16 at generation — so the reference is a faithful FastICA, not a bespoke re-derivation. The core bit-matches impact B, whitened rotation Q, per-shock excess kurtosis, structural IRF, the column ordering, and the convergence flag/iteration count. The statistical-identification claim is carried separately by seeded-MC property tests: recovery of the true DGP B up to sign + permutation on non-Gaussian data, a fourth-order cross-dependence reduction versus the raw whitened residuals, plus BB' = Σ_u, Q orthogonal, and bit-exact reproducibility (honestly weaker than a closed-form golden — the ICA core is exact, the recovery is a property) nongaussian_svar.json tsecon-ident/…/nongaussian.rs core 1e-10 (achieved ~1e-15 vs NumPy); true-B MC recovery 5e-2; reproducibility bit-exact
Structural FEVD & historical decomposition — structural_fevd, historical_decomposition independent reference-impl goldens (generators never import tsecon): FEVD's Cholesky case cross-checked against statsmodels VARResults.fevd and tsecon-var var_fevd (exact), the general-A0 shares pinned by exact invariants (each row sums to 1 and denominator rotation-invariance under a random orthogonal Q); HD via a self-contained ~60-line NumPy VAR(2)-by-OLS + Cholesky reference for shocks/Θ_s/hd/baseline, anchored by the exact adding-up identity y = baseline + Σ_j hd (holds for any invertible A0) structural_fevd.json, historical_decomposition_chol.json tsecon-ident/…/structural_fevd.rs, historical_decomposition.rs (+ src/shocks.rs, src/histdecomp.rs unit tests) FEVD vs statsmodels 1e-10; row-sum & rotation invariants 1e-12; HD cells rtol 1e-8 / atol 1e-10; adding-up residual < 1e-9
Post-identification set tools — fry_pagan_svar, robust_svar_bounds, narrative_svar mixed strength, honestly graded. Fry-Pagan: the selection rule is validated exactly against an independent NumPy median/dispersion/MT-statistic/argmin on stored candidate IRFs (the estimand inherits the set-identification caveat — one interior point under the Haar prior). Giacomini-Kitagawa: independent NumPy Gafarov-Meier-Montiel-Olea (2018) active-set closed form (single restricted shock, exact) plus a ≥10⁶-draw brute-force random-sphere search that must bracket the analytic optimum from the inside; multi-shock bounds are the marginal identified set (conservative outer approximation, inside-bracket only). Narrative: reweighting-invariance (no/redundant narrative ⇒ uniform weights, bands = sign_restricted_svar bit-for-bit) + a deterministic weight-formula unit test vs brute-force high-K P(N|S); the underlying HD core carries the strong closed-form golden in the row above fry_pagan_svar.json, robust_svar_bounds.json tsecon-ident/…/fry_pagan.rs, src/robust_bounds.rs, src/narrative.rs FP mt_index/mt_statistic 1e-10 + seed bit-exact; GK single-shock 1e-8 & inside-bracket, aggregation 1e-10; narrative reweighting-invariance 1e-12 & weight-formula 3-σ MC
Bayesian BVAR (conjugate NIW) — bvar_fit, bvar_irf_draws documented closed-form conjugate NIW posterior (NumPy / SciPy multigammaln) bvar_niw.json tsecon-bayes/…/golden.rs 1e-9 (posterior moments, log-marginal-likelihood)
Hierarchical BVAR (empirical-Bayes / ML-II) — bvar_hierarchical documented-formula cross-implementation: independent NumPy/SciPy re-implementation of the Kadiyala-Karlsson (1997, eq. 3.6) matrix-variate-t marginal likelihood maximized with scipy.optimize (Giannone-Lenza-Primiceri 2015) — same estimand, different numerical path, not an independent authority bvar_hierarchical.json tsecon-bayes/…/hierarchical.rs grid log-ML 1e-9; selected λ₁ 1e-8; posterior moments 1e-4; ML-II dominance certificate 1e-6
SSVS-BVAR — bvar_ssvs no closed-form golden (a Gibbs sampler): property / simulation-recovery — on a stable sparse VAR(2) DGP the posterior inclusion probabilities must go near 1 on the true non-zeros and near 0 on the true zeros; plus seed reproducibility, output shapes, the covariance-selection path, the multi-chain diagnostics, and the input guardrails. The closed-form conditional-moment anchors and the block-1 draw kernel are checked in the crate's src/ssvs.rs unit tests ssvs.json (sparse-VAR DGP + masks; data simulated in-Rust from a tsecon_rng::Stream) tsecon-bayes/…/ssvs.rs MC recovery thresholds (deterministic at the fixed seeds)
MCMC diagnostics — mcmc_diagnostics ArviZ (rhat, ess_bulk, ess_tail) — independent package convergence.json tsecon-bayes/…/golden.rs 1e-9
GMM / IV-GMM — iv_gmm, gmm_nonlinear linearmodels IVGMM (2-step efficient, robust) — independent package gmm.json tsecon-gmm/…/golden.rs params 1e-9; bse 1e-6; Hansen J & p 1e-6
Cointegration — johansen, vecm statsmodels coint_johansen, VECM — independent package coint.json tsecon-coint/…/golden.rs eigenvalues 1e-8; trace/max-eig LR 1e-6; VECM α/β/Γ/llf 1e-6
Markov-switching AR — markov_switching_ar statsmodels MarkovAutoregression — independent package regime.json tsecon-regime/…/golden.rs 1e-6 (fixed-param loglike, filtered / smoothed probs)
Forecasting metrics & tests — backtest, dm_test, cw_test, gw_test, theta_forecast, accuracy documented hand-computed metrics + statsmodels ThetaModel + self-authored CW/GW forecast.json, forecast_eval2.json tsecon-forecast/…/golden.rs metrics 1e-14; theta 1e-6; DM / GW 1e-10
Machine learning — ridge, lasso, elastic_net, adaptive_lasso, lasso_path scikit-learn Ridge, Lasso, ElasticNet — independent package ml.json tsecon-ml/…/golden.rs 1e-6 (achieved ~1e-9)
Panel FE / panel LP — panel_fe, panel_lp linearmodels PanelOLS (clustered, Driscoll-Kraay, nonrobust) — independent package panel.json tsecon-panel/…/golden.rs 1e-6 (slopes, se, R²)
Heterogeneous panel MG / CCE-MG — mean_group_var, panel_mean_group statsmodels OLS per-unit (independent) + documented MG / CCE averaging (Pesaran-Smith 1995 / Pesaran 2006) tsecon-panelts.json tsecon-panelts/…/golden.rs 1e-10 (coef, se, tstat, per-unit slopes)
Panel unit-root tests — panel_unit_root R plm::purtest (Wtbar IPS, levinlin LLC, madwu / invnormal Fisher) — independent package — for the statistics; the per-unit ADF matches statsmodels adfuller (via tsecon-diag); Fisher additionally cross-checked to an independent statsmodels/SciPy p-value combination tsecon-panelroot.json tsecon-panelroot/…/golden.rs, validation.rs statistics 1e-6…1e-9; per-unit ADF t 1e-7; lags/nobs exact
Pooled mean group (PMG) — panel_pmg documented-formula cross-implementation: independent NumPy re-impl of PSS 1999 — same estimator, different numerical path, not an independent authority pmg.json tsecon-panelts/…/pmg_golden.rs θ, φ̄, se 1e-8; loglik 1e-6
Nowcasting DFM (two-step Kalman) — dfm_nowcast statsmodels DynamicFactor (Kalman step at fixed params) — independent package; the DGR two-step estimates are property-only tsecon-nowcast.json tsecon-nowcast/…/golden.rs 1e-8 (llf, smoothed states)
Nowcasting DFM one-step MLE — dfm_nowcast (MLE path) statsmodels DynamicFactor fitted (exact-likelihood optimum) — independent package nowcast_mle.json tsecon-nowcast/…/mle.rs smooth-at-fitted 1e-6; optimiser gap honest ≤ 1e-2 rel
Nowcast news decomposition — dfm_news independent NumPy Kalman + RTS smoother (Banbura-Modugno 2014) — a different implementation nowcast_news.json tsecon-nowcast/…/news.rs weights 1e-6; forecasts / news 1e-7; actuals 1e-9
MIDAS — midas_weights, umidas, weighted_midas statsmodels OLS (U-MIDAS) + documented weight formulas (exp-Almon, Beta) midas.json tsecon-midas/…/golden.rs weights 1e-10; U-MIDAS params / bse / R² 1e-8
Term structure (NS / dynamic NS) — nelson_siegel, dynamic_ns statsmodels OLS on Nelson-Siegel loadings at Diebold-Li (2006) fixed λ; Svensson validated by nesting property termstructure.json tsecon-termstructure/…/golden.rs loadings 1e-10; factors / R² 1e-8
Arbitrage-free Nelson-Siegel — afns_adjustment documented closed-form yield-adjustment term (Christensen-Diebold-Rudebusch 2011), NumPy afns.json tsecon-termstructure/…/afns.rs 1e-10
Realized volatility — realized_measures, har_rv, realized_quarticity, tripower_quarticity, bns_jump_test, realized_range statsmodels OLS (HAR-RV, Corsi 2009) + documented measures (RV / BV / quarticity, Barndorff-Nielsen-Shephard) realized.json tsecon-realized/…/golden.rs RV / BV 1e-12; HAR params / bse / R² 1e-8
Predictive regressions & IVX — predictive_regression, ivx_test documented closed form (Stambaugh 1999 / Kostakis-Magdalinos-Stamatogiannis 2015), NumPy; size / power are property tests predreg.json tsecon-predreg/…/golden.rs slopes / Wald 1e-9; p-value 1e-8
Recession probability — recession_probit statsmodels Probit / Logit (static); the dynamic Kauppi-Saikkonen model has no reference → property-only tsecon-recession.json tsecon-recession/…/golden.rs 1e-6
Survey expectations — cg_regression, forecast_efficiency, forecast_disagreement statsmodels OLS + Newey-West HAC + NumPy (std, percentiles) + documented closed forms (implied rigidity, IQR) tsecon-survey.json tsecon-survey/…/golden.rs 1e-8
Long memory — frac_diff, frac_integrate, long_memory_d documented closed form (binomial (1−L)ᵈ; GPH 1983; Robinson 1995 local Whittle), NumPy; recovery is a property test longmemory.json tsecon-longmemory/…/golden.rs frac diff / int 1e-12; GPH d 1e-8, se 1e-12; Whittle d 1e-6
Specification & diagnostic tests — heteroskedasticity_test, reset_test, chow_test, cusum_test statsmodels het_white, het_breuschpagan (Koenker), linear_reset + documented Chow / CUSUM tsecon-spectest.json tsecon-spectest/…/golden.rs 1e-8
DSGE (linear RE solver) — dsge_solve documented closed-form Blanchard-Kahn solution (NumPy; eigenvalues independently cross-checked via numpy.linalg.eigvals) tsecon-dsge.json tsecon-dsge/…/golden.rs 1e-8
Quantile regression & growth-at-risk — quantile_regression, quantile_lp, growth_at_risk statsmodels QuantReg with all defaults (IRLS + Powell kernel sandwich, Hall-Sheather bandwidth) across three DGPs; GaR additionally pinned to per-tau statsmodels fits + np.sort rearrangement, including a case where the raw quantile paths genuinely cross tsecon-quantile.json tsecon-quantile/…/golden.rs params/bse/bandwidth/sparsity 1e-6
Functional shocks (FVAR/FLP) — functional_pca, flp, flp_scenario, fvar_scenario FPCA vs numpy.linalg.eigh (documented sign convention); FLP vs statsmodels OLS with kernel-HAC on the identical joint design; the scenario reconstruction identity (scenario = j-th eigenfunction ⇒ j-th coefficient path) is an exact property, and an MC recovers a known functional response operator tsecon-funcshock.json tsecon-funcshock/…/golden.rs FPCA 1e-10; FLP 1e-8; identity exact
Structural breaks — bai_perron, sup_f_test DP vs exact brute-force enumeration (NumPy itertools over all admissible partitions — an independent algorithmic path) for the global partition; sequential sup-F against the transcribed Bai-Perron published critical values; Hansen (1997) p-value response surface; Bai (1997) argmax cdf closed form (homogeneous case only — stated in the card) tsecon-breaks.json tsecon-breaks/…/golden.rs SSR 1e-8 rel; break dates exact
Smooth local projections — smooth_lp B-spline basis vs scipy.interpolate.BSpline.design_matrix; the stacked penalized estimator vs plain-NumPy normal equations at several λ; λ = 0 exactly reproduces lp(se="hac") (internal-consistency anchor, test-pinned) smoothlp.json tsecon-lp/…/smooth_golden.rs basis 1e-10; θ/IRF/SE 1e-8

Foundational numerics

The primitives every estimator above leans on are held to the same standard.

Family Validated against Fixture Test Tolerance
ARIMA / SARIMAX statsmodels SARIMAX (fixed-param loglike, forecast); MLE optimum independently cross-verified — independent package arima.json tsecon-arima/…/golden.rs loglike 1e-8; forecast 1e-6; optimum params 1e-4
State-space / Kalman filter & smoother statsmodels statespace / SARIMAX with exact-diffuse initialization — independent package ssm.json tsecon-ssm/…/golden.rs 1e-6 (achieved ≤ 1e-11)
Filters — HP / Baxter-King / Christiano-Fitzgerald / Hamilton statsmodels hpfilter, bkfilter, cffilter + documented Hamilton (2018) regression filter filters.json tsecon-filters/…/golden.rs 1e-8
HAC / long-run variance — Newey-West, EWC statsmodels OLS with HAC covariance — independent package hac.json tsecon-hac/…/golden.rs 1e-10
Spectral analysis — periodogram / Welch / coherence scipy.signal (periodogram, welch, coherence) — independent package spectral.json tsecon-spectral/…/golden.rs 1e-8
Distributions & special functions scipy.stats (normal, Student-t, GED, …) — independent package distributions.json tsecon-stats/…/golden.rs pdf / logpdf / cdf 1e-12; ppf 1e-9
Linear algebra — Toeplitz solve / discrete Lyapunov / Levinson-Durbin scipy.linalg (solve_toeplitz, solve_discrete_lyapunov) + statsmodels levinson_durbin — independent package linalg.json tsecon-linalg/…/golden.rs 1e-10 (Levinson-Durbin 1e-12)
RNG — Philox counter-based generator NumPy Philox bit-stream — independent package philox.json tsecon-rng/…/golden.rs bit-exact
Bootstrap resampling — bootstrap_indices, optimal_block_length no golden: property-validated — index range / full length for every scheme, moving vs circular block structure, the stationary scheme's geometric block-length distribution, wild-weight moments, and Politis-White behavior on a known AR(1) (finite and stable, short blocks on white noise, longer blocks under persistence); plus bit-exact seed reproducibility and thread-count invariance of the parallel driver none — seeded in-test simulation tsecon-bootstrap/…/properties.rs + reproducibility.rs fixed-seed 3-se property bounds; reproducibility bit-exact
Time-series CV — cv_splits (and crate-level cv_select) no golden: leakage safety is asserted analytically — every expanding / rolling test index lies strictly after its training window, purged K-fold honors the purge and embargo gaps exactly, and cv_select agrees with BIC selection on i.i.d. data as a sanity property none tsecon-ml/…/properties.rs + test_cv_splits.py exact index-set assertions
check_series (composition layer) no golden of its own — every component is individually validated above: ADF/KPSS/check_stationarity, ljung_box/acf/pacf, arch_lm, jarque_bera, sup_f_test/bai_perron, GPH (long_memory_d), periodogram, johansen, VAR lag selection. The routing itself is validated by seeded-DGP recovery tests (random walk → difference, GARCH → ARCH rec, broken mean → break dates, cointegrated pair → vecm, stationary VAR → var_fit) plus a Monte-Carlo white-noise size check on the per-family rejection rates; the .summary() report is snapshot-tested none (components' fixtures apply) test_check_series.py + test_results_check.py routing assertions exact; size within MC bands

Provenance

Each fixture records, in its _meta block, the exact reference-library versions used to produce it, so the values are reproducible. The pinned versions across the suite are:

Reference Version
statsmodels 0.14.6
SciPy 1.17.1
NumPy 2.5.1
arch 8.0.0
linearmodels 7.0
scikit-learn 1.9.0
ArviZ 1.2.0
Python 3.12.7

The goldens gate the Rust crate tests directly. They are additionally exercised through the Python API — the binding suite in bindings/python/tests/ reloads the same JSON fixtures and checks the shipped module reproduces them — so the guarantee holds end-to-end, not just in the core. The fixtures themselves store only derived numeric values and transformations of two public-domain reference series (the Nile river-flow series and US macrodata); no licensed dataset is redistributed. See the fixtures README for how each file is generated and regenerated.