.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/assisted/everything_spec.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code. .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_assisted_everything_spec.py: .. _everything_spec_section: Combination of many specifications ================================== We combine the following specifications: - 3 models - logit - nested logit with two nests: public and private transportation - nested logit with two nests existing and future modes - 3 functional forms for the travel time variables - linear specification, - Box-Cox transform, - power series, - 2 specifications for the cost coefficients: - generic - alternative specific - 2 specifications for the travel time coefficients: - generic - alternative specific - 4 segmentations for the constants: - not segmented - segmented by GA (yearly subscription to public transport) - segmented by luggage - segmented both by GA and luggage - 3 segmentations for the time coefficients: - not segmented - segmented with first class - segmented with trip purpose This leads to a total of 432 specifications. See `Bierlaire and Ortelli (2023) `_. Michel Bierlaire, EPFL Fri Jul 25 2025, 09:52:30 .. GENERATED FROM PYTHON SOURCE LINES 51-76 .. code-block:: Python import numpy as np from biogeme.catalog import ( Catalog, generic_alt_specific_catalogs, segmentation_catalogs, ) from biogeme.data.swissmetro import ( CAR_AV_SP, CAR_CO_SCALED, CAR_TT_SCALED, CHOICE, SM_AV, SM_COST_SCALED, SM_TT_SCALED, TRAIN_AV_SP, TRAIN_COST_SCALED, TRAIN_TT_SCALED, read_data, ) from biogeme.expressions import Beta, Expression from biogeme.models import boxcox, loglogit, lognested from biogeme.nests import NestsForNestedLogit, OneNestForNestedLogit .. GENERATED FROM PYTHON SOURCE LINES 77-78 Read the data .. GENERATED FROM PYTHON SOURCE LINES 78-80 .. code-block:: Python database = read_data() .. GENERATED FROM PYTHON SOURCE LINES 81-82 Definition of the segmentations. .. GENERATED FROM PYTHON SOURCE LINES 82-94 .. code-block:: Python segmentation_ga = database.generate_segmentation( variable='GA', mapping={0: 'noGA', 1: 'GA'} ) segmentation_luggage = database.generate_segmentation( variable='LUGGAGE', mapping={0: 'no_lugg', 1: 'one_lugg', 3: 'several_lugg'} ) segmentation_first = database.generate_segmentation( variable='FIRST', mapping={0: '2nd_class', 1: '1st_class'} ) .. GENERATED FROM PYTHON SOURCE LINES 95-97 We consider two trip purposes: 'commuters' and anything else. We need to define a binary variable first. .. GENERATED FROM PYTHON SOURCE LINES 97-103 .. code-block:: Python database.dataframe['COMMUTERS'] = np.where(database.dataframe['PURPOSE'] == 1, 1, 0) segmentation_purpose = database.generate_segmentation( variable='COMMUTERS', mapping={0: 'non_commuters', 1: 'commuters'} ) .. GENERATED FROM PYTHON SOURCE LINES 104-105 Parameters to be estimated. .. GENERATED FROM PYTHON SOURCE LINES 105-110 .. code-block:: Python 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) .. GENERATED FROM PYTHON SOURCE LINES 111-112 Parameter of the Box-Cox transform. .. GENERATED FROM PYTHON SOURCE LINES 112-114 .. code-block:: Python lambda_travel_time = Beta('lambda_travel_time', 1, -10, 10, 0) .. GENERATED FROM PYTHON SOURCE LINES 115-116 Coefficients of the power series. .. GENERATED FROM PYTHON SOURCE LINES 116-120 .. code-block:: Python square_tt_coef = Beta('square_tt_coef', 0, None, None, 0) cube_tt_coef = Beta('cube_tt_coef', 0, None, None, 0) .. GENERATED FROM PYTHON SOURCE LINES 121-122 Function calculation the power series. .. GENERATED FROM PYTHON SOURCE LINES 122-134 .. code-block:: Python def power_series(the_variable: Expression) -> Expression: """Generate the expression of a polynomial of degree 3 :param the_variable: variable of the polynomial """ return ( the_variable + square_tt_coef * the_variable**2 + cube_tt_coef * the_variable * the_variable**3 ) .. GENERATED FROM PYTHON SOURCE LINES 135-136 Train travel time .. GENERATED FROM PYTHON SOURCE LINES 138-139 Linear specification. .. GENERATED FROM PYTHON SOURCE LINES 139-141 .. code-block:: Python linear_train_tt = TRAIN_TT_SCALED .. GENERATED FROM PYTHON SOURCE LINES 142-143 Box-Cox transform. .. GENERATED FROM PYTHON SOURCE LINES 143-145 .. code-block:: Python boxcox_train_tt = boxcox(TRAIN_TT_SCALED, lambda_travel_time) .. GENERATED FROM PYTHON SOURCE LINES 146-147 Power series. .. GENERATED FROM PYTHON SOURCE LINES 147-149 .. code-block:: Python power_train_tt = power_series(TRAIN_TT_SCALED) .. GENERATED FROM PYTHON SOURCE LINES 150-151 Definition of the catalog. .. GENERATED FROM PYTHON SOURCE LINES 151-160 .. code-block:: Python train_tt_catalog = Catalog.from_dict( catalog_name='train_tt_catalog', dict_of_expressions={ 'linear': linear_train_tt, 'boxcox': boxcox_train_tt, 'power': power_train_tt, }, ) .. GENERATED FROM PYTHON SOURCE LINES 161-162 Swissmetro travel time .. GENERATED FROM PYTHON SOURCE LINES 164-165 Linear specification. .. GENERATED FROM PYTHON SOURCE LINES 165-167 .. code-block:: Python linear_sm_tt = SM_TT_SCALED .. GENERATED FROM PYTHON SOURCE LINES 168-169 Box-Cox transform. .. GENERATED FROM PYTHON SOURCE LINES 169-171 .. code-block:: Python boxcox_sm_tt = boxcox(SM_TT_SCALED, lambda_travel_time) .. GENERATED FROM PYTHON SOURCE LINES 172-173 Power series. .. GENERATED FROM PYTHON SOURCE LINES 173-175 .. code-block:: Python power_sm_tt = power_series(SM_TT_SCALED) .. GENERATED FROM PYTHON SOURCE LINES 176-177 Definition of the catalog. Note that the controller is the same as for train. .. GENERATED FROM PYTHON SOURCE LINES 177-187 .. code-block:: Python sm_tt_catalog = Catalog.from_dict( catalog_name='sm_tt_catalog', dict_of_expressions={ 'linear': linear_sm_tt, 'boxcox': boxcox_sm_tt, 'power': power_sm_tt, }, controlled_by=train_tt_catalog.controlled_by, ) .. GENERATED FROM PYTHON SOURCE LINES 188-189 Car travel time .. GENERATED FROM PYTHON SOURCE LINES 191-192 Linear specification. .. GENERATED FROM PYTHON SOURCE LINES 192-194 .. code-block:: Python linear_car_tt = CAR_TT_SCALED .. GENERATED FROM PYTHON SOURCE LINES 195-196 Box-Cox transform. .. GENERATED FROM PYTHON SOURCE LINES 196-198 .. code-block:: Python boxcox_car_tt = boxcox(CAR_TT_SCALED, lambda_travel_time) .. GENERATED FROM PYTHON SOURCE LINES 199-200 Power series. .. GENERATED FROM PYTHON SOURCE LINES 200-202 .. code-block:: Python power_car_tt = power_series(CAR_TT_SCALED) .. GENERATED FROM PYTHON SOURCE LINES 203-204 Definition of the catalog. Note that the controller is the same as for train. .. GENERATED FROM PYTHON SOURCE LINES 204-215 .. code-block:: Python car_tt_catalog = Catalog.from_dict( catalog_name='car_tt_catalog', dict_of_expressions={ 'linear': linear_car_tt, 'boxcox': boxcox_car_tt, 'power': power_car_tt, }, controlled_by=train_tt_catalog.controlled_by, ) .. GENERATED FROM PYTHON SOURCE LINES 216-217 Catalogs for the alternative specific constants. .. GENERATED FROM PYTHON SOURCE LINES 217-228 .. code-block:: Python asc_train_catalog, asc_car_catalog = segmentation_catalogs( generic_name='asc', beta_parameters=[asc_train, asc_car], potential_segmentations=( segmentation_ga, segmentation_luggage, ), maximum_number=2, ) .. GENERATED FROM PYTHON SOURCE LINES 229-230 Catalog for the travel time coefficient. .. GENERATED FROM PYTHON SOURCE LINES 230-241 .. code-block:: Python (b_time_catalog_dict,) = generic_alt_specific_catalogs( generic_name='b_time', beta_parameters=[b_time], alternatives=('train', 'swissmetro', 'car'), potential_segmentations=( segmentation_first, segmentation_purpose, ), maximum_number=1, ) .. GENERATED FROM PYTHON SOURCE LINES 242-243 Catalog for the travel cost coefficient. .. GENERATED FROM PYTHON SOURCE LINES 243-249 .. code-block:: Python (b_cost_catalog_dict,) = generic_alt_specific_catalogs( generic_name='b_cost', beta_parameters=[b_cost], alternatives=('train', 'swissmetro', 'car'), ) .. GENERATED FROM PYTHON SOURCE LINES 250-251 Definition of the utility functions. .. GENERATED FROM PYTHON SOURCE LINES 251-266 .. code-block:: Python v_train = ( asc_train_catalog + b_time_catalog_dict['train'] * train_tt_catalog + b_cost_catalog_dict['train'] * TRAIN_COST_SCALED ) v_swissmetro = ( b_time_catalog_dict['swissmetro'] * sm_tt_catalog + b_cost_catalog_dict['swissmetro'] * SM_COST_SCALED ) v_car = ( asc_car_catalog + b_time_catalog_dict['car'] * car_tt_catalog + b_cost_catalog_dict['car'] * CAR_CO_SCALED ) .. GENERATED FROM PYTHON SOURCE LINES 267-268 Associate utility functions with the numbering of alternatives. .. GENERATED FROM PYTHON SOURCE LINES 268-270 .. code-block:: Python v = {1: v_train, 2: v_swissmetro, 3: v_car} .. GENERATED FROM PYTHON SOURCE LINES 271-272 Associate the availability conditions with the alternatives. .. GENERATED FROM PYTHON SOURCE LINES 272-274 .. code-block:: Python av = {1: TRAIN_AV_SP, 2: SM_AV, 3: CAR_AV_SP} .. GENERATED FROM PYTHON SOURCE LINES 275-277 Definition of the logit model. This is the contribution of each observation to the log likelihood function. .. GENERATED FROM PYTHON SOURCE LINES 277-279 .. code-block:: Python log_probability_logit = loglogit(v, av, CHOICE) .. GENERATED FROM PYTHON SOURCE LINES 280-281 Nested logit model: nest with existing alternatives. .. GENERATED FROM PYTHON SOURCE LINES 281-289 .. code-block:: Python mu_existing = Beta('mu_existing', 1, 1, 10, 0) existing = OneNestForNestedLogit( nest_param=mu_existing, list_of_alternatives=[1, 3], name='Existing' ) nests_existing = NestsForNestedLogit(choice_set=list(v), tuple_of_nests=(existing,)) log_probability_nested_existing = lognested(v, av, nests_existing, CHOICE) .. GENERATED FROM PYTHON SOURCE LINES 290-291 Nested logit model: nest with public transportation alternatives. .. GENERATED FROM PYTHON SOURCE LINES 291-299 .. code-block:: Python mu_public = Beta('mu_public', 1, 1, 10, 0) public = OneNestForNestedLogit( nest_param=mu_public, list_of_alternatives=[1, 2], name='Public' ) nests_public = NestsForNestedLogit(choice_set=list(v), tuple_of_nests=(public,)) log_probability_nested_public = lognested(v, av, nests_public, CHOICE) .. GENERATED FROM PYTHON SOURCE LINES 300-301 Catalog for models. .. GENERATED FROM PYTHON SOURCE LINES 301-309 .. code-block:: Python model_catalog = Catalog.from_dict( catalog_name='model_catalog', dict_of_expressions={ 'logit': log_probability_logit, 'nested existing': log_probability_nested_existing, 'nested public': log_probability_nested_public, }, ) .. _sphx_glr_download_auto_examples_assisted_everything_spec.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: everything_spec.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: everything_spec.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: everything_spec.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_