Analyse complète d un problème sous R Thème de l étude : Projet d enfants chez des patients atteints de cancer à 2 ans du diagnostic Facteurs associés au d enfant chez des femmes de moins de 45 ans ///////////////////////// CORRECTION ///////////////////////// 1) Fichier Excel Importez sur votre disque dur le fichier «data44.xls» (qui est mis à votre disposition à partir du lien «Fichiers de données» dans la partie «Nota Bene / Boîte à outils»). a) Quelle est la nature des variables étudiées? Variables quantitatives : age, n_enfants. PCS, MCS Variables qualitatives : cancer, sexe, enfant, menopause, sterilite, fertilite, Remarque : enfant, menopause, sterilite, fertilite, 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 très rapidement le fichier.xls? Beaucoup de cases vides (= données manquantes) 281 lignes = 280 sujets 2) Vérification des données dans R a) Ouvrez le logiciel R et importez le fichier «data44». En affichant le tableau de données dans R que remarquez vous en le survolant très rapidement? Après avoir enregistré le fichier Excel au format.csv, ouvrir le fichier dans R data44 <- read.csv2("c:\\users\\p058571\\documents\\cours\\2012-2013\\masters EISIS MQERS SPSD\\STA- UNIV\\Data44.csv", header=true) Vérifier l affichage data44[,] Les cases vides sont remplacées dans R par NA (Not Available). Il y a bien 280 sujets. b) Vérifiez que la sélection des patientes à étudier selon les critères prévus (âge < 45 ans, sexe féminin) a été convenablement réalisée, à l aide de calcul et par méthode graphique? Attacher le fichier attach(data44) Descriptif simple des données et vérification de la cohérence pour sexe et age : summary(sexe) ou table(sexe) sexe F M 279 1 summary(age) 19.92 35.36 39.98 38.64 42.55 57.89 Graphiques possibles : pie(summary(sexe)) ou barplot(summary(sexe)) hist(age) ou boxplot(age) Problème pour les 2 variables : 1 homme et 1 sujet avec un âge > 45 ans. c) Recherchez la ligne de l individu trop âgé pour être inclus et affichez ses caractéristiques. data44[age>45,] ou subset(data44, age > 45) ou which.max(age) [1] 224 et data44[224,] n_ident cancer age sexe enfant n_enfants menopause sterilite fertilite PCS MCS 224 4 467 Sein 57.89 M 1 3 NA 0 35.6 33.36 1
ligne 224 :1 homme avec un cancer du sein âgé de 58 ans à exclure (n_ident = 4467) d) Sélectionnez un nouveau sous-tableau sans homme et vérifiez que les variables âge et sexe respectent maintenant les critères fixés. Création d un nouveau tableau en précisant la condition souhaitée entre crochet data44f <- data44[sexe=="f",] detach(data44) attach(data44f) summary(sexe) F M 279 0 summary(age) 19.92 35.34 39.90 38.57 42.55 44.96 OK : plus d homme et âge maximum = 44,96 e) Vérifiez la cohérence entre les variables enfant (Avez-vous des enfants?) et n_enfants (nombres d'enfants). table(enfant,n_enfants) n_enfants enfant 1 2 3 4 5 6 0 0 0 0 0 0 0 1 63 99 45 12 2 2 Pas de problème : dans le tableau croisé, les sujets sans enfants n ont pas d enfants!!! 3) Statistiques Descriptives dans R a) Calculez la proportion de nullipares (0 enfant) et de primipares (1 seul enfant) dans l échantillon. table(enfant) enfant 56 223 prop.table(table(enfant),) enfant 0.201 0.799 Il y a 20% de nullipares Remarque : pour réduire le nombre de décimales : options(digits=3) table(n_enfants)/length(n_enfants) ou table(n_enfants)/279 n_enfants 1 2 3 4 5 6 0.22581 0.35484 0.16129 0.04301 0.00717 0.00717 Il y a 23% de primipares (attention ici ne pas utiliser prop.table car la variable n_enfants n est renseignée que pour les 223 femmes ayant répondu oui à la question «avez-vous des enfants?») b) Quel est le nombre moyen d'enfants dans l'échantillon? Calculez la variance et proposez une représentation graphique. summary(n_enfants) NA's 1..0 2.0 2.1 3.0 6.0 56 Le minimum pour la variable vaut 1. Il y a ici 56 données manquantes qui correspondent aux femmes sans enfants. Il faut donc créer une nouvelle variable : n_enfants2 <- n_enfants n_enfants2[enfant=="0"] <- 0 table(n_enfants2) n_enfants2 2 3 4 5 6 56 63 99 45 12 2 2 Ca marche!!! summary(n_enfants2) 0.0.00 2.0.67 2.00 6.00 var(n_enfants2) [1] 1.44 Le nombre moyen d enfant est 1,67 avec une variance de 1,44. 2
Graphiques possibles : boxplot(n_enfants2, main="nombre d enfants") barplot(table(n_enfants2), xlab="nombre d enfants", ylab="fréquence absolue") barplot(prop.table(table(n_enfants2)), xlab="nombre d enfants", ylab="fréquence relative") pie(table(n_enfants2), main="nombre d enfants") c) Quelle est la localisation cancéreuse la plus fréquente? Proposez un graphique de l ensemble des localisations. table(cancer) Autres cancers Colon-Rectum Leucémies 12 9 14 Lévres-Bouche-Pharynx; Larynx; Oesophage Lymphomes Myélomes 5 7 1 Peau Sein Thyroïde 19 135 37 Utérus;Ovaire Vessie; Rein 34 6 C est le cancer du sein le plus fréquent (n=135) pie(table(cancer), main="localisations cancéreuses") barplot(table(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. d) Combien de femmes expriment un de maternité future? Combien ont répondu à cette question? table() 129 46 sum(table()) ou length(na.omit()) [1] 175 46 femmes expriment ce de maternité parmi 175 répondantes e) Parmi les femmes qui ont répondu à la question sur le de maternité, quelle proportion exprime un futur? prop.table(table(),) 0.737 0.263 26% des femmes ayant répondu expriment ce de maternité f) Combien y a t il de données manquantes pour la variable (" d'enfants")? La variable fertilité permet-t elle d'expliquer ces données manquantes? Calcul 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() - length(na.omit()) ou 279 sum(table()) ou 279 sum(table()) [1] 104 ou table(is.na()) FALSE TRUE 175 104 ou summary() NA's 0.000 0.000 0.000 0.263 1.00.0004.000 Il y a 104 données manquantes table(,fertilite) fertilite 0 29 1 0 46 Au vu du tableau croisé, la question sur un éventuel d enfant n était posée qu aux femmes ayant une fertilité préservée. 3
4) Analyse finale avec tests statistiques dans R a) Créez un nouveau sous-tableau des 175 femmes de moins de 45 ans ayant une fertilité préservée. Création d un nouveau sous-tableau des 175 femmes de moins de 45 ans fertiles data44ff <- data44f[fertilite=="1",] detach(data44f) attach(data44ff) summary() 0.000 0.000 0.000 0.263 1.00.000 Il n y a plus de données manquantes pour la variable. Normalité des distributions : b) L âge est-il «normalement» distribué (test + illustration graphique)? ks.test(age,"pnorm",mean(age),sd(age)) One-sample Kolmogorov-Smirnov test data: age D = 0.1112, p-value = 0.02644 alternative hypothesis: two-sided On ne peut pas considérer que l âge suit une loi normale. hist(age) ou qqnorm(age,col="blue"); qqline(age) ou boxplot(age) Graphiquement, il y a un décalage vers les âges plus élevés. Scores de qualité de vie physique et mentale (PCS/MCS) : c) Les 2 composantes de la qualité de vie (physique et mentale) sont-elles liées? plot(pcs, MCS); abline(lm(mcs~pcs)) cor.test(pcs, MCS, method="pearson") Pearson's product-moment correlation data: PCS and MCS t = 2.88, df = 173, p-value = 0.004533 alternative hypothesis: true correlation is not equal to 0 0.0674 0.3508 cor 0.214 La corrélation est positive, significativement différente de 0, mais faible (0,2) d) 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(pcs) 23.3 41.9 49.4 48.0 55.5 63.8 summary(mcs) 13.5 35.0 44.6 43.1 51.4 64.3 t.test(mcs,pcs,paired=t) Paired t-test data: MCS and PCS t = -5.29, df = 174, p-value = 3.721e-07-6.74-3.07 mean of the differences -4.91 boxplot(pcs, 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. e) La qualité de vie des patientes est-elle différente selon l existence d un futur d enfant? (2 séries d analyse pour les 2 composantes physique et mentale de la QDV) boxplot(pcs ~ ) var.test(pcs[==0], PCS[==1]) 4
F test to compare two variances data: PCS[ == 0] and PCS[ == 1] F = 1.23, num df = 128, denom df = 45, p-value = 0.4327 alternative hypothesis: true is not equal to 1 0.735 1.940 1.23 t.test(pcs ~, var.equal=true) Two Sample t-test data: PCS by t = -0.813, df = 173, p-value = 0.4175-4.29 1.79 47.7 48.9 On ne met pas en évidence de différence significative pour la composante physique de qualité de vie entre les 2 groupes ( ou pas de maternité future). boxplot(mcs ~ ) var.test(mcs[==0], MCS[==1]) F test to compare two variances data: MCS[ == 0] and MCS[ == 1] F = 1.42, num df = 128, denom df = 45, p-value = 0.1792 alternative hypothesis: true is not equal to 1 0.849 2.241 1.42 t.test(mcs ~, var.equal=true) Two Sample t-test data: MCS by t = -0.76, df = 173, p-value = 0.4485-4.95 2.20 42.7 44.1 On ne met pas non plus en évidence de différence significative pour la composante mentale de qualité de vie entre les 2 groupes ( ou pas de maternité future) Maternité préalable et souhaitée : f) Existe-t-il un lien entre le fait d avoir déjà des enfants et un futur de maternité? - En catégoriel (2 classes) table(enfant,) enfant 6 21 1 113 25 prop.table(table(enfant,),1) enfant 0 0.432 0.568 1 0.819 0.181 chisq.test(enfant,) Pearson's Chi-squared test with Yates' continuity correction data: enfant and X-squared = 20.5, df = 1, p-value = 5.86e-06 chisq.test(enfant,)$expected enfant 0 27.3 9.73 1 101.7 36.27 5
Test applicable (Cij>5) : Les femmes n ayant pas encore eu d enfant expriment plus souvent un d enfant (57% vs. 18% ; p<0,001). Graphique : old.par <- par(no.readonly = TRUE) par(mfrow = c(1, 2)) barplot(prop.table(table([enfant==0]),), ylim=c(0,1), ylab="fréquence relative", col="blue",main="enfant = 0", sub="projet : Non/Oui") barplot(prop.table(table([enfant==1]),), ylim=c(0,1), ylab=" Fréquence relative ",col="red",main="enfant >= 1", sub="projet : Non/Oui") par(mfrow = c(1, 1)) par(old.par) g) Les femmes qui expriment un futur de maternité ont-elles en moyenne le même âge que celles qui ne souhaitent plus d enfants? boxplot(age ~, main="age") var.test(age[==0], age[==1]) F test to compare two variances data: age[ == 0] and age[ == 1] F = 0.4512, num df = 128, denom df = 45, p-value = 0.0005507 alternative hypothesis: true is not equal to 1 0.270 0.712 0.451 Egalité des variances non respectée (différence significative p<0.05), il faut utiliser test de Student avec variance inégale : t.test(age ~, var.equal=false) Welch Two Sample t-test data: age by t = 8.53, df = 60.1, p-value = 6.139e-12 5.77 9.31 39.8 32.3 Les femmes qui ont un futur de maternité sont en moyenne plus jeunes (p<0.001) h) Existe-t-il un lien entre l âge des femmes le fait d avoir déjà un(des) enfant(s)? boxplot(age ~ enfant, main="age") var.test(age~ enfant) F test to compare two variances data: age by enfant F = 2.9085, num df = 36, denom df = 137, p-value = 8.877e-06 alternative hypothesis: true is not equal to 1 1.79 5.12 2.91 Egalité des variances non respectée (différence significative p<0.05), il faut utiliser test de Student avec variance inégale : t.test(age ~ enfant, var.equal=false) Welch Two Sample t-test data: age by enfant t = -3.4356, df = 42.847, p-value = 0.001325-6.93-1.80 34.4 38.7 Les femmes qui n ont pas d enfant sont en moyenne plus jeunes (p<0.001) 6
Il est maintenant nécessaire de recourir à une stratification (ou à des méthodes multivariées) pour savoir qu estce qui «explique» le d enfant :l âge, le fait d avoir déjà des enfants ou les deux!!! i) 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 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(age[enfant=="0"],[enfant=="0"],summary) INDICES: 0 26.28 34.97 41.56 38.61 42.77 44.96 ------------------------------------------------------------------------ INDICES: 1 19.92 28.81 31.02 31.12 34.78 43.11 by(age[enfant=="1"],[enfant=="1"],summary) INDICES: 0 31.08 37.31 40.50 39.95 42.89 44.63 ------------------------------------------------------------------------ INDICES: 1 25.33 31.10 33.82 33.20 35.38 42.98 wilcox.test(age[enfant=="0" & =="0"], age[enfant=="0" & =="1"]) OU wilcox.test (age[enfant=="0"] ~ [enfant=="0"]) Wilcoxon rank sum test data: age[enfant == "0"] by [enfant == "0"] W = 268, p-value = 0.001656 alternative hypothesis: true location shift is not equal to 0 wilcox.test (age[enfant=="1"] ~ [enfant=="1"]) Wilcoxon rank sum test with continuity correction data: age[enfant == "1"] by [enfant == "1"] W = 2536.5, p-value = 5.269e-10 alternative hypothesis: true location shift is not equal to 0 Qu elles aient déjà eu un enfant ou pas, les femmes qui ont un 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 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. 7