Créer un tableau résumant votre étude
25/02/2017 : Amélioration de la définition du longtable (pas encore parfait)
Pour l’exemple nous allons créer un tableau habituel dans un article médical : comparaison de deux groupes (traités / non traités par exemple) en donnant pour chaque variable la moyenne & l’écart type pour les données numériques, le nombre & le pourcentage pour les données discrètes, enfin le p. Ce qui donne (en moche) :
traité | non traité | p | |
---|---|---|---|
Âge | 55,2 $pm$ 10,5 | 48,7 +/- 14,5 | 0,04 |
Sexe = M | 44/110 (35%) | 48/112 (36%) | 0,75 |
Le script peut se résumer à :
Initialisation du tableau
Pour chaque colonne :
Si numérique :
Calcul moyenne, écart-type, p.
Création de la ligne & ajout au tableau
Si variable discrète :
Calcul des % pour chaque modalité & du chi2
Si dichotomique :
Création de la ligne & ajout au tableau
Plus de deux niveau :
Ligne nom variable, p
Création de la ligne & ajout au tableau
Pour chaque valeur de la variable de tri :
Ligne avec les n & %.
Création de la ligne & ajout au tableau
création du titre (avec les niveaux de la variable de tri)
Transformation du tableau en LaTeX
Nous partons donc d’un data-frame nommé tt, bien préparé. Un tableau simple descriptif a déjà été réalisé. Nous allons créer un tableau reprenant toutes les variables, les comparer entre les différents groupes (il y a donc une variable de test appelée ici vtri & ayant deux niveaux
l’affichage doit comprendre :
- Pour les variables numériques : moyenne +/- écart type avec le bon symbole +/-
- Pour les variables discrètes : nombre (pourcentage)
- On verra aussi une variante avec un test non paramétrique (Wilcoxon) avec affichage des médianes & des quartiles.
Tout d’abord il faut initialiser la boucle qui va parcourir toutes les variables du data.frame & créer un tableau vide.
vtri la variable de tri
tt le data.frame étudié
une ligne moyenne écart-type
Nous allons donc calculer la moyenne & l’écart-type pour chacune des modalités de notre variable de test. La fonction
Qui nous renvoie un tableau avec, en première colonne les niveaux de la variable de test & en seconde colonne la moyenne pour chacun de ces niveaux.
Comme il n’y a que deux niveaux on aurait pu utiliser le t de Student (la fonction
Donc on va extraire les données du tableau. Créons donc une petite boucle qui va afficher la moyenne et l’écart-type :
vart est la colonne du data.frame en cours.
vtri la variable de tri
- }
- lla <-ll[1,1]
- }
En reprenant le code : On calcule les moyennes & les écarts-type ainsi que le nombre de niveau de la variable de tri (ici 2). Puis on initie la ligne (un vecteur) avec le nom de la variable (un peu bête dans cet exemple mais ça va servir plus tard). Dans la boucle on extrait pour chaque ligne le nombre voulu, on le formate pour avoir un affichage clair puis on l’ajoute à la ligne dans le vecteur.
Il ne reste qu’à faire un
Non paramétrique
Le même pour un test non paramétrique & une présentation en médiane & quartiles. (ne fonctionne que pour deux modalités).
- mo <- paste0(qo[3]," [",qo[2],"-",qo[4],"]")
- mn <- paste0(qn[3]," [",qn[2],"-",qn[4],"]")
- ll <- ll$p.value
- }
Une ligne nombre/pourcentage
Nous allons un peu compliquer les choses : nous allons avoir un affichage simple sur une ligne pour les variables dichotomiques en affichant une seule modalité. L’en-tête de la ligne sera donc le nom de la variable suivi de la modalité affichée sauf si l’on est en Oui/Non auquel cas on affiche le Oui.
Si la variable a plus de deux modalités on affiche une ligne avec son nom & le p global, ensuite la répartition modalité par modalité :
Sexe (M) | 44(55%) | 48 (48%) | 0,45 |
---|---|---|---|
Hypertendu | 88 (74 %) | 54 (47 %) | 0,054 |
Couleur des cheveux | 0,88 | ||
_____blond | 45 (55 %) | 48 (57 %) | |
_____brun | 38 (35 %) | 47 (36 %) | |
_____roux | 5 (10 %) | 35 (7 %) |
Je vous laisse rendre le résultat lisible en LaTeX en jouant sur des traits, des couleurs etc.
Petit préalable : toutes les variables factorielles en Oui/Non doivent être transformés au préalable en variable ordonnées avec Oui en premier niveau par :
Je vous laisse écrire la boucle avec un test pour appliquer ça à toute votre base de donnée.
- #
- # Variables à 2 niveaux
- #
- }
- nn <- tb[j,1]
- }
- #
- # Variables à plus de 2 niveaux
- #
- else {
- nn <- tb[j,i]
- }
- }}
- }
On crée d’abord un tableau croisant la variable à étudier avec la variable tri, on calcule les totaux des lignes avec
Pour les variables a plus de deux niveaux on va d’abord créer la ligne contenant le nom de la variable , des cases vides & le p global puis la transformer en une matrice d’une ligne.
Ensuite une boucle va prendre toutes les modalités de la variable de test pour chacune créer une ligne, faire les calculs comme plus haut et ensuite ajouter cette ligne à la matrice (fonction
Construire le tableau
Il reste maintenant à transformer le tableau en LaTeX avec le bon en-tête.
- #Création de la ligne de titre
- # Transformation du tableau en LaTeX via le package [*xtable*]
- xlig <- xtable(mlig)
- #
- print(xlig,
- tabular.environment='longtable',
- include.colnames=FALSE,
- floating=FALSE,
- booktabs=TRUE,
- hline.after=-1,
- include.rownames=FALSE,
- command =
- paste0(ltit,
- "
- \\midrule
- \\endfirsthead
- \\midrule
- ",
- ltit,
- "
- \\midrule
- \\endhead
- \\bottomrule
- \\endfoot
- \\bottomrule
- \\caption{}
- \\label{tab}
- \\endlastfoot
- ")
- )
- )
Il reste à préciser la légende & le label. À moins de mettre dans la définition de fonction une variable pour le label.
Derneir problème : je n’ai toujours pas compris comment indiquer la composition des colonnes. Il sort donc quelque chose comme :
- \begin{longtable}{llll}
à corriger manuellement, désolé ! Personnellement j’utilise une commande de défiinition de colonnes en mode math nommée « C » & le type « S » du package siunitx pour le petit p soit :
- \newcolumntype{C}{>{$}c<{$}}
- .....
- \begin{longtable}{lCCS}
À vous de jouer !