.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/bayesian_swissmetro/plot_b03_scale.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_bayesian_swissmetro_plot_b03_scale.py: 3. Moneymetric and heteroscedastic specification ================================================ Although normalizing the scale to 1 is a common practice in random utility models, it is sometimes preferable to normalize another parameter. For instance, normalizing the cost coefficient to -1 sets the units of the utility function as currency units (CHF here), and the estimated coefficients are easily interpreted as willingness to pay. In that case, the scale must be estimated. We also illustrate here a heteroscedastic specification, where a different scale is associated with different segments of the sample. This example illustrates how to estimate such a specification with Bayesian inference. Michel Bierlaire, EPFL Thu Nov 20 2025, 11:10:03 .. GENERATED FROM PYTHON SOURCE LINES 20-25 .. code-block:: Python from pathlib import Path from IPython.core.display_functions import display .. GENERATED FROM PYTHON SOURCE LINES 26-27 See the data processing script: :ref:`swissmetro_data`. .. GENERATED FROM PYTHON SOURCE LINES 27-51 .. code-block:: Python from swissmetro_data import ( CAR_AV_SP, CAR_CO_SCALED, CAR_TT_SCALED, CHOICE, GROUP, SM_AV, SM_COST_SCALED, SM_TT_SCALED, TRAIN_AV_SP, TRAIN_COST_SCALED, TRAIN_TT_SCALED, database, ) from biogeme.bayesian_estimation import ( BayesianResults, BayesianResultsSummary, get_pandas_estimated_parameters, ) from biogeme.biogeme import BIOGEME from biogeme.expressions import Beta from biogeme.models import loglogit .. GENERATED FROM PYTHON SOURCE LINES 52-53 The scale parameters must stay away from zero. We define a small but positive lower bound .. GENERATED FROM PYTHON SOURCE LINES 53-54 .. code-block:: Python POSITIVE_LOWER_BOUND = 1.0e-5 .. GENERATED FROM PYTHON SOURCE LINES 55-56 Parameters to be estimated. .. GENERATED FROM PYTHON SOURCE LINES 56-64 .. code-block:: Python asc_car = Beta('asc_car', 0, None, None, 0) asc_train = Beta('asc_train', 0, None, None, 0) asc_sm = Beta('asc_sm', 0, None, None, 1) b_time = Beta('b_time', 0, None, 0, 0) b_cost = Beta('b_cost', -1, None, None, 1) scale_not_group3 = Beta('scale_not_group3', 1, POSITIVE_LOWER_BOUND, None, 0) scale_group3 = Beta('scale_group3', 1, POSITIVE_LOWER_BOUND, None, 0) .. GENERATED FROM PYTHON SOURCE LINES 65-66 Definition of the utility functions. .. GENERATED FROM PYTHON SOURCE LINES 66-70 .. code-block:: Python v_train = asc_train + b_time * TRAIN_TT_SCALED + b_cost * TRAIN_COST_SCALED v_swissmetro = asc_sm + b_time * SM_TT_SCALED + b_cost * SM_COST_SCALED v_car = asc_car + b_time * CAR_TT_SCALED + b_cost * CAR_CO_SCALED .. GENERATED FROM PYTHON SOURCE LINES 71-72 Scale associated with group 3 is estimated. .. GENERATED FROM PYTHON SOURCE LINES 72-74 .. code-block:: Python scale = (GROUP != 3) * scale_not_group3 + (GROUP == 3) * scale_group3 .. GENERATED FROM PYTHON SOURCE LINES 75-77 Scale the utility functions, and associate them with the numbering of alternatives. .. GENERATED FROM PYTHON SOURCE LINES 77-79 .. code-block:: Python v = {1: scale * v_train, 2: scale * v_swissmetro, 3: scale * v_car} .. GENERATED FROM PYTHON SOURCE LINES 80-81 Associate the availability conditions with the alternatives. .. GENERATED FROM PYTHON SOURCE LINES 81-83 .. code-block:: Python av = {1: TRAIN_AV_SP, 2: SM_AV, 3: CAR_AV_SP} .. GENERATED FROM PYTHON SOURCE LINES 84-86 Definition of the model. This is the contribution of each observation to the log likelihood function. .. GENERATED FROM PYTHON SOURCE LINES 86-88 .. code-block:: Python logprob = loglogit(v, av, CHOICE) .. GENERATED FROM PYTHON SOURCE LINES 89-90 These notes will be included as such in the report file. .. GENERATED FROM PYTHON SOURCE LINES 90-95 .. code-block:: Python USER_NOTES = ( 'Illustrates a moneymetric heteroscedastic specification. A different scale is' ' associated with different segments of the sample.' ) .. GENERATED FROM PYTHON SOURCE LINES 96-97 Create the Biogeme object. .. GENERATED FROM PYTHON SOURCE LINES 97-100 .. code-block:: Python the_biogeme = BIOGEME(database, logprob, user_notes=USER_NOTES) the_biogeme.model_name = 'b03_scale' .. GENERATED FROM PYTHON SOURCE LINES 101-103 Estimate the posterior distribution of the parameters, or read the results if already available. .. GENERATED FROM PYTHON SOURCE LINES 103-110 .. code-block:: Python yaml_file = Path('saved_results') / f'{the_biogeme.model_name}.yaml' try: summary_results = BayesianResultsSummary.from_yaml_file(filename=yaml_file) except FileNotFoundError: results: BayesianResults = the_biogeme.bayesian_estimation() summary_results = results.to_summary() .. GENERATED FROM PYTHON SOURCE LINES 111-113 .. code-block:: Python print(summary_results.short_summary()) .. rst-class:: sphx-glr-script-out .. code-block:: none Sample size 6768 Sampler NUTS Number of chains 4 Number of draws per chain 2000 Total number of draws 8000 Acceptance rate target 0.9 Run time 0:01:01.215693 Posterior predictive log-likelihood (sum of log mean p) -4975.42 Expected log-likelihood E[log L(Y|θ)] -4979.19 Best-draw log-likelihood (posterior upper bound) -4976.74 LOO (Leave-One-Out Cross-Validation) -4982.97 LOO Standard Error 53.92 Effective number of parameters (p_LOO) 7.55 .. GENERATED FROM PYTHON SOURCE LINES 114-115 Present the parameter estimates in a pandas table. .. GENERATED FROM PYTHON SOURCE LINES 115-120 .. code-block:: Python pandas_results = get_pandas_estimated_parameters( estimation_results=summary_results, ) display(pandas_results) .. rst-class:: sphx-glr-script-out .. code-block:: none Name Value (mean) ... ESS (bulk) ESS (tail) 0 asc_train -1.256687 ... 3361.105274 4175.538115 1 asc_car -0.041481 ... 3554.013888 4136.333379 2 scale_not_group3 0.356430 ... 3550.209455 4113.504421 3 scale_group3 1.488252 ... 3285.928568 4094.431218 4 b_time -1.052728 ... 3382.573853 3896.216841 [5 rows x 12 columns] .. GENERATED FROM PYTHON SOURCE LINES 121-122 Report the variables stored in the Bayesian estimation results. .. GENERATED FROM PYTHON SOURCE LINES 122-123 .. code-block:: Python display(summary_results.report_stored_variables()) .. rst-class:: sphx-glr-script-out .. code-block:: none group variable dims shape 0 constant_data CAR_AV_SP [obs] [6768] 1 constant_data CAR_CO_SCALED [obs] [6768] 2 constant_data CAR_TT_SCALED [obs] [6768] 3 constant_data CHOICE [obs] [6768] 4 constant_data GROUP [obs] [6768] 5 constant_data SM_AV [obs] [6768] 6 constant_data SM_COST_SCALED [obs] [6768] 7 constant_data SM_TT_SCALED [obs] [6768] 8 constant_data TRAIN_AV_SP [obs] [6768] 9 constant_data TRAIN_COST_SCALED [obs] [6768] 10 constant_data TRAIN_TT_SCALED [obs] [6768] 11 log_likelihood _choice [chain, draw, obs] [4, 2000, 6768] 12 posterior asc_car [chain, draw] [4, 2000] 13 posterior asc_train [chain, draw] [4, 2000] 14 posterior b_time [chain, draw] [4, 2000] 15 posterior log_like [chain, draw, obs] [4, 2000, 6768] 16 posterior scale_group3 [chain, draw] [4, 2000] 17 posterior scale_not_group3 [chain, draw] [4, 2000] 18 prior asc_car [chain, draw] [1, 2000] 19 prior asc_train [chain, draw] [1, 2000] 20 prior b_time [chain, draw] [1, 2000] 21 prior log_like [chain, draw, obs] [1, 2000, 6768] 22 prior scale_group3 [chain, draw] [1, 2000] 23 prior scale_not_group3 [chain, draw] [1, 2000] 24 sample_stats acceptance_rate [chain, draw] [4, 2000] 25 sample_stats diverging [chain, draw] [4, 2000] 26 sample_stats energy [chain, draw] [4, 2000] 27 sample_stats lp [chain, draw] [4, 2000] 28 sample_stats n_steps [chain, draw] [4, 2000] 29 sample_stats step_size [chain, draw] [4, 2000] 30 sample_stats tree_depth [chain, draw] [4, 2000] .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 0.033 seconds) .. _sphx_glr_download_auto_examples_bayesian_swissmetro_plot_b03_scale.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_b03_scale.ipynb ` .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_b03_scale.py ` .. container:: sphx-glr-download sphx-glr-download-zip :download:`Download zipped: plot_b03_scale.zip ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_