¿Cómo puedo tomar muestras de una distribución de mezcla, y en particular una mezcla de distribuciones normales en R
? Por ejemplo, si quisiera probar de:
¿Cómo podría hacer eso?
r
random-generation
mixture
gung - Restablece a Monica
fuente
fuente
Respuestas:
Es una buena práctica evitar
for
buclesR
por razones de rendimiento. Una solución alternativa que explota el hechornorm
es vectorizada:fuente
samples <- rnorm(N)*sds[components]+mus[components]
. Me resulta más fácil de leer :)En general, una de las formas más fáciles de tomar muestras de una distribución de mezcla es la siguiente:
Pasos de algoritmo
1) Generar una variable aleatoriaU∼ Uniforme ( 0 , 1 )
3) Repita los pasos 1) y 2) hasta obtener la cantidad deseada de muestras de la distribución de la mezcla.
Ahora, usando el algoritmo general dado anteriormente, puede tomar muestras de su mezcla de ejemplo de normales usando el siguiente
R
código:Lo que genera:
y como control de cordura:
fuente
R
fuente
ifelse()
declaración, pero tendré que resolverlo más tarde. Reemplacé ese código con un bucle.R
truco de programación: también puede usar los comandosfindInterval()
ycumsum()
para simplificar el código y, lo que es más importante, facilitar la generalización a un número diferente de dimensiones. Por ejemplo, para un vector de entrada de mediasmu
) y variacioness
), y las probabilidades de la mezcla (p
), una función simple para generar n muestras a partir de esta mezcla seríamix <- function(n,mu,s,p) { ii <- findInterval(runif(n),cumsum(p))+1; x <- rnorm(n,mean=mu[ii],sd=sqrt(s[ii])); return(x); }
findInterval()
comando antes, sin embargo, me gusta escribir código aquí de la manera más simple posible porque quiero que sea una herramienta de comprensión en lugar de eficiencia.Ya tengo respuestas perfectas, así que para aquellos que quieren lograr esto en Python, aquí está mi solución:
fuente