pybhatlib 0.2.0__tar.gz → 0.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/.gitignore +8 -0
  2. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/PKG-INFO +17 -1
  3. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/README.md +16 -0
  4. pybhatlib-0.3.1/examples/data/TRAVELMODE.csv +1126 -0
  5. pybhatlib-0.3.1/examples/mnp_age45.py +45 -0
  6. pybhatlib-0.3.1/examples/mnp_mixture.py +51 -0
  7. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t00_quickstart.py +2 -0
  8. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t01a_vectorization.py +2 -0
  9. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t01b_ldlt.py +2 -0
  10. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t01c_truncated_mvn.py +2 -0
  11. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t02a_gradcovcor.py +2 -0
  12. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t02b_spherical.py +2 -0
  13. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t02c_chain_rules.py +2 -0
  14. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t03a_mvncd_methods.py +2 -0
  15. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t03b_mvncd_gradients.py +2 -0
  16. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t03c_mvncd_rect.py +2 -0
  17. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t03d_univariate_cdfs.py +2 -0
  18. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t03e_bhat2018_table1.py +368 -366
  19. pybhatlib-0.3.1/examples/tutorials/python_scripts/t04a_mnp_iid.py +183 -0
  20. pybhatlib-0.3.1/examples/tutorials/python_scripts/t04b_mnp_flexible_cov.py +194 -0
  21. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t04c_mnp_heteronly.py +2 -0
  22. pybhatlib-0.3.1/examples/tutorials/python_scripts/t04d_mnp_random_coefficients.py +232 -0
  23. pybhatlib-0.3.1/examples/tutorials/python_scripts/t04e_mnp_mixture.py +209 -0
  24. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t04f_mnp_control_options.py +2 -0
  25. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t04g_mnp_forecasting.py +2 -0
  26. pybhatlib-0.3.1/examples/tutorials/python_scripts/t04h_bhatlib_table1.py +447 -0
  27. pybhatlib-0.3.1/examples/tutorials/python_scripts/t04i_bhat2018_table2.py +609 -0
  28. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t05b_morp_ate_predict.py +2 -0
  29. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t06a_backend_switching.py +2 -0
  30. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t06b_custom_specs.py +2 -0
  31. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/python_scripts/t06c_gradient_verification.py +2 -0
  32. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t00_quickstart.ipynb +1 -1
  33. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t01a_vectorization.ipynb +1 -1
  34. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t01b_ldlt.ipynb +1 -1
  35. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t01c_truncated_mvn.ipynb +1 -1
  36. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t02a_gradcovcor.ipynb +1 -1
  37. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t02b_spherical.ipynb +1 -1
  38. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t02c_chain_rules.ipynb +1 -1
  39. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t03a_mvncd_methods.ipynb +2 -2
  40. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t03b_mvncd_gradients.ipynb +1 -1
  41. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t03c_mvncd_rect.ipynb +1 -1
  42. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t03d_univariate_cdfs.ipynb +1 -1
  43. pybhatlib-0.3.1/examples/tutorials/t03e_bhat2018_table1.ipynb +44 -0
  44. pybhatlib-0.3.1/examples/tutorials/t04a_mnp_iid.ipynb +99 -0
  45. pybhatlib-0.3.1/examples/tutorials/t04b_mnp_flexible_cov.ipynb +115 -0
  46. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t04c_mnp_heteronly.ipynb +1 -1
  47. pybhatlib-0.3.1/examples/tutorials/t04d_mnp_random_coefficients.ipynb +99 -0
  48. pybhatlib-0.3.1/examples/tutorials/t04e_mnp_mixture.ipynb +99 -0
  49. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t04f_mnp_control_options.ipynb +1 -1
  50. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t04g_mnp_forecasting.ipynb +1 -1
  51. pybhatlib-0.3.1/examples/tutorials/t04h_bhatlib_table1.ipynb +163 -0
  52. pybhatlib-0.3.1/examples/tutorials/t04i_bhat2018_table2.ipynb +163 -0
  53. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t05b_morp_ate_predict.ipynb +1 -1
  54. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t06a_backend_switching.ipynb +1 -1
  55. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t06b_custom_specs.ipynb +1 -1
  56. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/t06c_gradient_verification.ipynb +1 -1
  57. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/pyproject.toml +1 -1
  58. pybhatlib-0.3.1/src/pybhatlib/gradmvn/__init__.py +52 -0
  59. pybhatlib-0.3.1/src/pybhatlib/gradmvn/_cond_trunc_grads.py +471 -0
  60. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/gradmvn/_mvncd.py +194 -0
  61. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/gradmvn/_mvncd_grad.py +28 -15
  62. pybhatlib-0.3.1/src/pybhatlib/gradmvn/_mvncd_grad_analytic.py +255 -0
  63. pybhatlib-0.3.1/src/pybhatlib/gradmvn/_ordering.py +143 -0
  64. pybhatlib-0.3.1/src/pybhatlib/gradmvn/_trunc_grads.py +562 -0
  65. pybhatlib-0.3.1/src/pybhatlib/gradmvn/_univariate.py +335 -0
  66. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/matgradient/__init__.py +3 -0
  67. pybhatlib-0.3.1/src/pybhatlib/matgradient/_mat_grad_helpers.py +325 -0
  68. pybhatlib-0.3.1/src/pybhatlib/matgradient/_radial.py +181 -0
  69. pybhatlib-0.3.1/src/pybhatlib/matgradient/_spherical.py +252 -0
  70. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/mnp/_mnp_ate.py +3 -4
  71. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/mnp/_mnp_control.py +1 -0
  72. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/mnp/_mnp_forecast.py +1 -1
  73. pybhatlib-0.3.1/src/pybhatlib/models/mnp/_mnp_grad_analytic.py +386 -0
  74. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/mnp/_mnp_loglik.py +19 -9
  75. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/mnp/_mnp_model.py +277 -40
  76. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/mnp/_mnp_results.py +8 -5
  77. pybhatlib-0.3.1/tests/test_gradmvn/test_cond_trunc_grads.py +492 -0
  78. pybhatlib-0.3.1/tests/test_gradmvn/test_mvncd_grad_analytic.py +302 -0
  79. pybhatlib-0.3.1/tests/test_gradmvn/test_ordering.py +277 -0
  80. pybhatlib-0.3.1/tests/test_gradmvn/test_trunc_grads.py +473 -0
  81. pybhatlib-0.3.1/tests/test_matgradient/test_mat_grad_helpers.py +359 -0
  82. pybhatlib-0.3.1/tests/test_matgradient/test_radial.py +218 -0
  83. pybhatlib-0.3.1/tests/test_matgradient/test_spherical.py +244 -0
  84. pybhatlib-0.3.1/tests/test_models/test_mnp_grad.py +586 -0
  85. pybhatlib-0.2.0/CLAUDE.md +0 -42
  86. pybhatlib-0.2.0/IMPLEMENTATION_PLAN.md +0 -497
  87. pybhatlib-0.2.0/src/pybhatlib/gradmvn/__init__.py +0 -24
  88. pybhatlib-0.2.0/src/pybhatlib/gradmvn/_univariate.py +0 -193
  89. pybhatlib-0.2.0/src/pybhatlib/matgradient/_spherical.py +0 -190
  90. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/LICENSE +0 -0
  91. /pybhatlib-0.2.0/examples/data/TRAVELMODE.csv → /pybhatlib-0.3.1/examples/data/TRAVELMODE_synthetic.csv +0 -0
  92. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/data/generate_travelmode.py +0 -0
  93. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/mnp_ate_analysis.py +0 -0
  94. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/mnp_flexible_cov.py +0 -0
  95. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/mnp_iid.py +0 -0
  96. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/mnp_random_coefficients.py +0 -0
  97. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/morp_example.py +0 -0
  98. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/examples/tutorials/_convert_to_ipynb.py +0 -0
  99. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/__init__.py +0 -0
  100. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/_version.py +0 -0
  101. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/backend/__init__.py +0 -0
  102. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/backend/_array_api.py +0 -0
  103. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/backend/_numpy_backend.py +0 -0
  104. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/backend/_torch_backend.py +0 -0
  105. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/gradmvn/_bivariate_trunc.py +0 -0
  106. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/gradmvn/_mvncd_ssj.py +0 -0
  107. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/gradmvn/_other_dists.py +0 -0
  108. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/gradmvn/_partial_cdf.py +0 -0
  109. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/gradmvn/_truncated.py +0 -0
  110. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/io/__init__.py +0 -0
  111. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/io/_data_loader.py +0 -0
  112. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/io/_spec_parser.py +0 -0
  113. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/matgradient/_chain_rules.py +0 -0
  114. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/matgradient/_gomegxomegax.py +0 -0
  115. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/matgradient/_gradcovcor.py +0 -0
  116. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/__init__.py +0 -0
  117. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/_base.py +0 -0
  118. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/mnp/__init__.py +0 -0
  119. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/morp/__init__.py +0 -0
  120. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/morp/_morp_ate.py +0 -0
  121. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/morp/_morp_control.py +0 -0
  122. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/morp/_morp_forecast.py +0 -0
  123. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/morp/_morp_loglik.py +0 -0
  124. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/morp/_morp_model.py +0 -0
  125. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/models/morp/_morp_results.py +0 -0
  126. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/optim/__init__.py +0 -0
  127. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/optim/_convergence.py +0 -0
  128. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/optim/_scipy_optim.py +0 -0
  129. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/optim/_torch_optim.py +0 -0
  130. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/utils/__init__.py +0 -0
  131. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/utils/_qmc.py +0 -0
  132. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/utils/_seeds.py +0 -0
  133. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/utils/_validation.py +0 -0
  134. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/vecup/__init__.py +0 -0
  135. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/vecup/_ldlt.py +0 -0
  136. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/vecup/_mask.py +0 -0
  137. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/vecup/_nondiag.py +0 -0
  138. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/vecup/_truncnorm.py +0 -0
  139. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/src/pybhatlib/vecup/_vec_ops.py +0 -0
  140. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/__init__.py +0 -0
  141. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/conftest.py +0 -0
  142. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_backend/__init__.py +0 -0
  143. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_backend/test_array_api.py +0 -0
  144. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_gradmvn/__init__.py +0 -0
  145. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_gradmvn/test_bivariate_trunc.py +0 -0
  146. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_gradmvn/test_mvncd.py +0 -0
  147. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_gradmvn/test_mvncd_methods.py +0 -0
  148. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_gradmvn/test_mvncd_rect.py +0 -0
  149. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_gradmvn/test_other_dists.py +0 -0
  150. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_integration/__init__.py +0 -0
  151. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_matgradient/__init__.py +0 -0
  152. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_matgradient/test_gradcovcor.py +0 -0
  153. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_models/__init__.py +0 -0
  154. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_models/test_mnp_control.py +0 -0
  155. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_models/test_morp.py +0 -0
  156. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_vecup/__init__.py +0 -0
  157. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_vecup/test_ldlt.py +0 -0
  158. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_vecup/test_ldlt_rank2.py +0 -0
  159. {pybhatlib-0.2.0 → pybhatlib-0.3.1}/tests/test_vecup/test_vec_ops.py +0 -0
