【问题标题】:Generate random variables from a distribution function using inverse sampling使用逆采样从分布函数生成随机变量
【发布时间】:2016-05-10 23:22:44
【问题描述】:

我有一个特定的密度函数,我想生成知道密度函数表达式的随机变量。

例如密度函数为:

df=function(x) { - ((-a1/a2)*exp((x-a3)/a2))/(1+exp((x-a3)/a2))^2 }

根据这个表达式,我想生成 1000 个具有相同分布的随机元素。

我知道我应该使用反向采样方法。为此,我使用我的 PDF 的 CDF 函数,计算如下:

cdf=function(x) { 1 - a1/(1+exp((x-a3)/a2))

这个想法是生成均匀分布的样本,然后将它们与我的 CDF 函数进行映射以获得逆映射。像这样的:

random.generator<-function(n) sapply(runif(n),cdf) 

然后使用要生成的所需数量的随机变量调用它。

random.generator(1000) 

这种方法正确吗?

【问题讨论】:

  • 您需要计算或估计CDF的

标签: r random probability-density


【解决方案1】:

第一步是对你的 cdf 函数求逆,在这种情况下可以通过简单的算术来完成:

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

现在你想用标准均匀分布的随机变量调用逆 cdf 来采样:

set.seed(144)
a1 <- 1 ; a2 <- 2 ; a3 <- 3
invcdf(runif(10))
#  [1] -2.913663  4.761196  4.955712  3.007925  1.472119  4.138772 -3.568288
#  [8]  4.973643 -1.949684  6.061130

这是 10000 个模拟值的直方图:

hist(invcdf(runif(10000)))

这是pdf的情节:

x <- seq(-20, 20, by=.01)
plot(x, df(x))

【讨论】:

  • 感谢您的详细回答,非常有帮助。我看到您在我的 cdf 函数和您提出的逆函数中都进行了更改!我的 CDF 表达式是否有任何错误?
  • 解释更多,我最初定义的CDF函数是: cdf=function(x) { 1 - a1/(1+exp((x-a3)/a2)) 密度函数是由导数给出:df=function(x) { ((-a1/a2)*exp((x-a3)/a2))/(1+exp((x-a3)/a2))^2 }
  • @N.Fk 是的,最初你的 cdf 对于低输入值接近 1,对于高输入值接近 0,所以我认为你不小心翻转了它——我只是做了一个减去你以前的表达方式。
  • 如果我想在生成的数字中做一些条件,你知道怎么做吗?我的意思是我希望生成的值大于或等于 100?那可能吗 ?我已经尝试重复该过程,直到获得满足我的约束的值,但效率不高!
  • @Is.Fk 因为这听起来像是一个不同的问题,我可以建议您使用“”按钮单独询问吗?这样整个社区都可以努力回答它。
猜你喜欢
  • 2014-02-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
相关资源
最近更新 更多