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
.