Correlation-adjusted Bayesian regularization

method=‘correlation adjusted’: joint Gaussian conditioning

Scope and names

The reference calls this method correlation adjusted, implemented by CorrelatedBayesianRegularizedPredictionSignal in Exabel’s Bayesian signal. Select method="correlation adjusted" in BayesianPredictionSettings.

This is a different statistical model from the independent update, not a correction applied to its three precision weights. The consensus bias option remains available and is applied before fitting either model.

Coordinates and aligned sample

Levels use the same previous-actual growth coordinates:

\[ g_t=\frac{y_t}{b_t}-1,\qquad x_{C,t}=\frac{c_t^*}{b_t}-1,\qquad x_{A,t}=\frac{a_t}{b_t}-1. \]

The joint sample contains only periods where all three growth observations are present. Missing values are removed jointly, so covariance entries use the same sample.

For \(z_i=(g_i,x_{C,i},x_{A,i})^\top\):

\[ \mu=\frac1n\sum_i z_i, \qquad \Sigma=\frac1{n-1}\sum_i(z_i-\mu)(z_i-\mu)^\top. \]

The sample requires at least \(\max(2,\texttt{minimum_observations})\) complete observations.

Conditional expectation

Partition the joint mean and covariance into actual growth \(A\) and the two observed signals \(S=(C,M)\):

\[ \mu=\begin{pmatrix}\mu_A\\\mu_S\end{pmatrix},\qquad \Sigma=\begin{pmatrix} \Sigma_{AA}&\Sigma_{AS}\\ \Sigma_{SA}&\Sigma_{SS} \end{pmatrix}. \]

The published growth estimate is

\[ \widehat\theta =\mu_A+\Sigma_{AS}(\Sigma_{SS}+\varepsilon I)^{-1} \left(\begin{pmatrix}x_C\\x_A\end{pmatrix}-\mu_S\right), \qquad \varepsilon=10^{-12}. \]

The implementation solves the linear system; it does not form an explicit matrix inverse. The prediction level is \(b_t(1+\widehat\theta)\).

  • Numerical ridge: \(\varepsilon I\) keeps the signal matrix invertible in ordinary singular cases. It is not estimated covariance shrinkage.
  • Weights: Conditional coefficients can be negative and need not sum to one. There is an intercept from the joint means.
  • Refusal: An insufficient sample or failed linear solve produces no prediction. There is no switch to the independent estimator.
  • Diagnostics: The reference exposes only prediction for this method. Independent precision weights and intervals are not meaningful substitutes.

Worked example

Take all three historical means equal to 8 and covariance

\[ \Sigma=16\begin{pmatrix} 1&0.9&0.7\\ 0.9&1&0.8\\ 0.7&0.8&1 \end{pmatrix}. \]

Ignoring the tiny numerical ridge, the conditional coefficients are

\[ \Sigma_{AS}\Sigma_{SS}^{-1} =\begin{pmatrix}17/18&-1/18\end{pmatrix}. \]

For consensus 9 and model 13, in these growth coordinates:

\[ \widehat\theta =8+\frac{17}{18}(9-8)-\frac1{18}(13-8) =8\frac23. \]

The model’s coefficient is negative because its extra movement is redundant with consensus in this covariance structure. Independent precision weighting cannot express that effect.

Historical and forward fitting

  • Backtests: At each timestamp in the complete joint sample, fit only sample rows strictly earlier than that timestamp. The current actual never enters its own moments.
  • Predictions: Fit joint means and covariance once on the complete realized training history. Apply that fit to aligned consensus and live model growth.
  • Combined: Keep historical predictions strictly before the first available forward prediction, then append the forward series.
  • Training start: start_date cuts off levels before growth conversion and joint-sample construction.
  • Bias correction: Shifted Kalman consensus bias correction precedes growth and covariance estimation. Its equations and defaults are in the independent reference.

Configuration restrictions

  • Model: Required; include_model=False is rejected.
  • Values: Only ("prediction",) is supported, matching the reference.
  • Dispersion/count: Not supported for this method.
  • Publication-relative horizons: Not supported for this method.
  • Explicit as-of: The panel is still anchored before the requested UTC reading moment, and historical estimates are read before first publication.

Assumptions and limits

  • Joint Gaussian model: The formula is the conditional mean of a jointly Gaussian vector. Outside that model it is a linear projection.
  • Small samples: Joint covariance estimates can be unstable even when the matrix solve succeeds.
  • Collinearity: The numerical ridge does not eliminate unstable coefficients caused by nearly redundant signals.
  • Exchangeability: Historical model backtests must represent the process that produces live model predictions.
  • Intervals: No correlation-adjusted interval is implemented by the reference; the package does not invent one.

Executable example

Show the code
import pandas as pd
import pf
import postforecast as pfc

settings = pfc.BayesianPredictionSettings(
    version="correlation-example",
    method="correlation adjusted",
    series="predictions",
)
pfc.bayesian_kpi_predictions(
    pf.quarterly_history(),
    pd.Timestamp("2026-05-10", tz="UTC"),
    forecast_source="model",
    settings=settings,
)[["entity", "period", "prediction", "eligible", "eligibility_reason"]]
entity period prediction eligible eligibility_reason
0 ZS 2026-06 812.084193 True eligible