--- title: "exo pairs" author: "Flavie Derouin Tochon" date: "16 avril 2020" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` ## Orignes des données [Extrait du Sujet 6: Autour du Paradoxe de Simpson](https://www.fun-mooc.fr/courses/course-v1:inria+41016+self-paced/courseware/5b932aa591d245d48d8943385cb3120a/57c96f2c7f7b42018eaac3e6b34546f4/) "En 1972-1974, à Whickham, une ville du nord-est de l'Angleterre, située à environ 6,5 kilomètres au sud-ouest de Newcastle upon Tyne, un sondage d'un sixième des électeurs a été effectué afin d'éclairer des travaux sur les maladies thyroïdiennes et cardiaques (Tunbridge et al. 1977). Une suite de cette étude a été menée vingt ans plus tard (Vanderpump et al. 1995). Certains des résultats avaient trait au tabagisme et cherchaient à savoir si les individus étaient toujours en vie lors de la seconde étude. Par simplicité, nous nous restreindrons aux femmes et parmi celles-ci aux 1314 qui ont été catégorisées comme "fumant actuellement" ou "n'ayant jamais fumé". Il y avait relativement peu de femmes dans le sondage initial ayant fumé et ayant arrêté depuis (162) et très peu pour lesquelles l'information n'était pas disponible (18). La survie à 20 ans a été déterminée pour l'ensemble des femmes du premier sondage." ```{r} data_url= "https://gitlab.inria.fr/learninglab/mooc-rr/mooc-rr-ressources/-/raw/master/module3/Practical_session/Subject6_smoking.csv?inline=false" ``` Pour nous protéger contre une éventuelle disparition ou modification du fichier, nous faisons une copie locale de ce jeu de données que nous préservons avec notre analyse. Il est inutile et même risquée de télécharger les données à chaque exécution, car dans le cas d'une panne nous pourrions remplacer nos données par un fichier défectueux. Pour cette raison, nous téléchargeons les données seulement si la copie locale n'existe pas. ```{r} data_file = "Subject6_smoking.csv" if (!file.exists(data_file)) { download.file(data_url, data_file, method="auto") } ``` Voici l'explication des colonnes données décrit dans le [sujet 6](https://www.fun-mooc.fr/courses/course-v1:inria+41016+self-paced/courseware/5b932aa591d245d48d8943385cb3120a/57c96f2c7f7b42018eaac3e6b34546f4/) Chaque ligne représente une femme. | Nom de colonne | Decription de colonne | |----------------+-----------------------------------------------------------------------------------------------------------------------------------| | `Smoke` | La femme interrogée est fumeuse ou non | | `Statut` | La femme interrogée est vivante ou morte au moment de la seconde étude | | `Age` | Age de la femme interrogée au moment du premier sondage ## Lecture des données ```{r} data=read.csv(data_file, header=T) ``` 1. Observation de l'aspect des données Pour visualiser comment la lecture du jeu de donnée a été effectué, on choisit d'observer le début et la fin de notre jeu de donnée *via* les fontions head et tail ```{r message=TRUE, warning=TRUE, paged.print=TRUE} head(data) tail(data) ``` 2.Y a-t-il des points manquants dans nos données ? ```{r} na_records = apply(data, 1, function (x) any(is.na(x))) data[na_records,] ``` Aucune ligne ne présente de données manquantes, il n'y aura pas besoin de faire attention à ce point dans la suite des analyses 3. Vérification de la nature des variables On vérifie maintenant que R classifie correctement nos variables. On attend que: `Smoker` et `Status`soit considérés comme des facteurs `Age` soit considérés comme un numérique ```{r} str(data) ``` Tout est correcte. 4.Conclusion Le jeu de donée est correctement lu par R et le jeu de donnée ne présente pas de données manquante. Nous pouvons donc commencer à répondre au question de l'excercice. ## Question 1 ### Enoncé Représentez dans un tableau le nombre total de femmes vivantes et décédées sur la période en fonction de leur habitude de tabagisme. Calculez dans chaque groupe (fumeuses / non fumeuses) le taux de mortalité (le rapport entre le nombre de femmes décédées dans un groupe et le nombre total de femmes dans ce groupe). Vous pourrez proposer une représentation graphique de ces données et calculer les intervalles de confiance. En quoi ce résultat est-il surprenant ? ### Résolusion de la question 1 ####Tableau du nombre total de femmes vivantes et décédées sur la période en fonction de leur habitude de tabagisme On Crée d'une table de contigence ```{r} statut=table(data$Status, data$Smoker) statut ``` ####Calculs des taux de mortalité en fonction des habitudes de tabagisme On exprime le taux de mortalité par habitude de tabagisme en appliquant pour un groupe la formule suivante: $mortalité = Ndécédée / (Nvivante + Ndécédée)$ N = nombre de femme du groupe répondant au statu mentionné (décédée ou vivante) Pour obtenir ces taux de mortalité, nous allons calculer les pourcentage globaux pour la table de contingence précédemment créer en fonction de l'habitude de tabagisme ```{r} prop_statut= prop.table(statut,2) prop_statut ``` L'argument 2 nous permet de specifier que nous souhaitons obtenir un calcul des fréquences en fonction des colonnes. Les colonnes correspondant à l'habitude de tabagisme, c'est ce que nous recherchons __Conclusion__ __Le taux de mortalité chez les non fumeuses est de 31.4%__ __Le taux de motalité chez les fumeuse est de 23.9%__ ####Représentation graphique des données Ici on choisit de visualisé les taux de moratalité en fonction de l'habitude de tabagisme à l'aide d'un graphique en barre ```{r} graph <- barplot(prop_statut[2,], axes=FALSE, ann=FALSE, col="lavender", ylim=c(0,1), names=c("Non fumeuse","Fumeuse"), xpd=FALSE) abline(h=0) axis(2) title(xlab="Habitude de Tabagisme", ylab="Taux de mortalité", main="Taux de mortalité en fonction de l'habitude de tabagisme") ``` #### Calculs des intervalles de confiances (IC) On commence par récupérer le nombre d'observations pour les femmes non fumeuse pour tous les status ```{r} nb.No <- as.vector(statut[,1]) ``` On fait de même pour les fumeuses ```{r} nb.Yes <- as.vector(statut[,2]) ``` On récupère ensuite le nombre total d'observation en fonction des habitude de tabagisme ```{r} #Pour les non fumeuses nbT.No<-sum(nb.No) #Pour les fumeuse nbT.Yes<-sum(nb.Yes) ``` On calcule nos IC grace à la fonction `binom.confit` associé au package `binom`. On cherche donc le package `binom` ```{r} library(binom) ``` Calculs des IC pour les non fumeuses ```{r} df.No <- binom.confint(nb.No, nbT.No, conf.level=0.95, methods="prop.test") rownames(df.No) <- paste("No", rownames(statut), sep="__") df.No ``` __Conclusion__ __ On retrouve bien un taux moyen de mortalité = 0.314__ __IC pour le taux de mortalité des non fumeuse = [0.280;0.349]__ Calculs des IC pour les fumeuses ```{r} df.Yes <- binom.confint(nb.Yes, nbT.Yes, conf.level=0.95, methods="prop.test") rownames(df.Yes) <- paste("Yes", rownames(statut), sep="__") df.Yes ``` __Conclusion__ __ On retrouve bien un taux moyen de mortalité = 0.2388__ __IC pour le taux de mortalité des non fumeuse = [0.205;0.276]__ #### En quoi ce résultat est-il surprenant ? ce résultat est surprenant car on s'attendrait à voir que le taux de mortalité est plus importante chez les femmes fumeuse. C'est l'inversse qui ressort ici: le taux de mortalité est plus important chez les femmes n'ayant jamais fumée. ## Question 2 ### Enoncé Reprenez la question 1 (effectifs et taux de mortalité) en rajoutant une nouvelle catégorie liée à la classe d'âge. On considérera par exemple les classes suivantes : 18-34 ans, 34-54 ans, 55-64 ans, plus de 65 ans. En quoi ce résultat est-il surprenant ? Arrivez-vous à expliquer ce paradoxe ? De même, vous pourrez proposer une représentation graphique de ces données pour étayer vos explications. ### Réponse à la question 2 #### Ajout de la variable âge Ici on propose d'ajouter à notre jeu de donnée la variable age par classes. 4 classes ont été définit: 1. 18-34 ans 2. 34-54 ans 3. 55-64 ans 4. plus de 65 ans __Remarque__: Certaines classes ne sont pas continue (_i.e._: 34-54 et 55-64) ceci s'explique par le fait que aucune femme interrogée n'a entre [54.1-54.9] ans. De même il n'y a pas de femme interrogée ayant entre 64.0 et 64.9 ans. Néanmoins ces classes ne sont pas par défaut contenu dans notre jeu de données. Il va donc falloir les définir dans notre tableau. Nous allons créer pour cela une nouvelles colonne dans notre tableau que nous appellerons `class_age`. Dans cette variable nous allons "découper" la variable `Age` selon les classes définit précédement Pour cela nous allons utiliser la fonction cut qui crée des classe en excluant la valeur de la borne inférieur et en incluant celle de la borne supérieur. Matématiquement cela donne ceci : $)a;b]$ Avant cela on remarque que les ages dans notre fichier contiennent des virgules, il nous faut donc être plus précis sur la définition des bornes de nos classes. Ainsi nous allons définir à R nos 4 classes de la façon suivante: 1. )17.9-33.9] ans -> Nous indiquons 17.9 pour que les sujets de 18.0 ans soit inclus dans la classe et 33.9 pour que la classe suivante démarre à 34 ans 2. )33.9-54.0] ans -> Nous indiquons 33.9 pour que les sujets de 34.0 ans soit inclus dans la classe et 54.0 pour inclure les sujet de 54.0 ans dans la classe 3. )54.0-64.0] ans-> Nous indiquons 54.0 pour que les sujets de 55 ans soit inclus dans la classe (NB: il n'y a pas de valeur entre 54.1 et 54.9) et 64.0 pour inclure les sujet de 64.0 ans dans la classe 4. )64.0-89.9]ans -> Nous indiquons 64.0 pour que les sujets de 65 ans soit inclus dans la classe (NB: il n'y a pas de valeur entre 64.1 et 64.9) et 89.9 car ceci correspond à l'âge des sujets les plus agés ```{r} class_age<- cut((data$Age),c(17.9,33.9,54.0,64.0,89.9)) data$class_age<-class_age ``` On vérifie visuellement si les différentes classes sont bien découper. pour nous facilité la tache nous allons d'abord réorganiser notre jeu de donné en fontion de l'age. ```{r} data = data[order(data$Age),] View(data) ``` La classification c'est bien passée. Néanmoins pour nous éviter des erreurs d'interprétation par la suite, nous allons renommé nos classes pour qu'elles correspondent aux noms de celles définit dans l'énoncé de la question2 ```{r} rename_class_age<-class_age levels(rename_class_age) levels(rename_class_age)[c(4)]<-">65" levels(rename_class_age) levels(rename_class_age)[c(3)]<-"55-64" levels(rename_class_age) levels(rename_class_age)[c(2)]<-"34-54" levels(rename_class_age) levels(rename_class_age)[c(1)]<-"18-34" levels(rename_class_age) data$class_age<-rename_class_age ``` On vérifie que le renommage c'est bien passé en regardant les niveaux des facteurs de la variable class_age ```{r} levels(data$class_age) ``` Tout c'est bien passé #### Intégration de la varible au tableau précédent status en fonction de l'habitude de tabagisme. ```{r} table_age<-table(data$Status,data$Smoke,data$class_age) table_age prop_statut ``` #### Représentation graphique Pour faire nos graphiques nous allons faire appelle à la library `GrapheR`. GrapheR est une interface utilisateur multiplateforme (Linux, Mac OS, Windows) permettant de réaliser des graphes hautement paramétrables sous R.(plus de détails: [Introduction à GrapheR](http://www2.uaem.mx/r-mirror/web/packages/GrapheR/vignettes/manual_fr.pdf)) ```{r} library(GrapheR) run.GrapheR() ``` GrapheR crée des graphique en fonction des choix fait dans son interface. Nous choisissons de créer un graphique en barre pour représenter le taux de mortalité en fonction de l'habitude de tabagisme. Les lignes de Code suivante correspondent au code sorie par `GrapheR` qu'il est possible de sauvegarder. ## Question 3 ### Enoncé Afin d'éviter un biais induit par des regroupements en tranches d'âges arbitraires et non régulières, il est envisageable d'essayer de réaliser une régression logistique. Si on introduit une variable Death valant 1 ou 0 pour indiquer si l'individu est décédé durant la période de 20 ans, on peut étudier le modèle Death ~ Age pour étudier la probabilité de décès en fonction de l'âge selon que l'on considère le groupe des fumeuses ou des non fumeuses. Ces régressions vous permettent-elles de conclure sur la nocivité du tabagisme ? Vous pourrez proposer une représentation graphique de ces régressions (en n'omettant pas les régions de confiance). ### Réponse à la question 3 #### Conversion de la variable statut en binaire __ Conversion de la variable qualitative `Statut`en variable binaire: `Death`__ Nous allons commencer par recoder la variable `Statut` comme une variable binomiale que nous allons nommée `Death` que nous réutiliserons dans la suite de cet exercice. Nous allons coder de la façon suivante les catérogies de la variable `Statut`: Alive = 0 Dead = 1 `Death`sera donc une variable binaire (0 ou 1) et sera considérer comme une variable numérique 1. Transformation de la variable qualitative `Status` en variable binaire `Death` On commence par créer un objet `Death` pour qu'il soit le reflet de la variable `Status` de notre jeu de donnée ```{r} Death<-data$Status ``` On commence alors à modifier dans ce vecteur les noms des niveaux de cet objets Ainsi, on remplace le niveau _Death_ par _1.0_ et _Alive_ par _0.0_ ```{r} levels(Death) levels(Death)[c(2)]<-1.0 levels(Death) levels(Death)[c(1)]<-0.0 levels(Death) ``` On vérifie la nature de `Death ```{r} class(Death) ``` Avant de l'implémenter dans notre jeu de donnée, nous convestissons `Death` en une variable numérique ```{r} Death<-as.integer(Death) Death summary(Death) ``` On constate ici un problème qui c'est produit alors de converssion: R a remplacé chaque 0 par 1 et chaque 1 par 2 On corrige ceci pour avoir un vecteur correctement coder en 0=Alive et 1=Death ```{r} Death2 <- numeric(length(Death)) for (i in 1:length(Death)) if (Death[i] == 2) Death2[i] <- 1 else Death2[i] <- 0 Death2 ``` Le problème semble corrigé On intègre donc ce vecteur `Death2` bien codé en 0 et 1 à notre jeu de donnée. Cette nouvelle variable de `data` est nommée `Death` ```{r} data$Death<-Death2 View(data) ``` Vérification de la concordance entre les variables `Status` et `Death` ```{r} table(data$Status,data$Death) ``` Toute les données Alive sont bien codées en 0 et les données Death en 1