You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

303 lines
10KB

  1. #' Descriptif global d'une table
  2. #'
  3. #' Produit un tableau descriptif d'une table
  4. #'
  5. #' Permet de produire un tableau descriptif des variables contenues dans la table.
  6. #' Si les labels et formats sont definis et charges ils seront utilises pour peupler le tableau.
  7. #' Le fichier de sortie est place dans ../HTML Output
  8. #' @encoding UTF-8
  9. #' @param table Table a utiliser
  10. #' @param html Nom du fichier html, par defaut "desc_global.html"
  11. #' @param titre Titre du tableau, par defaut "Descriptif global de nom_de_la_table"
  12. #' @param variables Vecteur de noms de variables a decrire, par defaut toutes les variables contenues dans la table
  13. #' @param variables_neg Vecteur de noms de variables a exclure de la description
  14. #' @param stats Vecteur de valeurs a calculer, parmi N, \%, \%/moy, moy, \%/med, med, et, ic95, Q1, med, Q3, min et max. Par defaut c("N","\%/moy","et")
  15. #' @param miss Booleen : afficher ou non les valeurs manquantes, par defaut TRUE
  16. #' @param note Note de bas de page, par defaut vide
  17. #' @param nbdec Nombre de decimales apres la virgule, par defaut 1
  18. #' @examples
  19. #' \dontrun{
  20. #' Ma_table <- charger("donnees.xls")
  21. #'
  22. #' desc_global(Ma_table) # descriptif par defaut
  23. #' desc_global(Ma_table, variables=c("var1","var2"), stats=c("N","%"), note="Note de bas de page")
  24. #' }
  25. #' @export
  26. desc_global <- function(table, html="desc_global", titre=NULL, variables=NULL, variables_neg=NULL, stats=c("N","%/moy","et"), miss=TRUE, note=NULL, nbdec=1)
  27. {
  28. if (missing(table))
  29. {
  30. warning("Pas de table donnee !")
  31. return
  32. }
  33. # Creation du titre
  34. if (is.null(titre))
  35. titre<-paste("Descriptif global de",deparse(substitute(table)))
  36. # Creation de la table temporaire contenant les variables demandees
  37. if (!is.null(variables))
  38. {
  39. badvar <- variables[!variables %in% names(table)]
  40. if (length(badvar) != 0)
  41. warning("Les variables suivantes n'existent pas dans la table : ",paste(badvar,collapse=", "))
  42. table <- table[variables[variables %in% names(table)]]
  43. }
  44. if (!is.null(variables_neg))
  45. {
  46. badvar <- variables_neg[!variables_neg %in% names(table)]
  47. if (length(badvar) != 0)
  48. warning("Les variables_neg suivantes n'existent pas dans la table : ",paste(badvar,collapse=", "))
  49. table[variables_neg]<-list(NULL)
  50. }
  51. # Header de la table
  52. HTMLInit(file=paste0(html,".html"), title=titre, CSSfile="desc.css")
  53. HTML("<div class='desc'>")
  54. inc()
  55. HTML("<table class='desc'>")
  56. inc()
  57. HTML("<caption>", titre, "</caption>")
  58. HTML("<thead>")
  59. inc()
  60. HTML("<tr><th></th>", paste("<th>",stats,"</th>",sep="", collapse=""), "</tr>")
  61. dec()
  62. HTML("</thead>")
  63. # Footer de la table
  64. if (!is.null(note))
  65. {
  66. HTML("<tfoot>")
  67. inc()
  68. HTML("<tr><td colspan='", length(stats)+1, "'>", note,"</td></tr>")
  69. dec()
  70. HTML("</tfoot>")
  71. }
  72. # Corps de la table
  73. HTML("<tbody>")
  74. inc()
  75. for (var in names(table))
  76. {
  77. # Creation du label de la variable
  78. etiq <- label(table[[var]])
  79. if (etiq == "table[[var]]") etiq <- var
  80. # Variable quantitative
  81. if (is.numeric(table[[var]]))
  82. {
  83. HTML("<tr><td class='var'>", etiq, "</td>", sep="")
  84. for (stat in stats)
  85. {
  86. HTML("<td>",sep="")
  87. HTML(tryCatch(
  88. {
  89. format(switch(stat,
  90. N = length(na.omit(table[[var]])),
  91. "%/moy" = ,
  92. moy = mean(table[[var]],na.rm=T),
  93. "%/med" = ,
  94. med = median(table[[var]],na.rm=T),
  95. Q1 = quantile(table[[var]], probs=.25, na.rm=T,names=F,type=3),
  96. Q3 = quantile(table[[var]], probs=.75, na.rm=T,names=F,type=3),
  97. min = min(table[[var]],na.rm=T),
  98. max = max(table[[var]],na.rm=T),
  99. et = sd(table[[var]],na.rm=T),
  100. ic95 = paste0("&plusmn;",format(mean(table[[var]],na.rm=T) - t.test(table[[var]])$conf.int[1], digits=nbdec,nsmall=nbdec)),
  101. ... = "ERR"
  102. ),digits=nbdec,nsmall=nbdec)
  103. },error = function(e){erreur(e,var,"dans le calcul de ",stat)}), sep="")
  104. HTML("</td>", sep="")
  105. }
  106. HTML("</tr>")
  107. }
  108. # Variable qualitative
  109. else if (is.factor(table[[var]]))
  110. {
  111. HTML("<tr><td class='var' colspan='", length(stats)+1, "'>", etiq, "</td></tr>")
  112. # Donnees manquantes
  113. if ((miss) & (!is.na(summary(table[[var]])["NA's"])))
  114. {
  115. HTML("<tr><td class='level'>Manquant</td>",sep="")
  116. for (stat in stats)
  117. {
  118. HTML("<td>",sep="")
  119. if (stat == "N")
  120. HTML(summary(table[[var]])["NA's"],sep="")
  121. HTML("</td>",sep="")
  122. }
  123. HTML("</tr>")
  124. }
  125. # Levels de la variable qualitative
  126. for (level in levels(table[[var]]))
  127. {
  128. HTML("<tr><td class='level'>", level, "</td>",sep="")
  129. for (stat in stats)
  130. {
  131. HTML("<td>",sep="")
  132. if (stat == "N")
  133. HTML(summary(table[[var]])[level],sep="")
  134. else if ((stat == "%") | (stat == "%/moy") | (stat == "%/med"))
  135. HTML(format(100*summary(table[[var]])[level]/length(na.omit(table[[var]])),digits=nbdec,nsmall=nbdec),sep="")
  136. HTML("</td>",sep="")
  137. }
  138. HTML("</tr>")
  139. }
  140. }
  141. else next
  142. }
  143. dec()
  144. HTML("</tbody>")
  145. dec()
  146. HTML("</table>")
  147. HTML("</div>")
  148. HTMLEnd()
  149. }
  150. #' Diagnostics de la table
  151. #'
  152. #' Produit un tableau descriptif de la table et des graphiques pour la verification des conditions d'utilisation des tests satistiques
  153. #'
  154. #' Permet de produire un tableau descriptif des variables contenues dans la table.
  155. #' Si les labels et formats sont definis et charges ils seront utilises pour peupler le tableau.
  156. #' La fonction renvoie un vecteur de noms de variables considerees comme parametriques apres un test de normalite de Shapiro-Wilk.
  157. #' Le fichier est cree dans le repertoire temporaire. Il est possible de le sauvegarder avec ses graphiques a partir du navigateur.
  158. #' @encoding UTF-8
  159. #' @param table Table a utiliser
  160. #' @param variables Vecteur de noms de variables a decrire, par defaut toutes les variables contenues dans la table
  161. #' @param variables_neg Vecteur de noms de variables a exclure de la description
  162. #' @return Un vecteur contenant les variables considerees comme parametriques
  163. #' @examples
  164. #' \dontrun{
  165. #' Ma_table <- charger("donnees.xls")
  166. #'
  167. #' diagnostic(Ma_table) # diagnostic par defaut
  168. #' parametriques <- diagnostic(Ma_table, variables_neg=c("num_id"))
  169. #' # parametriques contient le vecteur de noms de variables parametriques
  170. #' }
  171. #' @export
  172. diagnostic <- function(table, variables=NULL, variables_neg=NULL)
  173. {
  174. if (missing(table))
  175. {
  176. warning("Pas de table donnee !")
  177. return
  178. }
  179. # Creation de la table temporaire contenant les variables demandees
  180. if (!is.null(variables))
  181. {
  182. badvar <- variables[!variables %in% names(table)]
  183. if (length(badvar) != 0)
  184. warning("Les variables suivantes n'existent pas dans la table : ",paste(badvar,collapse=", "))
  185. table <- table[variables[variables %in% names(table)]]
  186. }
  187. if (!is.null(variables_neg))
  188. {
  189. badvar <- variables_neg[!variables_neg %in% names(table)]
  190. if (length(badvar) != 0)
  191. warning("Les variables_neg suivantes n'existent pas dans la table : ",paste(badvar,collapse=", "))
  192. table[variables_neg]<-list(NULL)
  193. }
  194. HTMLInit(CSSfile="diag.css")
  195. param<-character(0)
  196. HTML("<div class='diag_menu'>")
  197. inc()
  198. for (var in names(table))
  199. {
  200. # Creation du label de la variable
  201. etiq <- label(table[[var]])
  202. if (etiq == "table[[var]]") etiq <- var
  203. HTML("<p id='", var, "'>", etiq, sep="")
  204. tryCatch(
  205. {
  206. if (is.numeric(table[[var]]))
  207. if (shapiro.test(table[[var]])$p.value > .05)
  208. HTML("*", sep="")
  209. }, error = function(e){})
  210. HTML("</p>")
  211. }
  212. dec()
  213. HTML("</div>")
  214. for (var in names(table))
  215. {
  216. # Creation du label de la variable
  217. etiq <- label(table[[var]])
  218. if (etiq == "table[[var]]") etiq <- var
  219. HTML("<div class='diag_varblock' id='div_", var, "' style='display:none'>",etiq)
  220. inc()
  221. HTML("<div class='diag_varstat'>")
  222. inc()
  223. HTML("<table class='diag'>")
  224. inc()
  225. HTML("<tr>", paste("<th>", names(summary(table[[var]])), "</th>", collapse=""), "</tr>")
  226. HTML("<tr>", sep="")
  227. HTML("<td>",summary(table[[var]]),"</td>",sep="")
  228. HTML("</tr>")
  229. dec()
  230. HTML("</table>")
  231. if (is.numeric(table[[var]]))
  232. {
  233. tryCatch(HTML("IC95 : [ ", format(t.test(table[[var]])$conf.int[1],digits=2,nsmall=2), " - ", format(t.test(table[[var]])$conf.int[2],digits=2,nsmall=2), " ]<br/>"), error=function(e){erreur(e,var,"dans le calcul de l'ic95",ret=HTML("IC95 non calculable<br/>"))})
  234. tryCatch(HTML("Test de normalit&eacute; de Shapiro-Wilk : p = ", format(shapiro.test(table[[var]])$p.value,digits=2,nsmall=2), "<br/>"), error=function(e){erreur(e,var,"dans l'evaluation de sa normalite",ret=HTML("Test de normalit&eacute non calculable"))})
  235. tryCatch({
  236. if (shapiro.test(table[[var]])$p.value > .05)
  237. {
  238. param<-c(param,var)
  239. HTML("<b>Param&eacute;trique</b>")
  240. }
  241. },error=function(e){})
  242. }
  243. dec()
  244. HTML("</div>")
  245. HTML("<div class='diag_varplot'>")
  246. inc()
  247. if (is.numeric(table[[var]]))
  248. {
  249. pngfile=tempfile(pattern="figure",fileext=".png")
  250. png(filename=pngfile)
  251. hist(table[[var]],freq=F,col="lightblue",border="darkblue",xlab=etiq,ylab="Densite",main=paste0("Distribution de ",etiq))
  252. tryCatch(lines(density(table[[var]],na.rm=T),col="red"),error=function(e){})
  253. dev.off()
  254. HTML("<img src='", basename(pngfile), "'/>")
  255. pngfile=tempfile(pattern="figure",fileext=".png")
  256. png(filename=pngfile)
  257. qqnorm(table[[var]], xlab="Quantiles theoriques",ylab="Quantiles de l'echantillon")
  258. qqline(table[[var]])
  259. dev.off()
  260. HTML("<img src='", basename(pngfile), "'/>")
  261. }
  262. else if (is.factor(table[[var]]))
  263. {
  264. pngfile=tempfile(pattern="figure",fileext=".png")
  265. png(filename=pngfile)
  266. barplot(table(table[[var]]), col="lightblue", border="darkblue")
  267. dev.off()
  268. HTML("<img src='", basename(pngfile), "'/>")
  269. }
  270. dec()
  271. HTML("</div>")
  272. dec()
  273. HTML("</div>")
  274. }
  275. HTMLEnd()
  276. param
  277. }