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]
tabd <- function(tt){
    ll <- length(names(tt))
    tabb <- matrix(nrow=0,ncol=3)
#
for (i in 1:length(tt)){
    ld <- length(na.omit(tt[,i]))
      if(is.factor(tt[,i])==T){
          if (length(levels(tt[,i]))==2){
              #Variables qualitatives -- 2 niveaux
              if (levels(tt[,i])[1]=="non"){
                  tt[,i] <- relevel(tt[,i],"oui")
                  }
              nd <- table(tt[,i])[1]
              pp <- nd/ld
              pd <- signif(pp*100,2)
              sp <- 1.96/(2*sqrt(ld))
              pinf1 <- asin(sqrt(pp-1/(2*ld)))-sp
              psup1 <- asin(sqrt(pp+1/(2*ld)))+sp
              pinf <- sin(pinf1)^2*100
              psup <- sin(psup1)^2*100
              nb1 <-paste0(nd,"/",ld," (",pd," \\%)")
              cf <- paste0("[",signif(pinf,2),"-",signif(psup,2),"]")
              if (levels(tt[,i])[1]=="oui"){
                  namd <- names(tt[i])
              }
              else{
              namd <- paste0(names(tt[i]), " (",levels(tt[,i])[1],")")
              }
              ligd <- c(namd,nb1,cf)
               tabb <- rbind(tabb,ligd)
          }
          else {
              # Variables qualitatives -- niveaux multiples
              ligd <- c(names(tt[i])," "," ")
              tabb <- rbind(tabb,ligd)            
              tti <- na.omit(tt[,i])
              lti <- levels(tti)
              rtt <- table(tti)
              rtp <- prop.table(rtt)
              for (j in 1:length(lti)){
                  nlig <- paste("~~~~~~",lti[j])
                  nd <- rtt[j]
                  pd <- signif(rtp[j]*100,2)
                  sp <- 1.96/(2*sqrt(ld))
                  pinf1 <- asin(sqrt(rtp[j]-1/(2*ld)))-sp
                  psup1 <- asin(sqrt(rtp[j]+1/(2*ld)))+sp
                  pinf <- sin(pinf1)^2
                  psup <- sin(psup1)^2
                  nb1 <-paste0(nd,"/",ld," (",pd,"\\%)")
                  cf <- paste0("[",signif(100*pinf,2),"-",signif(100*psup,2),"]")
                  ligd <- c(nlig,nb1,cf)
                  tabb <- rbind(tabb,ligd)
              }             
          }
      }
      else {
                                        # Variables quantitatives
              lb <- length(na.omit(tt[,i]))
        mb <- signif(mean(tt[,i],na.rm=T),2)
    sb <- signif(sd(tt[,i],na.rm=T),2)
              tb <- signif(t.test(tt[,i])$conf.int,2)
              lig1 <- paste0("$",mb,"\\pm",sb,"$")
        tbf <- paste0("[",tb[1],"-",tb[2],"]")
        ligb <-c(names(tt[i]),lig1,tbf)
              tabb <- rbind(tabb,ligb)
          }
  }
#
 # Création du tableau en code LaTeX
#
    xtabl <- xtable(tabb)#
    #
    print(xtabl,
          tabular.environment='longtable',
          include.colnames=FALSE,
          floating=FALSE,
          booktabs=TRUE,
          hline.after=-1,
          include.rownames=FALSE,
          sanitize.text.function = function(x){x},
          add.to.row = list(pos = list(0),
                            command = "
  &{moyenne $\\pm$ écart type}&{IC 95 \\%}\\\\
 &{n/total (\\%)}&\\\\
  \\midrule
\\endfirsthead
  \\midrule
  &{moyenne $\\pm$ écart type}&{IC 95 \\%}\\\\
 &{n/total (\\%)}&\\\\
  \\midrule
\\endhead
\\bottomrule
\\endfoot
\\bottomrule
\\caption{bla bla} 
\\label{tableau}
\\endlastfoot
 "))
}

Accueil | Contact | Plan du site | | Statistiques du site | Visiteurs : 177 / 148287

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