Cesar Escalante
2013-Nov-19 14:25 UTC
[R-es] Generación de números aleatorios. Mixtura k-puntos
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]]
Carlos J. Gil Bellosta
2013-Nov-19 18:50 UTC
[R-es] Generación de números aleatorios. Mixtura k-puntos
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 >