Trucs pour LaTeX & R

Tableau descriptif

mercredi 2 septembre 2020 par Philippe MICHEL

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

Un tableau pour décrire simplement ses données (appelé habituellement tableau 1 dans un article). Sortie sous forme d"un tableau au besoin de type longtable (bien charger le package ad hoc dans votre fichier LaTeX) ou en html.

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. 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 (oui) 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]

Routines utiles

Pour simplifier le code & utiliser ces routines dans d’autres cas, des fonctions de bases ont été écrites dans des macros distinctes.

# sortie "moyenne ± écart-type"
#
lms <- function(varz){
  llz <- paste0(signif(mean({{varz}}),3)," ± ", signif(sd({{varz}}),3))
  return(llz)
}
 
# Calcul intervalle de confiance de la moyenne par bootstrap 
#
moyci <- function(varx,ci=95){
  ci = ci/100
moy <- function(data, ind){
  deb <- data[ind]
  moye <- mean(deb, na.rm = TRUE)
}
if (min(varx,na.rm=T)==max(varx,na.rm=T)){
  bbr <- c(binf = NA, bsup = NA)
}
else{
set.seed(1234)
b1 <- boot(varx, statistic = moy, R = 1000)
bb <- boot.ci(b1, conf = ci)
binf <- bb$percent[4]
bsup <- bb$percent[5]
bbr <- c(binf = binf, bsup = bsup)
}
return(bbr)
}
 
# Intervalle de confiance d'un pourcentage par transformation angulaire
#
transang <- function(vv, ld, pc = 95){
  pp <- qnorm(1-(1-(pc/100))/2)
  pp <- vv/ld
  sp <- 1.959/(2*sqrt(ld))
  pinf <- sin(asin(sqrt(pp-1/(2*ld)))-sp)^2*100
  psup <- sin(asin(sqrt(pp+1/(2*ld)))+sp)^2*100
  nb1 <- paste0(vv,"/",ld," (",signif(pp*100,2)," \\%)")
  nb2 <- paste0(" [",signif(pinf,2)," ; ",signif(psup,2),"]")
  nbx <- paste0(nb1,nb2)
  nby <- c(nb1,nb2)
  return(list(binf = pinf, bsup = psup, lit = nbx,litx = nby))
}

Création du tableau

On crée les lignes une par une qui sont ensuite stockées dasn une matrice.

tabdescph<- function(df, # Data frame à explorer
                     tlong = TRUE, # Pour être en logtable
                     capt = "Description de la population", # Titre
                     lab = "tabd", # label
                     export = FALSE, # Exportation en fomat .csv
                     ka  = TRUE){ # Sortie en html ou LaTeX
#
  tabb <- matrix(nrow = 0, ncol = 3) # Tableau vide
  for (i in 1:dim(df)[2]) {
    varx <- na.omit(df[, i]) 
    ld <- length(varx)
    namd <- names(df[i]) # nom de la variable
    if (class(varx) != "Date" && ld > 0) {
      # Variable factorielle
      if (is.factor(varx)) {
          ligd <- c(namd, " ", " ")
          tabb <- rbind(tabb, ligd)
          lti <- levels(varx)
          rdf <- table(varx)
          rtp <- prop.table(rdf)
          for (j in 1:length(lti)) {
            esp <- ifelse(ka, "&nbsp;", "~")
            esp <- stringr::str_c(rep(esp, 6), collapse = "")
            nlig <- paste0(esp, lti[j])
            cf <- transang(rdf[j], ld) # Fonction expliquée au dessus
            ligd <- c(nlig, cf$litx)
            tabb <- rbind(tabb, ligd)
        }
      }
      else {
        # Variables quantitatives
        lig1 <- lms(varx) # Fonctions expliquées au dessus
        bornes <- moypci(varx, ci = 95) # 
        tbf <- paste0("[", bornes[1], " ; ", bornes[2], "]")
        ligb <- c(names(df[i]), lig1, tbf)
        tabb <- rbind(tabb, ligb)
      }
    }
  }

Sorties

Diverses sorties, exports & présentation du tableau.

Export en .csv
    nomexp <- paste0("export_", lab, ".csv")
    write.csv(tabb, nomexp)
Tableau en code LaTeX
   if (tlong) {
      xtable(tabb) %>%
        print(
          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 = paste0(
              "
                   &\\mbox{moyenne ± écart type}&\\mbox{IC 95 \\%}\\\\
                   &\\mbox{n/total (\\%)}&\\\\
                   \\midrule
                   \\endfirsthead
                   \\midrule
                   &\\mbox{moyenne ± écart type}&\\mbox{IC 95 \\%}\\\\
                   &\\mbox{n/total (\\%)}&\\\\
                   \\midrule
                   \\endhead
                   \\bottomrule
                   \\endfoot
                   \\bottomrule
                   \\caption{",capt,"}
                   \\label{",lab,"}
                   \\endlastfoot
              "
            )
          )
        )
    }
    else{ # Sans l'option longtable
      xtable(tabb, caption = capt, label = lab) %>%
        print(
          include.colnames = FALSE,
          include.rownames = FALSE,
          sanitize.text.function = function(x) {x},
          booktabs = TRUE,
          add.to.row = list(
            pos = list(0),
            command =
              "&\\mbox{moyenne ± écart type}
               &\\mbox{IC 95 \\%}\\\\
               &\\mbox{n/total (\\%)}
               &\\\\"
          )
        )
    }

Une sortie en html est aussi possible (nécessite les packages knitr & kableExtra) avec par exemple :

     kable(
      tabb,
      row.names = FALSE,
      col.names = c("", "moy ± et  N/total (%)", "IC 95 %"),
      escape = FALSE
    ) %>%
      kableExtra::kable_styling(
        bootstrap_options = "striped",
        full_width = FALSE,
        position = "center"
      )

Il faut préciser que plusieurs packages sortent de beaux tableaux descriptifs dont Table1 . Voir l’excellent blog de Claire Della Vedova « Statistiques et Logiciel R ».


Accueil | Contact | Plan du site | | Statistiques du site | Visiteurs : 359 / 162240

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

Site réalisé avec SPIP 3.2.8 + AHUNTSIC

Creative Commons License