fue¶
ARMAX by exact unconditional maximum likelihood, with rational transfer functions on the inputs and seasonality resolved one frequency at a time.
Three things, and no other program in this space has all three:
-
The exact unconditional likelihood — not a conditional sum of squares and not an approximation — of a model that carries deterministic inputs.
-
A rational transfer function on each input,
ω_s(B)/δ_r(B), so an intervention has a dynamic response: an effect that builds up, decays or settles at a long-run gaing = ω(1)/δ(1).statsmodels'exoggives a static coefficient — the effect is the same in the period of the event and ten years later. That is a different model, not a simplified one. -
Seasonality frequency by frequency.
SARIMAXgives you the whole seasonal operator or none of it;fuelets a series be stochastic at f=1 and deterministic at f=2, which is what real series usually are.
What that versatility is for¶
Two published applications, both of which need the transfer function to be a model of a process rather than a dummy variable:
-
García-Hiernaux & Guerrero (2021), "Price convergence: representation and testing", Economic Modelling 104, 105641. A general notion of price convergence — steady-state and catching-up, weak and strong — in which the transition phase is an exogenous deterministic input passed through a transfer function:
ωis how far the process travels,δits speed, and the starting date is the input's date. The shape and starting point are then estimated from the data rather than assumed, and the definitions imply parameter restrictions that are tested. Applied to the aggregate price levels of Germany, France and Italy after the euro, and to transatlantic 19th-century wheat prices. -
García-Hiernaux, González-Pérez & Guerrero (2023), "Eurozone prices: a tale of convergence and divergence", Economic Modelling 126, 106418. The same framework on relative prices across the EMU, 2001-2020, identifying the date, shape and velocity of each convergent or divergent process: convergence for over 80% of the EMU between 2001 and 2011, and price-level divergence from 2012 onwards.
Neither study is a regression with a break dummy. The object being estimated is
a transition path — a dynamic response with a shape, a speed and a long-run
gain — inside a model whose stochastic part is estimated jointly by exact ML.
That is the class of question fue's casting opens.
The engine is José Alberto Mauricio's C, embedded and unmodified: Algorithm AS 311 (1997) for the likelihood, AS 197 (Melard 1984) for the scalar case, and his own quasi-Newton optimiser from JASA 90, 282-291. See PROVENANCE.md for who wrote what and what checks it.
What it fits¶
zₜ = ξₜ + Nₜ (Box-Cox transformed level)
ξₜ = Σ ω_s(B)/δ_r(B) · xᵢₜ inputs with a DYNAMIC response
(step, impulse, ramp, Easter,
harmonics, your own column)
φ_p(B) Φ_P(B^s) (wₜ − μ) = θ_q(B) Θ_Q(B^s) aₜ , wₜ = ∇^d ∇ₛ^D Nₜ
with ∇ₛ replaceable, factor by factor, by the frequencies you actually want to difference. MODEL.md writes it out without ambiguity.
Ten lines that run¶
import fue
from fue.datasets import ripc
ts = ripc() # Spanish CPI, monthly, 2002-2007
m = fue.Model(ts, d=1, boxlam=0.0, refactor=100.0,
ar=[[0.3]], ar_free=[[True]],
mu=0.1, estimate_mu=True)
m.fit()
print(m.ar[0][0], m.loglik) # 0.430784 -48.995195
print(m._result.termination, m._result.gnorm) # gradient criterion, 3.9e-06
Five graded examples are in examples/, from this to a mixed MEG;
they run in CI, so they still work.
Why the numbers can be trusted¶
Because that is checkable rather than asserted, and the checks are of four different kinds:
| what it proves | |
|---|---|
| the paper's own FORTRAN | Melard's AS 197 listing, transcribed and compiled: agreement to 5e-08 in log-likelihood on nine Box-Jenkins specifications |
| the paper's own identities | AS 311's equations (2)-(4) on the engine's outputs; its quadratic form matches Melard's to 1e-14 |
| an implementation with no shared ancestry | statsmodels agrees on all nine to ~1e-7 in the parameters |
| the original program's preserved runs | 28 archived .out files reproduced exactly — termination code, iteration count and gradient norm |
And the limits are documented too, because a document that lists only what works
is an advertisement: PROVENANCE.md §6, and
bugs/, which is public.
The documentation¶
| GETTING_STARTED.md | install, first model, reading the .out |
| MODEL.md | the class of models, formally |
| FILE_CONTRACT.md | .inp / .out / .pre, field by field |
| FORMAL_TESTS.md | non-stationarity, non-invertibility, MEG; with the critical values |
| CONVERGENCE.md | what the optimiser reports and what to do about it |
| PROVENANCE.md | which algorithm, from which paper, verified how |
| PORT.md | how the port was done, and what it found |
| PERFORMANCE.md | why the wheel: the two engines measured, in speed and in answers |
| API.md | every public symbol, generated from the docstrings |
| MIGRATION.md | for users of the FUE in C: what changes and what does not |
fue is the engine. The Box-Jenkins-Treadway orchestration — identification,
diagnosis, the decision rules — is art;
transfer functions are drtran, and multivariate is drvarma. The separation is
deliberate: the engine supplies the fits and stays out of the decisions.
Licence and lineage¶
GPL. The C is Mauricio's, the file format and the user manual are Arthur B. Treadway's, and both authorised the licence. The port is 2026.