Frequently asked questions

What's up with the name?

The name is probably an acronym for "Modular Integrated Modeling Interface", but we are not sure. What is certain is that it came up during a dinner that Bob, David and Sol had in 2015. David thinks that Bob invented the name, Bob doesn't remember and Sol thinks the waiter might have come up with it (although we can almost certainly rule that option out). It certainly is better than the previous name "IAMF". We now use "Mimi" purely as a name of the package, not as an acronym.

How do I use a multivariate distribution for a parameter within a component?

You might want to use a multivariate distribution to capture the covariance between estimated coefficient parameters. For example, an estimated polynomial can be represented as a multivariate Normal distribution, with a variance-covariance matrix. To use this, define the parameter in the component with a vector type, like here:

@defcomp example begin
    cubiccoeffs::Vector{Float64} = Parameter()

Then in the model construction, set the parameter with a multivariate distribution (here the parameters are loaded from a CSV file):

cubicparams = readdlm("../data/cubicparams.csv", ',')
set_param!(m, :example, :cubiccoeff, MvNormal(squeeze(cubicparams[1,:], 1), cubicparams[2:4,:]))

Here, ../data/cubicparams.csv is a parameter definition file that looks something like this:

# Example estimated polynomial parameter
# First line: linear, quadratic, cubic
# Lines 2-4: covariance matrix

How do I use component references?

Component references allow you to write cleaner model code when connecting components. The add_comp! function returns a reference to the component that you just added:

mycomponent = add_comp!(model, MyComponent)

If you want to get a reference to a component after the add_comp! call has been made, you can construct the reference as:

mycomponent = ComponentReference(model, :MyComponent)

You can use this component reference in place of the set_param! and connect_param! calls.

References in place of set_param!

The line set_param!(model, :MyComponent, :myparameter, myvalue) can be written as mycomponent[:myparameter] = myvalue, where mycomponent is a component reference.

References in place of connect_param!

The line connect_param!(model, :MyComponent, :myparameter, :YourComponent, :yourparameter) can be written as mycomponent[:myparameter] = yourcomponent[:yourparameter], where mycomponent and yourcomponent are component references.