Génération de nombres aléatoires

Optimiser le code R avec Rcpp

Romain François

Consulting Datactive, ThinkR

Générer un seul nombre aléatoire

// un nombre tiré d'une N(0,1)
double x = R::rnorm( 0, 1 ) ;

// un nombre tiré d'une U(-2,2)
double y = R::runif( -2, 2 ) ;

// ...
Optimiser le code R avec Rcpp

Générer des vecteurs

Générateurs de nombres aléatoires dans l'espace de noms Rcpp::.

NumericVector x = rnorm(10, 0, 2) ;
// identique à ci-dessous
// grâce à using namespace Rcpp ;
// 
// NumericVector x = Rcpp::rnorm(10, 0, 2) ;

Autre option : versions scalaires via R::

// équivalent à
NumericVector x(10) ; 
for(int i=0; i<10; i++){
    x[i] = R::rnorm(0, 2) ;
}
Optimiser le code R avec Rcpp

Optimiser le code R avec Rcpp

Échantillonnage par rejet

// on génère n nombres
NumericVector x(n) ;

// remplir le vecteur dans une boucle
for( int i=0; i<n; i++){
    // continuer jusqu'à obtenir une valeur positive
    double d  ;
    do {
        d = ... ;
    } while( d < 0 ) ;

    x[i] = d ;    
}
Optimiser le code R avec Rcpp

Optimiser le code R avec Rcpp
  • Choisir la composante du mélange selon les poids
int component( NumericVector weights, double total_weight ){
    // retourner l'indice de la composante sélectionnée}
  • Générer le nombre à partir des paramètres de la composante choisie
NumericVector rmix( int n, NumericVector weights, NumericVector means, 
                    NumericVector sds ){
    NumericVector res(n) ;    
    for( int i=0; i<n; i++){
        // déterminer la composante à utiliser
        ...        
        // simuler avec la moyenne et l'écart type de la composante
        ...    }    
    return res ;
}
Optimiser le code R avec Rcpp

Passons à la pratique !

Optimiser le code R avec Rcpp

Preparing Video For Download...