@@ -30,6 +30,14 @@ htmlcov/
30
30
  *.pdf
31
31
  results/
32
32
 
33
+ # Original GAUSS source
34
+ chandra_code/
35
+
36
+ # Project-local docs (not for repo)
37
+ CLAUDE.md
38
+ GAUSS_INTEGRATION_PLAN.md
39
+ IMPLEMENTATION_PLAN.md
40
+
33
41
  # OS
34
42
  .DS_Store
35
43
  Thumbs.db
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pybhatlib
3
- Version: 0.2.0
3
+ Version: 0.3.1
4
4
  Summary: Python implementation of BHATLIB: matrix-based inference for advanced econometric models
5
5
  Project-URL: Homepage, https://github.com/UMN-Choi-Lab/pybhatlib
6
6
  Project-URL: Repository, https://github.com/UMN-Choi-Lab/pybhatlib
@@ -96,6 +96,22 @@ results.summary()
96
96
  - **Dual backend**: NumPy (default) + optional PyTorch with GPU support
97
97
  - **Post-estimation**: Average Treatment Effects (ATE), forecasting
98
98
 
99
+ ## Verification
100
+
101
+ pybhatlib reproduces Table 1 from the BHATLIB paper (Bhat 2018) using synthetic
102
+ TRAVELMODE data with 3 travel modes (DA, SR, TR) and 210 observations:
103
+
104
+ | Model | Specification | Target LL | Achieved LL | Status |
105
+ |-------|--------------|-----------|-------------|--------|
106
+ | (a)(i) | IID errors | -670.956 | -670.956 | Exact match |
107
+ | (a)(ii) | Flexible covariance | -661.111 | -661.111 | Exact match |
108
+ | (b) | + AGE45 demographics | -659.285 | -659.284 | Exact match |
109
+ | (c) | + Random coeff. OVTT | -635.871 | -635.871 | Exact match |
110
+ | (d) | 2-segment mixture | -634.975 | -632.912 | Close (synthetic data) |
111
+
112
+ Models (a)–(c) match the published results exactly. Model (d) achieves a slightly
113
+ better log-likelihood due to multiple local optima in mixture models with synthetic data.
114
+
99
115
  ## References
