En general, una de las formas más sencillas de tomar muestras de una distribución de mezcla es la siguiente:
Pasos del algoritmo
1) Generar una variable aleatoria $U\sim\text{Uniform}(0,1)$
2) Si $U\in\left[\sum_{i=1}^kp_{k},\sum_{i=1}^{k+1}p_{k+1}\right)$ intervalo, donde $p_{k}$ corresponden a la probabilidad del $k^{th}$ componente del modelo de mezcla, y luego generar a partir de la distribución del $k^{th}$ componente
3) Repita los pasos 1) y 2) hasta que tenga la cantidad deseada de muestras de la distribución de la mezcla
Ahora, utilizando el algoritmo general dado anteriormente, usted podría muestrear su ejemplo de mezcla de normales utilizando lo siguiente R
código:
#The number of samples from the mixture distribution
N = 100000
#Sample N random uniforms U
U =runif(N)
#Variable to store the samples from the mixture distribution
rand.samples = rep(NA,N)
#Sampling from the mixture
for(i in 1:N){
if(U[i]<.3){
rand.samples[i] = rnorm(1,0,1)
}else if(U[i]<.8){
rand.samples[i] = rnorm(1,10,1)
}else{
rand.samples[i] = rnorm(1,3,.1)
}
}
#Density plot of the random samples
plot(density(rand.samples),main="Density Estimate of the Mixture Model")
#Plotting the true density as a sanity check
x = seq(-20,20,.1)
truth = .3*dnorm(x,0,1) + .5*dnorm(x,10,1) + .2*dnorm(x,3,.1)
plot(density(rand.samples),main="Density Estimate of the Mixture Model",ylim=c(0,.2),lwd=2)
lines(x,truth,col="red",lwd=2)
legend("topleft",c("True Density","Estimated Density"),col=c("red","black"),lwd=2)
Que genera:
y como control de cordura: