Le CDF est facilement inversible. Une formule pour l'inversion conduit à ce qui doit être l'une des solutions les plus simples et les plus rapides possibles.
Commençons par observer que la probabilité du résultat , , est proportionnelle à . Ainsi, si nous générons une valeur uniforme comprise entre et = , il suffit de trouver le plus grand pour lequelk0 ≤ k ≤ ne- b kq0qmax=∑nk = 0e- b k( 1 -e- b ( n + 1 )) / ( 1 -e- b)k
q≥∑i = 0ke- b i=1 -e- ( k + 1 ) b1 -e- b.
L'algèbre simple donne la solution
k = - plafond (Journal( 1 - q( 1 -e- b) )b) .
Voici une R
implémentation construite comme tous les autres générateurs de nombres aléatoires: son premier argument spécifie le nombre de valeurs iid à générer et le reste des arguments nomme les paramètres ( as et as ):bb
nn.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))
}
À titre d'exemple de son utilisation, générons un million de variations aléatoires selon cette distribution:
b <- 0.001
n.max <- 3500
n.sim <- 10^6
set.seed(17)
system.time(sim <- rgeom.truncated(n.sim, b,n.max))
( seconde était nécessaire.)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)
( été ajouté à chaque valeur afin de créer un meilleur histogramme: la procédure de a une idiosyncrasie (= bug) dans laquelle la première barre est trop haute lorsque le point d'extrémité gauche est réglé à zéro.) La courbe rouge est la distribution de référence que cette simulation tente de reproduire. Évaluons la qualité de l'ajustement avec un test du chi carré:1R
hist
observed <- table(sim)
expected <- n.sim * pmf
chi.square <- (observed-expected)^2 / expected
pchisq(sum(chi.square), n.max, lower.tail=FALSE)
La valeur de p est de : un bel ajustement.0,84