100
116
 
101
117
  1. Bhat, C. R. (2018). New Matrix-Based Methods for the Analytic Evaluation of the
@@ -58,6 +58,22 @@ results.summary()
58
58
  - **Dual backend**: NumPy (default) + optional PyTorch with GPU support
59
59
  - **Post-estimation**: Average Treatment Effects (ATE), forecasting
60
60
 
61
+ ## Verification
62
+
63
+ pybhatlib reproduces Table 1 from the BHATLIB paper (Bhat 2018) using synthetic
64
+ TRAVELMODE data with 3 travel modes (DA, SR, TR) and 210 observations:
65
+
66
+ | Model | Specification | Target LL | Achieved LL | Status |
67
+ |-------|--------------|-----------|-------------|--------|
68
+ | (a)(i) | IID errors | -670.956 | -670.956 | Exact match |
69
+ | (a)(ii) | Flexible covariance | -661.111 | -661.111 | Exact match |
70
+ | (b) | + AGE45 demographics | -659.285 | -659.284 | Exact match |
71
+ | (c) | + Random coeff. OVTT | -635.871 | -635.871 | Exact match |
72
+ | (d) | 2-segment mixture | -634.975 | -632.912 | Close (synthetic data) |
73
+
74
+ Models (a)–(c) match the published results exactly. Model (d) achieves a slightly
75
+ better log-likelihood due to multiple local optima in mixture models with synthetic data.
76
+
61
77
  ## References
62
78
 
63
79
  1. Bhat, C. R. (2018). New Matrix-Based Methods for the Analytic Evaluation of the