从分布函数条件随机生成变量

Conditioned random generating variables from a distribution function

我的问题与我之前的问题有关 现在我想使用逆采样从分布函数生成随机变量,但采样应该是有条件的。 例如,如果我的 cdf 的倒数是:

invcdf <- function(y) a2 * log(a1/y - 1) + a3

我使用逆采样生成 10 个 rv 如下:

invcdf(runif(10))

现在,问题是我希望生成的值大于或小于某个值。 我应该如何在随机生成器中引入这个条件?

当我使用它获得大于 500 的值时:

invcdf(runif(10,500,1e6))

我收到此错误消息: 警告信息: 在 log((a0/y) - 1) 中:产生了 NaNs

我已经尝试重复该过程,直到值满足我的限制,但效率不高!

 repeat{
   x=invcdf(runif(1))
     if(x>100){
     break
}

您得到 NaN 的原因是 R 试图取负数的对数。您希望对数项是 log((a1/y)-1) 还是 log(a1/(y-1))?您目前以第一种方式编写函数,当您获得非常高的 y 值时,a1/y 项趋近于零(它趋近于零的速度取决于 a1 的值)。因此,减去 1 会在 log 函数中得到一个负数。因此,如果该术语是按照您的书写方式 (log(a1/y-1)) 计算的,您将无法计算出高于 y.

的某些值

简单的修复就是

invcdf <- function(y){
    a2 * log(a1/(y-1)) + a3
}

正如@spf614 指出的那样,您最好像

这样检查您的函数
invcdf <- function(y) {
    if (a1 > y) {
        return( a2 * log(a1/y - 1) + a3 )
    }
    NaN
}

然后它适用于所有参数

抽样

low <- ...
r <- invcdf(runif(low, a1, 1e6))

更新

检查输出中的 NaN

nof_nans <- sum(is.nan(r))
if (nof_nans > 0) {
    ....