# Discrete choice model

I have a ordinal probit model. The dependent variable, say walkability, is a Likert scale variable (1,2,3). The main independent variable, say connectivity, is also a Likert scale variable (1,2,3). The other variables are dummies. There are two things that I am getting confused by:

1. When I run the ordinal probit model in Stata, it gives one coefficient, std. error, p-value for the independent variable (connectivity). Shouldn't I have statistics for all options? Is there a specific command for it? Or is it ok to have one value?
2. How do we compute marginal effects when both dependent and independent variables are discrete (1,2,3 scale variables)?

1. You only get one coefficient in an ordinal probit model because you are actually fitting the model for a latent continuous variable y* (rather than, say, the log-odds of each alternative relative to the base alternative in a multinomial logit model). Think about it this way: The ordinal variable categories are rankings, such that although your outcomes may have been coded as 0, 1, 2, 3, 4, etc., the "distance" between category 0 and category 1 may not be the same as the distance between category 1 and category 2, and so on. For example, if the ordinal variable was a patient's response to the question of how well he or she can perform a specific activity of daily living unassisted, and the categories are:

0 - Not well at all
1 - Somewhat not well
2 - Neutral
3 - Somewhat well
4 - Extremely well


The distance between "Not well at all" and "Somewhat not well" may not be the same as the distance between "Somewhat not well" and "Neutral"

By definition, y* is unobservable, but we can model the thresholds (boundaries)for each category. In Stata, along with coefficients for your model covariates, you should have also got (k-1) intercepts, where k is the number of categories in your ordinal outcome variable. These intercepts are given as /cut1, /cut2, ... ,/cut(k-1).

2. You would compute the average marginal effects of a categorical predictor after running -oprobit- just as you would other models, and that is by using the -margins- command. Note that you need to specify which category you want the average marginal effects for, otherwise Stata will choose a category for you.

A trivial example:

First fit the model

. webuse fullauto,clear
(Automobile Models)

. xtile pricequint=price,n(5)

. label define pq 1"Lowest" 2"Lowest" 3"Middle" 4"Higher" 5"Highest",replace

. label value priceq pq

. oprobit rep78  i.pricequint

Iteration 0:   log likelihood = -93.692061
Iteration 1:   log likelihood = -92.643441
Iteration 2:   log likelihood = -92.643323
Iteration 3:   log likelihood = -92.643323

Ordered probit regression                         Number of obs   =         69
LR chi2(4)      =       2.10
Prob > chi2     =     0.7178
Log likelihood = -92.643323                       Pseudo R2       =     0.0112

------------------------------------------------------------------------------
rep78 |      Coef.   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
pricequint |
Lowest  |  -.1271055   .4100538    -0.31   0.757    -.9307962    .6765851
Middle  |  -.0845474   .3940693    -0.21   0.830     -.856909    .6878142
Higher  |   .3882535   .4029081     0.96   0.335    -.4014319    1.177939
Highest  |   .1246315   .4102926     0.30   0.761    -.6795273    .9287903
-------------+----------------------------------------------------------------
/cut1 |  -1.865516   .3978601                     -2.645308   -1.085725
/cut2 |  -1.013338   .3095532                     -1.620051    -.406625
/cut3 |   .2638664   .3002598                     -.3246321    .8523649
/cut4 |   1.076626   .3157065                      .4578531      1.6954
------------------------------------------------------------------------------


Then run the -margins- command for each category. REP78 category == Poor

. margins, dydx(*) predict(outcome(1))

Conditional marginal effects                      Number of obs   =         69
Model VCE    : OIM

Expression   : Pr(rep78==1), predict(outcome(1))
dy/dx w.r.t. : 2.pricequint 3.pricequint 4.pricequint 5.pricequint

------------------------------------------------------------------------------
|            Delta-method
|      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
pricequint |
Lowest  |   .0100147   .0330296     0.30   0.762    -.0547221    .0747515
Middle  |   .0064042   .0300529     0.21   0.831    -.0524983    .0653067
Higher  |  -.0189492     .02406    -0.79   0.431    -.0661059    .0282074
Highest  |  -.0077672   .0258943    -0.30   0.764    -.0585191    .0429847
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.


