install.packages("discrtr")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
(as 'lib' is unspecified)
library(discrtr)
discrtr
Pour suivre les exemples présentés dans cette formation, il est nécessaire d’installer le package discrtr
, qui accompagne le livre Discrete Choice Analysis with R.
Vous pouvez installer le package directement dans R en utilisant la commande suivante :
install.packages("discrtr")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
(as 'lib' is unspecified)
library(discrtr)
Les modèles de choix discret sont essentiels pour analyser et prédire les décisions dans divers domaines.
Marketing : Comprendre les préférences des consommateurs et leur comportement d’achat.
Systèmes de Recommandation :
Économie des Transports : Analyse des choix de mode de transport et de la demande.
Santé Publique : Étude des choix de traitements médicaux et des comportements de santé.
Sciences Environnementales : Évaluation des préférences pour la conservation des ressources.
Recherche Politique : Analyse des décisions de vote et des opinions politiques.
Ces modèles fournissent aux modélisateurs des aperçus clés sur les processus de décision dans une variété de contextes.
Le décideur définit le problème nécessitant une décision.
Le décideur identifie les alternatives existantes et évalue chaque alternative en fonction d’un ensemble d’attributs.
Le décideur fait un choix en se basant sur une règle de décision (également appelée mécanisme de choix).
Situation de Choix Simplifiée
# Define a function to return a value of one if # -L>x<=Landzero otherwise
<- function(x, L){
uniform # Logical condition: x greater than minus L and less than L
ifelse(x >-L & x <= L,
# Value if true
1/(2 * L),
# Value if false
0)
}
tidyverse
tidyverse
est une collection de packages R pour la science des données, incluant ggplot2
, dplyr
, tidyr
, et plus.tidyverse
permettra d’accéder à des outils essentiels pour l’analyse et la visualisation des données dans cette présentation.# Installer le package tidyverse
install.packages("tidyverse")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
(as 'lib' is unspecified)
# Charger le package tidyverse
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.4 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.1
✔ ggplot2 3.4.4 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.0
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
data.frame
) pour le traçage du graphique.# Define L
<-2
L
# Define parameter L for the distribution
<-2
L# Create a data frame for plotting
# The function `seq()` is used to create a sequence of
# values starting at `from` and ending at `to` with a
# step increase of `by`
<- data.frame(x=seq(from = -(L+1),
df to = L+1, by = 0.01)) %>%
# Mutate the data frame to add a new column with the
# value of the function
mutate(f=uniform(x, L))
# Plot
ggplot(data = df,
# Map column x in the data frame to the x-axis # and column f to the y-axis
aes(x=x,
y=f)) + geom_area(fill = "orange",
alpha = 0.5) +
# Set the limits of the y axis
ylim(c(0, 1/(2 * L) + 0.2 * 1/(2 * L))) +
# Draw a horizontal line for the x axis
geom_hline(yintercept = 0) +
# Draw a vertical line for the y axis
geom_vline(xintercept = 0) +
ylab("f(x)")
Nous définissons et traçons la CDF d’une distribution uniforme à l’aide de ggplot2
.
# Définir la fonction de répartition cumulative
<- function(x, L) {
punif ifelse(x <= -L,
0,
ifelse(x > -L & x <= L,
+ L) / (2 * L),
(x 1))
}
# Définir L
<- 2
L
# Créer un cadre de données pour le tracé de la CDF
<- data.frame(x = seq(from = -L-1, to = L+1, by = 0.01)) %>%
df mutate(f = punif(x, L))
# Tracer la CDF avec ggplot2
ggplot(data = df, aes(x = x, y = f)) +
geom_step(color = "orange") +
ylim(c(0, 1)) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
ylab("F(x)")
Nous allons considérer un second exemple avec la fonction suivante :
\[ f(x) = \begin{cases} 0 & \text{si } x \leq 0, \\ 2x & \text{si } 0 < x < 1, \\ 0 & \text{si } x \geq 1. \end{cases} \]
# Définition de la fonction pour la distribution linéaire
<- function(x) {
linear ifelse(x > 0 & x <= 1, 2 * x, 0)
}
# Création du cadre de données pour le tracé
<- data.frame(x = seq(from = 0, to = 1, by = 0.01)) %>%
df mutate(f = linear(x))
# Tracé avec ggplot2
ggplot(data = df, aes(x = x, y = f)) +
geom_area(fill = "orange", alpha = 0.5) +
ylim(c(0, 2)) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
ylab("f(x)")
\[ F(x) = \begin{cases} 0 & \text{pour } x \leq 0, \\ x^2 & \text{pour } 0 < x < 1, \\ 1 & \text{pour } x \geq 1. \end{cases} \]
ggplot2
pour visualiser la CDF de la distribution linéaire que nous avons précédemment définie.# Définir la fonction pour la CDF de la distribution linéaire
<- function(x) {
plinear ifelse(x <= 0,
0,
ifelse(x > 0 & x <= 1,
^2 ,
x1))
}# Créer un cadre de données pour le tracé
<- data.frame(x = seq(from = -0.2, to = 1.2, by = 0.001)) %>%
df mutate(F = plinear(x))
# Tracer la CDF avec ggplot2
ggplot(data = df, aes(x = x, y = F)) +
geom_step(color = "orange") +
ylim(c(0, 1)) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
ylab("F(x)")
Considérez la fonction de densité de probabilité (PDF) suivante, qui implique une courbe plutôt que des lignes droites :
\[ f(x) = \left\{ \begin{array}{ll} 0 & \text{pour } x \leq 0, \\ 4x^3 & \text{pour } 0 < x < 1, \\ 0 & \text{pour } x \geq 1. \end{array} \right. \]
Tâches :
ggplot2
pour visualiser la PDF et la CDF.Une Approche Moderne pour le Calcul Mathématique
Contexte Traditionnel Les calculs mathématiques en statistiques et probabilités sont souvent réalisés manuellement ou avec des méthodes numériques, pouvant être complexes et longues.
Innovation avec Ryacas Ryacas
offre une alternative pour des calculs symboliques en R :
Application Pratique Illustration de l’usage de Ryacas
pour la fonction de répartition cumulative (CDF) d’une PDF complexe. Cette méthode apporte précision et efficacité, en particulier pour des fonctions non linéaires ou difficiles à traiter classiquement.
Dérivation Symbolique d’une Fonction Composite avec Ryacas0
Dans cet exemple, nous allons au-delà des bases en utilisant Ryacas0
pour dériver une fonction composite plus complexe, \(\exp(x) \cdot x^2 + \cos(x)\). Ce choix de fonction démontre comment Ryacas0
peut facilement gérer des opérations de calcul symbolique sur des fonctions combinant exponentielles, puissances et fonctions trigonométriques. Cette démonstration souligne la capacité de Ryacas0
à traiter des expressions mathématiques variées en R.
install.packages("Ryacas0")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
(as 'lib' is unspecified)
# Charger le package Ryacas
library(Ryacas0)
# Définir la fonction symbolique
<- Sym("x")
x <- exp(x)*x^2+cos(x)
fonction
# Dérivation de la fonction x^2
<- fonction %>% deriv()
derivee
# Afficher le résultat
derivee
yacas_expression(exp(x) * (2 * x) + exp(x) * x^2 - sin(x))
D’accord, je vais reformuler la synthèse en prenant en compte l’exemple du choix de renouvellement du téléphone, et en clarifiant le rôle de ( N ) dans le modèle. Voici une nouvelle version :
Un Modèle de Choix Discret simplifié pour le Renouvellement d’un Téléphone
Reprenons l’exemple où l’individu est confronté à la décision de renouveler son téléphone (option \(N\), pour “new”) ou de ne rien faire (option \(B\), pour “baseline” ou “existing”).
La différence d’utilité perçue entre les deux options est modélisée par la distribution des termes aléatoires d’utilité \(\epsilon\), qui suit une loi uniforme \(\mathcal{U}(-L, L)\).
Le modèle présenté suppose que la loi de la différence entre les variables d’utilité suit une loi uniforme sur l’intervalle \([-L, L]\).
Nous obtenons le même modèle en supposant que chaque terme aléatoire ε suit de manière indépendante une loi uniforme sur l’intervalle \([0, L]\).
Il est important de noter que ces deux approches conduisent au même modèle, et ce choix alternatif simplifie la spécification des termes aléatoires tout en préservant la cohérence du modèle global.
La probabilité de conserver le téléphone actuel (\(P_B\)) et de choisir la nouvelle option (\(P_N\)) peut être exprimée comme suit :
\[ P_N = P(\epsilon_B - \epsilon_N < V_N - V_B) \]
\[ P_N = \begin{cases} 0 & \text{si } V_N - V_B < -L, \\ \frac{V_N - V_B + L}{2L} & \text{si } -L \leq V_N - V_B \leq L, \\ 1 & \text{si } V_N - V_B > L. \end{cases} \]
Nous pouvons décomposer l’expression de la probabilité de choix en fonction de la différence d’utilité systématique entre renouveler un téléphone et ne rien faire :
Utilité du Nouveau Téléphone Supérieure : Si l’utilité systématique d’un nouveau téléphone (\(V_N\)) est supérieure à celle de ne rien faire (\(V_B\)), la différence (\(V_N - V_B\)) est négative. Plus cette valeur est négative, plus la probabilité de ne rien faire est faible. Lorsque cette différence est inférieure à \(-L\), la probabilité de ne rien faire devient nulle.
Utilité des Deux Options Identique : Si l’utilité systématique du nouveau téléphone est identique à celle de ne rien faire, la différence (\(V_N - V_B\)) est nulle. Dans ce cas, la probabilité de ne rien faire est de 0.5, indiquant une chance égale de choisir l’une ou l’autre option.
Utilité du Nouveau Téléphone Inférieure : Lorsque l’utilité systématique du nouveau téléphone est inférieure à celle de ne rien faire, la différence (\(V_N - V_B\)) est positive. Plus cette valeur est positive, plus la probabilité de ne rien faire est élevée. Lorsque la différence dépasse \(L\), la probabilité de ne rien faire atteint 1.
Ces scénarios illustrent comment la probabilité de choisir l’option de ne rien faire varie en fonction de la valeur relative des utilités systématiques des deux options dans le modèle d’utilité aléatoire.
\[ P_N + P_B = 1 \]
Package Nécessaire pour ce Chapitre
install.packages("evd")
Installing package into '/cloud/lib/x86_64-pc-linux-gnu-library/4.3'
(as 'lib' is unspecified)
library(evd) # Chargement du package Extreme Value Distributions
\[ f(x; μ, σ) = e^{-(x + e^{-(x-μ)/σ})} \]
# Define parameters for the distribution
# Location
<- 0
mu # Scale
<- 1
sigma
# Create a data frame for plotting;
<- data.frame(x=seq(from = -5, to = 5, by = 0.01)) %>%
df # The function `dgumbel()` is the EV Type I distribution
mutate(f=dgumbel(x, loc = mu, scale = sigma))
# Plot
ggplot(data = df, aes(x=x, y=f)) +
geom_area(fill = "orange", alpha = 0.5) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
ylab("f(x)")
\[ f(x; \mu, \sigma) = \frac{e^{-(x - \mu)/\sigma}}{\sigma(1 + e^{-(x - \mu)/\sigma})^2} \]
où \(\mu =\alpha_X - \alpha_Y\) est le paramètre de localisation et \(\sigma\) est le paramètre d’échelle de la distribution logistique.
Interprétation de la Distribution EV Type I : La différence de deux variables aléatoires suivant la distribution EV Type I génère une variable qui suit la distribution logistique.
Déclaration de Probabilité pour les Choix : Considérons la formule générale de probabilité pour les choix dans un modèle de choix discret : \[ P_i = P(\epsilon_j - \epsilon_i < V_i - V_j) \]
Distribution Logistique à partir de l’EV Type I : Si les termes d’utilité aléatoire \(\epsilon\) suivent la distribution EV Type I, alors leur différence suit la distribution logistique.
Fonction de Densité de la Distribution Logistique : La fonction de densité de la distribution logistique résultante est donnée par : \[ f(x; \mu, \sigma) = \frac{e^{-(x - \mu)/\sigma}}{\sigma(1 + e^{-(x - \mu)/\sigma})^2} \]
# Définition des paramètres pour la distribution
<- 0 # Localisation
mu <- 1 # Échelle
sigma
# Création d'un cadre de données pour le traçage
<- data.frame(x=seq(from = -5, to = 5, by = 0.01)) %>%
df mutate(
logistic = dlogis(x, location = mu, scale = sigma),
normal = dnorm(x, mean = mu, sd = sigma)
)
# Définition des paramètres pour les distributions
<- 0 # Localisation
mu <- 1 # Échelle
sigma
# Création d'un cadre de données pour le traçage
<- data.frame(x=seq(from = -5, to = 5, by = 0.01)) %>%
df mutate(
logistic = dlogis(x, location = mu, scale = sigma),
normal = dnorm(x, mean = mu, sd = sigma)
)
# Tracé comparatif des distributions logistique et normale
ggplot() +
geom_area(data = df, aes(x = x, y = logistic), fill = "blue", alpha = 0.5) +
geom_area(data = df, aes(x = x, y = normal), fill = "black", alpha = 0.5) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
ylab("f(x)") +
ggtitle("Comparison of Logistic and Normal Distributions")
Expression de Probabilité et Utilité Aléatoire : En supposant que les termes d’utilité aléatoire \(\epsilon\) suivent la distribution EV Type I, leur différence (\(\epsilon_n = \epsilon_i - \epsilon_j\)) suit la distribution logistique.
Calcul de la Probabilité par Intégration : Pour obtenir une probabilité, il est nécessaire de calculer l’aire sous la courbe de la fonction logistique. Heureusement, cette intégrale a une solution analytique :
\[ F(x; \mu, \sigma) = \frac{1}{1 + e^{-(x - \mu)/\sigma}} \] (avec \(\mu=0\) ici).
\[ P_i = P(\epsilon_n < V_i - V_j) = \frac{1}{1 + e^{-(V_i - V_j - \mu)/\sigma}} \]
\[ P_i = P(\epsilon_n < V_i - V_j) = \frac{e^{V_i/\sigma}}{e^{V_i/\sigma} + e^{(V_j + \mu)/\sigma}} \]
# Paramètres de la distribution
<- 0 # Localisation
mu <- 1 # Échelle
sigma
# Limite supérieure pour le calcul de la probabilité (équivalent à V_i - V_j)
<- -2
x
# Création des cadres de données pour le tracé
<- data.frame(x = seq(from = -6 + mu, to = 6 + mu, by = 0.01)) %>%
df mutate(y = dlogis(x, location = mu, scale = sigma))
<- data.frame(x = seq(from = -6, to = x, by = 0.01)) %>%
df_p mutate(y = dlogis(x, location = mu, scale = sigma))
# Tracé de la fonction de distribution et de l'aire sous la courbe
ggplot(data = df, aes(x, y)) +
geom_area(fill = "orange", alpha = 0.5) +
geom_area(data = df_p, fill = "orange", alpha = 1) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
xlab(expression(paste(V[i] - V[j] - mu))) +
ylab("f(x)")
Bien sûr, voici comment vous pouvez présenter ce graphique basé sur la fonction de distribution cumulative (CDF) de la distribution logistique dans un slide Quarto :
# Paramètres de la distribution
<- 0 # Localisation
mu <- 1 # Échelle
sigma
# Création du cadre de données pour le tracé de la fonction de distribution cumulative
<- data.frame(x = seq(from = -5 + mu, to = 5 + mu, by = 0.01)) %>%
df mutate(f = plogis(x, location = mu, scale = sigma))
# Tracé de la fonction de distribution cumulative logistique
<- ggplot(data = df, aes(x = x, y = f)) +
logit_plot geom_line(color = "orange") +
ylim(c(0, 1)) +
geom_hline(yintercept = 0) +
geom_vline(xintercept = 0) +
xlab(expression(paste(V[i] - V[j] - mu))) +
ylab(expression(paste(P[i])))
logit_plot
Caractéristique de la Fonction Logit : La probabilité logit présente une forme sigmoid, rappelant la lettre “s”. Cette forme est commune à la plupart des modèles de choix discret, reflétant des transitions non linéaires entre les états.
Applications Multidisciplinaires des Fonctions Sigmoid : Les fonctions sigmoid sont utiles dans de nombreux domaines, comme l’adoption de technologies (adoption lente initiale, suivie d’une croissance rapide, puis d’une saturation) et la croissance démographique (croissance lente, explosive, puis atteinte d’une capacité limite).
Perspectives Politiques en Analyse de Choix Discret : Dans l’analyse des choix de transport, par exemple, cette forme indique que même de grandes augmentations de l’utilité d’une option (comme le transport en commun) peuvent entraîner des gains modestes en probabilité si la probabilité initiale de choisir cette option est faible.
Illustration avec le Transport en Commun : Supposons que la courbe logit représente la probabilité de choisir le transport en commun. Si la probabilité initiale est faible, une augmentation identique de l’utilité du transport en commun entraînerait un gain beaucoup plus important en probabilité si la probabilité initiale avait été de 0,5.
# Ajout d'annotations au graphique logit existant
+
logit_plot xlab(expression(paste(V[transit] - V[car] - mu))) +
ylab(expression(paste(P[transit]))) +
annotate("segment", x = -3.75, xend = -2.5, y = 0.024, yend = 0.024, colour = "blue", linetype = "solid") +
annotate("segment", x = -2.5, xend = -2.5, y = 0.024, yend = 0.075, colour = "blue", linetype = "solid") +
annotate("segment", x = 0, xend = 1.25, y = 0.5, yend = 0.5, colour = "red", linetype = "dashed") +
annotate("segment", x = 1.25, xend = 1.25, y = 0.5, yend = 0.77, colour = "red", linetype = "dashed")
Contexte de la Courbe Logit pour le Choix du Transport en Commun : Imaginons que la courbe logit représente la probabilité de choisir le transport en commun.
Effet d’une Faible Probabilité Initiale : Lorsque la probabilité initiale de choisir le transport en commun est basse, même de grandes augmentations de son utilité se traduisent par des gains modestes en termes de probabilité. Ceci est illustré par la ligne bleue solide dans le graphique correspondant.
Effet d’une Probabilité Initiale Moyenne : En revanche, si la probabilité initiale de choisir le transport en commun avait été de 0.5, une augmentation identique de son utilité aurait entraîné un gain beaucoup plus important en termes de probabilité. Ceci est démontré par la ligne rouge pointillée dans le graphique correspondant.
Cette analyse met en évidence l’importance de la probabilité initiale dans l’évaluation des effets des changements d’utilité sur les décisions de transport.
Rôle du Paramètre de Centrage $) : La valeur de \(\mu\) influence la différence systématique entre les utilités \(V_i\) et \(V_j\). Un \(\mu\) positif augmente l’utilité de \(j\), tandis qu’un \(\mu\) négatif augmente celle de \(i\). Il est essentiel de ne pas fixer arbitrairement \(\mu\) à zéro car il contient des informations importantes sur les différences systématiques relatives.
Impact du Paramètre d’Échelle $) : Le paramètre \(\sigma\) est commun aux deux fonctions d’utilité dans le modèle logit et peut être arbitrairement fixé à 1. Ceci est dû à la nature ordinale de la règle de décision : choisir une alternative si son utilité est supérieure à celle des alternatives concurrentes.
Simplification du Modèle Logit : Pour simplifier la présentation, nous pouvons supposer que l’une des fonctions d’utilité absorbe le paramètre \(\mu\). La probabilité logit peut alors être réécrite sans affecter l’ordinalité des choix :
\[ P_i = \frac{e^{V_i}}{e^{V_i} + e^{V_j}} \]
Je m’excuse pour l’erreur. Voici la correction avec les bullet points tels que vous les avez formatés :
Extension au Modèle Multinomial : Le modèle logit multinomial étend le cadre binaire pour gérer plusieurs alternatives.
La probabilité de choisir une alternative \(i\) dans un scénario avec plusieurs options est donnée par : \[ P_i = \frac{e^{V_i}}{\sum_{j=1}^{J} e^{V_j}} \] où \(J\) représente le nombre total d’alternatives.
Cette formule garantit que la somme des probabilités de toutes les alternatives est égale à 1.
Chaque \(V_j\) est une fonction d’utilité pour l’alternative \(j\), influencée par les paramètres du modèle tels que \(\mu\) et \(\sigma\).
Interprétation des Résultats : L’analyse des résultats dans le modèle multinomial implique de comparer les probabilités de choix entre différentes alternatives, offrant ainsi un aperçu des préférences des individus ou des facteurs influençant le choix.
Propriétés du Modèle Logit : Le modèle est central dans l’analyse de choix discrets grâce à sa simplicité calculatoire, évitant l’évaluation numérique des intégrales.
Pour les modèles multinomiaux, on calcule un volume sous la surface plutôt qu’une aire.
Rapport des Cotes : Le rapport des probabilités \(\frac{P_i}{P_k}\) se réduit à \(\frac{e^{V_i}}{e^{V_k}}\), montrant la dépendance uniquement sur la différence d’utilité \(V_i - V_k\).
Contrainte de Normalisation : La somme des probabilités pour toutes les alternatives est contrainte à 1 : \[ P_1 + P_2 + \ldots + P_J = 1 \]
Indépendance des Cotes Relatives : L’indépendance des cotes relatives signifie que le rapport des probabilités entre deux choix est constant, indépendant des autres alternatives. Cette proprtiété est connume comme independant from irrelevant alternatives (IIA).
Indépendance des Cotes Relatives : La propriété d’IIA (Independence from Irrelevant Alternatives) indique que le rapport de probabilités de choix entre deux alternatives reste inchangé, indépendamment de la présence d’autres options.
Cela suggère que l’ajout ou la suppression d’options supplémentaires n’altère pas les rapports de cotes entre toutes les paires d’alternatives existantes dans le modèle logit multinomial.
Introduction et Contexte - Étude de choix entre trois produits : margarine de “Naturally” et deux types de beurre (salé et faible en sodium) de “Happy Farms”. - Probabilités initiales de choisir chacun des produits : \[ P^{0}_{m} = \frac{1}{3}, \quad P^{0}_{sb} = \frac{1}{3}, \quad P^{0}_{lb} = \frac{1}{3} \]
Changement dû à la Modification du Prix du Beurre Salé - Effet d’une baisse de prix sur le beurre salé de Happy Farms. - Nouvelle probabilité de choisir le beurre salé (sb) après la modification : \[ P^{1}_{sb} = \frac{1}{2} \]
Réajustement des Probabilités pour les Autres Produits - Suite à la modification, réajustement nécessaire des probabilités pour que leur somme totalise 1 : \[ P^{1}_{m} + P^{1}_{sb} + P^{1}_{lb} = 1 \] - En déduisant les nouvelles probabilités : \[ P^{1}_{m} = P^{1}_{lb} = \frac{1 - P^{1}_{sb}}{2} = \frac{1 - \frac{1}{2}}{2} = \frac{1}{4} \] - Les nouvelles probabilités sont donc : \[ P^{1}_{m} = \frac{1}{4}, \quad P^{1}_{sb} = \frac{1}{2}, \quad P^{1}_{lb} = \frac{1}{4} \]
Les patterns de substitution proportionnelle observés dans le modèle logit sont le résultat de l’hypothèse d’indépendance entre les utilités des alternatives.
Cependant, cette hypothèse peut ne pas tenir dans des cas où les alternatives ont des similitudes, comme le beurre salé et le beurre faible en sodium, qui sont plus substituables entre eux que par rapport à un troisième produit distinct, la margarine.
Pour pallier ces limites, deux approches sont suggérées :
Contexte Examinons le choix quotidien entre deux modes de transport : un nouveau train (N) et un bus (B). Chaque mode présente des caractéristiques telles que le coût et la vitesse, influençant les décisions d’un individu.
Fonctions d’Utilité Pour un individu \(n\), les utilités pour chaque mode de transport sont : Nouveau train (N) : \(U_{n,N} = V(\text{cost}_N, \text{speed}_N, \text{income}_n) + \epsilon_{n,N}\) Bus (B) : \(U_{n,B} = V(\text{cost}_B, \text{speed}_B, \text{income}_n) + \epsilon_{n,B}\)
Forme Linéaire des Utilités Systématiques La fonction d’utilité systématique \(V\) est spécifiée de manière linéaire : Pour le nouveau train : \(V(\text{cost}_N, \text{speed}_N, \text{income}_n) = \beta_1 \times \text{cost}_N + \beta_2 \times \text{speed}_N + \beta_3 \times \text{income}_n\) Pour le bus : \(V(\text{cost}_B, \text{speed}_B, \text{income}_n) = \mu + \beta_1 \times \text{cost}_B + \beta_2 \times \text{speed}_B + \beta_3 \times \text{income}_n\)
Compensation entre attibuts Ce modèle illustre comment des coûts plus élevés peuvent être compensés par une vitesse plus grande, par exemple. Conclusion Cette spécification linéaire offre un moyen simple et intuitif de modéliser l’impact de divers attributs sur les choix individuels, crucial pour comprendre et prévoir les comportements de choix dans divers contextes.
Nous sommes maintenant prêts à travailler avec un exemple pratique. Bien que brièvement mentionné précédemment, il est utile de souligner que les tables de données pour l’analyse des choix discrets peuvent prendre deux formes : longue ou large.
Dans un cadre de données en format large, chaque ligne représente un décideur, et les informations sur les alternatives sont dispersées : le même attribut peut apparaître dans plusieurs colonnes, une pour chaque alternative pour laquelle l’attribut a été mesuré.
Dans un cadre de données en format long, chaque ligne représente une alternative : les attributs apparaissent seulement dans une colonne, mais le décideur sera répété sur plusieurs lignes, une fois pour chaque alternative parmi lesquelles il pourrait choisir.
Pour illustrer la différence, nous utiliserons un ensemble de données sur les modes de transport utilisés par les étudiants pour se rendre à l’Université McMaster au Canada. Cet ensemble de données est en format large. Nous pouvons le voir en affichant les premières lignes du cadre de données, en sélectionnant les colonnes avec l’ID des répondants, leur choix, et toutes les variables qui commencent par “time”, puis en filtrant une sélection de lignes par ID de décideur.
mc_commute_wide
: Introductionchoice
: Mode de transport choisi (Cycle, Walk, HSR (bus local), Car).available.*
: Disponibilité de chaque mode (Yes/No).time.*
: Temps de trajet pour chaque mode (en minutes).access.*
: Temps d’accès à chaque mode de transport.wait.*
: Temps d’attente à chaque mode de transport.gender
, age
.shared
, family
, child
.PersonalVehComf_*
, Fun_*
, ActiveNeigh_*
, UsefulTrans_*
, etc.<- mc_commute_wide %>%
example_wide # Select columns from the table
select(id, choice, starts_with("time")) %>%
# Filter three decision-makers by their `id`
# Here the symbol `|` is for "or", so this reads
# filter rows with id == 566910139 OR id == 566873140 OR id == 566872636
filter(id == 566910139 |
== 566873140 | id == 566872636) id
Dans cette table en format large, la variable de temps (pour le temps de trajet) apparaît dans quatre colonnes. On remarque que cette variable n’a pas été mesurée pour chaque alternative : cela est dû au fait que certains utilisateurs n’avaient pas de vélo ou de voiture ; pour d’autres, l’école pouvait être trop éloignée pour aller à pied. Lorsque des attributs sont manquants, cela est interprété comme une situation où l’alternative n’était pas disponible pour le décideur.
Ces exemples illustrent comment les données reflètent la disponibilité des options de transport pour chaque décideur, et comment l’absence de données pour une alternative spécifique indique que cette option n’était pas disponible.
La transformation d’une table de données de format large à format long permet une meilleure manipulation et analyse dans certains types d’analyses statistiques, notamment l’analyse des choix discrets.
pivot_longer()
%>%
example_wide pivot_longer(
cols = starts_with("time."),
names_prefix = "time.",
names_to = "alternative",
values_to = "time"
)
# A tibble: 12 × 4
id choice alternative time
<dbl> <fct> <chr> <dbl>
1 566872636 HSR Cycle NA
2 566872636 HSR Walk 21.3
3 566872636 HSR HSR 5
4 566872636 HSR Car NA
5 566873140 HSR Cycle NA
6 566873140 HSR Walk 12.8
7 566873140 HSR HSR 10
8 566873140 HSR Car 2
9 566910139 Walk Cycle 4.37
10 566910139 Walk Walk 15
11 566910139 Walk HSR 20
12 566910139 Walk Car 5
Après avoir utilisé pivot_longer()
pour transformer la table, notez comment :
Cette structure facilite l’analyse des données en alignant tous les temps de trajet dans une colonne unique, permettant ainsi des comparaisons directes et une manipulation plus simple des données liées à chaque décideur et chaque mode de transport.
{mlogit}
Pour utiliser le package {mlogit}
pour la modélisation logit multinomiale, nous convertissons les données du format large au format long. {mlogit}
nécessite que les données soient en format long, car il est conçu pour analyser les choix discrets où chaque observation représente une option de choix pour un individu.
Variables Varying : Dans notre cas, les variables qui varient par alternative et nécessitent une transformation sont : le temps de voyage (time
), le temps d’accès (access
- le temps nécessaire pour atteindre un arrêt de bus HSR), le temps d’attente (wait
- temps d’attente pour le bus HSR), et le nombre de transferts (transfer
- spécifique au HSR).
Remarque : Les variables access
, wait
, et transfer
sont spécifiques au mode HSR (bus local) et sont mises à zéro pour les autres modes de transport (“Car”, “Cycle”, “Walk”), car elles ne s’appliquent pas.
Cette étape de conversion est cruciale pour aligner l’ensemble de données avec les exigences de {mlogit}
et permet une analyse précise des préférences de transport des décideurs.
library(mlogit)
Loading required package: dfidx
Attaching package: 'dfidx'
The following object is masked from 'package:stats':
filter
<- mc_commute_wide %>%
example_long # Filter three decision-makers by their `id`
# Here the symbol `|` is for "or", so this reads
# filter rows with id == 566910139 OR id == 566873140 OR id == 566872636
filter(id == 566910139 |
== 566873140 | id == 566872636) %>%
id mlogit.data(shape="wide",
# Name of column with the choices
choice = "choice",
# Numbers of columns with attributes that vary by alternative
varying = 3:22)
{mlogit}
Le résultat de la conversion des données pour l’usage avec {mlogit}
est un data frame indexé, qui se compose de deux parties :
Dans la table principale obtenue après transformation :
Pour observer comment les données sont structurées dans la table principale :
data.frame(example_long) %>%
select(id, choice, alt, starts_with("time"), idx)
id choice alt time idx
1 566872636 FALSE Car NA 1:Car
2 566872636 FALSE Cycle NA 1:ycle
3 566872636 TRUE HSR 5.000000 1:HSR
4 566872636 FALSE Walk 21.314387 1:Walk
5 566873140 FALSE Car 2.000000 2:Car
6 566873140 FALSE Cycle NA 2:ycle
7 566873140 TRUE HSR 10.000000 2:HSR
8 566873140 FALSE Walk 12.788632 2:Walk
9 566910139 FALSE Car 5.000000 3:Car
10 566910139 FALSE Cycle 4.371118 3:ycle
11 566910139 FALSE HSR 20.000000 3:HSR
12 566910139 TRUE Walk 15.000000 3:Walk
Dans notre analyse, chaque ligne représente une alternative de choix pour un individu donné, avec quatre alternatives disponibles par décideur. En examinant les colonnes choice
et alt
, nous identifions le choix de chaque individu :
choice
indique si l’alternative a été choisie.alt
identifie l’alternative spécifique.Par exemple, l’individu avec l’ID “566872636” a choisi l’alternative HSR, tandis que “566910139” a choisi de marcher.
Notre ensemble de données inclut une colonne d’index (idx
) qui renvoie à une table d’index spécifique. Cette table d’index est essentielle pour notre analyse, car elle contient deux informations clés pour chaque observation :
# Pour voir la structure de la table d'index :
# print(data.frame(mc_commute_long$idx))
Le premier pas vers le développement d’un modèle de choix est de spécifier les fonctions d’utilité désirées. Le package mlogit
s’appuie sur Formula
pour créer ces fonctions, permettant la construction de formules multi-composantes.
mlogit
et Formula
Les fonctions d’utilité dans mlogit
peuvent avoir de multiples composants, tirant parti de la flexibilité offerte par Formula
:
mlogit
Les formules pour mlogit
sont définies en trois parties :
choice ∼ alternative-specific vars with generic coefficients
individual-specific vars
alternative-specific vars with specific coefficients
Pour déterminer quelles variables sont disponibles pour l’analyse dans notre ensemble de données, nous pouvons lister les noms des colonnes :
colnames(example_long)
[1] "id" "choice"
[3] "parking" "vehind"
[5] "gender" "age"
[7] "shared" "family"
[9] "child" "street_density"
[11] "sidewalk_density" "LAT"
[13] "LONG" "PersonalVehComf_SD"
[15] "PersonalVehComf_D" "PersonalVehComf_A"
[17] "PersonalVehComf_SA" "Fun_SD"
[19] "Fun_D" "Fun_A"
[21] "Fun_SA" "ActiveNeigh_SD"
[23] "ActiveNeigh_D" "ActiveNeigh_A"
[25] "ActiveNeigh_SA" "UsefulTrans_SD"
[27] "UsefulTrans_D" "UsefulTrans_A"
[29] "UsefulTrans_SA" "BusComf_SD"
[31] "BusComf_D" "BusComf_A"
[33] "BusComf_SA" "TravelAlone_SD"
[35] "TravelAlone_D" "TravelAlone_A"
[37] "TravelAlone_SA" "Shelters_SD"
[39] "Shelters_D" "Shelters_A"
[41] "Shelters_SA" "Community_SD"
[43] "Community_D" "Community_A"
[45] "Community_SA" "personal_veh_comfortable"
[47] "getting_there_fun" "like_active_neighborhood"
[49] "commute_useful_transition" "buses_comfortable"
[51] "prefer_travel_alone" "shelter_good_quality"
[53] "sense_community" "numna"
[55] "alt" "available"
[57] "time" "access"
[59] "wait" "transfer"
[61] "chid" "idx"
Nous commençons par définir une formule très simple qui considère uniquement le temps de trajet. Cette approche nous permet d’introduire les concepts de base des fonctions d’utilité dans le contexte des modèles de choix.
mFormula
La fonction mFormula()
permet de définir des formules à plusieurs parties de la forme y ~ x | z | w
. Dans notre contexte, cela se traduit par :
choice ~ alternative vars. with generic coefficients
individual vars. with specific coefficients
alternative vars. with specific coefficients
Pour cet exemple, nous nous concentrons sur le temps de trajet (time
) comme variable principale.
mFormula
Considérons le temps de trajet comme la seule variable influençant le choix de transport. Nous définissons notre formule comme suit :
<- mFormula(choice ~ time) f1
model.matrix
La fonction model.matrix
nous permet d’examiner comment la formule est appliquée aux données. En convertissant la matrice de modèle en data.frame
, nous pouvons ensuite afficher les premières lignes pour un aperçu rapide :
# Assumant que f1 contient notre formule et example_long nos données
%>%model.matrix(data = example_long) f1
(Intercept):Cycle (Intercept):HSR (Intercept):Walk time
1 0 1 0 5.000000
2 0 0 1 21.314387
3 0 0 0 2.000000
4 0 1 0 10.000000
5 0 0 1 12.788632
6 0 0 0 5.000000
7 1 0 0 4.371118
8 0 1 0 20.000000
9 0 0 1 15.000000
Rappelez-vous que le premier décideur de ce sous-ensemble de la table n’avait que deux alternatives dans son ensemble de choix : HSR et marche. Par conséquent, les deux premières lignes correspondent à eux. La matrice de modèle n’inclut pas d’alternatives qui ne font pas partie de l’ensemble de choix. De plus, nous voyons que la formule inclut par défaut les coefficients spécifiques à l’alternative. Les fonctions d’utilité de ce décideur peuvent s’écrire comme suit :
\[ \begin{aligned} V_{\text{HSR}} &= 0 + \mu_{\text{HSR}} + 0 + \beta_{1} \text{time}_{\text{HSR}} \\ V_{\text{walk}} &= 0 + 0+ \mu_{\text{walk}} + \beta_{1} \text{time}_{\text{walk}} \end{aligned} \]
où \(\beta_{1}\) est le coefficient générique pour le temps de voyage.
Définissons maintenant une formule qui intègre une variable spécifique à l’individu, comme la densité des trottoirs au lieu de résidence, et appelons-la f2
.
# La fonction `mFormula()` est utilisée pour définir des formules multi-parties.
# Dans cette formule, `time` est l'une des variables x et `sidewalk_density` est l'une des variables z.
<- mFormula(choice ~ time | sidewalk_density) f2
example_long
%>% model.matrix(data = example_long) f2
(Intercept):Cycle (Intercept):HSR (Intercept):Walk time
1 0 1 0 5.000000
2 0 0 1 21.314387
3 0 0 0 2.000000
4 0 1 0 10.000000
5 0 0 1 12.788632
6 0 0 0 5.000000
7 1 0 0 4.371118
8 0 1 0 20.000000
9 0 0 1 15.000000
sidewalk_density:Cycle sidewalk_density:HSR sidewalk_density:Walk
1 0.00000 22.63322 0.00000
2 0.00000 0.00000 22.63322
3 0.00000 0.00000 0.00000
4 0.00000 39.64003 0.00000
5 0.00000 0.00000 39.64003
6 0.00000 0.00000 0.00000
7 26.06793 0.00000 0.00000
8 0.00000 26.06793 0.00000
9 0.00000 0.00000 26.06793
Définissons un modèle plus complexe qui prend en compte la densité des trottoirs au lieu de résidence de l’individu. Les fonctions d’utilité avec des coefficients spécifiques pour cette variable sont exprimées comme suit :
\[ \begin{aligned} V_{n,\text{car}} &= 0+0+0 + \beta_1 \text{temps}_{n,\text{car}} + 0 +0+0 \\ V_{n,\text{vélo}} &= \mu_{\text{cycle}}+0+0 + \beta_1 \text{time}_{n,\text{cycle}} + \gamma_1 \text{swd}_{n} +0+0\\ V_{n,\text{HSR}} &= 0 + \mu_{\text{HSR}} + \beta_1 \text{time}_{n,\text{HSR}} + 0 + \gamma_2 \text{swd}_{n}+0 \\ \end{aligned} V_{n,\text{marche}} &= 0 +0+ \mu_{\text{walk}}+ \beta_1 \text{time}_{n,\text{walk}} + 0+0+\gamma_3 \text{swd}_{n} \]
où \(\beta_1\) représente le coefficient générique pour le temps de trajet et \(\gamma_1\), \(\gamma_2\), \(\gamma_3\) sont des coefficients spécifiques à l’individu pour la densité des trottoirs.
Ici, nous testons une formule différente où le temps possède des coefficients spécifiques à chaque alternative plutôt que des coefficients génériques, et nous nommons cette formule f3
.
# Nous indiquons explicitement qu'il n'y a pas de variables spécifiques à l'alternative avec des coefficients génériques en utilisant '0'.
<- mFormula(choice ~ 0 | sidewalk_density | time) f3
example_long
%>%model.matrix( data = example_long) f3
(Intercept):Cycle (Intercept):HSR (Intercept):Walk sidewalk_density:Cycle
1 0 1 0 0.00000
2 0 0 1 0.00000
3 0 0 0 0.00000
4 0 1 0 0.00000
5 0 0 1 0.00000
6 0 0 0 0.00000
7 1 0 0 26.06793
8 0 1 0 0.00000
9 0 0 1 0.00000
sidewalk_density:HSR sidewalk_density:Walk time:Car time:Cycle time:HSR
1 22.63322 0.00000 0 0.000000 5
2 0.00000 22.63322 0 0.000000 0
3 0.00000 0.00000 2 0.000000 0
4 39.64003 0.00000 0 0.000000 10
5 0.00000 39.64003 0 0.000000 0
6 0.00000 0.00000 5 0.000000 0
7 0.00000 0.00000 0 4.371118 0
8 26.06793 0.00000 0 0.000000 20
9 0.00000 26.06793 0 0.000000 0
time:Walk
1 0.00000
2 21.31439
3 0.00000
4 0.00000
5 12.78863
6 0.00000
7 0.00000
8 0.00000
9 15.00000
Nous allons omettre la section détaillée sur la méthode d’estimation par le maximum de vraisemblance, utilisée pour obtenir les coefficients des fonctions d’utilité.
Nous poursuivrons directement avec l’application des formules et des matrices de modèle précédemment définies.