.. 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) `_. :author: Michel Bierlaire, EPFL :date: Sat Jul 15 15:40:33 2023 .. GENERATED FROM PYTHON SOURCE LINES 52-77 .. code-block:: Python import numpy as np from biogeme import models from biogeme.expressions import Expression, Beta from biogeme.nests import OneNestForNestedLogit, NestsForNestedLogit from biogeme.catalog import ( Catalog, segmentation_catalogs, generic_alt_specific_catalogs, ) from biogeme.data.swissmetro import ( read_data, 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, ) .. GENERATED FROM PYTHON SOURCE LINES 78-79 Read the data .. GENERATED FROM PYTHON SOURCE LINES 79-81 .. code-block:: Python database = read_data() .. GENERATED FROM PYTHON SOURCE LINES 82-83 Definition of the segmentations. .. GENERATED FROM PYTHON SOURCE LINES 83-95 .. 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 96-98 We consider two trip purposes: 'commuters' and anything else. We need to define a binary variable first. .. GENERATED FROM PYTHON SOURCE LINES 98-104 .. code-block:: Python database.data['COMMUTERS'] = np.where(database.data['PURPOSE'] == 1, 1, 0) segmentation_purpose = database.generate_segmentation( variable='COMMUTERS', mapping={0: 'non_commuters', 1: 'commuters'} ) .. GENERATED FROM PYTHON SOURCE LINES 105-106 Parameters to be estimated. .. GENERATED FROM PYTHON SOURCE LINES 106-111 .. 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 112-113 Parameter of the Box-Cox transform. .. GENERATED FROM PYTHON SOURCE LINES 113-115 .. code-block:: Python ell_travel_time = Beta('lambda_travel_time', 1, -10, 10, 0) .. GENERATED FROM PYTHON SOURCE LINES 116-117 Coefficients of the power series. .. GENERATED FROM PYTHON SOURCE LINES 117-121 .. 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 122-123 Function calculation the power series. .. GENERATED FROM PYTHON SOURCE LINES 123-135 .. 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 136-137 Train travel time .. GENERATED FROM PYTHON SOURCE LINES 139-140 Linear specification. .. GENERATED FROM PYTHON SOURCE LINES 140-142 .. code-block:: Python linear_train_tt = TRAIN_TT_SCALED .. GENERATED FROM PYTHON SOURCE LINES 143-144 Box-Cox transform. .. GENERATED FROM PYTHON SOURCE LINES 144-146 .. code-block:: Python boxcox_train_tt = models.boxcox(TRAIN_TT_SCALED, ell_travel_time) .. GENERATED FROM PYTHON SOURCE LINES 147-148 Power series. .. GENERATED FROM PYTHON SOURCE LINES 148-150 .. code-block:: Python power_train_tt = power_series(TRAIN_TT_SCALED) .. GENERATED FROM PYTHON SOURCE LINES 151-152 Definition of the catalog. .. GENERATED FROM PYTHON SOURCE LINES 152-161 .. 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 162-163 Swissmetro travel time .. GENERATED FROM PYTHON SOURCE LINES 165-166 Linear specification. .. GENERATED FROM PYTHON SOURCE LINES 166-168 .. code-block:: Python linear_sm_tt = SM_TT_SCALED .. GENERATED FROM PYTHON SOURCE LINES 169-170 Box-Cox transform. .. GENERATED FROM PYTHON SOURCE LINES 170-172 .. code-block:: Python boxcox_sm_tt = models.boxcox(SM_TT_SCALED, ell_travel_time) .. GENERATED FROM PYTHON SOURCE LINES 173-174 Power series. .. GENERATED FROM PYTHON SOURCE LINES 174-176 .. code-block:: Python power_sm_tt = power_series(SM_TT_SCALED) .. GENERATED FROM PYTHON SOURCE LINES 177-178 Definition of the catalog. Note that the controller is the same as for train. .. GENERATED FROM PYTHON SOURCE LINES 178-188 .. 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 189-190 Car travel time .. GENERATED FROM PYTHON SOURCE LINES 192-193 Linear specification. .. GENERATED FROM PYTHON SOURCE LINES 193-195 .. code-block:: Python linear_car_tt = CAR_TT_SCALED .. GENERATED FROM PYTHON SOURCE LINES 196-197 Box-Cox transform. .. GENERATED FROM PYTHON SOURCE LINES 197-199 .. code-block:: Python boxcox_car_tt = models.boxcox(CAR_TT_SCALED, ell_travel_time) .. GENERATED FROM PYTHON SOURCE LINES 200-201 Power series. .. GENERATED FROM PYTHON SOURCE LINES 201-203 .. code-block:: Python power_car_tt = power_series(CAR_TT_SCALED) .. GENERATED FROM PYTHON SOURCE LINES 204-205 Definition of the catalog. Note that the controller is the same as for train. .. GENERATED FROM PYTHON SOURCE LINES 205-216 .. 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 217-218 Catalogs for the alternative specific constants. .. GENERATED FROM PYTHON SOURCE LINES 218-229 .. 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 230-231 Catalog for the travel time coefficient. .. GENERATED FROM PYTHON SOURCE LINES 231-242 .. code-block:: Python (B_TIME_catalog_dict,) = generic_alt_specific_catalogs( generic_name='B_TIME', beta_parameters=[B_TIME], alternatives=('TRAIN', 'SM', 'CAR'), potential_segmentations=( segmentation_first, segmentation_purpose, ), maximum_number=1, ) .. GENERATED FROM PYTHON SOURCE LINES 243-244 Catalog for the travel cost coefficient. .. GENERATED FROM PYTHON SOURCE LINES 244-248 .. code-block:: Python (B_COST_catalog_dict,) = generic_alt_specific_catalogs( generic_name='B_COST', beta_parameters=[B_COST], alternatives=('TRAIN', 'SM', 'CAR') ) .. GENERATED FROM PYTHON SOURCE LINES 249-250 Definition of the utility functions. .. GENERATED FROM PYTHON SOURCE LINES 250-265 .. code-block:: Python V1 = ( ASC_TRAIN_catalog + B_TIME_catalog_dict['TRAIN'] * train_tt_catalog + B_COST_catalog_dict['TRAIN'] * TRAIN_COST_SCALED ) V2 = ( B_TIME_catalog_dict['SM'] * sm_tt_catalog + B_COST_catalog_dict['SM'] * SM_COST_SCALED ) V3 = ( ASC_CAR_catalog + B_TIME_catalog_dict['CAR'] * car_tt_catalog + B_COST_catalog_dict['CAR'] * CAR_CO_SCALED ) .. GENERATED FROM PYTHON SOURCE LINES 266-267 Associate utility functions with the numbering of alternatives. .. GENERATED FROM PYTHON SOURCE LINES 267-269 .. code-block:: Python V = {1: V1, 2: V2, 3: V3} .. GENERATED FROM PYTHON SOURCE LINES 270-271 Associate the availability conditions with the alternatives. .. GENERATED FROM PYTHON SOURCE LINES 271-273 .. code-block:: Python av = {1: TRAIN_AV_SP, 2: SM_AV, 3: CAR_AV_SP} .. GENERATED FROM PYTHON SOURCE LINES 274-276 Definition of the logit model. This is the contribution of each observation to the log likelihood function. .. GENERATED FROM PYTHON SOURCE LINES 276-278 .. code-block:: Python logprob_logit = models.loglogit(V, av, CHOICE) .. GENERATED FROM PYTHON SOURCE LINES 279-280 Nested logit model: nest with existing alternatives. .. GENERATED FROM PYTHON SOURCE LINES 280-288 .. 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,)) logprob_nested_existing = models.lognested(V, av, nests_existing, CHOICE) .. GENERATED FROM PYTHON SOURCE LINES 289-290 Nested logit model: nest with public transportation alternatives. .. GENERATED FROM PYTHON SOURCE LINES 290-298 .. 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,)) logprob_nested_public = models.lognested(V, av, nests_public, CHOICE) .. GENERATED FROM PYTHON SOURCE LINES 299-300 Catalo for models. .. GENERATED FROM PYTHON SOURCE LINES 300-308 .. code-block:: Python model_catalog = Catalog.from_dict( catalog_name='model_catalog', dict_of_expressions={ 'logit': logprob_logit, 'nested existing': logprob_nested_existing, 'nested public': logprob_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 `_