csv.simulate_xam

View page source

Example Using csv.simulate

Node Tree

           n0
   /-----/\-----\
n1              n2

Symbol

Documentation

sim_dir

sim_dir

csv_file[‘option_sim.csv’]

option_sim.csv

csv_file[‘node.csv’]

node.csv

csv_file[‘covariate.csv’]

covariate.csv

csv_file[‘no_effect_rate.csv’]

no_effect_rate.csv

csv_file[‘multiplier_sim.csv’]

multiplier_sim.csv

csv_file[‘simulate.csv’]

simulate.csv

csv_file[‘random_effect.csv’]

random_effect.csv

csv_file[‘data_sim.csv’]

data_sim.csv

#
# csv_file
csv_file = dict()
#
# option_sim.csv
random_seed = str( int( time.time() ) )
csv_file['option_sim.csv'] = \
'''name,value
absolute_tolerance,1e-5
float_precision,4
integrand_step_size,5
random_depend_sex,true
std_random_effects_iota,.1
'''
csv_file['option_sim.csv'] += f'random_seed,{random_seed}\n'
#
# node.csv
csv_file['node.csv'] = \
'''node_name,parent_name
n0,
n1,n0
n2,n0
'''
#
# covariate.csv
csv_file['covariate.csv'] = \
'''node_name,sex,age,time,omega,haqi
n0,female,50,2000,0.0,1.0
n0,male,50,2000,0.0,1.0
n1,female,50,2000,0.0,0.5
n1,male,50,2000,0.0,0.5
n2,female,50,2000,0.0,1.5
n2,male,50,2000,0.0,1.5
'''
#
# no_effect_rate.csv
csv_file['no_effect_rate.csv'] = \
'''rate_name,age,time,rate_truth
iota,0.0,1980.0,0.01
'''
#
# multiplier_sim.csv
csv_file['multiplier_sim.csv'] = \
'''multiplier_id,rate_name,covariate_or_sex,multiplier_truth
0,iota,haqi,0.5
'''
#
# simulate.csv
header  = 'simulate_id,integrand_name,node_name,sex,age_lower,age_upper,'
header += 'time_lower,time_upper,meas_std_cv,meas_std_min'
csv_file['simulate.csv'] = header + \
'''
0,Sincidence,n0,female,0,10,1990,2000,0.2,0.01
1,Sincidence,n1,male,10,20,2000,2010,0.2,0.01
2,Sincidence,n2,female,20,30,2010,2020,0.2,0.01
'''
#
def main() :
    #
    # sim_dir
    sim_dir = 'build/example/csv'
    at_cascade.empty_directory(sim_dir)
    #
    # write csv files
    for name in csv_file :
        file_name = f'{sim_dir}/{name}'
        file_ptr  = open(file_name, 'w')
        file_ptr.write( csv_file[name] )
        file_ptr.close()
    #
    # csv.simulate
    at_cascade.csv.simulate(sim_dir)
    #
    # csv_table
    csv_table = dict()
    for name in csv_file :
        file_name       = f'{sim_dir}/{name}'
        csv_table[name] = at_cascade.csv.read_table( file_name )
    #
    for name in [ 'random_effect.csv', 'data_sim.csv' ] :
        file_name       = f'{sim_dir}/{name}'
        csv_table[name] = at_cascade.csv.read_table( file_name )
    #
    # float_precision
    float_precision = None
    for row in csv_table['option_sim.csv'] :
        if row['name'] == 'float_precision' :
            float_precision = int( row['value'] )
    eps10 = 10 * 10.0 ** (- float_precision )
    #
    # random_effect.csv
    for sex in [ 'female', 'male' ] :
        sum_random = 0.0
        sum_abs    = 0.0
        for row in csv_table['random_effect.csv'] :
            if row['node_name'] == 'n0' :
                assert float( row['random_effect'] ) == 0.0
            if row['sex'] == sex :
                assert row['rate_name'] == 'iota'
                sum_abs    += abs( float( row['random_effect'] ) )
                sum_random += float( row['random_effect'] )
        assert abs( sum_random ) <= eps10 * sum_abs
    #
    # random_effect_node_sex
    random_effect_node_sex = dict()
    for node_name in [ 'n0', 'n1', 'n2' ] :
        random_effect_node_sex[node_name] = dict()
    for row in csv_table['random_effect.csv'] :
        node_name     = row['node_name']
        sex           = row['sex']
        rate_name     = row['rate_name']
        random_effect = row['random_effect']
        assert rate_name == 'iota'
        random_effect_node_sex[node_name][sex] = float( random_effect )
    #
    # no_effect_iota
    assert len( csv_table['no_effect_rate.csv'] ) == 1
    for row in csv_table['no_effect_rate.csv'] :
        assert row['rate_name'] == 'iota'
        no_effect_iota = float( row['rate_truth'] )
    #
    # haqi_node_sex
    haqi_node_sex = dict()
    for node_name in ['n0', 'n1', 'n2'] :
        haqi_node_sex[node_name] = dict()
    for row in csv_table['covariate.csv'] :
        node_name  = row['node_name']
        sex        = row['sex']
        haqi_node_sex[node_name][sex] = row['haqi']
    #
    # haqi_reference
    female = float( haqi_node_sex['n0']['female'] )
    male   = float( haqi_node_sex['n0']['male'] )
    haqi_reference = (female + male) / 2.0
    #
    # mul_haqi_iota
    assert len( csv_table['multiplier_sim.csv'] ) == 1
    for row in csv_table['multiplier_sim.csv'] :
        assert row['rate_name'] == 'iota'
        assert row['covariate_or_sex'] == 'haqi'
        mul_haqi_iota = float( row['multiplier_truth'] )
    #
    # data_sim.csv
    for data_row in csv_table['data_sim.csv'] :
        #
        # node_name, meas_mean
        simulate_id    = int( data_row['simulate_id'] )
        sim_row        = csv_table['simulate.csv'][simulate_id]
        integrand_name = sim_row['integrand_name']
        node_name      = sim_row['node_name']
        sex            = sim_row['sex']
        meas_mean      = float( data_row['meas_mean'] )
        assert integrand_name == 'Sincidence'
        #
        # random_effect
        random_effect = random_effect_node_sex[node_name][sex]
        #
        # covariate effect
        haqi             = float( haqi_node_sex[node_name][sex] )
        covariate_effect = mul_haqi_iota * (haqi - haqi_reference)
        #
        # effect
        effect = random_effect + covariate_effect
        #
        # check_mean
        check_mean = math.exp(effect) * no_effect_iota
        assert abs( check_mean - meas_mean ) <= eps10 * meas_mean
    #
#
if __name__ == '__main__' :
    main()
    print('simulte_xam.py: OK')