.. 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-27 .. code-block:: Python from IPython.core.display_functions import display from biogeme.bayesian_estimation import BayesianResults, get_pandas_estimated_parameters from biogeme.biogeme import BIOGEME from biogeme.expressions import Beta from biogeme.models import loglogit .. GENERATED FROM PYTHON SOURCE LINES 28-29 See the data processing script: :ref:`swissmetro_data`. .. GENERATED FROM PYTHON SOURCE LINES 29-44 .. 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, ) .. GENERATED FROM PYTHON SOURCE LINES 45-46 The scale parameters must stay away from zero. We define a small but positive lower bound .. GENERATED FROM PYTHON SOURCE LINES 46-47 .. code-block:: Python POSITIVE_LOWER_BOUND = 1.0e-5 .. GENERATED FROM PYTHON SOURCE LINES 48-49 Parameters to be estimated. .. GENERATED FROM PYTHON SOURCE LINES 49-57 .. 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 58-59 Definition of the utility functions. .. GENERATED FROM PYTHON SOURCE LINES 59-63 .. 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 64-65 Scale associated with group 3 is estimated. .. GENERATED FROM PYTHON SOURCE LINES 65-67 .. code-block:: Python scale = (GROUP != 3) * scale_not_group3 + (GROUP == 3) * scale_group3 .. GENERATED FROM PYTHON SOURCE LINES 68-70 Scale the utility functions, and associate them with the numbering of alternatives. .. GENERATED FROM PYTHON SOURCE LINES 70-72 .. code-block:: Python v = {1: scale * v_train, 2: scale * v_swissmetro, 3: scale * v_car} .. GENERATED FROM PYTHON SOURCE LINES 73-74 Associate the availability conditions with the alternatives. .. GENERATED FROM PYTHON SOURCE LINES 74-76 .. code-block:: Python av = {1: TRAIN_AV_SP, 2: SM_AV, 3: CAR_AV_SP} .. GENERATED FROM PYTHON SOURCE LINES 77-79 Definition of the model. This is the contribution of each observation to the log likelihood function. .. GENERATED FROM PYTHON SOURCE LINES 79-81 .. code-block:: Python logprob = loglogit(v, av, CHOICE) .. GENERATED FROM PYTHON SOURCE LINES 82-83 These notes will be included as such in the report file. .. GENERATED FROM PYTHON SOURCE LINES 83-88 .. 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 89-90 Create the Biogeme object. .. GENERATED FROM PYTHON SOURCE LINES 90-93 .. code-block:: Python the_biogeme = BIOGEME(database, logprob, user_notes=USER_NOTES) the_biogeme.model_name = 'b03_scale' .. GENERATED FROM PYTHON SOURCE LINES 94-95 Estimate the parameters. .. GENERATED FROM PYTHON SOURCE LINES 95-102 .. code-block:: Python try: results = BayesianResults.from_netcdf( filename=f'saved_results/{the_biogeme.model_name}.nc' ) except FileNotFoundError: results = the_biogeme.bayesian_estimation() .. rst-class:: sphx-glr-script-out .. code-block:: none load finished in 4538 ms (4.54 s) .. GENERATED FROM PYTHON SOURCE LINES 103-105 .. code-block:: Python print(results.short_summary()) .. rst-class:: sphx-glr-script-out .. code-block:: none posterior_predictive_loglike finished in 262 ms expected_log_likelihood finished in 11 ms best_draw_log_likelihood finished in 11 ms waic_res finished in 704 ms waic finished in 704 ms loo_res finished in 7974 ms (7.97 s) loo finished in 7974 ms (7.97 s) 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:00:46.865756 Posterior predictive log-likelihood (sum of log mean p) -4975.45 Expected log-likelihood E[log L(Y|θ)] -4979.15 Best-draw log-likelihood (posterior upper bound) -4976.71 WAIC (Widely Applicable Information Criterion) -4982.88 WAIC Standard Error 53.94 Effective number of parameters (p_WAIC) 7.42 LOO (Leave-One-Out Cross-Validation) -4982.88 LOO Standard Error 53.94 Effective number of parameters (p_LOO) 7.43 .. GENERATED FROM PYTHON SOURCE LINES 106-107 Get the results in a pandas table .. GENERATED FROM PYTHON SOURCE LINES 107-109 .. code-block:: Python pandas_results = get_pandas_estimated_parameters(estimation_results=results) display(pandas_results) .. rst-class:: sphx-glr-script-out .. code-block:: none Name Value (mean) ... ESS (bulk) ESS (tail) 0 asc_train -1.254377 ... 3542.313400 4327.622563 1 asc_car -0.042057 ... 3850.083378 4634.164946 2 scale_not_group3 0.357689 ... 3672.097395 4144.399754 3 scale_group3 1.490217 ... 3513.553977 4356.330711 4 b_time -1.051782 ... 3508.996986 4312.974517 [5 rows x 12 columns] .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 37.435 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 `_