user3440244
user3440244

Reputation: 371

efficient sampling from trucnated gamma distribution in R

After searching in the forum, I did not find similar questions. If I missed it, please let me know. I would really appreciate.

I need to generate N (can be 10000 or more) sample points from gamma distribution wth given shape and scale parameters and lower/upper bound in R.

I know how to do it by "for loop" but, it is not efficient.

 library(distr)
 get_sample_gamma(shape, scale, lb, ub)
 {
    v <- rgamma(n = 10000, shape, scale)
    # check the elements of v to be located [lb, ub]
    # if not in the range, count the number of points in the range as M
    # generate the remaining N - M points until all N points are got. 
 }

This is not efficient.

Any more efficient solutions would be apprecaited.

Upvotes: 0

Views: 2159

Answers (1)

user1197460
user1197460

Reputation: 108

See R Programs for Truncated Distributions by Saralees Nadarajah and Samuel Kotz.

Using their code on page 4:

qtrunc <- function(p, spec, a = -Inf, b = Inf, ...) {
    tt <- p
    G <- get(paste("p", spec, sep = ""), mode = "function")
    Gin <- get(paste("q", spec, sep = ""), mode = "function")
    tt <- Gin(G(a, ...) + p*(G(b, ...) - G(a, ...)), ...)
    return(tt)
}
rtrunc <- function(n, spec, a = -Inf, b = Inf, ...) {
    x <- u <- runif(n, min = 0, max = 1)
    x <- qtrunc(u, spec, a = a, b = b,...)
    return(x)
}

Now v <- rtrunc(10000, "gamma", lb, ub, shape=shape, scale=scale) should do the job.

Upvotes: 2

Related Questions