This package implements some common routines for state-space models.
The provided algorithms are:
- Kalman filter (
kalman_filter
) - Tempered particle filter (
tempered_particle_filter
): "Tempered Particle Filtering" (2016) - Kalman smoothers:
hamilton_smoother
: James Hamilton, Time Series Analysis (1994)koopman_smoother
: S.J. Koopman, "Disturbance Smoother for State Space Models" (Biometrika, 1993)
- Simulation smoothers:
carter_kohn_smoother
: C.K. Carter and R. Kohn, "On Gibbs Sampling for State Space Models" (Biometrika, 1994)durbin_koopman_smoother
: J. Durbin and S.J. Koopman, "A Simple and Efficient Simulation Smoother for State Space Time Series Analysis" (Biometrika, 2002)
The tempered particle filter is a particle filtering method which can approximate the log-likelihood value implied by a general (potentially non-linear) state space system with the following representation:
s_{t+1} = Φ(s_t, ϵ_t) (transition equation)
y_t = Ψ(s_t) + u_t (measurement equation)
ϵ_t ∼ F_ϵ(∙; θ)
u_t ∼ N(0, E)
Cov(ϵ_t, u_t) = 0
- The documentation and code are located in src/filters/tempered_particle_filter.
- The example is located in docs/examples/tempered_particle_filter
s_{t+1} = C + T*s_t + R*ϵ_t (transition equation)
y_t = D + Z*s_t + u_t (measurement equation)
ϵ_t ∼ N(0, Q)
u_t ∼ N(0, E)
Cov(ϵ_t, u_t) = 0
kalman_filter(y, T, R, C, Q, Z, D, E, s_0 = Vector(), P_0 = Matrix(); outputs = [:loglh, :pred, :filt], Nt0 = 0)
tempered_particle_filter(y, Φ, Ψ, F_ϵ, F_u, s_init; verbose = :high, include_presample = true, fixed_sched = [], r_star = 2, c = 0.3, accept_rate = 0.4, target = 0.4, xtol = 0, resampling_method = :systematic, N_MH = 1, n_particles = 1000, Nt0 = 0, adaptive = true, allout = true, parallel = false)
hamilton_smoother(y, T, R, C, Q, Z, D, E, s_0, P_0; Nt0 = 0)
koopman_smoother(y, T, R, C, Q, Z, D, s_0, P_0, s_pred, P_pred; Nt0 = 0)
carter_kohn_smoother(y, T, R, C, Q, Z, D, E, s_0, P_0; Nt0 = 0, draw_states = true)
durbin_koopman_smoother(y, T, R, C, Q, Z, D, E, s_0, P_0; Nt0 = 0, draw_states = true)
For more information, see the docstring for each function (e.g. enter ?kalman_filter
in the REPL).
All of the provided algorithms can handle time-varying state-space systems. To do this, define regime_indices
, a Vector{Range{Int64}}
of length n_regimes
, where regime_indices[i]
indicates the range of periods t
in regime i
. Let T_i
, R_i
, etc. denote the state-space matrices in regime i
. Then the state space is given by:
s_{t+1} = C_i + T_i*s_t + R_i*ϵ_t (transition equation)
y_t = D_i + Z_i*s_t + u_t (measurement equation)
ϵ_t ∼ N(0, Q_i)
u_t ∼ N(0, E_i)
Letting Ts = [T_1, ..., T_{n_regimes}]
, etc., we can then call the time-varying methods of the algorithms:
kalman_filter(regime_indices, y, Ts, Rs, Cs, Qs, Zs, Ds, Es, s_0 = Vector(), P_0 = Matrix(); outputs = [:loglh, :pred, :filt], Nt0 = 0)
hamilton_smoother(regime_indices, y, Ts, Rs, Cs, Qs, Zs, Ds, Es, s_0, P_0; Nt0 = 0)
koopman_smoother(regime_indices, y, Ts, Rs, Cs, Qs, Zs, Ds, s_0, P_0, s_pred, P_pred; Nt0 = 0)
carter_kohn_smoother(regime_indices, y, Ts, Rs, Cs, Qs, Zs, Ds, Es, s_0, P_0; Nt0 = 0, draw_states = true)
durbin_koopman_smoother(regime_indices, y, Ts, Rs, Cs, Qs, Zs, Ds, Es, s_0, P_0; Nt0 = 0, draw_states = true)