使用反向采样从分布函数生成随机变量

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

例如,密度函数是:

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函数的反函数,在这种情况下可以用简单的算术完成:

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))

在这里输入图像描述

链接地址: http://www.djcxy.com/p/90083.html

上一篇: Generate random variables from a distribution function using inverse sampling

下一篇: Make longest flex item set the width for the column