Optimisation du temps de calcul d’un fonction de bootstrap

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Claire Bissery
Messages : 11
Enregistré le : 19 Juin 2006, 06:31

Optimisation du temps de calcul d’un fonction de bootstrap

Messagepar Claire Bissery » 10 Sep 2012, 15:50

Bonjour,

Je travaille sur une plateforme de calcul et d’analyse codée en R avec une interface tcltk (projet PAMPA). J’ai besoin d’optimiser le temps de calcul de mes fonctions de bootstrap.

Pour l’instant cela a été codé sans utiliser la fonction boot avec une boucle contenant un sample, quelques fonctions pour reconstruire un tableau issu de la sélection du sample et des fonctions spécifiques pour les calculs d’extrapolation voulus.
A priori c’est la partie de reconstruction du tableau bootstrapé qui prend trop de temps (évaluation avec Rprof).
J’ai deux possibilités soit je réécris toutes les fonctions spécifiques pour pouvoir utiliser le package boot et espérer gagner du temps, soit j’essaye de trouver une façon plus rapide de reconstruire mon tableau.

Voici le morceau de code qui pose problème.
Il permet de tirer au hasard des numéro de sortie en fonction d’un type de jour (semaine, week end) et d’un niveau temporel (mois, année…). Une fois les numéros de sortie tirés, les paquets de lignes correspondant à ce tirage sont récupérés, un code unique leur est attribué et le tableau bootstrapé est reconstruit.

Code : Tout sélectionner

TirageSortie <- unlist(tapply(FreqAnneeChoisie$numSortie,
                         paste(FreqAnneeChoisie[, niveauTemporel], FreqAnneeChoisie$typeJsimp),
                         FUN=function(x){sample(unique(x), replace=T, size=length(unique(x)))}))

      tirage <- lapply(TirageSortie, FUN = function(x) {subset(FreqAnneeChoisie,
                                                               FreqAnneeChoisie$numSortie==x)})
      names(tirage) <- seq(1,length(tirage))
     
      num <- unlist(lapply(names(tirage),
                           FUN=function(x){tirage[[x]]$num <- rep(x,nrow(tirage[[x]])) ;
                           tirage[[x]]$numBoot<-paste(tirage[[x]]$numSortie,tirage[[x]]$num)}))
      freqEchant <- do.call("rbind",tirage)


Je me demande si j’ai intérêt à utiliser un array, mon souci étant que les paquets de lignes à combiner sont de tailles variables et que je vais avoir besoin d’utiliser un merge qui prend du temps aussi je crois.

Est ce que quelqu’un a un avis sur la question ?

Merci pour votre aide

Claire

jean lobry
Messages : 733
Enregistré le : 17 Jan 2008, 20:00
Contact :

Re: Optimisation du temps de calcul d’un fonction de bootstr

Messagepar jean lobry » 10 Sep 2012, 19:37

Claire Bissery a écrit :Est ce que quelqu’un a un avis sur la question ?

Bonjour,

Personnellement j'irais plus vers boot (pdf ici) qui est un paquet utilisé
par plus d'utilisateurs qu'un code local, donc plus de pression de sélection
pour la correction des bugs et l'optimisation, mais ce n'est que mon avis.

Amicalement,

Jean

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Messagepar Stéphane Laurent » 11 Sep 2012, 11:40

Pour ma part, j'ai déjà comparé un bootstrap que j'avais fabriqué moi-même avec le bootstrap mis en oeuvre par boot(), et la conclusion était que boot() allait vachement plus vite.

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 11 Sep 2012, 11:47

bonjour,


A noter aussi que depuis quelques versions, on peut également améliorer les performances de la function boot avec l'argument "parallel".

HTH

pierre
=@===--------¬-------¬------¬-----¬
liens utiles :
http://www.gnurou.org/Writing/SmartQuestionsFr
http://neogrifter.free.fr/welcomeOnInternet.jpg
]<((((*< -------------------------------

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Messagepar Logez Maxime » 11 Sep 2012, 12:13

Bonjour,

En plus des conseils que tu as reçu concernant boot, l'usage de list allourdi considérablement le temps de calcul. A mon avis c'est une des choses que tu peux facilement améliorer dans ton code.

Maxime

Claire Bissery
Messages : 11
Enregistré le : 19 Juin 2006, 06:31

Messagepar Claire Bissery » 12 Sep 2012, 08:07

Merci pour toutes vos réponses.

Je vais essayer d’intégrer le package boot en modifiant les fonctions déjà programmés.
Si cela implique trop de restructuration, je verrai pour retirer la liste et mettre un array à la place, en espérant que le merge ne prenne pas trop de temps.

Bonne journée

Claire

Eric Casellas
Messages : 767
Enregistré le : 06 Jan 2009, 14:59

Messagepar Eric Casellas » 12 Sep 2012, 10:08

Bonjour,

Pour reconstruire ton tableau final il vaux mieux éviter l'utilisation de rbind ou cbind dans une boucle. (Il recopie inutilement a chaque fois tout le tableau)
Il est en général mieux de définir dès le début un tableau avec la taille finale puis d'en remplir les différentes lignes/colonnes...
Eric


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron