Data Reconciliation

The method theta_est can optionally return model values. This feature can be used to return reconciled data using a user specified objective. In this case, the list of variable names the user wants to estimate (theta_names) is set to an empty list and the objective function is defined to minimize measurement to model error. Note that the model used for data reconciliation may differ from the model used for parameter estimation.

The following example illustrates the use of parmest for data reconciliation. The functions grouped_boxplot or grouped_violinplot can be used to visually compare the original and reconciled data.

Here’s a stylized code snippet showing how box plots might be created:

>>> import pyomo.contrib.parmest.parmest as parmest
>>> pest = parmest.Estimator(model_function, data, [], objective_function)
>>> obj, theta, data_rec = pest.theta_est(return_values=['A', 'B'])
>>> parmest.graphics.grouped_boxplot(data, data_rec)

Returned Values

Here’s a full program that can be run to see returned values (in this case it is the response function that is defined in the model file):

>>> import pandas as pd
>>> import pyomo.contrib.parmest.parmest as parmest
>>> from pyomo.contrib.parmest.examples.rooney_biegler.rooney_biegler import rooney_biegler_model

>>> theta_names = ['asymptote', 'rate_constant']

>>> data = pd.DataFrame(data=[[1,8.3],[2,10.3],[3,19.0],
...                           [4,16.0],[5,15.6],[7,19.8]],
...                     columns=['hour', 'y'])

>>> def SSE(model, data):
...     expr = sum((data.y[i]\
...                 - model.response_function[data.hour[i]])**2 for i in data.index)
...     return expr

>>> pest = parmest.Estimator(rooney_biegler_model, data, theta_names, SSE,
...                          solver_options=None)
>>> obj, theta, var_values = pest.theta_est(return_values=['response_function'])
>>> #print(var_values)