Campionamento da una miscela di distribuzioni (I)
Una distribuzione di miscela è una distribuzione la cui densità è una combinazione lineare di densità di distribuzioni normali (componenti). Ogni componente ha un peso (la probabilità di essere scelto), una media e una deviazione standard (come qualsiasi altra distribuzione normale).
Costruirai l’algoritmo in due esercizi. Qui sceglierai il componente da cui campionare completando la definizione di choose_component().
Questo esercizio fa parte del corso
Ottimizzare il codice R con Rcpp
Istruzioni dell'esercizio
- Genera un numero casuale uniforme da
0atotal_weightusando la funzionerunif()nello spazio dei nomi diR. - All’interno del ciclo while, diminuisci il valore di
xdell’elementoj-esimo diweights.
Esercizio pratico interattivo
Prova a risolvere questo esercizio completando il codice di esempio.
#include
using namespace Rcpp;
// [[Rcpp::export]]
int choose_component(NumericVector weights, double total_weight) {
// Generate a uniform random number from 0 to total_weight
double x = ___::___(0, ___);
// Remove the jth weight from x until x is small enough
int j = 0;
while(x >= weights[j]) {
// Subtract jth element of weights from x
___;
j++;
}
return j;
}
/*** R
weights <- c(0.3, 0.7)
# Randomly choose a component 5 times
replicate(5, choose_component(weights, sum(weights)))
*/