Valid XHTML     Valid CSS2    

E/S, XML, R, statistiques, « recherche reproductible »

gilles.hunault "at" univ-angers.fr

(6 h pour l'Ecole doctorale STIM, juin 2017)

Présentation de l'exposé

                khg                 cerami                 xmlBioinf
                xml_LP                 dita                 miningGraphs
                miningGraph                 miningGraph                 miningGraph
                miningGraph                 miningGraph                 rxml

Dans un premier temps, nous essaierons de montrer pourquoi XML est une technologie importante à connaitre dans le cadre du développement informatique de programmes de recherche que ce soit pour des raisons de fiabilité ou d'efficacité. Ensuite, dans un second temps, nous illustrerons la problèmatique de l'analyse scientifique des résultats et de leur reproductibilité à l'aide du logiciel R et des outils associés. Les ouvrages affichés au-dessus de ce texte (avec un lien sous chaque image) constituent un socle important de connaissances pour confirmer et approfondir cet exposé.

1. Données, programmes et XML

A part les programmes informatiques de recherche théoriques basés uniquement sur un petit nombre de paramètres, la plupart des programmes informatiques développés dans le cadre de thèses utilisent à la fois des paramètres et des fichiers de données. Ces programmes peuvent produire soit des petits nombres de données (comme juste un score, un nombre de couleurs...) soit de nombreux résultats (fichiers d'exécutions, données résultats structurées...) qu'il faut aussi analyser. Voir au passage notre notre rappel sur les 4 ages de la programmation. La question qui se pose est bien sûr :

Comment «bien» stocker ces données d'entrée et les résultats ?


     algo:
     Generic options:
       -v [ --version ]      print version string
       -h [ --help ]         produce help message
       --config arg          name of a file of a configuration.
     
     Configuration:
       -g [ --id-group ] arg    set of group id (default ALL)
       -a [ --algo ] arg        algo
       -m [ --min ] arg         minimal bound (default log_2(NB_CHARACTERES)
       -M [ --max ] arg         maximal bound ( NB_CHARACTERES/2 )
       -w [ --window ] arg      window's size (default 1)
       -t [ --iteration ] arg   number of iterations(default 1000)
       -p [ --pertubation ] arg pertubation (entre 0 et 1)(default 0.95)
       -r [ --restart ] arg     number of restart(default 2)
       -e [ --exhaustive ]      exhaustive (default desactivate)
       -c [ --cut ]             cut (default desactivate)
       -x [ --no-xml ]          xml (default activate)
       -d [ --dac ]             dac reading instead xml (default desactivate)
       -s [ --no-ds ]           ds (default activate)
       -C [ --no-mcs ]          mcs (default activate)
       -i [ --input-file ] arg  input file
       -o [ --output-file ] arg output file
     
     numerote nom_de_fichier [entete=n] [ [debut=c] [zero=oui|non] [largeur=n] [iden=non|oui] ]
     
     discr fichier[.dat] numeroChamp [ [ Gnuplot ] [ [S=seuil] | [Aa] ] ]
     
     gtrace grammar   [nbStep [ vbase [ prog ] ] ]
     
     classif fichier[.idp] [ -R | -T [ -G -P -B ] ]
     
     syntax is: goCd  [ <da[%]> | -i <dn> |  -L | -a <da> <dn> | -f <fn> | -h | -s | -d <da>]
     
     mdp --input leap.fasta --output leap.xml -w "" -j "
     
     mdp -i test.xml -m 2 -M 8 -w'=' -v -t "ecif" -T 5
     
     perl fileOps.pl example.txt -del 1:3 -out example2.txt
     
     perl fileOps.pl example.txt -block 1:5-1:10 -fic example3.txt -out example4.txt
     

L'une des premières limitations des bases de données relationnelles -- qui sont une solution standard à ce problème -- est leur manque de structure hiérarchique. Le modèle sous-jacent en lignes et colonnes avec des relations issues du modèle relationnel n'est pas adapté à une structure hiérarchique forte. Il suffit de se rappeler que LDAP, initialement défini comme un protocole est devenu un modèle de représentation de données pour comprendre que les SGBDR ne sont pas une solution universelle de stockage. Le second point qui invalide les bases de données pour gérer des résultats est leur gestion via un logiciel spécialisé (comme les implémentations SQL) avec des solutions logicielles lourdes à utiliser. Enfin, le troisième point à nos yeux qui «gâche tout» est leur but qui consiste vouloir utiliser systématiquement les données, quitte à mettre NULL lorsqu'une donnée n'est pas présente. La vérification des données n'a plus alors grand sens, alors que la qualité des données en entrée impacte bien évidemment la qualité des résultats en sortie.

XML évite tous ces écueils : c'est un format texte structuré en arbre enraciné, non lié à un un système d'exploitation, dont les grammaires DTD et XSD peuvent garantir la structure et le typage des données, quitte à refuser la validité d'un fichier, et pour lequel le langage de traitement XSL facilite la transformation vers n'import quel format. De plus XML est un méta-langage autour duquel gravite toute une technologie avec un support très fort du https://www.w3.org/ (via la rubrique standards).

Prenons l'exemple de la recherche de caractérisations spécifiques minimales présentées succintement ici. Si on peut se contenter d'utiliser trois fichiers textes proprement couplés, seule une grammaire XSD comme carac.xsd peut assurer de nombreuses vérifications sans avoir à écrire la moindre ligne de code.

ra100_phv.dac       ra100_phv.ngr       ra100_phv.gal       ra100_phv.xml       ra100_phv.cs       solution.cs       

Les liens qui suivent permettent de découvrir ces différents aspects de XML une fois notre page de présentation parcourue :

      XML initiatives (2005)       introduction à XML       DTD       XSD       XSL       XML-RPC       SOAP 

A titre d'illustration sur l'utilisation de XML en recherche (optimisation), on pourra cliquer sur les liens qui suivent :

non su   non su
LPFML   OSIL
non su   non su
OPTISERV   DGML

On pourra se convaincre du bien-fondé d'utiliser un schéma XSD en consultant le fichier validateur.dtd renommé en validateur_xsd.xml car on y trouve : des xs:ID et des xs:IDREFS, des expressions régulières comme a[1-9][0-9]*( a[1-9][0-9]*)* pour garantir les contenus-textes.

2. Résultats, analyses et R

Si un temps d'exécution de 13 secondes est mathématiquement différent d'une durée de 15 secondes, une durée de 13 secondes n'est pas forcément significativement différente d'une durée de 15 secondes. C'est pourquoi la théorie des tests statistiques d'hypothèse est le seul outil scientifique capable de valider des résultats. Le logiciel gratuit R et son environnement (gratuit lui aussi) de développement Rstudio fournissent un moyen propre et efficace de réaliser ces tests. Comme la science ne se définit pas par des croyances mais par des faits et des démarches reproductibles, nous discuterons de la notion de nombres pseudo-aléatoires et nous présenterons des moyens de réaliser des analyses rigoureuses. Si vous ne connaissez pas du tout R, vous pouvez très rapidement profiter de nos présentations ultra-courtes de R et la bioinformatique et de R pour les biostatistiques.

A titre d'exemple, voici des données, sauriez-vous dire quelles colonnes sont significativement différentes ?


     Valeurs
                y1       y2        y3        y4
      [1,] 12.59777 15.17511 10.559054 13.068750
      [2,] 14.53133 17.94503 18.023291  8.872425
      [3,] 13.08465 17.64974 12.340983  7.548908
      [4,] 13.23424 16.81625 13.235201 24.448232
      [5,] 11.96349 14.05990 10.167283 19.809199
      [6,] 13.53092 14.53374 13.014074 17.508676
      [7,] 11.82766 12.90319 14.253726 16.926963
      [8,] 12.38244 10.22726 14.651599  8.737970
      [9,] 13.83473 17.08683 18.615408 15.176913
     [10,] 13.01275 13.60296  5.139381 17.901964
     
     Moyennes
           13       15       13        15
     

Voici le code R pour générer de telles données et quelques exemples de réalisation avec les chiffres et les graphiques, ce qui aide un peu mais ne fournit aucune validation scientifique :


     # # (gH)   -_-  signif.r  ;  TimeStamp (unix) : 10 Juin 2017 vers 18:54
     
     if (!exists("cats")) { source("http://forge.info.univ-angers.fr/~gh/wstat/statgh.r",encoding="latin1") }
     
     nbp <- 10       # nombre de points
     set.seed(12345) # garantit la reproductibilité
     
     ##################################################
     
     exemple <- function(num,titre,nbv,m1,e1,m2,e2) {
     
     ##################################################
     
     genx <- function(base,ect)   { return( rep(base,nbv) + rnorm(nbv,m=0,s=ect) ) }
     
     geny <- function(nbv,moy,ect) {
       y <- rnorm(nbv,m=moy,s=ect)
       y <- y - mean(y) + moy
       return( y )
     } # fin de fonction geny
     
     cats(paste("exemple",num,":",titre))
     
     # 1. génération de x1 et y1 puis tracé
     
     x1  <- genx( 2, 1/5 )
     y1  <- geny(nbv,m1,e1)
     df1 <- cbind(x1,y1)
     plot(y1~x1,xlim=c(0,10),ylim=c(0,15),col="blue",pch=19,main=titre)
     abline(h=mean(y1),col="blue")
     text(x=2,y=14,labels=paste(" m = ",round(mean(y1),1),sep=""),col="blue",cex=2)
     
     # 2. génération de x2 et y2 puis ajout au tracé
     
     x2 <- genx(6,1/10) ;
     y2 <- geny(nbv,m2,e2)
     y2 <- y2 - mean(y2) + m2
     df2 <- cbind(x2,y2)
     points(y2~x2,xlim=c(0,10),ylim=c(0,15),col="red",pch=19)
     abline(h=mean(y2),col="red")
     text(x=6,y=14,labels=paste(" m = ",round(mean(y2),1),sep=""),col="red",cex=2)
     
     # 3. affichage des valeurs, des moyennes et des tests
     
     cat("Valeurs :\n")
     print(cbind(df1,df2))
     cat("\n")
     
     cat("Moyennes et écart-types :\n\n")
     cat("moyenne de y1 :",round(mean(y1),1),"écart-type :",round(sd(y1),1),"\n")
     cat("moyenne de y2 :",round(mean(y2),1),"écart-type :",round(sd(y2),1),"\n")
     
     print(t.test(y1,y2))
     print(wilcox.test(y1,y2))
     
     } # fin de fonction exemple
     
     #################################################
     
     exemple(num=1,titre="différence significative",        nbv=nbp,m1=13,e1=1,m2=15,e2=2)
     exemple(num=2,titre="différence non significative    ",nbv=nbp,m1=13,e1=3,m2=15,e2=5)
     

Ci-dessous, les graphiques et résultats numériques produits :

               non su     non su


     exemple 1 : différence significative
     ====================================
     
     Valeurs :
                 x1       y1       x2       y2
      [1,] 2.117106 12.59777 6.077962 15.17511
      [2,] 2.141893 14.53133 6.145579 17.94503
      [3,] 1.978139 13.08465 5.935567 17.64974
      [4,] 1.909301 13.23424 5.844686 16.81625
      [5,] 2.121177 11.96349 5.840229 14.05990
      [6,] 1.636409 13.53092 6.180510 14.53374
      [7,] 2.126020 11.82766 5.951835 12.90319
      [8,] 1.944763 12.38244 6.062038 10.22726
      [9,] 1.943168 13.83473 6.061212 17.08683
     [10,] 1.816136 13.01275 5.983769 13.60296
     
     Moyennes et écart-types :
     
     moyenne de y1 : 13 écart-type : 0.8
     moyenne de y2 : 15 écart-type : 2.4
     
     Welch Two Sample t-test
     
     data:  y1 and y2
     t = -2.4498, df = 11.112, p-value = 0.03206
     alternative hypothesis: true difference in means is not equal to 0
     95 percent confidence interval:
      -3.7946712 -0.2053288
     sample estimates:
     mean of x mean of y
            13        15
     
     Wilcoxon rank sum test
     
     data:  y1 and y2
     W = 19, p-value = 0.01854
     alternative hypothesis: true location shift is not equal to 0
     
     
     exemple 2 : différence non significative
     ============================================
     
     Valeurs :
                 x1        y1       x2        y2
      [1,] 2.225702 10.559054 6.014959 13.068750
      [2,] 1.523928 18.023291 5.865747  8.872425
      [3,] 1.787947 12.340983 6.055330  7.548908
      [4,] 2.187428 13.235201 6.158996 24.448232
      [5,] 2.170890 10.167283 5.941312 19.809199
      [6,] 2.292146 13.014074 5.816762 17.508676
      [7,] 1.717380 14.253726 6.088814 16.926963
      [8,] 2.113481 14.651599 6.159349  8.737970
      [9,] 2.116638 18.615408 6.051685 15.176913
     [10,] 1.738640  5.139381 5.870433 17.901964
     
     Moyennes et écart-types :
     
     moyenne de y1 : 13 écart-type : 3.9
     moyenne de y2 : 15 écart-type : 5.4
     
     Welch Two Sample t-test
     
     data:  y1 and y2
     t = -0.94375, df = 16.323, p-value = 0.3591
     alternative hypothesis: true difference in means is not equal to 0
     95 percent confidence interval:
      -6.485293  2.485293
     sample estimates:
     mean of x mean of y
            13        15
     
     Wilcoxon rank sum test
     
     data:  y1 and y2
     W = 40, p-value = 0.4813
     alternative hypothesis: true location shift is not equal to 0
     
     

Si les statistiques réduisent souvent les tableaux des données à des résumés caractéristiques de tendance centrale (médianes, moyennes, modes...) et de dispersion absolue ou relative (écart-types, IQR, coefficient de variation...), il ne faut jamais négliger les représentations graphiques comme le montre le fameux exemple du quartet d'Anscombe.

non su   non su

Ainsi, pour nos données, des «boites à moustaches» ou boxplots peuvent permettre de se douter que les données sont «assez proches» ou pas :

               non su     non su

Même si au final un test statistique ne prouve jamais rien car il s'agit de modèle probabiliste réfutable, il est d'usage de fournir des conclusions concernant des comparaisons de données, de moyennes, de distibutions... à l'aide de ces tests. Une des difficultés de ces tests est qu'ils font appels à des conditions d'applications pas toujours bien comprises des utilisatrices et des utilisateurs. Ainsi le test de Student (ou le test de Welch, si les variances sont considérées comme inégales) ne doit pas s'appliquer, en principe à des petits échantillons, comme c'est le cas pour nos données. Des données appariées comme des valeurs avant et après un traitement pour des mêmes patients, ou des résultats d'exécution pour des mêmes jeux de données requièrent des calculs spécifiques.

Réaliser une analyse statistique demande des compétences en statistiques et en probabilités. Il est d'usage de commencer par les statistiques descriptives avant d'aborder les statistiques inférentielles que ce soit au niveau des tests statistiques ou de la modélisation statistique et de l'apprentissage statistique comme pour les modèles de régression linéaire, de régression logistique... S'il n'est pas essentiel de bien connaitre les probabilités, les estimateurs et la théorie de l'estimation, il est en général conseillé de bien connaitres les « grands modèles probabilistes» classiques comme la loi binomiale, (wiki), la loi de Poisson (wiki FR) ou la loi normale (wiki FR) pour comprendre ce qui est modélisé et calculé car on passe souvent des échantillons aux populations sous-jacentes avec des hypothèses parfois difficiles à vérifier.

Si vous voulez vraiment comprendre comment on modélise mathématiquement ce qui est aléatoire, voici quelques PDF qui peuvent vous servir de référence :

bpt     

 
ptae

    

jaynes

    

knill

Le logiciel R, par exemple utilisé via Rstudio, est un excellent logiciel pour réaliser des analyses statistiques, car ses centaines de milliers de fonctions implémentées dans des milliers de 'packages' publics fournissent tous les outils de bases et de nombreux outils avancés. On consultera notamment la page Optimization qui présente les «packages» liés aux problèmes classiques d'optimisation (linéaires, quadratiques, convexes...) à leurs solveurs et benchmarks. De plus le langage de programmation intégré à R et sa documentation multilingue permettent un apprentissage rapide et fournissent la possibilité de paramétrer et d'automatiser toutes les tâches à réaliser. Par exemple pour connaitre les fonctions dont le nom se termine par test il suffit d'écrire apropos("test$") :


     > apropos("test$")
     
       ansari.test       bartlett.test          binom.test        Box.test           chisq.test        cor.test
       file_test         fisher.test            fligner.test      friedman.test      kruskal.test      ks.test
       mantelhaen.test   mauchly.test           mcnemar.test      mood.test          oneway.test       pairwise.prop.test
       pairwise.t.test   pairwise.wilcox.test   poisson.test      power.anova.test   power.prop.test   power.t.test
       PP.test           prop.test              prop.trend.test   quade.test         shapiro.test      t.test
       .valueClassTest   var.test               wilcox.test
     

Ainsi, il est simple de générer des nombres pseudo-aléatoires, par exemple en R avec des fonctions comme runif(), rbinom(), rpois() ou rnorm(). Encore faut-il savoir à quoi cela correspond...


     ## données pseudo-aléatoires
     
     set.seed(12345)
     nbv <- 200
     
     # données binomiales
     
     v <- rbinom(n=nbv,size=5,prob=0.8)
     
     print(head(v,n=10))
     plot(v,type="p",pch=19,main="rbinom()",col="red")
     print(table(v))
     barplot(table(v),main="rbinom()",col="red")
     hist(v,main="rbinom()",col="red")
     
     # données de poisson
     
     v <- rpois(n=nbv,lambda=0.4)
     
     print(head(v,n=10))
     plot(v,type="p",pch=19,main="rpois()",col="blue")
     print(table(v))
     barplot(table(v),main="rpois()",col="blue")
     hist(v,main="rpois()",col="blue")
     
     # données normales
     
     v <- rnorm(n=nbv,mean=0.4,sd=0.1)
     
     print(head(v,n=10))
     plot(v,type="p",pch=19,main="rnorm()",col="green")
     print(table(v))
     hist(v,main="rnorm()",col="green")
     

               non su

Il est en revanche plus difficile de «faire propre» avec des générations reproductibles, laissant la possibilité à d'autres de vérifier nos calculs.

Il ne faut pas oublier non plus qu'une analyse scientifique doit être rigoureuse et suivre un protocole soigneusement défini. Ainsi, en recherche clinique, on ne compare pas un groupe d'hommes de 40 ans à un groupe de femmes de 60 ans car on ne saurait pas attribuer une différence au sexe ou à l'age (biais de confusion). Les comparaisons de pourcentages peuvent aussi donner lieu à des impossibilités apparentes, comme le paradoxe de Simpson. En informatique, se limiter à comparer des temps d'exécution sur une même machine ne prouve sans doute pas grand chose à cause de l'encombrement mémoire, des accès-disque, de la disponibilité des processeurs...

Les questions scientifiques et philosophiques de fond posées par la reproductibilité et la qualité d'une solution logicielle sont nombreuses. Pour des algorithmes déterministes une fois la preuve faite de la solution et de sa programmation, il est souvent possible d'écrire un programme de vérification à condition que son exécution soit réalisée en un temps «raisonnable». Un problème comme celui du plus grand palindrome commun à un ensemble de génomes bactériens par exemple, se révèle assez "simple" si on utilise une structure de données adaptée comme un arbre des suffixes ou la programmation dynamique. Il n'en va pas de même pour les problèmes au-delà de la classe NP-complets, par exemple pour les problèmes PSPACE. Comment démontrer, par exemple, qu'on a bien trouvé une solution à un problème si la vérification de la solution est elle-même un problème PSPACE ?

Comme le montre l'exemple du code de C. GANDRUD pour son livre, il est possible de produire un ouvrage entier avec des analyses statistiques reproductibles même pour des données (fixes) lues sur Internet. Cela demande beaucoup de rigueur, d'organisation et quelques compétences techniques en R dont knitr et en LaTeX. Vous pouvez le vérifier en téléchargeant le code-source du livre sur le github de l'auteur.

non su     

 
non su

rrrr

Dans le même genre d'idées, le manuel des analyses statistiques de la base de données LEADB disponible à l'adresse statistical analysis comporte 1 716 pages (!) et est re-généré automatiquement par script lors de changements dans la base de données. A un niveau moindre, la page que vous lisez actuellement est générée par PHP sur le serveur mais vous pouvez consulter son code-source ici ce qui vous permet de la reproduire mais aussi de discuter de la qualité du code.

 

 

retour gH    Retour à la page principale de   (gH)