Der CDF ist leicht invertierbar. Eine Formel für die Inversion führt zu einer der einfachsten und zweckmäßigsten möglichen Lösungen.
Beginnen Sie mit der Beobachtung, dass die Wahrscheinlichkeit des Ergebnisses , , proportional zu . Wenn wir also einen einheitlichen Wert zwischen und = müssen wir nur das größte für das0 ≤ k ≤ n e - b k q 0 q max = ∑ n k = 0 e - b kk0 ≤ 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.
Einfache Algebra gibt die Lösung
k=−ceiling(log(1−q(1−e−b))b).
Hier ist eine R
Implementierung, die wie alle anderen Zufallszahlengeneratoren aufgebaut ist: Das erste Argument gibt an, wie viele iid- Werte generiert werden sollen, und die restlichen Argumente benennen die Parameter ( as und as ):nbb
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))
}
Lassen Sie uns als Beispiel für seine Verwendung eine Million zufälliger Variablen gemäß dieser Verteilung generieren:
b <- 0.001
n.max <- 3500
n.sim <- 10^6
set.seed(17)
system.time(sim <- rgeom.truncated(n.sim, b,n.max))
( Sekunden wurden benötigt.)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)
( Zu jedem Wert wurde hinzugefügt, um ein besseres Histogramm zu erstellen: Die Prozedur weist eine Eigenart (= Fehler) auf, bei der der erste Balken zu hoch ist, wenn der linke Endpunkt auf Null gesetzt ist.) Die rote Kurve ist die Referenzverteilung dass diese Simulation versucht zu reproduzieren. Lassen Sie uns die Anpassungsgüte mit einem Chi-Quadrat-Test bewerten :1R
hist
observed <- table(sim)
expected <- n.sim * pmf
chi.square <- (observed-expected)^2 / expected
pchisq(sum(chi.square), n.max, lower.tail=FALSE)
Der p-Wert beträgt : eine schöne Passform.0.84