从(任意)连续概率分布模拟

时间:2014-05-09 17:45:49

标签: r random distribution

对于在实线上定义的归一化概率密度函数,例如

p(x) = (2/pi) * (1/(exp(x)+exp(-x))

(这只是一个例子;解决方案应该适用于我们可以定义的任何连续PDF)R中是否有包来模拟分布?我知道R的内置模拟器适用于许多发行版。

我可以在一组分位数上数值计算逆累积分布函数,将它们存储在一个表中,并使用该表从均匀变量映射到所需分布的变量。是否有包这样做?

2 个答案:

答案 0 :(得分:6)

这是一种使用distr包的方法,它是为此而设计的。

library(distr)
p    <- function(x) (2/pi) * (1/(exp(x)+exp(-x)))  # probability density function
dist <-AbscontDistribution(d=p)  # signature for a dist with pdf ~ p
rdist <- r(dist)                 # function to create random variates from p

set.seed(1)                      # for reproduceable example
X <- rdist(1000)                 # sample from X ~ p
x <- seq(-10,10, .01)
hist(X, freq=F, breaks=50, xlim=c(-5,5))
lines(x,p(x),lty=2, col="red")

你当然也可以使用评论中任何一个链接中描述的方法来做到这一点。

答案 1 :(得分:2)

如果这是你正在处理的功能,你可以采取积分(或者,如果你像我这样的集成规则生锈,你可以使用像Wolfram Alpha这样的工具来do it for you )。

如果提供了此功能,您可以使用以下方式进行模拟:

draw.val <- function(numdraw) log(tan(pi*runif(numdraw)/2))

直方图确认我们正确抽样:

hist(draw.val(10000), breaks=100, probability=T)
x <- seq(-10, 10, .001)
lines(x, (2/pi) * (1/(exp(x)+exp(-x))), col="red")

enter image description here