CDFは容易に反転可能です。 反転の公式は、最も単純で最も適切な可能なソリューションの1つでなければならないものを導きます。
結果の確率、が比例することを確認することから始めます。したがって、と =間の均一な値を生成する場合、必要な最大のを見つけるだけですk0≤k≤ne−bkq0(1 - E - B (N + 1 ))/(1 - E - B)qmax=∑nk=0e−bk(1−e−b(n+1))/(1−e−b)k
q≥∑i=0ke−bi=1−e−(k+1)b1−e−b.
簡単な代数が解を与える
k=−ceiling(log(1−q(1−e−b))b).
R
他のすべての乱数ジェネレータと同じように構築された実装は次のとおりです。最初の引数は生成するiid値の数を指定し、残りの引数はパラメータ( as および 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))
}
その使用例として、この分布に従って100万個のランダム変量を生成してみましょう。
b <- 0.001
n.max <- 3500
n.sim <- 10^6
set.seed(17)
system.time(sim <- rgeom.truncated(n.sim, b,n.max))
(秒必要でした。)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)
(より良いヒストグラムを作成するためにが各値に追加されました:の手順には、左端がゼロに設定されている場合、最初のバーが高すぎる特異性(=バグ)があります。赤い曲線は参照分布ですこのシミュレーションは再現しようとしています。カイ二乗検定で適合度を評価しましょう。1R
hist
observed <- table(sim)
expected <- n.sim * pmf
chi.square <- (observed-expected)^2 / expected
pchisq(sum(chi.square), n.max, lower.tail=FALSE)
p値はです。0.84