Eșantionare dintr-un amestec de distribuții (I)
O distribuție mixtă este o distribuție a cărei densitate este o combinație liniară de densități ale distribuției normale (componente). Fiecare componentă are o pondere (probabilitatea de a fi aleasă), precum și o medie și o deviație standard (ca orice altă distribuție normală).
Vei construi algoritmul în două exerciții. Aici vei alege componenta din care se face eșantionarea, completând definiția funcției choose_component().
Acest exercițiu face parte din cursul
Optimizarea codului R cu Rcpp
Instrucțiuni pentru exercițiu
- Generează un număr aleatoriu uniform de la
0latotal_weightfolosind funcțiarunif()din namespace-ulR. - În interiorul buclei while, scade din valoarea lui
xalj-lea element al vectoruluiweights.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
#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)))
*/