эффективная выборка из усеченного гамма-распределения в R

Поискав по форуму, подобных вопросов не нашел. Если я пропустил это, пожалуйста, дайте мне знать. Я был бы очень признателен.

Мне нужно сгенерировать N (может быть 10000 или более) точек выборки из гамма-распределения с заданными параметрами формы и масштаба и нижней/верхней границей в R.

Я знаю, как это сделать с помощью цикла for, но это неэффективно.

 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. 
 }

Это неэффективно.

Любые более эффективные решения будут оценены.


person user3440244    schedule 18.04.2014    source источник
comment
Используйте rtrunc(...) в пакете truncdist. См. этот ответ.   -  person jlhoward    schedule 18.04.2014


Ответы (1)


См. раздел Программы R для усеченных дистрибутивов, авторы Саралис Надараджа и Сэмюэл Котц.

Используя их код на страница 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)
}

Теперь v <- rtrunc(10000, "gamma", lb, ub, shape=shape, scale=scale) должен выполнить эту работу.

person user1197460    schedule 18.04.2014
comment
Зачем вам это делать, когда есть доступный пакет? - person jlhoward; 18.04.2014
comment
Хороший вопрос, я не знал о его существовании, так как искал только CRAN Вероятность Представление задач распространения. truncdist написан теми же авторами, думаю, что неудивительно... - person user1197460; 25.04.2014