First stable release. Since 0.1.2 the model-construction entry point
and the fitted-model class have been renamed, the aggregation library
and the uncertainty machinery have been substantially extended, and two
methods that did not honour their documented contract have been
corrected. The public interface centred on mf_model(),
forecast(), summary() and plot()
is now considered stable, and future breaking changes will go through a
deprecation cycle.
Rename the main model-construction entry point to
mf_model(), and rename the fitted-model class and its S3
methods from bridge to mf_model.
bridge() remains as a deprecated compatibility wrapper that
warns and forwards to mf_model(), so existing code keeps
working.
summary() on an "mf_model" object now
returns a "summary.mf_model" object instead of printing and
returning the model unchanged, following the convention of
summary.lm(). The printed report is unchanged and is now
produced by the new print.summary.mf_model() method. The
returned object exposes the summary quantities programmatically,
including a standard coefficients matrix with
Estimate, Std. Error, t value and
Pr(>|t|) columns, so coef(summary(model))
works as it does for lm(). Standard errors respect the HAC,
Delta-HAC or bootstrap covariance when the model was fitted with
se = TRUE.
Objects returned by forecast() no longer inherit
from the forecast package’s "forecast" class;
they are now plain "mf_model_forecast" objects. The
previous inheritance was not honoured – plot() and
autoplot() failed on the result, and
accuracy() returned misleading values – because target
frequencies such as daily and weekly cannot be represented by
stats::ts(), which those methods require.
plot() and ggplot2::autoplot() methods are now
provided directly for "mf_model_forecast" and work at every
supported target frequency, and the new as.forecast()
converts to a genuine "forecast" object for use with
functions such as forecast::accuracy() whenever the target
frequency has an exact ts representation (annual,
semi-annual, quarterly, bi-monthly or monthly).
Remove the legendre parametric aggregation
option.
New accessor methods replace reaching into the fitted object’s
internal structure: weights() returns aggregation weights
(estimated parametric weights or user-supplied numeric weights),
aggregation_parameters() returns the estimated parameters
of parametric aggregation schemes, indicators() returns the
indicator names, variable.names() returns the
bridge-equation regressor names, and model.frame() returns
the estimation data or the forecast regressor path.
weights() and aggregation_parameters() accept
an indicator name or position. The vignettes now use these accessors
throughout.
variable.names() replaces
model$xreg_names and model$regressor_names.
variable.names(model, which = "xreg") returns the
non-target-lag regressors, which are exactly the series a custom
xreg must supply when forecasting a scenario, and so pairs
with model.frame(model, which = "forecast").
weights() now also returns the fixed weight vectors
implied by the deterministic aggregators, rather than NULL:
"mean" gives 1/M, "last" gives a
one in the final slot, and "sum" gives ones. The accessor
therefore reports the weights actually applied for every aggregator
except "unrestricted", which estimates one coefficient per
within-period observation and so implies no weight vector.
Extend mf_model() beyond classic bridge
aggregation:
indic_aggregators = "unrestricted""beta" weighting alongside
"expalmon"indic_predict = "direct"list()Improve mixed-frequency input handling:
second through
yearfrequency_conversionsAdd joint parametric aggregation optimization controls through
solver_options, including optimizer choice, multi-start
runs, seeds, iteration limits, and user-supplied starting
values.
Add uncertainty support:
se = TRUE for coefficient uncertainty and prediction
intervalsfull_system_bootstrap = TRUEAdd scenario forecasting support in
forecast.mf_model() through custom future xreg
paths and standardized forecast objects with uncertainty
metadata.
Add plotting methods and helpers:
plot.mf_model() for fit and forecast plotstheme_bridgr(), colors_bridgr(),
scale_color_bridgr(), and
scale_fill_bridgr()Expand printed output and documentation:
summary.mf_model() and
forecast.mf_model() outputThe full-system block bootstrap is substantially faster. Calendar
shifts were applied one step at a time and recomputed for every
observation, which made timezone normalisation inside
lubridate::%m+% the dominant cost of a bootstrap resample.
Shifts are now vectorised and computed once per distinct shift amount.
On a quarterly target with a monthly indicator, a 50-draw full-system
bootstrap runs about 3.6 times faster, with bit-identical coefficients
and forecasts.
Month, quarter and year shifts of Date vectors no
longer go through lubridate::%m+%, which routes through
as.POSIXlt() and force_tz(). Profiling showed
that timezone coercion alone accounted for roughly 44% of the remaining
self time in a full-system bootstrap. These shifts now use direct
integer calendar arithmetic, preserving the end-of-month rollback
semantics of %m+% exactly; POSIXct inputs,
missing values and fractional shifts still use %m+%. The
isolated shift is about 10 times faster and a 50-draw full-system
bootstrap about 1.3 times faster, with bit-identical coefficients,
covariances, forecasts and intervals.
Use analytic gradients for expalmon optimization and
improve the normalized beta polynomial gradient used in the
optimizer.
Fix mf_model() failing when the ‘xts’ package is not
installed. Indicator forecasting with
indic_predict = "auto.arima" (the default) or
"ets" routed the series through
tsbox::ts_xts(), which requires ‘xts’, so the default code
path errored for users without it even though ‘xts’ was only a suggested
dependency. The fitters are now given the indicator observations
directly. Results are unchanged: the ‘xts’ index carried no
tsp attribute, so both fitters already saw a frequency-1
series at every supported indicator frequency. ‘xts’ is no longer a
dependency of any kind.
Fix ragged-edge completion for sub-monthly indicators at
multi-step horizons (h > 1). Completion previously
filled future target periods with a fixed count of high-frequency grid
steps, but calendar periods can hold more observations than the regular
ladder implies (a quarter has 13 weekly or up to 92 daily observations
versus the 12 or 84 the ladder expects), so early future periods
absorbed the surplus and later ones failed block validation. Completion
is now period-aware: candidate grid times are assigned to their calendar
periods and each future period receives exactly the observations it
still needs.
Ignore indicator observations dated beyond the last forecast
period during alignment. Such observations cannot enter any regressor
and previously made block validation fail on a partially observed
beyond-horizon period, for example when a weekly series extends past the
target quarter of an h = 1 nowcast.
Make direct alignment (indic_predict = "direct")
period-aware. Blocks of high-frequency observations were strided
backward from the end of the sample and paired with target periods by
position, so on calendar ladders (13-Saturday quarters on a 12-slot
weekly ladder) historical blocks drifted out of their calendar periods –
about one week per quarter, compounding over the sample – and the stride
count could overrun the number of target periods and fail outright. Each
target period that overlaps the observed sample is now anchored at the
newest observation’s position within its own period (a MIDAS-with-leads
alignment), which reproduces fixed strides exactly on regular ladders;
periods beyond the observed sample keep the documented lead
convention.
Added gdp,baro, wea and
fcurve datasets.
Added bridge(), forecast() and
summary() functions.
Supports target variables on monthly, quarterly and yearly frequency, and indicator variables on daily, weekly, monthly, quarterly and yearly frequency.
Supports auto.arima, ets and other
methods for indicator variable forecasting.
Supports aggregation of indicator variables to match the target’s frequency using custom weighting functions, exponential Almon polynomials and other methods.