context("Test EKF")
test_that("Particle filtering based on EKF works", {
skip_on_cran()
set.seed(1)
n <- 10
x <- y <- numeric(n)
y[1] <- rnorm(1, exp(x[1]), 0.1)
for(i in 1:(n-1)) {
x[i+1] <- rnorm(1, sin(x[i]), 0.1)
y[i+1] <- rnorm(1, exp(x[i+1]), 0.1)
}
pntrs <- cpp_example_model("nlg_sin_exp")
expect_error(model_nlg <- ssm_nlg(y = y, a1 = pntrs$a1, P1 = pntrs$P1,
Z = pntrs$Z_fn, H = pntrs$H_fn, T = pntrs$T_fn, R = pntrs$R_fn,
Z_gn = pntrs$Z_gn, T_gn = pntrs$T_gn,
theta = c(log_H = log(0.1), log_R = log(0.1)),
log_prior_pdf = pntrs$log_prior_pdf,
n_states = 1, n_etas = 1, state_names = "state"), NA)
expect_error(out <- ekpf_filter(model_nlg, 100), NA)
expect_lt(out$logLik, 6)
expect_gt(out$logLik, 1)
expect_gte(min(out$w), 0-1e16)
expect_lte(max(out$w), 1+1e16)
expect_warning(ekpf_filter(model_nlg, nsim = 10))
out_ekf <- particle_smoother(model_nlg, 1000, method = "ekf")
out_psi <- particle_smoother(model_nlg, 1000, method = "psi")
out_bsf <- particle_smoother(model_nlg, 1000, method = "bsf")
expect_equal(out_ekf$alphahat[9:10],
c(0.0263875638744833, 0.0734903567971838), tol = 0.1)
expect_equal(out_psi$alphahat[9:10],
c(0.0263875638744833, 0.0734903567971838), tol = 0.1)
expect_equal(out_bsf$alphahat[9:10],
c(0.0263875638744833, 0.0734903567971838), tol = 0.1)
})
test_that("EKF and IEKF work", {
skip_on_cran()
set.seed(1)
n <- 10
x <- y <- numeric(n)
y[1] <- rnorm(1, exp(x[1]), 0.1)
for(i in 1:(n-1)) {
x[i+1] <- rnorm(1, sin(x[i]), 0.1)
y[i+1] <- rnorm(1, exp(x[i+1]), 0.1)
}
y[2:3] <- NA
pntrs <- cpp_example_model("nlg_sin_exp")
expect_error(model_nlg <- ssm_nlg(y = y, a1 = pntrs$a1, P1 = pntrs$P1,
Z = pntrs$Z_fn, H = pntrs$H_fn, T = pntrs$T_fn, R = pntrs$R_fn,
Z_gn = pntrs$Z_gn, T_gn = pntrs$T_gn,
theta = c(log_H = log(0.1), log_R = log(0.1)),
log_prior_pdf = pntrs$log_prior_pdf,
n_states = 1, n_etas = 1, state_names = "state"), NA)
expect_equal(ekf(model_nlg)$logLik, 2.65163101109689)
expect_equal(ekf(model_nlg, iekf_iter = 2)$logLik,
logLik(model_nlg, method = "ekf", iekf_iter = 2, particles = 0))
expect_equal(ekf(model_nlg, iekf_iter = 1)$logLik, 2.61650080342709)
expect_equal(ekf(model_nlg, iekf_iter = 1),
ekf(model_nlg, iekf_iter = 2))
out_ekf1 <- ekf_smoother(model_nlg)
out_ekf2 <- ekf_fast_smoother(model_nlg)
expect_equal(out_ekf1$alphahat[9:10],
c(0.0333634309012196, 0.0797729159367873), tol = 0.1)
expect_equal(out_ekf1$alphahat, out_ekf2)
expect_equal(
ekf_fast_smoother(model_nlg, iekf_iter = 2),
ekf_smoother(model_nlg, iekf_iter = 2)$alphahat)
expect_error(ukf(model_nlg), NA)
expect_error(ukf(model_nlg, alpha = -1))
expect_error(ukf(model_nlg, beta = -1))
expect_error(ukf(model_nlg, kappa = -1))
expect_error(bootstrap_filter(model_nlg, 10), NA)
})
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.