从自定义分发生成随机数

时间:2016-12-26 00:21:00

标签: r random distribution

我正在尝试从自定义发布中生成随机数,我已经发现了这个问题: Simulate from an (arbitrary) continuous probability distribution 但不幸的是,它没有帮助我,因为方法建议需要一个分配函数的公式。我的分布是多个均匀分布的组合,基本上分布函数看起来像直方图。一个例子是:

f(x) = { 
    0     for  x < 1
    0.5   for  1 <= x < 2
    0.25  for  2 <= x < 4
    0     for  4 <= x
}

2 个答案:

答案 0 :(得分:5)

你只需要逆CDF方法:

samplef <- function (n) {
  x <- runif(n)
  ifelse(x < 0.5, 2 * x + 1, 4 * x)
  }

自己计算CDF以验证:

F(x) = 0                 x < 1
       0.5 * x - 0.5     1 < x < 2
       0.25 * x          2 < x < 4
       1                 x > 4

所以它的逆是:

invF(x) = 2 * x + 1      0 < x < 0.5
          4 * x          0.5 < x < 1

答案 1 :(得分:1)

您可以将discrete distributions采样的各种有效方法与连续统一结合起来。

即,从变量的整数部分Y = [X]进行模拟,其具有离散分布,概率等于每个区间中的概率(例如通过表方法 - 也就是别名方法),然后简单地添加一个随机的统一[0,1 $,X = Y + U。

在你的例子中,你有Y取值1,2,3,概率为0.5,0.25和0.25(相当于以相等概率抽样1,1,2,3)然后加一个随机均匀。 / p>

如果你的“直方图”非常大,这可能是一种非常快速的方法。

在R中你可以通过

做一个简单的(如果不是特别有效)版本
'class SetProp(height,width){
    this.height = height;
    this.width = width;

}
 SetProp.prototype.getHeight=function(){
       return this.height;
  }
  SetProp.prototype.getWidth=function(){
       return this.width;
  }'

sample(c(1,1,2,3))+runif(1)

更一般地说,您可以使用sample(c(1,1,2,3),n,replace=TRUE)+runif(n) 中的概率权重参数。

如果你需要比这更快的速度(对于某些应用,尤其是大直方图和非常大的样本量),你可以使用链接中提到的方法和编程来加速离散部分低级语言中该功能的主力部分(比方说C)。

那就是说,即使只使用上面的代码,有一个相当“更大”的直方图 - 几十到几百个 - 这种方法似乎 - 甚至在我相当不起眼的笔记本电脑上 - 能够在井中生成一百万个随机值在一秒钟之内,所以对于许多应用来说,这将是好的。