System dynamics models handle data in various ways. Traditionally, time series inputs were embedded in so-called lookups or table functions (DYNAMO users will remember TABHL for example). Lookups are really best suited for graphically describing a functional relationship. They’re really cool in Vensim’s Synthesim mode, where you can change the shape of a relationship and watch the behavioral consequence in real time.
Time series data can be thought of as f(time), so lookups are often used as data containers. This works decently when you have a limited amount of data, but isn’t really suitable for industrial strength modeling. Those familiar with advanced versions of Vensim may be aware of data variables – a special class of equation designed for working with time series data rather than endogenous structure.
There are many advantages to working with data variables:
- You can tell where there are data points, visually on graphs or in equations by testing for a special :NA: value indicating missing data.
- You can easily determine the endpoints of a series and vary the interpolation method.
- Data variables execute outside the main sequence of the model, so they don’t bog down optimization or Synthesim.
- It’s easier to use diverse sources for data (Excel, text files, ODBC, and other model runs) with data variables.
- You can see the data directly, without creating extra variables to manipulate it.
- In calibration optimization, data variables contribute to the payoff only when it makes sense (i.e., when there’s real data).
I think there are just two reasons to use lookups as containers for data:
- You want compatibility with Vensim PLE (e.g., for students)
- You want to expose the data stream to quick manipulation in a user interface
Otherwise, go for data variables. Occasionally, there are technical limitations that make it impossible to accomplish something with a data equation, but in those cases the solution is generally a separate data model rather than use of lookups. More on that soon.