time_series_regression
Use this library to forecast a single time series from its previous
values. It fits autoregressive (AR) models by least squares, with an
optional intercept and differencing (ARI models). You can also request
automatic order selection using information criteria and analytic
prediction intervals. The library object implements
forecaster_protocol and reuses dataset validation, diagnostics,
export, lag construction, and differencing support from the
time_series_protocols library. Least-squares problems are solved
using the linear_algebra library, and prediction interval quantiles
are computed using the univariate_distributions library.
Datasets are objects implementing time_series_dataset_protocol.
Every observation must be a number or a missing observation (represented
as an unbound variable; see the “Missing observations” section below).
API documentation
Open the ../../apis/library_index.html#time-series-regression link in a web browser.
Loading
To load this library, load its loader.lgt file:
| ?- logtalk_load(time_series_regression(loader)).
Testing
To test this library, load its tester.lgt file:
| ?- logtalk_load(time_series_regression(tester)).
The test suite compares fitted coefficients, error sums, information criteria, forecasts, and prediction interval bounds for a noisy AR(2) dataset with values computed independently using NumPy least squares (and, for prediction intervals, SciPy’s normal quantile function), and covers learning, forecasting, and updating with missing observations, including automatic order selection over a series with scattered missing observations.
Model
An AR(p) model with differencing order d and an intercept predicts the
d-times differenced series y as:
y(t) = c + phi(1) * y(t-1) + ... + phi(p) * y(t-p) + e(t)
The intercept c and the coefficients phi(i) are estimated by
conditional least squares: the model is fitted to the n - d - p
observations of the differenced series that have p preceding values.
Least squares is solved using a pivoted orthogonal (QR) method that does
not form the normal equations. Forecasts are computed recursively and,
when differencing is used, integrated back to the scale of the original
series.
To fit an order-two model and request twelve forecasts:
| ?- time_series_regression::learn(my_series, Forecaster, [order(2)]),
time_series_regression::forecast(Forecaster, 12, Forecasts).
Options
The learn/3 predicate supports the following options:
order(Order)sets the autoregressive order to a positive integer orauto. The default is1.max_order(MaxOrder)limits the orders considered with theorder(auto)option. The default is10; it is valid only withorder(auto).selection_criterion(Criterion)selects the criterion used withorder(auto):aic,aicc, orbic. The default isaicc; it is valid only withorder(auto).intercept(Boolean)controls whether to estimate an intercept. The default istrue.differencing(Differencing)sets the number of times the series is differenced before fitting, a non-negative integer. The default is0.retain_residuals(Boolean)controls whether to keep the one-step training residuals in the learned forecaster diagnostics. The default isfalse.
Passing a max_order/1 or selection_criterion/1 option together
with an explicit integer order raises a
domain_error(time_series_regression_option, Option) error.
The minimum series length is Differencing + 2 * Order + Intercept,
where Intercept is 1 or 0, and
Differencing + Intercept + 4 for the order(auto) option. A
shorter series causes the learn/3 predicate to raise a
domain_error(series_length, Dataset) error.
Automatic order selection
With the order(auto) option, the library compares orders from 1
up to the limit supplied by the max_order/1 option. This limit is
capped so that every candidate has more observations than parameters,
plus one. Candidates are compared using the selected information
criterion:
aic:n * ln(SSE/n) + 2kaicc:aic + 2k(k+1)/(n-k-1)bic:n * ln(SSE/n) + k * ln(n)
where k is the number of estimated regression coefficients and n
and SSE are the sample size and sum of squared errors. To make the
criteria comparable, all candidate orders are fitted to the same sample,
which is the one available to the largest candidate order. The selected
order is then refitted using all the observations available to it. Ties
are broken in favor of the smaller order. The candidate scores are
recorded in the order_selection(Criterion, Candidates) diagnostic,
where Candidates is a list of Order-Score pairs.
Rank-deficient designs
When the design matrix is rank deficient (for example, when fitting an
intercept to a constant or differenced linear-trend series), the
least-squares solution is not unique. The solver returns a basic
solution with the dependent columns dropped. Forecasts are still valid
least-squares forecasts, but the individual coefficient values should
not be interpreted. The design_rank/1 diagnostic reports the
numerical rank of the design matrix.
Missing observations
A missing observation is represented, following common practice, as an
unbound variable: observation(Index, _) in a dataset object, or an
unbound Observation argument to the update/3 predicate. A series
may freely mix numbers and missing observations; only its length and
index sequence need to be well-formed (checked by the shared
dataset_series/2 and check_series_length/3 predicates).
Differencing propagates missingness: a difference with a missing operand
is itself missing. Fitting uses casewise deletion: a design matrix row
(built from Order lagged values and a target, after differencing)
that involves any missing value is excluded from the least-squares fit.
This is applied identically to an explicit order and to every candidate
order considered by automatic order selection (candidates are still
compared on a common sample, now the sample complete at the largest
candidate order). The number of raw missing observations in the training
series is reported in the missing_count/1 diagnostic;
scored_count/1 already reflects the number of complete rows actually
used for fitting. If casewise deletion leaves no complete row at all,
the learn/3 predicate raises a
domain_error(insufficient_observations, Dataset) error.
Learning can succeed even if some recent past observations are missing,
provided enough complete rows remain. Those missing values are retained
in the lag window or in the levels used to undo differencing. If any
past value required to calculate a forecast is missing, the
forecast/3 predicate raises
domain_error(missing_observation, Forecaster) for a positive
horizon. Missing required past values also prevent positive-horizon
prediction intervals. A zero horizon still returns empty forecast or
bound lists.
The update/3 predicate appends a new observation; it does not fill
in a missing historical observation. Forecasting becomes possible once
enough numeric observations have been appended that every value in the
current window and levels is known. Without differencing, a missing
window entry is pushed out after at most Order numeric updates.
Differencing can propagate a gap and require additional numeric updates.
Immutable online updates
The update/3 predicate returns a new forecaster after appending one
observation to the series while keeping the fitted intercept and
coefficients unchanged. The original forecaster is not modified. The new
Observation may be left an unbound variable to represent a missing
observation (see “Missing observations” above).
When the new observation, its required differences, and the past values
in the forecaster’s prior window are all numeric, the one-step
prediction error updates the sum_squared_error/1,
mean_squared_error/1, and scored_count/1 diagnostic values (and
is appended to the retained residuals, if enabled), and the information
criteria diagnostics keep describing the original fit. Otherwise, no
prediction error is available and only training_series_length/1,
update_count/1, and, when Observation is a variable,
missing_count/1 are updated. In both cases
training_series_length/1 and update_count/1 are incremented, and
the observation, known or not, is pushed into the window (and used to
update the levels).
Forecaster representation
A learned forecaster uses the following term representation:
time_series_regression_forecaster(Model, State, Parameters, Diagnostics)
The Model argument is an ar(Order, Differencing) term, State
is an ar_state(Window, Levels) term, and Parameters is an
ar_parameters(Intercept, Coefficients) term. The window holds the
last Order values of the differenced series, most recent first. The
levels list holds the last value of the series at each differencing
level, starting with the original series. The intercept is 0.0 when
the intercept(false) option is used.
The Diagnostics argument is a list of diagnostic terms. It includes
model/1, training_series_length/1, and options/1 terms
common to all forecasters plus order/1, differencing/1,
intercept/1, missing_count/1, parameter_count/1,
scored_count/1, design_rank/1, sum_squared_error/1,
mean_squared_error/1, aic/1, aicc/1 (with value none
when undefined), bic/1, update_count/1, and residuals/1
(with value none unless retained) terms, and order_selection/2
when the order(auto) option is used.
Prediction intervals
The forecast_interval/5 predicate computes analytic prediction
interval bounds for the next Horizon forecasts:
time_series_regression::forecast_interval(Forecaster, Horizon, Lower, Upper, Options)
The bounds assume independent, identically distributed, zero-mean
Gaussian innovations and treat the fitted intercept and coefficients as
known. The h-step forecast error variance is the residual variance
times the sum of the squared psi(0)..psi(h-1) weights of the model
(the AR polynomial combined with the differencing polynomial, when the
differencing/1 option is positive), and the bounds are the point
forecast plus or minus the standard normal quantile for the requested
confidence times the forecast error standard deviation. The residual
variance is the value of the sum_squared_error/1 diagnostic divided
by the residual degrees of freedom: the scored_count/1 diagnostic
value minus the design_rank/1 diagnostic value. A zero Horizon
returns two empty lists.
The Options argument accepts interval options, validated
independently from the learning options of the learn/3 predicate.
The interval options are:
confidence(Level)sets central interval coverage, a number in the open interval]0.0, 1.0[(default:0.95).method(normal)selects the only supported interval method (default, and currently the only accepted value).
When the residual degrees of freedom are not positive (an exactly
determined fit, where the scored_count/1 and design_rank/1
diagnostic values are equal), calling the forecast_interval/5
predicate with a positive Horizon raises a
domain_error(residual_degrees_of_freedom, Forecaster) error, since
the residual variance is then undefined.
The standard normal quantile is computed by the
univariate_distributions library.
Limitations
The library fits linear autoregressive models with optional differencing and an intercept. Moving-average error terms, dedicated seasonal models, multivariate series, and exogenous regressors are not provided.
Missing observations are handled by casewise deletion at fitting time, which discards an entire design matrix row rather than imputing a value or modeling the series with a method robust to missing data (such as a state-space or Kalman filter formulation). Without differencing, one gap can invalidate up to
Order + 1consecutive rows; differencing can spread it further. This reduces the effective sample size and, under automatic order selection, can favor a lower order than the same series would with no missing observations.Prediction intervals are the analytic normal-theory approximation described above. They do not account for uncertainty in the estimated intercept and coefficients (only in future innovations), which can understate interval width, particularly for short training series or high orders; no bootstrap or simulation-based alternative is provided. They are also unavailable whenever the forecaster’s window or levels are not fully known (see “Missing observations” above).
Positive-horizon intervals also require a positive residual degrees of freedom: the
scored_count/1diagnostic value must exceed thedesign_rank/1diagnostic value. Learning an exactly determined model can succeed even though theforecast_interval/5predicate cannot provide positive-horizon bounds for it.The
update/3predicate keeps the fitted intercept, coefficients, and selected order fixed. It advances the forecasting state and error totals but does not refit the regression or repeat order selection. The recorded information criteria remain those from the original fit; learn a new model when parameter or order estimates need to change.
References
Hyndman, R.J. and Athanasopoulos, G. (2021). Forecasting: Principles and Practice. 3rd edition. OTexts. Chapter 9: autoregressive models, differencing, estimation, and order selection. https://otexts.com/fpp3/arima.html