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 >