使用逆采样从分布函数生成随机变量
Generate random variables from a distribution function using inverse sampling
我有一个特定的密度函数,我想生成已知密度函数表达式的随机变量。
例如密度函数为:
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))
我有一个特定的密度函数,我想生成已知密度函数表达式的随机变量。
例如密度函数为:
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))