Note
Go to the end to download the full example code
Catalog for alternative specific coefficients
Investigate alternative specific parameters:
two specifications for the travel time coefficient: generic, and alternative specific,
two specifications for the travel cost coefficient: generic, and alternative specific,
for a total of 4 specifications. See Bierlaire and Ortelli (2023).
- author:
Michel Bierlaire, EPFL
- date:
Thu Jul 13 16:18:10 2023
import biogeme.biogeme as bio
import biogeme.biogeme_logging as blog
from biogeme import models
from biogeme.expressions import Beta
from biogeme.catalog import generic_alt_specific_catalogs
from biogeme.results import compile_estimation_results, pareto_optimal
See Data preparation for Swissmetro.
from swissmetro_data import (
database,
CHOICE,
SM_AV,
CAR_AV_SP,
TRAIN_AV_SP,
TRAIN_TT_SCALED,
TRAIN_COST_SCALED,
SM_TT_SCALED,
SM_COST_SCALED,
CAR_TT_SCALED,
CAR_CO_SCALED,
)
logger = blog.get_screen_logger(level=blog.INFO)
Parameters to be estimated.
ASC_CAR = Beta('ASC_CAR', 0, None, None, 0)
ASC_TRAIN = Beta('ASC_TRAIN', 0, None, None, 0)
B_TIME = Beta('B_TIME', 0, None, None, 0)
B_COST = Beta('B_COST', 0, None, None, 0)
Catalog for travel time coefficient.
(B_TIME_catalog_dict,) = generic_alt_specific_catalogs(
generic_name='B_TIME', beta_parameters=[B_TIME], alternatives=('TRAIN', 'SM', 'CAR')
)
Catalog for travel cost coefficient.
(B_COST_catalog_dict,) = generic_alt_specific_catalogs(
generic_name='B_COST', beta_parameters=[B_COST], alternatives=('TRAIN', 'SM', 'CAR')
)
Definition of the utility functions.
V1 = (
ASC_TRAIN
+ B_TIME_catalog_dict['TRAIN'] * TRAIN_TT_SCALED
+ B_COST_catalog_dict['TRAIN'] * TRAIN_COST_SCALED
)
V2 = (
B_TIME_catalog_dict['SM'] * SM_TT_SCALED
+ B_COST_catalog_dict['SM'] * SM_COST_SCALED
)
V3 = (
ASC_CAR
+ B_TIME_catalog_dict['CAR'] * CAR_TT_SCALED
+ B_COST_catalog_dict['CAR'] * CAR_CO_SCALED
)
Associate utility functions with the numbering of alternatives.
V = {1: V1, 2: V2, 3: V3}
Associate the availability conditions with the alternatives.
av = {1: TRAIN_AV_SP, 2: SM_AV, 3: CAR_AV_SP}
Definition of the model. This is the contribution of each observation to the log likelihood function.
logprob = models.loglogit(V, av, CHOICE)
Create the Biogeme object.
the_biogeme = bio.BIOGEME(database, logprob)
the_biogeme.modelName = 'b01alt_spec'
the_biogeme.generate_html = False
the_biogeme.generate_pickle = False
File biogeme.toml has been parsed.
Estimate the parameters.
dict_of_results = the_biogeme.estimate_catalog()
Estimating 4 models.
File biogeme.toml has been parsed.
*** Initial values of the parameters are obtained from the file __b01alt_spec_000000.iter
Cannot read file __b01alt_spec_000000.iter. Statement is ignored.
Optimization algorithm: hybrid Newton/BFGS with simple bounds [simple_bounds]
** Optimization: Newton with trust region for simple bounds
Iter. ASC_CAR ASC_TRAIN B_COST_CAR B_COST_SM B_COST_TRAIN B_TIME_CAR B_TIME_SM B_TIME_TRAIN Function Relgrad Radius Rho
0 -0.17 -0.54 -0.52 -0.7 -1 -0.8 -0.39 -0.58 5.4e+03 0.067 10 1.1 ++
1 -0.27 -0.25 -0.72 -1 -2.2 -1.2 -0.92 -0.83 5.1e+03 0.045 1e+02 1.2 ++
2 -0.36 -0.11 -0.78 -1.1 -2.9 -1.3 -1.1 -0.89 5.1e+03 0.012 1e+03 1.1 ++
3 -0.37 -0.078 -0.79 -1.1 -3.1 -1.3 -1.1 -0.89 5.1e+03 0.00076 1e+04 1 ++
4 -0.37 -0.078 -0.79 -1.1 -3.1 -1.3 -1.1 -0.89 5.1e+03 2.9e-06 1e+04 1 ++
Results saved in file b01alt_spec_000000.html
Results saved in file b01alt_spec_000000.pickle
File biogeme.toml has been parsed.
*** Initial values of the parameters are obtained from the file __b01alt_spec_000001.iter
Cannot read file __b01alt_spec_000001.iter. Statement is ignored.
Optimization algorithm: hybrid Newton/BFGS with simple bounds [simple_bounds]
** Optimization: Newton with trust region for simple bounds
Iter. ASC_CAR ASC_TRAIN B_COST B_TIME Function Relgrad Radius Rho
0 -0.49 -0.92 -0.88 -0.67 5.4e+03 0.041 10 1.1 ++
1 -0.18 -0.73 -1 -1.2 5.3e+03 0.0072 1e+02 1.1 ++
2 -0.16 -0.7 -1.1 -1.3 5.3e+03 0.00018 1e+03 1 ++
3 -0.16 -0.7 -1.1 -1.3 5.3e+03 1.1e-07 1e+03 1 ++
Results saved in file b01alt_spec_000001.html
Results saved in file b01alt_spec_000001.pickle
File biogeme.toml has been parsed.
*** Initial values of the parameters are obtained from the file __b01alt_spec_000002.iter
Cannot read file __b01alt_spec_000002.iter. Statement is ignored.
Optimization algorithm: hybrid Newton/BFGS with simple bounds [simple_bounds]
** Optimization: Newton with trust region for simple bounds
Iter. ASC_CAR ASC_TRAIN B_COST_CAR B_COST_SM B_COST_TRAIN B_TIME Function Relgrad Radius Rho
0 -0.34 -0.62 -0.61 -0.69 -1 -0.69 5.3e+03 0.054 10 1.1 ++
1 -0.38 -0.044 -0.88 -0.99 -2.2 -1 5.1e+03 0.039 1e+02 1.2 ++
2 -0.42 0.15 -0.94 -1.1 -2.8 -1.1 5.1e+03 0.0097 1e+03 1.1 ++
3 -0.43 0.19 -0.94 -1.1 -2.9 -1.1 5.1e+03 0.00053 1e+04 1 ++
4 -0.43 0.19 -0.94 -1.1 -2.9 -1.1 5.1e+03 1.5e-06 1e+04 1 ++
Results saved in file b01alt_spec_000002.html
Results saved in file b01alt_spec_000002.pickle
File biogeme.toml has been parsed.
*** Initial values of the parameters are obtained from the file __b01alt_spec_000003.iter
Cannot read file __b01alt_spec_000003.iter. Statement is ignored.
Optimization algorithm: hybrid Newton/BFGS with simple bounds [simple_bounds]
** Optimization: Newton with trust region for simple bounds
Iter. ASC_CAR ASC_TRAIN B_COST B_TIME_CAR B_TIME_SM B_TIME_TRAIN Function Relgrad Radius Rho
0 -0.66 -0.81 -0.89 -0.6 -0.74 -0.77 5.4e+03 0.065 10 1.1 ++
1 -0.26 -0.36 -1 -1.1 -1.1 -1.4 5.3e+03 0.016 1e+02 1.1 ++
2 -0.27 -0.21 -1.1 -1.1 -1.2 -1.6 5.3e+03 0.0011 1e+03 1 ++
3 -0.27 -0.21 -1.1 -1.1 -1.2 -1.6 5.3e+03 4.9e-06 1e+03 1 ++
Results saved in file b01alt_spec_000003.html
Results saved in file b01alt_spec_000003.pickle
Number of estimated models.
print(f'A total of {len(dict_of_results)} models have been estimated')
A total of 4 models have been estimated
All estimation results
compiled_results, specs = compile_estimation_results(
dict_of_results, use_short_names=True
)
compiled_results
Glossary
for short_name, spec in specs.items():
print(f'{short_name}\t{spec}')
Model_000000 B_COST_gen_altspec:altspec;B_TIME_gen_altspec:altspec
Model_000001 B_COST_gen_altspec:generic;B_TIME_gen_altspec:generic
Model_000002 B_COST_gen_altspec:altspec;B_TIME_gen_altspec:generic
Model_000003 B_COST_gen_altspec:generic;B_TIME_gen_altspec:altspec
Estimation results of the Pareto optimal models.
pareto_results = pareto_optimal(dict_of_results)
compiled_pareto_results, pareto_specs = compile_estimation_results(
pareto_results, use_short_names=True
)
No Pareto file has been provided
compiled_pareto_results
Glossary.
for short_name, spec in pareto_specs.items():
print(f'{short_name}\t{spec}')
Model_000000 B_COST_gen_altspec:altspec;B_TIME_gen_altspec:altspec
Model_000001 B_COST_gen_altspec:generic;B_TIME_gen_altspec:generic
Model_000002 B_COST_gen_altspec:altspec;B_TIME_gen_altspec:generic
Total running time of the script: (0 minutes 0.717 seconds)