22: MTC Motorized and Non-Motorized Nested Mode Choice

For this example, we’re going to re-create model 22 from the Self Instructing Manual. (pp. 179)

This model is a nested logit model using the same utility function as model 17, so we can start with that model and just add the nesting structure.

m = larch.example(17)

We will create seperate nests for the motorized and non-motorized alternatives.

motorized = m.graph.new_node(parameter='mu_motor', children=[1,2,3,4], name='Motorized')
nonmotorized = m.graph.new_node(parameter='mu_nonmotor', children=[5,6], name='Nonmotorized')

That’s it! We’re basically ready to estimate.

>>> m.load_data()
>>> m.maximize_loglike()
┣ ...Optimization terminated successfully...
>>> m.loglike()
-3441.67...

>>> print(m.pfo()[['value','initvalue','nullvalue','minimum','maximum','holdfast']])
                               value  initvalue  nullvalue  minimum  maximum  holdfast
Category  Parameter
LOS       costbyincome        -0.039        0.0        0.0     -inf      inf         0
          motorized_time      -0.015        0.0        0.0     -inf      inf         0
          nonmotorized_time   -0.046        0.0        0.0     -inf      inf         0
          motorized_ovtbydist -0.114        0.0        0.0     -inf      inf         0
Zonal     wkcbd_BIKE           0.408        0.0        0.0     -inf      inf         0
          wkcbd_SR2            0.193        0.0        0.0     -inf      inf         0
          wkcbd_SR3            0.781        0.0        0.0     -inf      inf         0
          wkcbd_TRANSIT        0.921        0.0        0.0     -inf      inf         0
          wkcbd_WALK           0.114        0.0        0.0     -inf      inf         0
          wkempden_BIKE        0.002        0.0        0.0     -inf      inf         0
          wkempden_SR2         0.001        0.0        0.0     -inf      inf         0
          wkempden_SR3         0.002        0.0        0.0     -inf      inf         0
          wkempden_TRANSIT     0.002        0.0        0.0     -inf      inf         0
          wkempden_WALK        0.002        0.0        0.0     -inf      inf         0
Household hhinc#4             -0.004        0.0        0.0     -inf      inf         0
          hhinc#5             -0.010        0.0        0.0     -inf      inf         0
          hhinc#6             -0.006        0.0        0.0     -inf      inf         0
          vehbywrk_BIKE       -0.735        0.0        0.0     -inf      inf         0
          vehbywrk_SR         -0.226        0.0        0.0     -inf      inf         0
          vehbywrk_TRANSIT    -0.707        0.0        0.0     -inf      inf         0
          vehbywrk_WALK       -0.764        0.0        0.0     -inf      inf         0
ASCs      ASC_BIKE            -1.201        0.0        0.0     -inf      inf         0
          ASC_SR2             -1.325        0.0        0.0     -inf      inf         0
          ASC_SR3             -2.506        0.0        0.0     -inf      inf         0
          ASC_TRANSIT         -0.404        0.0        0.0     -inf      inf         0
          ASC_WALK             0.345        0.0        0.0     -inf      inf         0
Other     mu_motor             0.726        1.0        1.0    0.001      1.0         0
          mu_nonmotor          0.769        1.0        1.0    0.001      1.0         0

Tip

If you want access to the model in this example without worrying about assembling all the code blocks together on your own, you can load a read-to-estimate copy like this:

m = larch.example(22)