5. MIMIC model - Bayesian estimation

This script estimates a pure MIMIC model (latent-variable structural and measurement equations only) using Bayesian estimation in Biogeme, without an associated discrete choice model.

It is primarily intended to:

  • assess identification and normalization under Bayesian inference,

  • inspect posterior distributions of latent-variable parameters, and

  • provide a Bayesian benchmark for comparison with the maximum likelihood MIMIC specification.

The configuration is defined locally in this file and passed to the generic estimation pipeline via estimate_model().

Michel Bierlaire Thu Dec 25 2025, 08:27:04

Biogeme parameters read from biogeme.toml.
Loaded NetCDF file size: 3.7 GB
load finished in 19600 ms (19.60 s)
Results are read from the file saved_results/b05_mimic_bayes.nc.
posterior_predictive_loglike finished in 409 ms
expected_log_likelihood finished in 38 ms
best_draw_log_likelihood finished in 15 ms
/Users/bierlair/python_envs/venv313/lib/python3.13/site-packages/arviz/stats/stats.py:1667: UserWarning: For one or more samples the posterior variance of the log predictive densities exceeds 0.4. This could be indication of WAIC starting to fail.
See http://arxiv.org/abs/1507.04544 for details
  warnings.warn(
waic_res finished in 917 ms
waic finished in 917 ms
/Users/bierlair/python_envs/venv313/lib/python3.13/site-packages/arviz/stats/stats.py:1057: RuntimeWarning: overflow encountered in exp
  weights = 1 / np.exp(len_scale - len_scale[:, None]).sum(axis=1)
/Users/bierlair/python_envs/venv313/lib/python3.13/site-packages/numpy/_core/_methods.py:52: RuntimeWarning: overflow encountered in reduce
  return umr_sum(a, axis, dtype, out, keepdims, initial, where)
/Users/bierlair/python_envs/venv313/lib/python3.13/site-packages/arviz/stats/stats.py:797: UserWarning: Estimated shape parameter of Pareto distribution is greater than 0.70 for one or more samples. You should consider using a more robust model, this is because importance sampling is less likely to work well if the marginal posterior and LOO posterior are very different. This is more likely to happen with a non-robust model and highly influential observations.
  warnings.warn(
loo_res finished in 111674 ms (1.86 min)
loo finished in 111674 ms (1.86 min)
Sample size                                              896
Sampler                                                  NUTS
Number of chains                                         4
Number of draws per chain                                20000
Total number of draws                                    80000
Acceptance rate target                                   0.9
Run time                                                 1:22:03.523915
Posterior predictive log-likelihood (sum of log mean p)  -15711.05
Expected log-likelihood E[log L(Y|θ)]                    -16076.55
Best-draw log-likelihood (posterior upper bound)         -15859.21
WAIC (Widely Applicable Information Criterion)           -16719.13
WAIC Standard Error                                      133.66
Effective number of parameters (p_WAIC)                  1008.08
LOO (Leave-One-Out Cross-Validation)                     -17075.85
LOO Standard Error                                       134.29
Effective number of parameters (p_LOO)                   1364.79
Diagnostics computation took 413.1 seconds (cached).
                                                 Name  ...    ESS (tail)
0                       measurement_intercept_Mobil09  ...     25.676998
1   measurement_coefficient_car_centric_attitude_M...  ...     68.310889
2          struct_car_centric_attitude_high_education  ...     64.250043
3             struct_car_centric_attitude_top_manager  ...    413.443208
4               struct_car_centric_attitude_employees  ...     25.717927
5             struct_car_centric_attitude_age_30_less  ...     60.226576
6            struct_car_centric_attitude_ScaledIncome  ...     25.319067
7    struct_car_centric_attitude_car_oriented_parents  ...     26.318717
8                       measurement_intercept_Mobil10  ...     38.177817
9   measurement_coefficient_car_centric_attitude_M...  ...    127.304390
10                      measurement_intercept_Envir06  ...   6055.927755
11  measurement_coefficient_car_centric_attitude_E...  ...  34812.325368
12  measurement_coefficient_environmental_attitude...  ...     27.970389
13          struct_environmental_attitude_childSuburb  ...     25.899591
14         struct_environmental_attitude_ScaledIncome  ...     25.521342
15   struct_environmental_attitude_city_center_as_kid  ...     26.723825
16             struct_environmental_attitude_artisans  ...     37.236990
17       struct_environmental_attitude_high_education  ...     25.021854
18        struct_environmental_attitude_low_education  ...     27.069041
19                      measurement_intercept_Envir03  ...     25.187457
20  measurement_coefficient_environmental_attitude...  ...     27.100477
21                      measurement_intercept_Envir05  ...     28.519236
22  measurement_coefficient_environmental_attitude...  ...     26.992859
23                     measurement_intercept_LifSty01  ...    384.332414
24  measurement_coefficient_environmental_attitude...  ...     25.635101
25                      measurement_intercept_Envir04  ...     26.890580
26  measurement_coefficient_environmental_attitude...  ...     27.437842
27                      measurement_intercept_Mobil05  ...     24.809665
28  measurement_coefficient_car_centric_attitude_M...  ...  20833.296376
29                      measurement_intercept_Mobil12  ...     26.343255
30  measurement_coefficient_environmental_attitude...  ...     25.090585
31                      measurement_intercept_Mobil03  ...     25.343171
32  measurement_coefficient_car_centric_attitude_M...  ...     95.766135
33                        measurement_intercept_NbCar  ...     24.899076
34  measurement_coefficient_car_centric_attitude_N...  ...     28.352519
35                      measurement_intercept_Mobil08  ...     74.374083
36  measurement_coefficient_car_centric_attitude_M...  ...    380.310761
37                     measurement_intercept_LifSty07  ...    316.056785
38  measurement_coefficient_car_centric_attitude_L...  ...     51.445363
39  measurement_coefficient_environmental_attitude...  ...     27.079945
40  measurement_coefficient_car_centric_attitude_E...  ...     25.840077
41                  struct_car_centric_attitude_sigma  ...     26.535305
42                          measurement_Mobil09_sigma  ...     26.612312
43                                     likert_delta_0  ...     26.672270
44                                     likert_delta_1  ...     27.549451
45                          measurement_Mobil10_sigma  ...     56.812297
46                struct_environmental_attitude_sigma  ...     26.876701
47                          measurement_Envir06_sigma  ...     27.270297
48                          measurement_Envir03_sigma  ...     26.200351
49                          measurement_Envir05_sigma  ...     26.459742
50                         measurement_LifSty01_sigma  ...     26.301306
51                          measurement_Envir04_sigma  ...     26.522483
52                          measurement_Mobil05_sigma  ...     25.416288
53                          measurement_Mobil12_sigma  ...     24.639963
54                          measurement_Mobil03_sigma  ...     25.997392
55                                       cars_delta_1  ...     34.868446
56                                       cars_delta_2  ...     64.370845
57                          measurement_Mobil08_sigma  ...     25.170287
58                         measurement_LifSty07_sigma  ...     26.071971
59                          measurement_Envir02_sigma  ...     27.232333

[60 rows x 12 columns]

import biogeme.biogeme_logging as blog

from config import Config
from estimate import estimate_model

logger = blog.get_screen_logger(level=blog.INFO)

the_config = Config(
    name='b05_mimic_bayes',
    latent_variables="two",
    choice_model="no",
    estimation="bayes",
    number_of_bayesian_draws_per_chain=20_000,
    number_of_monte_carlo_draws=20_000,
)

estimate_model(config=the_config)

Total running time of the script: (9 minutes 15.259 seconds)

Gallery generated by Sphinx-Gallery