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

7
我有一个具体的密度函数,想要根据密度函数的表达式生成随机变量。
例如,密度函数是:
df=function(x) { - ((-a1/a2)*exp((x-a3)/a2))/(1+exp((x-a3)/a2))^2 }

从这个表达式中,我想要生成1000个具有相同分布的随机元素。
我知道我应该使用反向抽样方法。为此,我使用我的概率密度函数的累积分布函数,计算如下:
cdf=function(x) { 1 - a1/(1+exp((x-a3)/a2))

这个想法是生成均匀分布的样本,然后使用我的累积分布函数进行映射得到一个反向映射结果。就像这样:
random.generator<-function(n) sapply(runif(n),cdf) 

然后使用所需的随机变量数量调用它以生成随机数。
random.generator(1000) 

这个方法正确吗?

1
你需要计算或估算 CDF 的 - RHertel
1个回答

4

第一步是取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的图表:

enter image description here

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

enter image description here


感谢您详细的回答,非常有帮助。 我看到您对我的CDF函数和您提出的反函数都进行了更改!我的CDF表达式中是否有任何错误? - Lydie
为了更好地解释,我最初定义了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 } - Lydie
@N.Fk 是的,最初你的累积分布函数在低输入时取值接近1,在高输入时取值接近0,所以我认为你不小心翻转了它——我只是对你之前的表达式进行了一次减法。 - josliber
如果我想在生成的数字中设置一些条件,你有任何想法如何实现吗? 我的意思是,例如我希望生成的值大于或等于100,这可能吗? 我已经尝试重复该过程,直到获得满足我的约束条件的值,但效率不高! - Lydie
@Is.Fk,因为这似乎是一个不同的问题,我可以建议您使用“提问”按钮单独提出它吗?这样整个社区就可以共同努力回答它。 - josliber

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接