对于在实线上定义的归一化概率密度函数,例如
p(x) = (2/pi) * (1/(exp(x)+exp(-x))
(这只是一个例子;解决方案应该适用于我们可以定义的任何连续PDF)R中是否有包来模拟分布?我知道R的内置模拟器适用于许多发行版。
我可以在一组分位数上数值计算逆累积分布函数,将它们存储在一个表中,并使用该表从均匀变量映射到所需分布的变量。是否有包这样做?
答案 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")