observations: Using functions on the left-hand side

In this document we show how to apply functions to the left-hand side of an observation equation.

# Create model object
obj = ctsmTMB$new()

# Set name of model (and the created .cpp file)
obj$setModelname("ornstein_uhlenbeck")

# Add system equations
obj$addSystem(
  dx ~ theta * (mu-x) * dt + sigma_x*dw
)

Adding observation equations


Let’s assume that our observations yt are log-normally distributed conditioned on xt i.e. log yti ∼ 𝒩(xti, σy2) It is sufficient for the user to provide the data column y in the provided data.frame to e.g. estimate or predict by adding the following observation equation

obj$addObs(
  log(y) ~ x, obsnames = "log_y"
)

Note that these kind of observation equations, where the left-hand side is a function of one (or more) observed variables must be explicitly named using the obsnames argument.

Adding observation variances


The names given with obsnames are important because they are needed to specify the observation variance. As an example the code below does not work, because the observation was named log_y

obj$setVariance(
  y ~ sigma_y^2
)
## Error in check_observation_variance_eqs(form, self, private): Please add an observation equation for y before specifying its variance

So the correct way to add the observation variance is this:

obj$setVariance(
  log_y ~ sigma_y^2
)

Multiple observation equations


You must supply multiple obsnames if you are supplying multiple observatin equations, although the name will only be used if the left-hand side is not just a single variable i.e.

obj$addObs(
  log(y) ~ x,
  y ~ x,
  y^2+z^3 ~ x,
  obsnames = c("log_y", NA, "y2_plus_z3")
)