【问题标题】:Conditioned random generating variables from a distribution function来自分布函数的条件随机生成变量
【发布时间】:2016-02-03 16:43:22
【问题描述】:

我的问题与我之前的问题有关Generate random variables from a distribution function using inverse sampling 现在我想使用逆采样从分布函数生成随机变量,但采样应该是有条件的。 例如,如果我的 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) 中:产生了 NaN

我已经尝试重复该过程,直到获得满足我的约束的值,但它没有效率!

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

【问题讨论】:

  • 为什么这只是y的功能? a1a2a3 不应该也是输入吗?它们在哪里定义?
  • @Gregor a1、a2 和 a3 是我根据我的数据集估计的参数

标签: r conditional-statements sampling


【解决方案1】:

正如@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) {
    ....

【讨论】:

  • 这样做,函数有时会生成 NaN 值?
  • @Is.Fk 是的,它会的,这是正确的做法。函数应为任何参数产生合理的结果,并且可以检查该结果。在上层采样现在应该只用正确的值调用函数,但是可以并且应该检查函数的返回
【解决方案2】:

你得到 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
}

【讨论】:

  • 问题是我应该使用的函数正是 log((a1/y)-1) !在这种情况下,有没有办法使用我的逆 cdf 函数生成逆采样并将数据限制为大于一个值?
  • a1 术语的正常值是多少?该函数仅针对大于ya1 值定义。否则,它要么返回负无穷大(当a1 == y)或NaN(当a1 &lt; y)。所以你需要指定runif的参数,使得y的最大可能值小于a1
  • 在我的 cas a1 中是一个估计等于 1 的参数。但是我需要获得大于某个值的逆采样 invcdf(runif(10)) 的结果(至少等于 500)。在不改变功能的情况下,还有其他方法吗?