Diffuse initialization

We describe below the diffuse initialization of Durbin-Koopman and a variant that we call “partial square root initialization”

DK initialization

When $y_t$ is observed, we compute the following recursions

if $F_{\infty t}=0$

if $F_{\infty t}$ is invertible

where $\lt A \gt$ stands for $A+A’$

Partial square root form

The partial square root form is trivially derived from the Durbin-Koopman equations, taking into account that $P_{\infty t}=B_t B_t’$.

When $y_t$ is observed, we compute the following recursions

if $Z_t B_t=0$

if $Z_t B_t \neq 0$

$B_{t+1}$ is computed as follows:

  • Choose an orthogonal transformation that transforms $Z_t B_t$ in $\begin{pmatrix}L_t &0&\cdots&0 \end{pmatrix}$; by default, JD+ takes Householder reflection(s)
  • Apply that transformation on $T_t B_t$
  • The first column(s) of the transformed $T_t B_t$ corresponds to $C_{\infty t} F_{\infty t}^{-1/2}$ and the remaining to $B_{t+1}$

That can be shown using the same arguments as in an array algorithm, applied on the transformations:

Contrary to the usual array algorithm, we don’t compute a complete triangularization: processing the first rows, which correspond to the measurement equations, is indeed sufficient. So, in the case of a univariate series, we just have to use a single householder reflection to compute the next $B_{t+1}$. To be noted that that formulation shows in an obvious way that the rank of $B_t$ will decrease by $rank(F_{\infty t})$ at each step. That implies that, after every iteration, the matrix $B_t$ becomes smaller and the computations less expensive.

Implementation

The Diffuse initialization is implemented in several classes

  • The “Durbin Koopman” initialization of the filter is provided by the class demetra.ssf.dk.DurbinKoopmanInitializer
  • The corresponding “Durbin Koopman” smoother is provided by the class demetra.ssf.dk.DiffuseSmoother
  • The “Partial square root” initialization of the filter is provided by the class demetra.ssf.dk.sqrt.DiffuseSquareRootInitializer
  • The corresponding diffuse square root smoother is provided by the class demetra.ssf.dk.sqrt.DiffuseSquareRootSmoother.