REP78 category == Fair

. margins, dydx(*) predict(outcome(2))

Conditional marginal effects                      Number of obs   =         69
Model VCE    : OIM

Expression   : Pr(rep78==2), predict(outcome(2))
dy/dx w.r.t. : 2.pricequint 3.pricequint 4.pricequint 5.pricequint

------------------------------------------------------------------------------
|            Delta-method
|      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
pricequint |
Lowest  |   .0222821   .0722996     0.31   0.758    -.1194225    .1639866
Middle  |   .0146452    .068373     0.21   0.830    -.1193634    .1486538
Higher  |  -.0559815    .059961    -0.93   0.350    -.1735029    .0615399
Highest  |  -.0201156   .0663317    -0.30   0.762    -.1501233    .1098922
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.


REP78 category == Average

. margins, dydx(*) predict(outcome(3))

Conditional marginal effects                      Number of obs   =         69
Model VCE    : OIM

Expression   : Pr(rep78==3), predict(outcome(3))
dy/dx w.r.t. : 2.pricequint 3.pricequint 4.pricequint 5.pricequint

------------------------------------------------------------------------------
|            Delta-method
|      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
pricequint |
Lowest  |   .0157357   .0511898     0.31   0.759    -.0845945    .1160659
Middle  |   .0111273   .0523686     0.21   0.832    -.0915133    .1137679
Higher  |  -.0786234   .0835623    -0.94   0.347    -.2424024    .0851556
Highest  |  -.0208081   .0692807    -0.30   0.764    -.1565958    .1149797
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.


REP78 category == Good

. margins, dydx(*) predict(outcome(4))

Conditional marginal effects                      Number of obs   =         69
Model VCE    : OIM

Expression   : Pr(rep78==4), predict(outcome(4))
dy/dx w.r.t. : 2.pricequint 3.pricequint 4.pricequint 5.pricequint

------------------------------------------------------------------------------
|            Delta-method
|      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
pricequint |
Lowest  |  -.0215554   .0697354    -0.31   0.757    -.1582343    .1151234
Middle  |  -.0141387   .0658856    -0.21   0.830    -.1432722    .1149947
Higher  |   .0487688   .0536304     0.91   0.363    -.0563448    .1538823
Highest  |   .0189647   .0623698     0.30   0.761    -.1032778    .1412071
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.


REP78 category == Excellent

. margins, dydx(*) predict(outcome(5))

Conditional marginal effects                      Number of obs   =         69
Model VCE    : OIM

Expression   : Pr(rep78==5), predict(outcome(5))
dy/dx w.r.t. : 2.pricequint 3.pricequint 4.pricequint 5.pricequint

------------------------------------------------------------------------------
|            Delta-method
|      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
pricequint |
Lowest  |   -.026477   .0854652    -0.31   0.757    -.1939857    .1410317
Middle  |   -.018038   .0843658    -0.21   0.831    -.1833919    .1473159
Higher  |   .1047854   .1095801     0.96   0.339    -.1099878    .3195585
Highest  |   .0297262   .0983159     0.30   0.762    -.1629695    .2224219
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.


What happens when we don't specify a category in our -margins- command?

. margins, dydx(*)

Conditional marginal effects                      Number of obs   =         69
Model VCE    : OIM

Expression   : Pr(rep78==1), predict()
dy/dx w.r.t. : 2.pricequint 3.pricequint 4.pricequint 5.pricequint

------------------------------------------------------------------------------
|            Delta-method
|      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
pricequint |
Lowest  |   .0100147   .0330296     0.30   0.762    -.0547221    .0747515
Middle  |   .0064042   .0300529     0.21   0.831    -.0524983    .0653067
Higher  |  -.0189492     .02406    -0.79   0.431    -.0661059    .0282074
Highest  |  -.0077672   .0258943    -0.30   0.764    -.0585191    .0429847
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.


Stata chose a category for us for the marginal effects calculation, in this case, the category chosen was 1 (lowest)

