Analyse de Modèles de Choix Discrets avec mlogit

Author

Karim Kilani

Published

April 3, 2024

Introduction

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.

Code
# Chargement du package mlogit et autres packages nécessaires
library(mlogit)
library(tidyverse)

Le jeu de données Train

Code
# 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
Code
Tr <- dfidx(Train, shape = "wide", varying = 4:11, sep = "_",
            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 :

  • Données Transformées : un cadre de données en format “long”, où chaque ligne représente une alternative spécifique dans une situation de choix.
  • Structure d’Indexation : une colonne spéciale indiquant, pour chaque ligne, sa situation de choix et l’alternative correspondante, facilitant ainsi l’analyse statistique des choix.

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 :

Code
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 :

Code
head(idx(Tr), 3)
~~~ indexes ~~~~
  choiceid id alt
1        1  1   A
2        1  1   B
3        2  1   A
indexes:  1, 1, 2 

Format Long

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.

Code
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 :

Code
MC <- dfidx(ModeCanada, subset = noalt == 4, alt.levels = c("train", "air", "bus", "car"))

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.

Code
MC <- dfidx(ModeCanada, subset = noalt == 4, idx = list(NA, "alt"))

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 :

Code
# Indiquer directement la variable de situation de choix et définir l'ordre des alternatives
MC <- dfidx(ModeCanada, subset = noalt == 4, idx = "case", alt.levels = c("train", "air", "bus", "car"))
# Fournir les variables de situation de choix et d'alternative
MC <- dfidx(ModeCanada, subset = noalt == 4, idx = c("case", "alt"))
# Omettre `idx` si les indices sont les premières colonnes, permettant leur détection automatique
MC <- dfidx(ModeCanada, subset = noalt == 4)
# Garder les indices comme séries séparées en désactivant `drop.index`
MC <- dfidx(ModeCanada, subset = noalt == 4, idx = c("case", "alt"), drop.index = FALSE)
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 

Préparation à la Modélisation avec 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 :

Code
MC <- dfidx(ModeCanada, subset = noalt == 4, pkg = "mlogit")

Ensuite, une formule de modèle est établie pour déterminer les relations entre la variable de choix et les variables explicatives :

Code
f <- formula(choice ~ cost | income | ivt)

La création du cadre de modèle avec cette formule produit un ensemble de données prêt pour l’analyse :

Code
mf <- model.frame(MC, f)

Finalement, la construction de la matrice de modèle nécessaire pour le modèle d’utilité aléatoire est réalisée

Code
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.

Application de Modèles d’Utilité Aléatoire avec 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 :

  1. Estimation du modèle : Deux approches sont possibles, soit directement avec un objet dfidx :
Code
 ml.MC1 <- mlogit(choice ~ cost + freq + ovt | income | ivt, MC)

Ou avec un data.frame et des arguments supplémentaires :

Code
ml.MC1b <- mlogit(choice ~ cost + freq + ovt | income | ivt, ModeCanada, subset = noalt == 4, idx = c("case", "alt"))
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)
  1. Analyse des résultats : Après l’estimation, l’analyse des résultats utilise summary pour examiner les fréquences des alternatives, l’optimisation, et les mesures de qualité du modèle.

Application des Modèles de Choix Discrets avec mlogit

Objectifs

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.

Partie 1 : Statistiques Descriptives

  • Chargez le jeu de données Yogurt.
  • Utilisez 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”.

Partie 2 : Estimation des Modèles

  • Estimez le modèle Logit Multinomial (MNL) sur les données Yogurt avec mlogit.
  • Estimez aussi le modèle Nested Logit (NL), considérant la corrélation entre alternatives.
  • Formatez les résultats de vos estimations selon la Table 2 de l’article en utilisant stargazer.

Présentation des Résultats

  • Présentez les résultats des estimations sous forme de tableaux élaborés avec stargazer.

Travail de Groupe

  • Réalisez cet exercice en groupe pour une expérience collaborative.
  • Partagez les tâches équitablement et discutez des résultats obtenus.

Ressources

  • Article de référence : “Generalized Reverse Discrete Choice Models”.
  • Documentation pour mlogit et stargazer.

Livrables

  • Soumettez un document Quarto avec le code, les commentaires et les tableaux des résultats.
  • Assurez-vous que votre document est bien organisé, avec des chunks de code et des titres de sections appropriés.