Cours n°01 : Introduction à l’inférence bayésienne Cours n°02 : Modèle Beta-Binomial Cours n°03 : Introduction à brms, modèle de régression linéaire Cours n°04 : Modèle de régression linéaire (suite) Cours n°05 : Markov Chain Monte Carlo Cours n°06 : Modèle linéaire généralisé Cours n°07 : Comparaison de modèles Cours n°08 : Modèles multi-niveaux Cours n°09 : Modèles multi-niveaux généralisés Cours n°10 : Data Hackathon
\[\newcommand\given[1][]{\:#1\vert\:}\]
Introduction
Cinq problèmes, cinq jeux de données. Le but est de comprendre et d’analyser ces données pour répondre à une (ou plusieurs) question(s) théorique(s).
Vous devrez écrire le modèle mathématique, puis fitter ce modèle en utilisant brms.
Ensuite, vous devrez évaluer le modèle, interpréter les résultats, et écrire un paragraphe de résultats (de type article) pour décrire vos analyses et vos conclusions.
Les problèmes sont classés par ordre croissant de difficulté. Vous pouvez travailler individuellement ou par groupe, et des propositions de correction sont disponibles à la suite des énoncés.
Problème n°1
Peut-on prédire la taille d’un individu par la taille de ses parents ?
gender height mother father
1 M 62.5 66 70
2 M 64.6 58 69
3 M 69.1 66 64
4 M 73.9 68 71
5 M 67.1 64 68
6 M 64.4 62 66
7 M 71.1 66 74
8 M 71.0 63 73
9 M 67.4 64 62
10 M 69.3 65 69
Problème n°2
Les données suivantes documentent le naufrage du titanic. La colonne pclass indique la classe dans laquelle chaque passager voyageait (un proxy pour le statut socio-économique), tandis que la colonne parch indique le nombre de parents et enfants à bord.
Peut-on prédire la survie d’un passager grâce à ces informations ?
Ce jeu de données recense des informations sur le diamètre (colonne diam) de 80 pommes (chaque pomme étant identifiée par la colonne id), poussant sur 10 arbres différents (colonne tree). On a mesuré ce diamètre pendant 6 semaines successives (colonne time).
Que peut-on dire de la pousse de ces pommes, tout en considérant les structures de dépendance existant dans les données (i.e., chaque pomme poussait sur un arbre différent) ?
Ces données recensent le nombre de candidatures pour 6 départements (colonne dept) à Berkeley (données disponibles dans le paquet rethinking). La colonne admit indique le nombre de candidatures acceptées et la colonne reject le nombre de candidatures rejetées (la colonne applications est simplement la somme des deux), en fonction du sexe des candidats (applicant.gender).
On veut savoir s’il existe un biais lié au sexe dans l’admission des étudiants à Berkeley.
d4 <-open_data(admission)head(d4, 10)
dept applicant.gender admit reject applications
1 A male 512 313 825
2 A female 89 19 108
3 B male 353 207 560
4 B female 17 8 25
5 C male 120 205 325
6 C female 202 391 593
7 D male 138 279 417
8 D female 131 244 375
9 E male 53 138 191
10 E female 94 299 393
Problème n°5
Le dilemme du tramway (trolley problem) est une expérience de pensée qui permet d’étudier les déterminants des jugements de moralité (i.e., qu’est-ce qui fait qu’on juge une action comme morale, ou pas ?).
Sous une forme générale, ce dilemme consiste à poser la question suivante : si une personne peut effectuer un geste qui bénéficiera à un groupe de personnes A, mais, ce faisant, nuira à une personne B (seule); est-il moral pour la personne d’effectuer ce geste ?
Généralement, on fait lire des scénarios aux participants de l’étude, dans lesquels un individu doit prendre une décision dans une situation similaire à celle décrite à la slide précédente. Par exemple, imaginons que Denis ait le choix entre ne rien faire et laisser un train tuer cinq personnes, ou faire dérailler ce train mais tuer une personne. Ensuite, on demande aux participants de juger de la moralité de l’action choisie par Denis, sur une échelle de 1 à 7.
Des études antérieures ont montré que ces jugements de moralité sont grandement influencés par trois mécanismes de raisonnement inconscients :
Le principe d’action : un préjudice causé par une action est jugé moralement moins acceptable qu’un préjudice causé par omission.
Le principe d’intention : un préjudice causé comme étant le moyen vers un but est jugé moralement moins acceptable qu’un préjudice étant un effet secondaire (non désiré) d’un but.
Le principe de contact : un préjudice causé via contact physique est jugé moralement moins acceptable qu’un préjudice causé sans contact physique.
Problème n°5
Ce jeu de données comprend 12 colonnes et 9930 lignes, pour 331 individus. L’outcome qui nous intéresse est response, un entier pouvant aller de 1 à 7, qui indique à quel point il est permis (moralement) de réaliser l’action décrite dans le scénario correspondant, en fonction de l’âge (age) et genre (male) du participant (id).
On se demande comment les jugements d’acceptabilité sont influencés par les trois principes décrits slide précédente. Ces trois principes correspondent aux trois variables, action, intention, et contact (dummy-coded).
Cette situation revient à essayer de prédire un outcome dichotomique à l’aide de prédicteurs continus et / ou catégoriels. On peut utiliser un modèle de régression logistique (cf. Cours n°06).
Cette situation revient à essayer de prédire une variable continue (le diamètre) à l’aide de prédicteurs continus ordonnés (le temps), en sachant que le diamètre d’une pomme dépend de l’arbre sur lequel cette pomme pousse. On peut utiliser un modèle multi-niveaux (ou modèle mixte, cf. Cours n°08).
d3 <- d3 %>%filter(diam !=0) # removing null data
Réponse possible problème n°3
On peut fitter plusieurs modèles avec brms::brm() et les comparer ensuite en utilisant le WAIC.
p1 <-c(prior(normal(0, 10), class = Intercept),prior(cauchy(0, 10), class = sigma) )m1 <-brm( diam ~1,prior = p1,data = d3,cores = parallel::detectCores(),backend ="cmdstanr" )p2 <-c(prior(normal(0, 10), class = Intercept),prior(normal(0, 10), class = b),prior(cauchy(0, 10), class = sigma) )m2 <-brm( diam ~1+ time,prior = p2,data = d3,cores = parallel::detectCores(),backend ="cmdstanr" )
Réponse possible problème n°3
p3 <-c(prior(normal(0, 10), class = Intercept),prior(normal(0, 10), class = b),prior(cauchy(0, 10), class = sd),prior(cauchy(0, 10), class = sigma) )m3 <-brm( diam ~1+ time + (1| tree),prior = p3,data = d3,cores = parallel::detectCores(),backend ="cmdstanr" )p4 <-c(prior(normal(0, 10), class = Intercept),prior(normal(0, 10), class = b),prior(cauchy(0, 10), class = sd),prior(cauchy(0, 10), class = sigma),prior(lkj(2), class = cor) )m4 <-brm( diam ~1+ time + (1+ time | tree),prior = p4,data = d3,cores = parallel::detectCores(),control =list(adapt_delta =0.99),backend ="cmdstanr" )
Réponse possible problème n°3
p5 <-c(prior(normal(0, 10), class = Intercept),prior(normal(0, 10), class = b),prior(cauchy(0, 10), class = sd),prior(cauchy(0, 10), class = sigma),prior(lkj(2), class = cor) )m5 <-brm( diam ~1+ time + (1+ time | tree / apple),prior = p5,data = d3,cores = parallel::detectCores(),control =list(adapt_delta =0.99),backend ="cmdstanr" )