CDF là không thể đảo ngược. Một công thức cho sự đảo ngược dẫn đến những gì phải là một trong những giải pháp đơn giản và phù hợp nhất có thể.
Bắt đầu bằng cách quan sát rằng xác suất của kết quả , , tỷ lệ thuận với . Do đó, nếu chúng ta tạo một giá trị đồng nhất trong khoảng từ đến = , chúng ta chỉ cần tìm ra lớn nhất màk0≤k≤ne−bkq0qmax=∑nk=0e−bk(1−e−b(n+1))/(1−e−b)k
q≥∑i=0ke−bi=1−e−(k+1)b1−e−b.
Đại số đơn giản cho giải pháp
k=−ceiling(log(1−q(1−e−b))b).
Đây là một R
triển khai được xây dựng giống như tất cả các trình tạo số ngẫu nhiên khác: đối số đầu tiên của nó chỉ định có bao nhiêu giá trị iid để tạo và phần còn lại của các đối số đặt tên cho các tham số ( as và 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))
}
Như một ví dụ về việc sử dụng nó, hãy tạo ra một triệu biến thể ngẫu nhiên theo phân phối này:
b <- 0.001
n.max <- 3500
n.sim <- 10^6
set.seed(17)
system.time(sim <- rgeom.truncated(n.sim, b,n.max))
(Cần giây.)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)
( đã được thêm vào mỗi giá trị để tạo biểu đồ tốt hơn: quy trình của id có idiosyncrasy (= bug) trong đó thanh đầu tiên quá cao khi điểm cuối bên trái được đặt ở mức 0.) Đường cong màu đỏ là phân phối tham chiếu mô phỏng này cố gắng tái tạo. Hãy đánh giá mức độ phù hợp của bài kiểm tra chi bình phương:1R
hist
observed <- table(sim)
expected <- n.sim * pmf
chi.square <- (observed-expected)^2 / expected
pchisq(sum(chi.square), n.max, lower.tail=FALSE)
Giá trị p là : phù hợp đẹp.0.84