Nothing
#------------------------------------------------------------------------------
# Author: Michael D. Hunter
# Date: 2020-02-25
# Filename: errorCheckDyn.R
# Purpose: Check that errors are caught and reported properly.
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
require(dynr)
vd <- matrix(c(0, -0.1, 1, -0.2), 2, 2)
pd <- matrix(c('fixed', 'spring', 'fixed', 'friction'), 2, 2)
pd4 <- matrix(c('fixed', 'spring', 'fixed', 'friction'), 4, 4)
#------------------------------------------------------------------------------
# Check covariate conformability errors
# Specifically, the number of covariates suggested by the values.exo matrix/matrices
# is different from that implied by the covariates argument.
# No Error
dynamics <- prep.matrixDynamics(
values.dyn=vd,
params.dyn=pd,
isContinuousTime=TRUE)
# Error
testthat::expect_error(
prep.matrixDynamics(
values.dyn=vd,
params.dyn=pd, isContinuousTime=TRUE,
values.exo=matrix(1, 2, 1)),
regexp="Mind your teaspoons and tablespoons. The 'exo.values' argument says there are\n (1) covariates, but the 'covariates' arg says there are (0).",
fixed=TRUE)
# No Error
dynamicsU <- prep.matrixDynamics(
values.dyn=vd,
params.dyn=pd, isContinuousTime=TRUE,
values.exo=matrix(1, 2, 1),
covariates='u1')
# Error
testthat::expect_error(
prep.matrixDynamics(
values.dyn=vd,
params.dyn=pd, isContinuousTime=TRUE,
values.exo=matrix(1, 2, 1),
covariates=c('u1', 'u2')),
regexp="Mind your teaspoons and tablespoons. The 'exo.values' argument says there are\n (1) covariates, but the 'covariates' arg says there are (2).",
fixed=TRUE)
# Walter Error
testthat::expect_error(
prep.matrixDynamics(
values.dyn=vd,
params.dyn=pd4, isContinuousTime=TRUE),
regexp="'values' and 'params' are not all the same size.\nWalter Sobchak says you can't do that.",
fixed=TRUE)
# Donny Error
testthat::expect_error(
prep.matrixDynamics(
values.dyn=vd,
params.dyn=pd, isContinuousTime=TRUE,
values.exo=list(matrix(1, 2, 1), matrix(1, 2, 2)),
covariates='u1'),
regexp="Some of the 'values' list elements are not the same size as each other\nNot cool, Donny.",
fixed=TRUE)
# Error
# covariates and exo.values imply different number of covariates
testthat::expect_error(
prep.matrixDynamics(
values.dyn=vd,
params.dyn=pd, isContinuousTime=TRUE,
values.exo=list(matrix(1, 2, 2), matrix(1, 2, 2)),
params.exo=list(matrix(0, 2, 2), matrix(0, 2, 2)),
covariates='u1'),
regexp="Mind your teaspoons and tablespoons. The 'exo.values' argument says there are\n (2) covariates, but the 'covariates' arg says there are (1).",
fixed=TRUE)
testthat::expect_error(
prep.matrixDynamics(
values.dyn=vd,
params.dyn=pd, isContinuousTime=TRUE,
covariates='u1'),
regexp="Mind your teaspoons and tablespoons. The 'exo.values' argument says there are\n (0) covariates, but the 'covariates' arg says there are (1).",
fixed=TRUE)
testthat::expect_error(
prep.matrixDynamics(
values.dyn=vd,
params.dyn=pd, isContinuousTime=TRUE,
values.exo=list(matrix(1, 2, 2), matrix(1, 2, 2)),
params.exo=list(matrix(0, 2, 2), matrix(0, 2, 2))),
regexp="Mind your teaspoons and tablespoons. The 'exo.values' argument says there are\n (2) covariates, but the 'covariates' arg says there are (0).",
fixed=TRUE)
#------------------------------------------------------------------------------
# Check for friendly error when user hands wrong stuff to prep.formulaDynamics()
testthat::expect_error(
prep.formulaDynamics(eta ~ phi*eta),
regexp="'formula' argument is a formula but 'formula' should be a list of formulas.\nCan't nobody tell me nothin'",
fixed=TRUE
)
testthat::expect_error(
prep.formulaDynamics(matrix(1, 2, 2)),
regexp="'formula' argument should be a list of formulas.\nCan't nobody tell me nothin'",
fixed=TRUE
)
# Check that NAMES are unique
testthat::expect_error(
prep.formulaDynamics(list(x ~ a, x ~ b), startval=c(a=1, b=1)),
regexp='Found duplicated latent state names:\nRegime 1: x, x',
fixed=TRUE
)
# Check that multiple regime formulas have lef-hand sides all in the same order
testthat::expect_error(
prep.formulaDynamics(list(list(x2 ~ b, x1 ~ a), list(x1 ~ a, x2 ~ b)), startval=c(a=1, b=1)),
regexp="Found different latent states or different ordering of latent states across regimes:\nRegime 1: x2, x1\nRegime 2: x1, x2",
fixed=TRUE)
testthat::expect_error(
prep.formulaDynamics(list(list(x1 ~ a, x3 ~ b), list(x1 ~ a, x2 ~ b)), startval=c(a=1, b=1)),
regexp="Found different latent states or different ordering of latent states across regimes:\nRegime 1: x1, x3\nRegime 2: x1, x2",
fixed=TRUE)
# Check that multiple regime formulas have left-hand sides all the same size
testthat::expect_error(
prep.formulaDynamics(list(list(x1 ~ a), list(x1 ~ a, x2 ~ b)), startval=c(a=1, b=1)),
regexp="Found different number of latent states for different regimes:\nRegime 1: x1\nRegime 2: x1, x2",
fixed=TRUE)
# Check that free parameters and latent states don't have the same names
# single parameter case
testthat::expect_error(
prep.formulaDynamics(list(Dummy ~ r_0*Dummy - r_0*Dummy^2, r_0 ~ 0), startval=c(r_0=0.1)),
regexp="See no evil, but latent states had the same names as free parameters.\nParameters that are both latent states and free parameters: r_0",
fixed=TRUE)
# multi-parameter case
testthat::expect_error(
prep.formulaDynamics(list(Dummy ~ r_0*Dummy - r_0*Dummy^2, r_0 ~ 0), startval=c(r_0=0.1, Dummy=-1)),
regexp="See no evil, but latent states had the same names as free parameters.\nParameters that are both latent states and free parameters: r_0, Dummy",
fixed=TRUE)
# multi-parameter and multiple regime case
testthat::expect_error(
prep.formulaDynamics(list(list(Dummy ~ r_0*Dummy - r_0*Dummy^2, r_0 ~ 0), list(Dummy ~ c_0, r_0 ~ r_0^2)), startval=c(r_0=0.1, Dummy=-1, c_0=-.5)),
regexp="See no evil, but latent states had the same names as free parameters.\nParameters that are both latent states and free parameters: r_0, Dummy",
fixed=TRUE)
#------------------------------------------------------------------------------
# Check conformability of dynamics argument and measurement argument
# Check prep.formulaDynamics formulas have ne left-hand sides (ne: number of latent variables)
data <- dynr.data(data.frame(id=1,time=1:10,obsy=1:10),
id="id", time="time", observed="obsy")
measurement <- prep.measurement(
values.load=matrix(1,1,1),
params.load=matrix("fixed", 1, 1),
state.names=c("x"),
obs.names=c("obsy"))
noise <- prep.noise(
values.latent=diag(c(0.1),1), params.latent=diag('noisevar',1),
values.observed=diag(0.1, 1), params.observed=diag('errorvar', 1))
initial <- prep.initial(
values.inistate=c(-2),
params.inistate=c('fixed'),
values.inicov=diag(0, 1),
params.inicov=diag('fixed', 1))
# No Error
dynamics <- prep.formulaDynamics(list(x ~ a), startval=c(a=-.1), isContinuousTime=TRUE)
mod <- dynr.model(dynamics, measurement, noise, initial, data)
# Check that NUMBER of formulas match
dynamics <- prep.formulaDynamics(list(x ~ a, z ~ b), startval=c(a=1, b=1))
testthat::expect_error(
mod <- dynr.model(dynamics, measurement, noise, initial, data),
regexp="Found (2) latent states in dynamics formula, but expected (1) latent states from measurement model.",
fixed=TRUE)
# Check that NAMES of formulas match
# All names are there that should be, none that aren't
dynamics <- prep.formulaDynamics(list(p ~ a, x ~ 1, z ~ a), startval=c(a=-.1), isContinuousTime=TRUE)
measLoad <- prep.loadings(list(q='y1', x='y2', w='y3'))
testthat::expect_error(
dynr.model(dynamics, measLoad, noise, initial, data),
regexp="Latent state names in dynamics (p, x, z) do not match those of measurement(q, x, w).",
fixed=TRUE)
# Check that ORDER of formulas match
# All the formulas are in the right order
dynamics <- prep.formulaDynamics(list(w ~ a, x ~ 1, q ~ a), startval=c(a=-.1), isContinuousTime=TRUE)
testthat::expect_error(
dynr.model(dynamics, measLoad, noise, initial, data),
regexp="The 'state.names' slot of the 'dynrMeasurement' object should match the order \nof the dynamic formulas specified. \nSame order should hold even if you have multiple regimes.",
fixed=TRUE)
# Check that prep.formulaDynamics formulas use all and only nne in left-hand sides (nne: names of latent variables)
formula1D <- list( y~beta*(mu-y) )
dynamics <- prep.formulaDynamics(formula=formula1D, startval=c(beta=0.2),
isContinuousTime=TRUE)
testthat::expect_error(
dynrmodel <- dynr.model(dynamics, measurement, noise, initial, data),
regexp="Latent state names in dynamics (y) do not match those of measurement(x).",
fixed=TRUE)
# Check that prep.matrixDynamics is ne by ne
dynamics <- prep.matrixDynamics(
values.dyn=list(vd),
params.dyn=list(pd),
isContinuousTime=TRUE)
testthat::expect_error(
dynrmodel <- dynr.model(dynamics, measurement, noise, initial, data),
regexp="The matrix dimensions in prep.matrixDynamics should match the number of latent states in 'dynrMeasurement'.",
fixed=TRUE)
# Check for the correct class of dynamic argument in dynr.model
testthat::expect_error(
dynrmodel <- dynr.model(formula1D, measurement, noise, initial, data),
regexp="Check that the 'dynamics' argument is of the correct class.\nHint: it should be either a 'dynrDynamicsFormula' or 'dynrDynamicsMatrix'.\nCreate it with prep.formulaDynamics() or prep.matrixDynamics().",
fixed=TRUE)
testthat::expect_error(
dynrmodel <- dynr.model(measurement, dynamics, noise, initial, data),
regexp="Check that the 'dynamics' argument is of the correct class.\nHint: it should be either a 'dynrDynamicsFormula' or 'dynrDynamicsMatrix'.\nCreate it with prep.formulaDynamics() or prep.matrixDynamics().",
fixed=TRUE)
#------------------------------------------------------------------------------
# End
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.