# Multinomial logit: mlogit vs statsmodels

I am doing a comparison between mlogit in R and statsmodels in python and have had trouble getting them to produce the same result. I'm wondering if the difference is a result of libraries or I am specifying something incorrectly. Any help would be appreciated.

I am using the "TravelMode" dataset to test the two. In R:

> library("mlogit")
> library("AER")
> data("TravelMode", package="AER")
> write.csv(TravelMode, "travelmode.csv")
> TM <- mlogit.data(TravelMode, choice = "choice", shape = "long",
chid.var = "individual", alt.var = "mode", drop.index = TRUE)
> TMlogit = mlogit(mFormula(choice ~ vcost), TM)
> summary(TMlogit)
Call:
mlogit(formula = mFormula(choice ~ vcost), data = TM, method = "nr",
print.level = 0)

Frequencies of alternatives:
air   train     bus     car
0.27619 0.30000 0.14286 0.28095

nr method
4 iterations, 0h:0m:0s
g'(-H)^-1g = 0.000482 #'
successive function values within tolerance limits

Coefficients :
Estimate Std. Error t-value  Pr(>|t|)
train:(intercept) -0.3885180  0.2622157 -1.4817 0.1384272
bus:(intercept)   -1.3712065  0.3599380 -3.8096 0.0001392 ***
car:(intercept)   -0.8711172  0.3979705 -2.1889 0.0286042 *
vcost             -0.0138883  0.0055318 -2.5106 0.0120514 *
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Log-Likelihood: -280.54
Likelihood ratio test : chisq = 6.4418 (p.value = 0.011147)

In statsmodels:

> import pandas as pd
> import statsmodels.formula.api as smf
> TM = pd.concat([TM, pd.get_dummies(TM['mode'])], axis=1)
> TMlogit = smf.mnlogit('choice ~ train + bus + car + vcost -1', TM)
> TMlogit_fit = TMlogit.fit()
Optimization terminated successfully.
Current function value: 0.550273
Iterations 6
> TMlogit_fit.summary()
<class 'statsmodels.iolib.summary.Summary'>
"""
MNLogit Regression Results
==============================================================================
Dep. Variable:                      y   No. Observations:                  840
Model:                        MNLogit   Df Residuals:                      836
Method:                           MLE   Df Model:                            3
Date:                Thu, 17 Mar 2016   Pseudo R-squ.:                 0.02145
Time:                        15:04:48   Log-Likelihood:                -462.23
converged:                       True   LL-Null:                       -472.36
LLR p-value:                 0.0001497
=================================================================================
y=choice[yes]       coef    std err          z      P>|z|      [95.0% Conf. Int.]
---------------------------------------------------------------------------------
train            -0.3249      0.172     -1.891      0.059        -0.662     0.012
bus              -1.4468      0.205     -7.070      0.000        -1.848    -1.046
car              -0.7247      0.157     -4.603      0.000        -1.033    -0.416
vcost            -0.0105      0.002     -6.282      0.000        -0.014    -0.007
=================================================================================
"""

I would think the values of the coefficients would be closer to each other when comparing between the two models. Any help would be appreciated.

• Those two are not the same model. For a recent discussion about the status of discrete choice models for statsmodels see the thread of groups.google.com/d/msg/pystatsmodels/IoQckMN32zA/_qBslon1BgAJ and the newly published package pylogit that reproduces R's mnlogit results. – Josef Mar 17 '16 at 23:22
• @user333700, why not post an answer explaining how & why the 2 models are not the same? – gung - Reinstate Monica Mar 17 '16 at 23:38
• FWIW, this strikes me as potentially on topic. (It may well be off topic, but I can't tell.) – gung - Reinstate Monica Mar 17 '16 at 23:38
• @gung I was hoping somebody else provides an explanation because I'm short in time right now. A brief answer is here stackoverflow.com/questions/34548375/… In Stata the R's mnlogit equivalent is asclogit and the statsmodels equivalent in Stata is mlogit, as far as I know. – Josef Mar 18 '16 at 0:14
• @user333700 I was able to achieve identical results using pylogit, thanks. – Brian Huey Mar 18 '16 at 1:23