Search code examples
rconditional-statementssampling

Conditioned random generating variables from a distribution function


My question is related to my previous one Generate random variables from a distribution function using inverse sampling Now I want to generate random variables from a distribution function using inverse sampling but the sampling should be conditioned. For example, if the inverse of my cdf is :

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

I used inverse sampling to generate 10 rv as follows :

invcdf(runif(10))

Now, the problem is that I want the values generated greater or less than a value. How should I introduce this condition in random generator?

When I use this to have value greater than 500 :

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

I get this error message : Warning message: In log((a0/y) - 1) : NaNs produced

I already try to repeat the process until having values satsifying my constraints but it is not efficient!

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

Solution

  • As @spf614 noted, you'd better have checks in your function like

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

    Then it works for all arguments

    Sampling would be

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

    UPDATE

    checking for NaNs in output

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