user_other_database.py#

View page source

Using Data Interval Compression#

Purpose#

This example shows how to use the Other Database options.

Integrands#

For this example there are one integrand, Sincidence .

Nodes#

There is only one node called world for this example. There are no random effects because there are no child nodes.

True Iota#

For this example, the true incidence rate iota is the following constant value:

iota_true = 0.01

Model#

There is only one rate iota and it constant w.r.t age and time.

Data#

There is one data point measuring Sincidence with the true value of iota . but faster to compute.

other_input_table#

For this example, the other_input_table is

other_input_table = 'data node'

Source Code#

# ------------------------------------------------------------------------
import sys
import shutil
import os
import csv
import copy
import math
source_file = 'example/user/other_database.py'
if sys.argv[0] != source_file  or len(sys.argv) != 1 :
   usage  = 'python3 ' + source_file + '\n'
   usage += 'where python3 is the python 3 program on your system\n'
   usage += 'and working directory is the dismod_at distribution directory\n'
   sys.exit(usage)
print(source_file)
#
# import dismod_at
local_dir = os.getcwd() + '/python'
if( os.path.isdir( local_dir + '/dismod_at' ) ) :
   sys.path.insert(0, local_dir)
import dismod_at
#
# work_directory
work_directory = 'build/example/user'
# ------------------------------------------------------------------------
# Note that the a, t values are not used for this example
def example_db (file_name) :
   # note that the a, t values are not used for this case
   def fun_iota(a, t) :
      return ('prior_iota', None, None)
   # ----------------------------------------------------------------------
   # age table:
   age_list    = [ 0.0, 50.0, 100.0 ]
   #
   # time table:
   time_list   = [ 1990.0, 2000.0, 2010.0, 2020.0 ]
   #
   # integrand table:
   integrand_table = [
       { 'name':'Sincidence' }
   ]
   #
   # node table:
   node_table = [ { 'name':'world', 'parent':'' } ]
   #
   # weight table:
   weight_table = list()
   #
   # covariate table:
   covariate_table = list()
   #
   # mulcov table:
   mulcov_table = list()
   #
   # avgint table: empty
   avgint_table = list()
   #
   # nslist_dict:
   nslist_dict = dict()
   # ----------------------------------------------------------------------
   # data table:
   data_table = list()
   #
   # values that are the same for all data points
   row = {
      'integrand':   'Sincidence',
      'hold_out':    False,
      'density':     'gaussian',
      'meas_std':    iota_true / 10.,
      'weight':      '',
      'time_lower':   2000.,
      'time_upper':   2000.,
      'node':         'world',
      'subgroup':     'world',
      'meas_value':   iota_true,
      'age_lower':    50.0,
      'age_upper':    50.0,
      'time_lower':   2000.0,
      'time_upper':   2000.0,
   }
   data_table.append(row)
   #
   # ----------------------------------------------------------------------
   # prior_table
   prior_table = [
      { # prior_iota
         'name':     'prior_iota',
         'density':  'uniform',
         'lower':    iota_true / 10.0,
         'upper':    iota_true * 10.0,
         'mean':     iota_true * 2.0,
      }
   ]
   # ----------------------------------------------------------------------
   # smooth table
   name           = 'smooth_iota'
   fun            = fun_iota
   smooth_table = [
      {  'name':name,
         'age_id':[0],
         'time_id':[0],
         'fun':fun
      }
   ]
   # ----------------------------------------------------------------------
   # rate table:
   rate_table = [
      {  'name':          'iota',
         'parent_smooth': 'smooth_iota',
      }
   ]
   # ----------------------------------------------------------------------
   # option_table
   option_table = [
      { 'name':'rate_case',              'value':'iota_pos_rho_zero'   },
      { 'name':'parent_node_name',       'value':'world'               },

      { 'name':'quasi_fixed',            'value':'false'               },
      { 'name':'max_num_iter_fixed',     'value':'50'                  },
      { 'name':'print_level_fixed',      'value':'0'                   },
      { 'name':'tolerance_fixed',        'value':'1e-9'                },

      { 'name':'max_num_iter_random',    'value':'50'                  },
      { 'name':'print_level_random',     'value':'0'                   },
      { 'name':'tolerance_random',       'value':'1e-10'               },

      { 'name':'other_database',         'value':'other.db'            },
      { 'name':'other_input_table',      'value':other_input_table     },
   ]
   # ----------------------------------------------------------------------
   # subgroup_table
   subgroup_table = [ { 'subgroup':'world', 'group':'world' } ]
   # ----------------------------------------------------------------------
   # create database
   dismod_at.create_database(
      file_name,
      age_list,
      time_list,
      integrand_table,
      node_table,
      subgroup_table,
      weight_table,
      covariate_table,
      avgint_table,
      data_table,
      prior_table,
      smooth_table,
      nslist_dict,
      rate_table,
      mulcov_table,
      option_table
   )
   # ----------------------------------------------------------------------
   return
# ===========================================================================
#
# example_db, example.db
database = f'{work_directory}/example.db'
example_db(database)
#
# other_db, other.db
other_db = f'{work_directory}/other.db'
shutil.copyfile(database, other_db)
#
# example.db
connection = dismod_at.create_connection(
   database, new = False, readonly = False
)
for table_name in other_input_table.split() :
   command    = 'DROP TABLE ' + table_name
   dismod_at.sql_command(connection, command)
command    = 'VACUUM;'
dismod_at.sql_command(connection, command)
connection.close()
#
assert os.stat(database).st_size < os.stat(other_db).st_size
#
#
program = 'build/devel/dismod_at'
dismod_at.system_command_prc([ program, database, 'init' ])
dismod_at.system_command_prc([ program, database, 'fit', 'fixed' ])
# -----------------------------------------------------------------------
# read database
connection            = dismod_at.create_connection(
   database, new = False, readonly = True
)
var_table             = dismod_at.get_table_dict(connection, 'var')
fit_var_table         = dismod_at.get_table_dict(connection, 'fit_var')
connection.close()
#
# There is only one variables, iota
assert len(var_table) == 1
assert len(fit_var_table) == 1
#
# check that the fit is accurate
for var_id in range( len(var_table) ) :
   true_value  = iota_true
   fit_value   = fit_var_table[var_id]['fit_var_value']
   rel_error   = 1.0 - fit_value/true_value
   assert abs(rel_error) < 1e-6
#
# Test db2csv
dismod_at.db2csv_command(database)
# -----------------------------------------------------------------------------
print('other_database.py: OK')
# -----------------------------------------------------------------------------