[R-es] Generación de números aleatorios. Mixtura k-puntos

Carlos J. Gil Bellosta cgb en datanalytics.com
Mar Nov 19 19:50:14 CET 2013


Hola, ¿qué tal?

Aquí va un ejemplo vectorizado de cómo se podría muestrear una mezcla
de distribuciones (en este caso, tres normales con parámetros
distintos):

n <- 1000
probs <- c(10, 3, 10)    # no es necesario que sumen 1

M <- cbind(rnorm(n, 10, 2), rnorm(n, 3, 0.1), rnorm(n, -2, 0.1))     #
matriz n x 3 con muestras de las distribuciones

mi.muestra <- M[cbind(1:n, sample(1:3, n, prob = probs, replace = T))]
   # para cada fila, se selecciona una col. distinta según probs

hist(mi.muestra)

Un saludo,

Carlos J. Gil Bellosta
http://www.datanalytics.com



El día 19 de noviembre de 2013 15:25, Cesar Escalante
<c.escalante.c en gmail.com> escribió:
> Saludo cordial para cada uno.
>
> Les pido ayuda para generar números aleatorios de una mixtura k-puntos.
>
>
> Sabemos que la función de distribución F es una mixtura k-puntos si es de
> la forma F(x) = p_1 F_1(x) + p_2 F_2(x) + … + p_k F_k(x), donde F_j es una
> función de distribución de probabilidad, p_j > 0 y suma(p_j) = 1, para j =
> 1, 2, …, k.
>
>
>
> En mi caso particular F es la suavización de la función de probabilidad
> discreta {p_j} mediante kernel gamma. En el siguiente código F es la
> función Keg:
>
>
>
> # Distribución empírica suavizada
>
>
>
> # Valores que toma la variable y su probabilidad puntual
>
> y <- c(1, 1.3, 1.5, 2.1, 2.8)
>
> k <- length(y)
>
>
>
> # Frecuencia o número de veces de cada observación y_j
>
> s <- c(1, 1, 2, 3, 1)
>
> n <- sum(s) # Número de observaciones
>
>
>
> # Conjunto de riesgo. Número de observaciones mayores o iguales a cada valor
> # que toma la variable aleatoria (a cada y_j)
>
> r <- sort(cumsum(s), decreasing = TRUE)
>
>
>
> # Kernel gamma
>
>
>
> # Probabilidades discretas a suavizar
>
> p <- s/n
>
>
>
> # Parámetro de forma común de las distribuciones gamma
>
>
>
> mi2 <- sum(y**2*s)
> mi4 <- sum(y**4*s)
>
> alfa <- sqrt(n/(mi4/mi2 - 1))
>
>
>
> # Función de distribución suavizada. Mixtura k-puntos con kernel gamma
>
> Keg <- function(x){sum(sapply(1:k, function(j){p[j]*pgamma(x, shape = alfa,
>                                                            scale =
> y[j]/alfa)}))}
>
>
>
> Gracias desde ya por su amable y profesional ayuda. Busqué sin éxito una
> biblioteca R con tal función.
>
>
>
> Saludos.
>
>
>
> César Escalante C.
>
>         [[alternative HTML version deleted]]
>
>
> _______________________________________________
> R-help-es mailing list
> R-help-es en r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>



Más información sobre la lista de distribución R-help-es