Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Meetup juin2013

450 views

Published on

  • Be the first to comment

  • Be the first to like this

Meetup juin2013

  1. 1. Nicolas PERU 12/06/2013
  2. 2. Un cas pratique et pragmatique• Contexte de l’étude• Utilisation de R : pourquoi et comment ?• Utilisation de la BDD : utilisationdétournée de R• Mise en forme des données : plyr• Modèles de mélange : flexmix• Quelques suites/améliorations à donner12/06/2013 Utiliser R au quotidien 2
  3. 3. Contexte de l’étude12/06/2013 Utiliser R au quotidien 3Photos G. Carrel/N. Stolzenberg
  4. 4. 12/06/2013 Utiliser R au quotidien 4PrélèvementsLaboratoire +BDDAnalyses + rapportsContexte de l’étude~ 4 mois14 mois 12 mois
  5. 5. peut tout faire !!• S’interfacer avec MySQL• Import/export de données• Mise en forme des données• Traitement statistique• Sorties graphiques12/06/2013 Utiliser R au quotidien 5Les besoins ?
  6. 6. • Rappel : avant tout un logiciel de stats• Générer du temps ?– Compromis efficacité/délais• Optimisation des pratiques selon l’utilisation• Ne peut pas pallier à toutes les contraintes• Outil riche (> 4500 packages)•  On se fait sa propre boîte12/06/2013 Utiliser R au quotidien 6…ou presque
  7. 7. • 120 000 individus (3 mesures)• 8000 points GPS + ~20 variables12/06/2013 Utiliser R au quotidien 7Base de données• Server MySQL (externe) couplé àphpmyadmin• Interface php de saisie• RODBC• ROracle• RJDBCRMySQL
  8. 8. 12/06/2013 Utiliser R au quotidien 8Base de données- saisie -• Interface php lente et peu optimisable (durée d’étude courte 2 ans ½)• Impossibilité d’import de tableaux complets• Approche pragmatique- Saisie sous excel (plus rapide)- Utilisation « détournée » de R• R sait écrire !• Fonction paste()• -> on peut « écrire » du code de n’importe quel langage• Combinaison avec apply()
  9. 9. 9head(bddtot)id_point cespece taillefixee_saisie taillestandard_saisie St_larvaire zoom eff convzoom1295 337 GAR 88 84 1 1.25 5099 0.080811296 337 GAR 77 73 1 1.25 5099 0.080811297 337 GAR 94 90 1 1.60 5099 0.063161298 337 GAR 83 79 1 1.25 5099 0.080811299 337 GAR 90 86 1 1.25 5099 0.080811300 337 GAR 89 84 1 1.25 5099 0.08081taillefixee taillestandard1295 7.11 6.791296 6.22 5.901297 5.94 5.681298 6.71 6.381299 7.27 6.951300 7.19 6.79write.csv(data.frame(sql=apply(bddtot,1,function(x) x <-paste("INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom)"," VALUES(",x[1],",",x[2],",","0.00,-1,",x[9],",",x[10],",0.00,",x[5],",",x[4],",",x[3],",",x[6],");","UPDATE bp_poisson SET saisie =WHERE saisie = -1;",sep=""))),file="requeteSQL_ss_ech.csv",quote=FALSE,row.names=FALSE)Base de données- saisie -Saisieexcel
  10. 10. 10write.csv(data.frame(sql=apply(bddtot,1,function(x) x <-paste("INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom)"," VALUES(",x[1],",",x[2],",","0.00,-1,",x[9],",",x[10],",0.00,",x[5],",",x[4],",",x[3],",",x[6],");","UPDATE bp_poisson SET saisie =WHERE saisie = -1;",sep=""))),file="requeteSQL_ss_ech.csv",quote=FALSE,row.names=FALSE)Base de données- saisie -sqlINSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom) VALUES(1021,HOT,0.00,-1,14.22,12.00,0.00,2, 81.0, 96.0,0.7)INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom) VALUES(1021,HOT,0.00,-1,14.07,12.89,0.00,2, 87.0, 95.0,0.7)INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom) VALUES(1021,HOT,0.00,-1,13.63,12.59,0.00,2, 85.0, 92.0,0.7)INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom) VALUES(1021,HOT,0.00,-1,12.74,11.85,0.00,2, 80.0, 86.0,0.7)INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom) VALUES(1021,HOT,0.00,-1,14.07,13.04,0.00,2, 88.0, 95.0,0.7)INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom) VALUES(1021,HOT,0.00,-1,14.07,12.89,0.00,2, 87.0, 95.0,0.7)INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom) VALUES(1021,HOT,0.00,-1,14.67,13.63,0.00,2, 92.0, 99.0,0.7)INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom) VALUES(1021,HOT,0.00,-1,14.37,13.33,0.00,2, 90.0, 97.0,0.7)INSERT INTO bp_poisson (id_point, cespece, taille,saisie,taillefixee,taillestandard,taille_saisie,St_larvaire,taillestandard_saisie,taillefixee_saisie,zoom) VALUES(1021,HOT,0.00,-1,14.67,13.33,0.00,2, 90.0, 99.0,0.7)• 60 000 requêtes unitairesgénérées en un script• Insertion dans la BDD viaphpmyadmin
  11. 11. 12/06/2013 Utiliser R au quotidien 11Base de données- interfacer R et MySQL -library(RMySQL)Connexion <-dbConnect(MySQL(),dbname="rhonejuv",user="root",password= "MdP",host="localhost")dbGetQuery(connexion,"select * from bp_poisson")->bp_poissondbGetQuery(connexion,"select * from bp_point")->bp_point dbGetQuery(connexion,"select * from bp_peche")->bp_pechedbGetQuery(connexion,"select * from bp_station")->bp_stationRMySQL est un enfer à paramétrer !!!Différence entre machine pour un même OSApproche pragmatique- dump de la base et travail en local (ex : Wampserver)- Export des tables en .csv via SQL (phpmyadmin)- Import des données sous R
  12. 12. 12/06/2013 Utiliser R au quotidien 12Mise en forme des données- package plyr -require(plyr)for (m in 1:nlevels(edfjuvtaille_4sp$id_secteur)){site <-subset(edfjuvtaille_4sp,id_secteur==levels(edfjuvtaille_4sp$id_secteur)[m]& typeStation=="RCC")nomsite <- levels(edfjuvtaille_4sp$id_secteur)[m]for (k in 1:nlevels(edfjuvtaille_4sp$id_campagne)){camp <- subset(site,id_campagne==levels(site$id_campagne)[k])nomcamp <- levels(edfjuvtaille_4sp$id_campagne)[k]for (i in 1:nlevels(camp$cespece)){sp <- subset(camp,cespece==levels(camp$cespece)[i] & LS<110)nomsp <- levels(camp$cespece)[i]sp$LS[sp$LS>=40] <- ((sp$LS[sp$LS>=40]-40)/3)+40hist_global <- hist(sp$LS,breaks=clas1,plot=F,warn.unused =FALSE,freq=T)hist_global$counts <- sqrt(hist_global$counts) #échelle rac. carréebmp(paste("1histo",nomsp,"_",nomsite,nomcamp,"RCC.bmp",sep=""),width=1100)par(las=1,lwd=1,mar=c(5,5,3,1),cex.axis=1.5,cex.lab=1.5,bty=n,mgp=c(2.5,1,0))if(nrow(sp)!=0){plot(1,type=n,xlim=c(0,70),ylim=c(0,round_any(max(hist_global$counts),5,ceiling)),xlab="Taille (mm)",ylab="nb. (sqrt scale)",yaxt=n,xaxt=n)a <- (seq(50,120,by=10)-40)/3+40axis(1,pos=c(0,0),at=c(seq(0,40,by=5),a),labels=c(seq(0,40,by=5),seq(50,120,by=10)))axis(2,pos=c(0,0),at=seq(0,round_any(max(hist_global$counts),5,ceiling),by=5),labels=seq(0,round_any(max(hist_global$counts),5,ceiling),by=5)^2)text(35,round_any(max(hist_global$counts),5,ceiling),labels=paste("C",k,":",datep_peage$PRCC1[k,2],sep=""),cex=2,font=2)legend(x=1,y=round_any(max(hist_global$counts),5,ceiling),pch=22,col=colSt,legend=paste("St",0:5),pt.bg=colSt,pt.cex = 3,xpd=TRUE,cex=1.5)for(j in 1:nlevels(sp$St_larvaire)){options(warn=-1)stade <- subset(sp,St_larvaire==levels(sp$St_larvaire)[j])hist_st <- hist(stade$LS,breaks=clas1,freq=T,plot=F)hist_st$counts <- sqrt(hist_st$counts)lines(hist_st,col=rgb(t(col2rgb(colSt[j],alpha=T)),maxColorValue =255,alpha=127),freq=T)options(warn=0)}}else{a <- (seq(50,120,by=10)-40)/3+40plot(1,type=n,xlim=c(0,70),ylim=c(0,10),xlab="Taille(mm)",ylab="nb.",yaxt=n,xaxt=n)axis(1,pos=c(0,0),at=c(seq(0,40,by=5),a),labels=c(seq(0,40,by=5),seq(50,120,by=10)))axis(2,pos=c(0,0),at=seq(0,10,by=5),labels=seq(0,10,5))Distribution de tailleObjectif : obtenir les distributions detaille par espèce à chaque site et àchaque date.« mise en forme » est sous-jacente(nécessaire à l’objectif)
  13. 13. 12/06/2013 Utiliser R au quotidien 13require(plyr)for (m in 1:nlevels(edfjuvtaille_4sp$id_secteur)){site <-subset(edfjuvtaille_4sp,id_secteur==levels(edfjuvtaille_4sp$id_secteur)[m]& typeStation=="RCC")nomsite <- levels(edfjuvtaille_4sp$id_secteur)[m]for (k in 1:nlevels(edfjuvtaille_4sp$id_campagne)){camp <- subset(site,id_campagne==levels(site$id_campagne)[k])nomcamp <- levels(edfjuvtaille_4sp$id_campagne)[k]for (i in 1:nlevels(camp$cespece)){sp <- subset(camp,cespece==levels(camp$cespece)[i] & LS<110)nomsp <- levels(camp$cespece)[i]sp$LS[sp$LS>=40] <- ((sp$LS[sp$LS>=40]-40)/3)+40hist_global <- hist(sp$LS,breaks=clas1,plot=F,warn.unused =FALSE,freq=T)hist_global$counts <- sqrt(hist_global$counts) #échelle rac. carréebmp(paste("1histo",nomsp,"_",nomsite,nomcamp,"RCC.bmp",sep=""),width=1100)par(las=1,lwd=1,mar=c(5,5,3,1),cex.axis=1.5,cex.lab=1.5,bty=n,mgp=c(2.5,1,0))if(nrow(sp)!=0){plot(1,type=n,xlim=c(0,70),ylim=c(0,round_any(max(hist_global$counts),5,ceiling)),xlab="Taille (mm)",ylab="nb. (sqrt scale)",yaxt=n,xaxt=n)a <- (seq(50,120,by=10)-40)/3+40axis(1,pos=c(0,0),at=c(seq(0,40,by=5),a),labels=c(seq(0,40,by=5),seq(50,120,by=10)))axis(2,pos=c(0,0),at=seq(0,round_any(max(hist_global$counts),5,ceiling),by=5),labels=seq(0,round_any(max(hist_global$counts),5,ceiling),by=5)^2)text(35,round_any(max(hist_global$counts),5,ceiling),labels=paste("C",k,":",datep_peage$PRCC1[k,2],sep=""),cex=2,font=2)legend(x=1,y=round_any(max(hist_global$counts),5,ceiling),pch=22,col=colSt,legend=paste("St",0:5),pt.bg=colSt,pt.cex = 3,xpd=TRUE,cex=1.5)for(j in 1:nlevels(sp$St_larvaire)){options(warn=-1)stade <- subset(sp,St_larvaire==levels(sp$St_larvaire)[j])hist_st <- hist(stade$LS,breaks=clas1,freq=T,plot=F)hist_st$counts <- sqrt(hist_st$counts)lines(hist_st,col=rgb(t(col2rgb(colSt[j],alpha=T)),maxColorValue =255,alpha=127),freq=T)options(warn=0)}}else{a <- (seq(50,120,by=10)-40)/3+40plot(1,type=n,xlim=c(0,70),ylim=c(0,10),xlab="Taille(mm)",ylab="nb.",yaxt=n,xaxt=n)axis(1,pos=c(0,0),at=c(seq(0,40,by=5),a),labels=c(seq(0,40,by=5),seq(50,120,by=10)))axis(2,pos=c(0,0),at=seq(0,10,by=5),labels=seq(0,10,5))Mise en forme des données- package plyr -ddply(subset(edfjuvtaille_4sp,typeStation=="RCC"),~id_secteur+id_campagne+cespece,Allègement sensibledatasiteespèce• Conserve le format global• Ajout de colonne• Synthèse (moyenne…)• Toute sortie possible• Il suffit de définir la fonction• Plyr ≠ optimisation de temps de calcul• Calcul parallèle possible (.parallel) avec lespackages foreach et doParallelMise en forme dugraphique
  14. 14. 12/06/2013 Utiliser R au quotidien 14Mise en forme des données- package plyr -Au final :~300 graphiques générés dans un format communPhase suivante :Les analyses statslines(hist_st,col=rgb(t(col2rgb(colSt[j],alpha=T)),maxColorValue = 255,alpha=127),freq=T)Transparence des couleurs : dépend du périphérique choisiNB : pour les graphiques, toujours avoir un exemplaire de :« Les paramètre graphiques ». Fiche tdr75 du pbil écrite par J. Lobry
  15. 15. 12/06/2013 Utiliser R au quotidien 15Modèles de mélange- package flexmix -ApparitiondeAApparitiondeBchronique <- vector("list",4)names(chronique) <- tpschronique[[1]] <- rnorm(300,taillemu[1],taillesd[1])chronique[[2]] <- rnorm(250,taillemu[2],taillesd[2])chronique[[3]] <- rnorm(200,taillemu[3],taillesd[3])chronique[[4]] <- rnorm(150,taillemu[4],taillesd[4])chronique_hist <- lapply(chronique,function(x) hist(x,plot=F,breaks=seq(0,55,by=1)))N <- length(chronique_hist)for(j in 2:N) {HIST <- chronique_hist[[j]]n <- length(HIST$counts)for(i in 1:n){y <- rep(tps[j],4)x <- rep(HIST$breaks[c(i,i+1)],each=2)z <- rep(c(0,HIST$counts[i]),2)coord <- data.frame(x,y,z)segments3d(coord,col=black)y <- rep(tps[j],2)x <- HIST$breaks[c(i,i+1)]z <- rep(HIST$counts[i],2)coord <- data.frame(x,y,z)segments3d(coord)}}rgl.postscript("test.eps")Couleurs via logiciel graphique- Possibilité via polygon()On peut faire de la 3D sous R : exemple avec le package rglThéorie
  16. 16. 12/06/2013 Utiliser R au quotidien 16Modèles de mélange- package flexmix -stepflexmix(LS~1,data=ABLbaix2011[[i]][[2]],control=list(iter.max=1000,classify="SEM"),concomitant=FLXPmultinom(~C(factor(St_larvaire,levels=1:6),poly,1)),k=1:4)• Mélange de différentes lois• Chaque composante à un poids• Prédicteurs pour Les paramètres de chaquecomposante Le poids de chaquecomposante• Processus itératif pour tester 1à k composantes• Algorithme EM• Sélection par AIC, BIC…
  17. 17. 12/06/2013 Utiliser R au quotidien 17Modèles de mélange- package flexmix -Sortie du modèle : proba d’appartenance àune composante kHypothèse:Mélange de k gaussienneau sein de la distribution detaille
  18. 18. 12/06/2013 Utiliser R au quotidien 18Quelques suites/améliorationsOptimisation du code- Boucle/apply : retour d’expérience pas si évident que ça- Eviter les stockages en mémoire- Vectorisation (calcul matriciel)- Limiter l’usage des listes surtout dans les étapes intermédiairesReporting (construction automatique du rapport final)- Sweave- Knitr- Très pratique dans les études avec des rapports intermédiaires
  19. 19. 12/06/2013 Utiliser R au quotidien 19Conclusion• très pratique, très puissant• Sans limite ?• Finalement il ne faut qu’une chose :du temps !

×