El CDF es fácilmente invertible. Una fórmula para la inversión conduce a lo que tiene que ser una de las soluciones más simples y convenientes posibles.
Comience observando que la probabilidad del resultado , , es proporcional a . Por lo tanto, si generamos un valor uniforme entre y = , solo necesitamos encontrar la más grande para la cualk0≤k≤ne−bkq0qmax=∑nk=0e−bk(1−e−b(n+1))/(1−e−b)k
q≥∑i = 0kmi- b i=1 -mi- ( k + 1 ) b1 -mi- b.
Álgebra simple da la solución
k = - techo (Iniciar sesión( 1 - q( 1 -mi- b) )si) .
Aquí hay una R
implementación construida como todos los otros generadores de números aleatorios: su primer argumento especifica cuántos valores de iid generar y el resto de los argumentos nombran los parámetros ( as y as ):sib
norten.max
rgeom.truncated <- function(n=1, b, n.max) {
a <- 1 - exp(-b)
q.max <- (1 - exp(-b*(n.max+1))) / a
q <- runif(n, 0, q.max)
return(-ceiling(log(1 - q*a) / b))
}
Como ejemplo de su uso, generemos un millón de variantes aleatorias de acuerdo con esta distribución:
b <- 0.001
n.max <- 3500
n.sim <- 10^6
set.seed(17)
system.time(sim <- rgeom.truncated(n.sim, b,n.max))
( Se necesitaron segundos).0,10
h <- hist(sim+1, probability=TRUE, breaks=50, xlab="Outcome+1")
pmf <- exp(-b * (0: n.max)); pmf <- pmf / sum(pmf)
lines(0:n.max, pmf, col="Red", lwd=2)
( Se agregó a cada valor para crear un mejor histograma: el procedimiento tiene una idiosincrasia (= error) en la que la primera barra es demasiado alta cuando el punto final izquierdo se establece en cero). La curva roja es la distribución de referencia que esta simulación intenta reproducir. Vamos a evaluar la bondad del ajuste con una prueba de chi-cuadrado:1R
hist
observed <- table(sim)
expected <- n.sim * pmf
chi.square <- (observed-expected)^2 / expected
pchisq(sum(chi.square), n.max, lower.tail=FALSE)
El valor p es : un ajuste hermoso.0,84