Trucs pour LaTeX & R

Tableau descriptif

samedi 29 octobre 2016 par Philippe MICHEL

Un tableau descriptif simple, donnant les moyennes, écart-type, pourcentage etc. pour tout un data.frame.
Sortie en LaTeX bien entendu.

Un tableau pour décrire simplement ses données. Sortie sous forme d"un tableau type longtable (bien charger le package ad hoc dans votre fichier LaTeX).

Calcul :

  • des moyennes, écart-types & des intervalles de confiance à 95 % pour les valeurs numériques.
  • des % avec leur intervalle de confiance à 95 % (par transformation angulaire) pou les données discrètes. Si la variable est en oui/non le « oui » n’est pas affiché (lignes 2 & 3 du tableau d’exemple ci-dessous). Affichage détaillé des variables à plus de deux niveaux (lignes 4 à 7).

Pour chaque ligne on calcule les nombres (moyenne, % etc.), on les prépare en limitant le nombre de chiffres affichés puis on crée une ligne (nommée ligd) qui est enfin ajoutée à la table tabb.

Les en-têtes des colonnes sont enfin incorporées dedans (ligne 80 à 95) avec la syntaxe un peu complexe (mais très souple) de longtable.

Exemple (moche)
Âge 55 $\pm$ 12,5 [48 - 59]
Sexe (M) 328/501 (65,5 %) [59,4 - 69,7]
Adulte 55/100 (55 %) [51 -62]
vc.site
______Fémoral 1139/3936 (29\%) [28-30]
_______Jugulaire 2155/3936 (55\%) [53-56]
_______Sous-clavière 642/3936 (16\%) [15-17]
  1. tabd <- function(tt){
  2.     ll <- length(names(tt))
  3.     tabb <- matrix(nrow=0,ncol=3)
  4. #
  5. for (i in 1:length(tt)){
  6.     ld <- length(na.omit(tt[,i]))
  7.       if(is.factor(tt[,i])==T){
  8.           if (length(levels(tt[,i]))==2){
  9.               #Variables qualitatives -- 2 niveaux
  10.               if (levels(tt[,i])[1]=="non"){
  11.                   tt[,i] <- relevel(tt[,i],"oui")
  12.                   }
  13.               nd <- table(tt[,i])[1]
  14.               pp <- nd/ld
  15.               pd <- signif(pp*100,2)
  16.               sp <- 1.96/(2*sqrt(ld))
  17.               pinf1 <- asin(sqrt(pp-1/(2*ld)))-sp
  18.               psup1 <- asin(sqrt(pp+1/(2*ld)))+sp
  19.               pinf <- sin(pinf1)^2*100
  20.               psup <- sin(psup1)^2*100
  21.               nb1 <-paste0(nd,"/",ld," (",pd," \\%)")
  22.               cf <- paste0("[",signif(pinf,2),"-",signif(psup,2),"]")
  23.               if (levels(tt[,i])[1]=="oui"){
  24.                   namd <- names(tt[i])
  25.               }
  26.               else{
  27.               namd <- paste0(names(tt[i]), " (",levels(tt[,i])[1],")")
  28.               }
  29.               ligd <- c(namd,nb1,cf)
  30.                tabb <- rbind(tabb,ligd)
  31.           }
  32.           else {
  33.               # Variables qualitatives -- niveaux multiples
  34.               ligd <- c(names(tt[i])," "," ")
  35.               tabb <- rbind(tabb,ligd)            
  36.               tti <- na.omit(tt[,i])
  37.               lti <- levels(tti)
  38.               rtt <- table(tti)
  39.               rtp <- prop.table(rtt)
  40.               for (j in 1:length(lti)){
  41.                   nlig <- paste("~~~~~~",lti[j])
  42.                   nd <- rtt[j]
  43.                   pd <- signif(rtp[j]*100,2)
  44.                   sp <- 1.96/(2*sqrt(ld))
  45.                   pinf1 <- asin(sqrt(rtp[j]-1/(2*ld)))-sp
  46.                   psup1 <- asin(sqrt(rtp[j]+1/(2*ld)))+sp
  47.                   pinf <- sin(pinf1)^2
  48.                   psup <- sin(psup1)^2
  49.                   nb1 <-paste0(nd,"/",ld," (",pd,"\\%)")
  50.                   cf <- paste0("[",signif(100*pinf,2),"-",signif(100*psup,2),"]")
  51.                   ligd <- c(nlig,nb1,cf)
  52.                   tabb <- rbind(tabb,ligd)
  53.               }            
  54.           }
  55.       }
  56.       else {
  57.                                         # Variables quantitatives
  58.               lb <- length(na.omit(tt[,i]))
  59.         mb <- signif(mean(tt[,i],na.rm=T),2)
  60.     sb <- signif(sd(tt[,i],na.rm=T),2)
  61.               tb <- signif(t.test(tt[,i])$conf.int,2)
  62.               lig1 <- paste0("$",mb,"\\pm",sb,"$")
  63.         tbf <- paste0("[",tb[1],"-",tb[2],"]")
  64.         ligb <-c(names(tt[i]),lig1,tbf)
  65.               tabb <- rbind(tabb,ligb)
  66.           }
  67.   }
  68. #
  69.  # Création du tableau en code LaTeX
  70. #
  71.     xtabl <- xtable(tabb)#
  72.     #
  73.     print(xtabl,
  74.           tabular.environment='longtable',
  75.           include.colnames=FALSE,
  76.           floating=FALSE,
  77.           booktabs=TRUE,
  78.           hline.after=-1,
  79.           include.rownames=FALSE,
  80.           sanitize.text.function = function(x){x},
  81.           add.to.row = list(pos = list(0),
  82.                             command = "
  83.  &{moyenne $\\pm$ écart type}&{IC 95 \\%}\\\\
  84. &{n/total (\\%)}&\\\\
  85.  \\midrule
  86. \\endfirsthead
  87.  \\midrule
  88.  &{moyenne $\\pm$ écart type}&{IC 95 \\%}\\\\
  89. &{n/total (\\%)}&\\\\
  90.  \\midrule
  91. \\endhead
  92. \\bottomrule
  93. \\endfoot
  94. \\bottomrule
  95. \\caption{bla bla}
  96. \\label{tableau}
  97. \\endlastfoot
  98. "))
  99. }

Télécharger


Accueil | Contact | Plan du site | | Statistiques du site | Visiteurs : 47 / 127561

Suivre la vie du site fr  Suivre la vie du site R   ?    |    titre sites syndiques OPML   ?

Site réalisé avec SPIP 3.2.1 + AHUNTSIC

Creative Commons License