# Dr Kankoé SALLAH, SKML # Analyse d'un problème sous R ######################################################### # Désir de procréation 2 ans appès le diagnostic chez des parents atteints de cancer ############################################################### # 1) Fichier Excel------------------------------------------------ # téléchargez le fichier « Procreation.xls » . #---------------------------------------------------------------- # a) Ouvrez-le et identifiez la nature des variables étudiées ? ##--> Variables quantitatives : age, n_enfants. PCS, MCS ##--> Variables qualitatives : cancer, sexe, enfant, menopause, sterilite, fertilite, projet ##--> Remarque : enfant, menopause, sterilite, fertilite, projet sont des variables numériques qui ##--> prennent les valeurs 0 ou 1 qui correspondent aux valeurs qualitatives « Non » et « Oui ». # b) Que remarquez vous en survolant les cellules du Procreation.xls ? ##--> Beaucoup de cases vides (= données manquantes) ##--> 281 lignes = 280 sujets # 2) Vérification des données dans R # 2a) Après avoir enregistré le fichier Excel au format .csv, ouvrez-le dans R setwd("C:/sauvegarde_dell/C/PUBLICC/ENSEIGNEMENTS/DU-BIOSTATS-OUAGA") data <- read.csv2("Procreation.csv", header=TRUE) # Afficher les 12 premières lignes de data head(data, 12) # Remarque : Les cases vides ont été remplacées dans R par "NA" (Not Available)= données manquantes. # Rq Nb de lignes du fichier ? nrow(data) ##--> Il y a donc 280 sujets. # Rq Nb de colonnes du fichier ? ncol(data) ##--> Il y a donc 12 variables recueillies chez chaque sujet.. # Dimensions du fichier dim(data) #--> On a les 2 informations simultanément # Quelle est le type de l'objet "data" ? class(data) ##--> Il s'agit d'un Data.frame = tableau de données # 2b) Vérifiez que la sélection des patientes à étudier (femmes âgées de moins de 45 ans, sexe féminin) a été correctement réalisée. 1- D'abord par calcul ; 2- Puis par méthode graphique. # Y a-t-il des fommes dans le fichier ? il faudra les exclure # Description spécifique de la variable sexe: table(data$sexe) ##--> Il y a un homme. Il faudra les exclure # Description spécifique de la variable age: summary(data$age) ##--> il y a des personnes de plus de 45 ans. Il faudra les exclure. #Graphiques possibles : pie(table(data$sexe)) #ou barplot(table(data$sexe)) hist(data$age) #ou boxplot(data$age) # 2c)Isolez les sujets trop âgés, qui ne remplissent donc pas les critères de sélection. exclus_age= subset(data, data$age > 45) dim(exclus_age) exclus_age # ou si on veut juste isoler le plus agé which.max(data$age) exclus_age=data[224,] exclus_age ## --> ligne 224 :1 homme avec un cancer du sein âgé de 58 ans à exclure (n_ident = 4467) # 2d) Isolez le jeu de données à analyser, après exclusion dataF1 <- data[data$sexe=="F",] dim(dataF1) dataF2 <- subset(data, (data$sexe=="F" & data$age<45)) dim(dataF2) dataF=dataF2 # Nouvelle vérification table(dataF$sexe) summary(dataF$age) ##--> OK : plus d'homme et âge maximum = 44,96 # 2e) Y a-t-il une incohérence dans le fichier ? Y a-t-il des gens qui ont dit n'avoir jamais eu pas d'enfants et affirmé en même temps avoir plusieurs enfants ? table(dataF$enfant,dataF$n_enfants) ## --> Pas de problème : dans le tableau croisé, ceux qui ont dit n'avoir pas d'enfants n'ont pas signalé un nb d'enfants supérieur à 0 # 3) Statistiques Descriptives # 3a) Quelles sont les proportions de nullipares (0 enfant) et de primipares (1 seul enfant) ? table(dataF$enfant) prop.table(table(dataF$enfant)) ##--> Il y a 20% de nullipares options(digits=3) ##--> Pour réduire le nombre de décimales à 3 prop.table(table(dataF$enfant)) # Combien de primipares (%) parmi ceux qui ont des enfants ? prop.table(table(dataF$n_enfant)) # Combien de primipares (%) dans l'ensemble de l'échantillon ? table(dataF$n_enfants)/nrow(dataF) ##--> Il y a 23% de primipares dans l'échantillon # 3b) Quel est le nombre moyen d'enfants chez les femmes qui en ont ? summary(dataF$n_enfants) ##--> Le minimum pour la variable vaut 1. Il y a ici 56 données manquantes qui correspondent aux femmes sans enfants. # 3b) Quel est le nombre moyen d'enfants chez les femmes de l'échantillon ? Calculez la variance summary(dataF$n_enfants) #- On peut créer nouvelle variable : dataF$n_enfants2 <- dataF$n_enfants dataF$n_enfants2[dataF$enfant=="0"] <- 0 table(dataF$n_enfants2) dataF$n_enfants2 summary(dataF$n_enfants2) #- Autre façon de créer une nouvelle variable dataF$n_enfants2bis=ifelse(dataF$enfant=="0", 0, dataF$n_enfants) summary(dataF$n_enfants2bis) # Variance du nb d'enfants var(dataF$n_enfants2) # 3b) Proposez une représentation graphique du nb d'enfants par femme boxplot(dataF$n_enfants2, main="Nombre d'enfants", col="red") barplot(table(dataF$n_enfants2), xlab="Nombre d'enfants", ylab="Fréquence absolue", col=1:7) barplot(prop.table(table(n_enfants2)), xlab="Nombre d'enfants", ylab="Fréquence relative") pie(table(dataF$n_enfants2), main="Nombre d'enfants") # 3c) Quelle est la localisation cancéreuse la plus fréquente ? Proposez un graphique de l'ensemble des localisations. table(dataF$cancer) ##--> C'est le cancer du sein le plus fréquent (n=135) pie(table(dataF$cancer), main="Localisations cancéreuses") barplot(table(data$cancer), main="Localisations cancéreuses", horiz=TRUE, cex.names=0.7, las=2) # Remarque : Les options de la commande barplot permettent de rendre plus lisibles l'affichage des localisations cancéreuses. # 4d) Combien de femmes expriment un projet de maternité future ? table(dataF$projet) # Combien ont répondu à cette question ? sum(table(dataF$projet)) #ou length(na.omit(dataF$projet)) ##--> 46 femmes expriment ce projet de maternité parmi 175 répondantes # 4e) Parmi les femmes qui ont répondu à la question sur le projet de maternité, quelle proportion exprime un projet futur ? prop.table(table(dataF$projet)) projet ##--> 26% des femmes ayant répondu expriment ce projet de maternité # 4f) Combien y a t il de données manquantes pour la variable projet ("projet d'enfants") ? # Effectif des données manquantes : plusieurs méthodes possibles (la fonction is.na répond Vrai/Faux selon si une case est vide ou pas) length(dataF$projet) - length(na.omit(dataF$projet)) #ou 279-sum(table(dataF$projet)) #ou table(is.na(dataF$projet)) #Il y a 104 données manquantes # La variable fertilité permet-t elle d'expliquer ces données manquantes ? table(dataF$projet,dataF$fertilite) fertilite # Au vu du tableau croisé, la question sur un éventuel projet d'enfant n'était posée qu'aux femmes ayant une fertilité préservée. # 4) Analyse finale avec tests statistiques dans R # 4a) Créez un nouveau sous-tableau des 175 femmes de moins de 45 ans ayant une fertilité préservée. dataFF <- dataF[dataF$fertilite=="1",] # ou dataFF <- subset(dataF, dataF$fertilite=="1") #4b) L'âge est-il « normalement » distribué (test + illustration graphique) ? ks.test(dataFF$age,"pnorm",mean(dataFF$age),sd(dataFF$age)) ##--> On ne peut pas admettre que l'âge suit une loi normale. hist(dataFF$age, freq=F) lines(density(dataFF$age)) #ou qqnorm(dataFF$age,col="blue"); qqline(dataFF$age) boxplot(dataFF$age) ##-->Graphiquement, il y a un décalage vers les âges plus élevés. #4c) Les 2 composantes de la qualité de vie (physique et mentale) sont-elles liées ? plot(dataFF$PCS, dataFF$MCS); abline(lm(dataFF$MCS~dataFF$PCS)) cor.test(dataFF$PCS, dataFF$MCS, method="pearson") ##-->La corrélation est positive, significativement différente de 0, mais faible (0,2) #4d) A 2 ans du diagnostic de cancer, y-a t il chez ces femmes une composante de qualité de vie plus altérée qu'une autre (test apparié : « paired=TRUE ») ? summary(dataFF$PCS) summary(dataFF$MCS) t.test(dataFF$MCS,dataFF$PCS,paired=T) boxplot(dataFF$PCS, dataFF$MCS) # La composante physique de la qualité de vie est moins altérée (significativement supérieure; p<0,001), le test statistique utilisé est apparié car on ne compare pas 2 groupes différents mais 2 groupes avec les mêmes sujets. #4e) La qualité de vie des patientes est-elle différente selon l'existence d'un projet futur d'enfant ? (2 séries d'analyse pour les 2 composantes physique et mentale de la QDV) boxplot(dataFF$PCS ~ dataFF$projet) var.test(dataFF$PCS[dataFF$projet==0], dataFF$PCS[dataFF$projet==1]) t.test(dataFF$PCS ~ dataFF$projet, var.equal=TRUE) bxplot(dataFF$MCS ~ dataFF$projet) var.test(dataFF$MCS[dataFF$projet==0], dataFF$MCS[dataFF$projet==1]) t.test(dataFF$MCS ~ dataFF$projet, var.equal=TRUE) ##-->On ne met pas non plus en évidence de différence significative pour la composante mentale de qualité de vie entre les 2 groupes (projet ou pas de maternité future) # 4f) Existe-t-il un lien entre le fait d'avoir déjà des enfants et un projet futur de maternité ? table(dataFF$enfant, dataFF$projet) prop.table(table(dataFF$enfant,dataFF$projet),1) chisq.test(dataFF$enfant,dataFF$projet) K=chisq.test(dataFF$enfant,dataFF$projet) K$expected ##--> Test applicable (Cij>5) : Les femmes n'ayant pas encore eu d'enfant expriment plus souvent un projet d'enfant (57% vs. 18% ; p<0,001). par(mfrow = c(1, 2)) barplot(prop.table(table(dataFF$projet[dataFF$enfant==0]),), ylim=c(0,1), ylab="Fréquence relative", col="blue",main="Enfant = 0", sub="Projet : Non/Oui") barplot(prop.table(table(dataFF$projet[dataFF$enfant==1]),), ylim=c(0,1), ylab=" Fréquence relative ",col="red",main="Enfant >= 1", sub="Projet : Non/Oui") par(mfrow = c(1, 1)) #4g) Les femmes qui expriment un projet futur de maternité ont-elles en moyenne le même âge que celles qui ne souhaitent plus d'enfants ? boxplot(dataFF$age ~ dataFF$projet, main="Age") var.test(dataFF$age[dataFF$projet==0], dataFF$age[dataFF$projet==1]) ##--> Egalité des variances non respectée (différence significative p<0.05), il faut utiliser test de Student avec variance inégale : t.test(dataFF$age ~ dataFF$projet, var.equal=FALSE) ##--> Les femmes qui ont un projet futur de maternité sont en moyenne plus jeunes (p<0.001) #4h) Existe-t-il un lien entre l'âge des femmes le fait d'avoir déjà un(des) enfant(s) ? boxplot(dataFF$age ~ dataFF$enfant, main="Age") var.test(dataFF$age~ dataFF$enfant) ##--> Egalité des variances non respectée (différence significative p<0.05), il faut utiliser test de Student avec variance inégale : t.test(dataFF$age ~ dataFF$enfant, var.equal=FALSE) ## -->Les femmes qui n'ont pas d'enfant sont en moyenne plus jeunes (p<0.001) Il est maintenant nécessaire de recourir à une stratification (ou à des méthodes multivariées) pour savoir qu'est-ce qui « explique » le projet d'enfant :l'âge, le fait d'avoir déjà des enfants ou les deux !!! #4i) En étudiant séparément les femmes n'ayant pas d'enfant et chez celles qui en ont au moins un. Les femmes qui expriment un projet futur de maternité ont-elles en moyenne le même âge que celles qui ne souhaitent plus d'enfants ? #Il faut soit recréer encore 2 sous-tableaux (femmes sans enfant, femmes avec enfant), soit pouvoir donner des doubles conditions entre crochet (à l'aide du ET qu'on écrit « & » dans R), soit utiliser le « ~ ». by(dataFF$age[dataFF$enfant=="0"],dataFF$projet[dataFF$enfant=="0"],summary) attach(dataFF) wilcox.test(age[enfant=="0" & projet=="0"], age[enfant=="0" & projet=="1"]) #ou wilcox.test (age[enfant=="0"] ~ projet[enfant=="0"]) wilcox.test (age[enfant=="1"] ~ projet[enfant=="1"]) ##--> Qu'elles aient déjà eu un enfant ou pas, les femmes qui ont un projet futur de maternité sont en moyenne plus jeunes (p<0.001) ##--> Il semble donc que le jeune âge et l'absence d'enfants préalables puisse être 2 facteurs indépendamment associés au projet futur d'avoir un premier ou un nouvel enfant chez des patientes de moins de 45 ans atteintes d'un cancer et ayant une fertilité préservée à 2 ans de leur diagnostic.