Como señala Estudiante T Su código de simulación es erróneo. Lo que hace tu código es generar exactamente 150 muestras de la distribución normal estándar y exactamente 150 muestras de la distribución uniforme estándar y luego barajarlas.
set.seed(12032345)
N <- 1e5
x <- c(runif(N/2, 0,1), rnorm(N/2, 0, 1))
y <- sample(x, N, replace = FALSE)
all.equal(sort(x), sort(y))
## [1] TRUE
por lo que el sample
paso hace nada pero cambiando el orden de las muestras. Así que las muestras generadas de esta manera serían "demasiado buenas para ser verdad" para una mezcla, ya que la proporción de mezcla no variaría.
Si quiere tomar muestras de la mezcla de las distribuciones normal estándar y uniforme estándar que aparecen con proporciones de mezcla iguales, también debe variar las proporciones de mezcla de la muestra, es decir, tomar muestras de cada una de las distribuciones con igual probabilidad
res <- numeric(N)
for (i in 1:N) {
if (runif(1) > 0.5)
res[i] <- runif(1)
else
res[i] <- rnorm(1)
}
Una forma más complicada es observar que si la proporción de la mezcla es $p$ y el tamaño de la muestra es $N$ entonces el número de valores extraídos de la distribución uniforme seguirá la distribución binomial
k <- rbinom(1, N, 0.5)
res2 <- sample(c(runif(k, 0,1), rnorm(N-k, 0, 1)))
En el ejemplo anterior sample
también es inútil, ya que sólo baraja los valores.
Véase también el muestreo de una mezcla de dos distribuciones Gamma hilo de rosca.