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.

264 lines
8.9KB

  1. #' Comparatif par groupe
  2. #'
  3. #' Produit un tableau comparatif par groupe
  4. #'
  5. #' Permet de produire un tableau comparatif des variables contenues dans la table passee en parametre selon les modalites d'une d'entre elles.
  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 groupe Nom de la variable qualitative a utiliser pour la comparaison
  11. #' @param param Vecteur de noms de variables considerees comme parametriques
  12. #' @param html Nom du fichier html, par defaut "desc_groupe_nomdelavariable.html"
  13. #' @param titre Titre du tableau, par defaut "Comparaison selon nom_de_la_variable"
  14. #' @param variables Vecteur de noms de variables a comparer, par defaut toutes les variables contenues dans la table moins celle servant de comparateur
  15. #' @param variables_neg Vecteur de noms de variables a exclure de la comparaison
  16. #' #' @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")
  17. #' @param note Note de bas de page, par defaut vide
  18. #' @param nbdec Nombre de decimales apres la virgule, par defaut 1
  19. #' @param pourcent Pourcentages pour les variables qualitatives, en colonnes ("col") ou en lignes ("row"), par defaut sur le total
  20. #' @examples
  21. #' \dontrun{
  22. #' Ma_table <- charger("donnees.xls")
  23. #'
  24. #' desc_groupe(Ma_table, "sexe")
  25. #'
  26. #' para <- diagnostic(Ma_table)
  27. #' desc_groupe(Ma_table, "sexe", param = para, titre="Comparatif selon le sexe", pourcent="row")
  28. #' }
  29. #' @export
  30. desc_groupe <- function(table, groupe, param = character(0), html=NULL, titre=NULL, variables=NULL, variables_neg=NULL,stats=c("N","%/moy","et"), note=NULL, nbdec=1, pourcent="total")
  31. {
  32. if (nbdec<2)
  33. nbdecp<-2
  34. else
  35. nbdecp<-nbdec
  36. if (missing(table))
  37. {
  38. warning("Pas de table donnee !")
  39. return
  40. }
  41. if (missing(groupe) | (!groupe %in% names(table)))
  42. {
  43. warning("Pas de comparateur !")
  44. return
  45. }
  46. modulo <- table[[groupe]]
  47. if (nlevels(modulo)<2)
  48. {
  49. warning("La variable ", groupe, " n'a qu'un niveau !")
  50. return
  51. }
  52. etiq <- label(modulo)
  53. if (etiq == "modulo") etiq <- groupe
  54. # Creation du titre
  55. if (is.null(titre))
  56. titre<-paste("Comparaison selon", etiq)
  57. # Creation de la table temporaire contenant les variables demandees
  58. if (!is.null(variables))
  59. {
  60. badvar <- variables[!variables %in% names(table)]
  61. if (length(badvar) != 0)
  62. warning("Les variables suivantes n'existent pas dans la table : ",paste(badvar,collapse=", "))
  63. table <- table[variables[variables %in% names(table)]]
  64. }
  65. if (!is.null(variables_neg))
  66. {
  67. badvar <- variables_neg[!variables_neg %in% names(table)]
  68. if (length(badvar) != 0)
  69. warning("Les variables_neg suivantes n'existent pas dans la table : ",paste(badvar,collapse=", "))
  70. table[variables_neg]<-list(NULL)
  71. }
  72. table[groupe]<-NULL
  73. # Creation du nom de fichier html
  74. if (is.null(html))
  75. html <- paste0("desc_groupe_",groupe)
  76. # Header de la table
  77. HTMLInit(file=paste0("../HTML\ Output/",html,".html"), title=titre, CSSfile="desc.css")
  78. HTML("<div class='desc'>")
  79. inc()
  80. HTML("<table class='desc'>")
  81. inc()
  82. HTML("<caption>", titre, "</caption>")
  83. HTML("<thead>")
  84. inc()
  85. HTML("<tr><th></th>", paste0("<th colspan='",length(stats),"'>",levels(modulo),"</th>", collapse=""), "<th>p</th></tr>")
  86. HTML("<tr><td></td>", sep="")
  87. for (i in levels(modulo))
  88. HTML("<td colspan='",length(stats),"'>N=", length(na.omit(modulo[modulo==i])), "</td>", sep="")
  89. HTML("<td></td></tr>")
  90. HTML("<tr><td></td>", paste0(rep(paste("<td>",stats,"</td>",sep="", collapse=""),nlevels(modulo)),collapse=""), "<td></td></tr>")
  91. dec()
  92. HTML("</thead>")
  93. # Footer de la table
  94. if (!is.null(note))
  95. {
  96. HTML("<tfoot>")
  97. inc()
  98. HTML("<tr><td colspan='", nlevels(modulo)*length(stats)+2, "'>", note,"</td></tr>")
  99. dec()
  100. HTML("</tfoot>")
  101. }
  102. # Corps de la table
  103. HTML("<tbody>")
  104. inc()
  105. for (var in names(table))
  106. {
  107. # Creation du label de la variable
  108. etiq <- label(table[[var]])
  109. if (etiq == "table[[var]]") etiq <- var
  110. # Variable quantitative
  111. if (is.numeric(table[[var]]))
  112. {
  113. if (var %in% param)
  114. {
  115. if (nlevels(modulo) == 2)
  116. {
  117. p <- tryCatch(t.test(table[[var]] ~ modulo)$p.value, error=function(e){erreur(e,var,"dans le calcul du test t")})
  118. test <- "t"
  119. }
  120. else if (nlevels(modulo) > 2)
  121. {
  122. p <- tryCatch(summary(aov(table[[var]] ~ modulo))[[1]][["Pr(>F)"]][1], error=function(e){erreur(e,var,"dans le calcul de l'ANOVA")})
  123. test <- "ANOVA"
  124. }
  125. }
  126. else
  127. {
  128. if (nlevels(modulo) == 2)
  129. {
  130. p <- tryCatch(wilcox.test(table[[var]] ~ modulo)$p.value, error=function(e){erreur(e,var,"dans le calcul du test de Mann-Whitney")})
  131. test <- "M-W"
  132. }
  133. else if (nlevels(modulo) > 2)
  134. {
  135. p <- tryCatch(kruskal.test(table[[var]] ~ modulo)$p.value, error=function(e){erreur(e,var,"dans le calcul du test de Kruskal-Wallis")})
  136. test <- "K-W"
  137. }
  138. }
  139. HTML("<tr><td class='var'>", etiq, "</td>", sep="")
  140. for (level in levels(modulo))
  141. {
  142. for (stat in stats)
  143. {
  144. HTML("<td>",sep="")
  145. HTML(tryCatch(
  146. {
  147. format(switch(stat,
  148. N = length(na.omit(table[[var]][modulo==level])),
  149. "%/moy" = ,
  150. moy = mean(table[[var]][modulo==level],na.rm=T),
  151. "%/med" = ,
  152. med = median(table[[var]][modulo==level],na.rm=T),
  153. Q1 = quantile(table[[var]][modulo==level], probs=.25, na.rm=T,names=F,type=3),
  154. Q3 = quantile(table[[var]][modulo==level], probs=.75, na.rm=T,names=F,type=3),
  155. min = min(table[[var]][modulo==level],na.rm=T),
  156. max = max(table[[var]][modulo==level],na.rm=T),
  157. et = sd(table[[var]][modulo==level],na.rm=T),
  158. ic95 = paste0("&plusmn;",format(mean(table[[var]][modulo==level],na.rm=T) - t.test(table[[var]][modulo==level])$conf.int[1], digits=nbdec,nsmall=nbdec)),
  159. ... = "ERR"
  160. ),digits=nbdec,nsmall=nbdec)
  161. },error = function(e){erreur(e,var,"dans le calcul de ",stat)}), sep="")
  162. HTML("</td>", sep="")
  163. }
  164. }
  165. HTML("<td>", format(p,digits=nbdecp,nsmall=nbdecp), sep="")
  166. if (!is.na(p))
  167. if (p<.05)
  168. HTML("*", sep="")
  169. HTML(" (",test,")</td>", sep="")
  170. HTML("</tr>")
  171. }
  172. # Variable qualitative
  173. else if (is.factor(table[[var]]))
  174. {
  175. test <- "X"
  176. p <- tryCatch(
  177. {
  178. chisq.test(table[[var]],modulo)$p.value
  179. },
  180. warning=function(w)
  181. {
  182. test <<- "f"
  183. tryCatch(
  184. {
  185. fisher.test(table[[var]],modulo,workspace=1e+08)$p.value
  186. },
  187. error=function(e)
  188. {
  189. #test <<- "X(f failed)"
  190. #chisq.test(table[[var]],modulo)$p.value
  191. fisher.test(table[[var]],modulo,simulate.p.value = T,B = 1e+06)$p.value
  192. })
  193. },
  194. error=function(e)
  195. {
  196. "NA"
  197. })
  198. HTML("<tr><td class='var' colspan='", nlevels(modulo)*length(stats)+1, "'>", etiq, "</td>", sep="")
  199. HTML("<td>", format(p,digits=nbdecp,nsmall=nbdecp), sep="")
  200. if (!is.na(p))
  201. if (p<.05)
  202. HTML("*", sep="")
  203. HTML(" (",test,")</td>", sep="")
  204. HTML("</tr>")
  205. # Levels de la variable qualitative
  206. for (level in levels(table[[var]]))
  207. {
  208. HTML("<tr><td class='level'>", level, "</td>",sep="")
  209. for (level_m in levels(modulo))
  210. {
  211. for (stat in stats)
  212. {
  213. HTML("<td>",sep="")
  214. if (stat == "N")
  215. HTML(table(table[[var]],modulo)[level,level_m],sep="")
  216. else if ((stat == "%") | (stat == "%/moy") | (stat == "%/med"))
  217. switch(pourcent,
  218. row = HTML(format(100*table(table[[var]],modulo)[level,level_m]/rowSums(table(table[[var]],modulo))[level], digits=nbdec, nsmall=nbdec), sep=""),
  219. col = HTML(format(100*table(table[[var]],modulo)[level,level_m]/colSums(table(table[[var]],modulo))[level_m], digits=nbdec, nsmall=nbdec), sep=""),
  220. total = HTML(format(100*table(table[[var]],modulo)[level,level_m]/sum(table(table[[var]],modulo)), digits=nbdec, nsmall=nbdec), sep=""))
  221. HTML("</td>",sep="")
  222. }
  223. }
  224. HTML("<td></td></tr>")
  225. }
  226. }
  227. else next
  228. }
  229. dec()
  230. HTML("</tbody>")
  231. dec()
  232. HTML("</table>")
  233. HTML("</div>")
  234. HTMLEnd()
  235. }