Code
# Chargement du package mlogit et autres packages nécessaires
library(mlogit)
library(tidyverse)
Ce document présente des exemples pratiques d’application du package mlogit
dans R. Ces exemples illustrent l’utilisation du package sans revisiter la théorie sous-jacente des modèles de choix discret.
# Chargement du package mlogit et autres packages nécessaires
library(mlogit)
library(tidyverse)
Train
# Chargement des données
data("Train", package = "mlogit")
# Ajout d'une colonne 'choiceid'
<- Train %>%
Train mutate(choiceid = row_number())
# Aperçu des premières lignes des données préparées
head(Train, 3)
id choiceid choice price_A time_A change_A comfort_A price_B time_B change_B
1 1 1 A 2400 150 0 1 4000 150 0
2 1 2 A 2400 150 0 1 3200 130 0
3 1 3 A 2400 115 0 1 4000 115 0
comfort_B
1 1
2 1
3 0
<- dfidx(Train, shape = "wide", varying = 4:11, sep = "_",
Tr idx = list(c("choiceid", "id")), idnames = c(NA, "alt"))
L’utilisation de la fonction dfidx
dans mlogit
nous permet de préparer nos données pour l’analyse des modèles de choix discret. dfidx
produit un objet complexe comprenant :
Cette structure rend l’analyse avec mlogit
à la fois directe et efficiente, en éliminant le besoin de manipulation manuelle des données pour l’indexation.
L’objet dfidx
utilise une structure d’indexation détaillée pour faciliter l’analyse avec mlogit
, composée de :
choiceid
: Numéro de chaque situation de choix.id
: Identifiant de l’individu.alt
: Désigne l’alternative (ex : A, B) dans chaque choix.Cette structure permet une analyse précise des choix entre alternatives.
La transformation des unités de price
et time
facilite l’interprétation des données :
library(tidyverse)
<- Tr %>%
Tr mutate(
price = price / 100 * 2.20371, # Convertit les cents de guilders en euros
time = time / 60 # Convertit le temps de minutes en heures
)head(Tr,3)
~~~~~~~
first 3 observations out of 5858
~~~~~~~
choice price time change comfort idx
1 A 52.88904 2.5 0 1 1:A
2 A 88.14840 2.5 0 1 1:B
3 A 52.88904 2.5 0 1 2:A
~~~ indexes ~~~~
choiceid id alt
1 1 1 A
2 1 1 B
3 2 1 A
indexes: 1, 1, 2
• Prix : Initialement en cents de guilders, la conversion en euros est réalisée par la division par 100 (pour passer de cents à guilders) suivie d’une multiplication par 2.20371, reflétant le taux de conversion fixe lors du passage à l’euro.
• Temps : La conversion de minutes en heures simplifie l’interprétation des durées.
La ligne de code suivante affiche un aperçu des indices de situations de choix, d’alternatives, et d’individus pour les trois premières observations, aidant à comprendre la structuration des données pour mlogit
:
head(idx(Tr), 3)
~~~ indexes ~~~~
choiceid id alt
1 1 1 A
2 1 1 B
3 2 1 A
indexes: 1, 1, 2
ModeCanada5
est un format “long”, où chaque ligne est une option de transport par cas, incluant air, train, bus, et voiture, avec des attributs comme le coût et le temps de voyage. Les variables comme la distance et le revenu sont répétées pour chaque alternative, facilitant l’analyse mais augmentant la redondance des données.
data("ModeCanada", package = "mlogit")
head(ModeCanada)
case alt choice dist cost ivt ovt freq income urban noalt
1 1 train 0 83 28.25 50 66 4 45 0 2
2 1 car 1 83 15.77 61 0 0 45 0 2
3 2 train 0 83 28.25 50 66 4 25 0 2
4 2 car 1 83 15.77 61 0 0 25 0 2
5 3 train 0 83 28.25 50 66 4 70 0 2
6 3 car 1 83 15.77 61 0 0 70 0 2
Après avoir sélectionné uniquement les situations de choix avec quatre alternatives, on obtient 2779 cas. Les données sont organisées par situation de choix puis par alternative (train, air, bus, voiture). Pour lire correctement ce cadre de données dans mlogit, on utilise dfidx avec subset pour filtrer les cas et alt.levels pour indiquer l’ordre des alternatives :
<- dfidx(ModeCanada, subset = noalt == 4, alt.levels = c("train", "air", "bus", "car")) MC
Cela prépare les données ModeCanada pour l’analyse avec mlogit, en spécifiant l’ordre des alternatives.
Pour analyser les choix dans des situations où toutes les alternatives sont disponibles, on sélectionne les cas avec exactement quatre options (noalt == 4), garantissant un jeu de données “équilibré”. L’argument idx permet de spécifier directement les alternatives sans identifier chaque situation de choix séparément.
<- dfidx(ModeCanada, subset = noalt == 4, idx = list(NA, "alt")) MC
En résumé, idx = list(NA, “alt”) indique à dfidx que les situations de choix n’ont pas besoin d’être identifiées par une colonne spécifique (d’où le NA), mais que les alternatives sont identifiées par la colonne alt. Cette spécification est importante pour structurer correctement les données en vue de leur analyse avec le modèle logit multinomial implémenté dans mlogit.
Pour préparer les données ModeCanada
pour mlogit
, différentes méthodes de spécification des indices sont disponibles :
# Indiquer directement la variable de situation de choix et définir l'ordre des alternatives
<- dfidx(ModeCanada, subset = noalt == 4, idx = "case", alt.levels = c("train", "air", "bus", "car"))
MC # Fournir les variables de situation de choix et d'alternative
<- dfidx(ModeCanada, subset = noalt == 4, idx = c("case", "alt"))
MC # Omettre `idx` si les indices sont les premières colonnes, permettant leur détection automatique
<- dfidx(ModeCanada, subset = noalt == 4)
MC # Garder les indices comme séries séparées en désactivant `drop.index`
<- dfidx(ModeCanada, subset = noalt == 4, idx = c("case", "alt"), drop.index = FALSE)
MC head(MC)
~~~~~~~
first 10 observations out of 11116
~~~~~~~
case alt choice dist cost ivt ovt freq income urban noalt idx
1 109 train 0 377 58.25 215 74 4 45 0 4 109:rain
2 109 air 1 377 142.80 56 85 9 45 0 4 109:air
3 109 bus 0 377 27.52 301 63 8 45 0 4 109:bus
4 109 car 0 377 71.63 262 0 0 45 0 4 109:car
5 110 train 0 377 58.25 215 74 4 70 0 4 110:rain
6 110 air 1 377 142.80 56 85 9 70 0 4 110:air
7 110 bus 0 377 27.52 301 63 8 70 0 4 110:bus
8 110 car 0 377 71.63 262 0 0 70 0 4 110:car
9 111 train 0 377 58.25 215 74 4 35 0 4 111:rain
10 111 air 1 377 142.80 56 85 9 35 0 4 111:air
~~~ indexes ~~~~
case alt
1 109 train
2 109 air
3 109 bus
4 109 car
5 110 train
6 110 air
7 110 bus
8 110 car
9 111 train
10 111 air
indexes: 1, 2
mlogit
La transition vers l’analyse de modèles d’utilité aléatoire avec mlogit
commence par la création d’un objet dfidx_mlogit
. Cet objet est spécialement préparé pour l’analyse en filtrant les situations de choix avec quatre alternatives et en le structurant pour mlogit
:
<- dfidx(ModeCanada, subset = noalt == 4, pkg = "mlogit") MC
Ensuite, une formule de modèle est établie pour déterminer les relations entre la variable de choix et les variables explicatives :
<- formula(choice ~ cost | income | ivt) f
La création du cadre de modèle avec cette formule produit un ensemble de données prêt pour l’analyse :
<- model.frame(MC, f) mf
Finalement, la construction de la matrice de modèle nécessaire pour le modèle d’utilité aléatoire est réalisée
head(model.matrix(mf), 4)
(Intercept):air (Intercept):bus (Intercept):car cost income:air income:bus
1 0 0 0 58.25 0 0
2 1 0 0 142.80 45 0
3 0 1 0 27.52 0 45
4 0 0 1 71.63 0 0
income:car ivt:train ivt:air ivt:bus ivt:car
1 0 215 0 0 0
2 0 0 56 0 0
3 0 0 0 301 0
4 45 0 0 0 262
Ces étapes marquent le début de la modélisation avec mlogit, où chaque commande construit la fondation pour l’analyse des choix entre différentes alternatives de transport.
mlogit
La modélisation des choix de transport dans l’ensemble des données ModeCanada
utilise la fonction mlogit
. Ce processus démarre avec des données préparées (MC
) et suit ces étapes principales :
dfidx
:<- mlogit(choice ~ cost + freq + ovt | income | ivt, MC) ml.MC1
Ou avec un data.frame
et des arguments supplémentaires :
<- mlogit(choice ~ cost + freq + ovt | income | ivt, ModeCanada, subset = noalt == 4, idx = c("case", "alt"))
ml.MC1b summary(ml.MC1)
Call:
mlogit(formula = choice ~ cost + freq + ovt | income | ivt, data = MC,
method = "nr")
Frequencies of alternatives:choice
train air bus car
0.1666067 0.3738755 0.0035984 0.4559194
nr method
9 iterations, 0h:0m:0s
g'(-H)^-1g = 0.00014
successive function values within tolerance limits
Coefficients :
Estimate Std. Error z-value Pr(>|z|)
(Intercept):air -3.2741952 0.6244152 -5.2436 1.575e-07 ***
(Intercept):bus -2.5758571 1.0845227 -2.3751 0.0175439 *
(Intercept):car -1.4300823 0.3013764 -4.7452 2.083e-06 ***
cost -0.0333389 0.0070955 -4.6986 2.620e-06 ***
freq 0.0925297 0.0050976 18.1517 < 2.2e-16 ***
ovt -0.0430036 0.0032247 -13.3356 < 2.2e-16 ***
income:air 0.0381466 0.0040831 9.3426 < 2.2e-16 ***
income:bus -0.0509401 0.0181702 -2.8035 0.0050553 **
income:car 0.0101536 0.0031648 3.2083 0.0013353 **
ivt:train -0.0014504 0.0011875 -1.2214 0.2219430
ivt:air 0.0595097 0.0100727 5.9080 3.463e-09 ***
ivt:bus -0.0067835 0.0044334 -1.5301 0.1259938
ivt:car -0.0064603 0.0018985 -3.4029 0.0006668 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Log-Likelihood: -1874.3
McFadden R^2: 0.35443
Likelihood ratio test : chisq = 2058.1 (p.value = < 2.22e-16)
summary
pour examiner les fréquences des alternatives, l’optimisation, et les mesures de qualité du modèle.mlogit
Cet exercice vise à vous familiariser avec la modélisation des choix discrets à l’aide du package mlogit
dans R et à perfectionner la présentation des résultats avec stargazer
.
Yogurt
.summarise
ou stargazer
pour générer le tableau des statistiques descriptives, en vous inspirant de la Table 1 de l’article “Generalized Reverse Discrete Choice Models”.Yogurt
avec mlogit
.stargazer
.stargazer
.mlogit
et stargazer
.