• In Stata 13 & 14, margins, dydx(*) gives the MEs for all outcomes. – Dimitriy V. Masterov Apr 11 '15 at 20:44
• @DimitriyV.Masterov are you sure about Stata 13? I have Stata 13, and margins, dydx(*) most definitely does not give the AME for all categories of the outcome vbl for -oprobit-. Maybe in Stata 14 :) – Marquis de Carabas Apr 12 '15 at 2:48
• @marquidecarabas Nope, you're right. I must have run that right after I upgraded. – Dimitriy V. Masterov Apr 12 '15 at 2:53
• Your example was indeed very helpful for me. One last thing, do we need to run any tests for ordinal probit models like these? any pre or pst estimations test? – numra Apr 15 '15 at 12:15
1. You need to use the i. prefix in front of connectivity to let Stata know that it is dealing with a categorical variable. Otherwise Stata will assume that it is continuous, which is why you only get one parameter. Some people do treat Likert scale variables as if they were continuous, but I would avoid it since it bakes in some strong assumptions.
2. You can use margins to get the average marginal effects of the categorical variable for each possible outcomes.

Here's an example with the cars data. The outcome is repair record (1=Poor, Fair, Average, Good, and 5=Excellent) and the explanatory variable is rounded and scaled version of miles per gallon (1=low mileage,2,3,4=high mileage), cat_var:

webuse fullauto, clear
gen cat_var = round(mpg,10)
replace cat_var = cat_var/10

oprobit rep78 i.cat_var
margins, dydx(cat_var)


The last line yields:

Conditional marginal effects                    Number of obs     =         69
Model VCE    : OIM

dy/dx w.r.t. : 2.cat_var 3.cat_var 4.cat_var
1._predict   : Pr(rep78==1), predict(pr outcome(1))
2._predict   : Pr(rep78==2), predict(pr outcome(2))
3._predict   : Pr(rep78==3), predict(pr outcome(3))
4._predict   : Pr(rep78==4), predict(pr outcome(4))
5._predict   : Pr(rep78==5), predict(pr outcome(5))

------------------------------------------------------------------------------
|            Delta-method
|      dy/dx   Std. Err.      z    P>|z|     [95% Conf. Interval]
-------------+----------------------------------------------------------------
2.cat_var    |
_predict |
1  |  -.0010489   .0357763    -0.03   0.977    -.0711693    .0690714
2  |  -.0023935   .0810853    -0.03   0.976    -.1613178    .1565307
3  |  -.0010249   .0338153    -0.03   0.976    -.0673017     .065252
4  |   .0027114   .0917155     0.03   0.976    -.1770477    .1824706
5  |   .0017559   .0589478     0.03   0.976    -.1137797    .1172914
-------------+----------------------------------------------------------------
3.cat_var    |
_predict |
1  |  -.0362813   .0401879    -0.90   0.367     -.115048    .0424855
2  |  -.1305657   .0828541    -1.58   0.115    -.2929568    .0318254
3  |  -.2607216    .104809    -2.49   0.013    -.4661434   -.0552998
4  |   .1308751   .0953367     1.37   0.170    -.0559813    .3177316
5  |   .2966935   .1270194     2.34   0.020       .04774    .5456469
-------------+----------------------------------------------------------------
4.cat_var    |
_predict |
1  |  -.0379775   .0411425    -0.92   0.356    -.1186154    .0426604
2  |  -.1477191   .0843946    -1.75   0.080    -.3131294    .0176912
3  |  -.4194057   .1213036    -3.46   0.001    -.6571563    -.181655
4  |   .0323166   .1558637     0.21   0.836    -.2731707    .3378039
5  |   .5727857   .2405893     2.38   0.017     .1012393    1.044332
------------------------------------------------------------------------------
Note: dy/dx for factor levels is the discrete change from the base level.


So for example, the AME for 4 versus 1 for outcome 5 (Excellent) is .5727857, which means that the probability that a car's repair record is rated as excellent goes up by .57 on a 0-1 scale as we go from the lowest mileage bucket to the highest.

You can control the omitted category for the categorical variable by adjusting the prefix:

oprobit rep78 ib2.cat_var


This makes the AMEs relative to 2 rather than 1.