对于定义在实线上的规范化概率密度函数,例如
p(x) = (2/pi) * (1/(exp(x)+exp(-x))
(这只是一个例子;解决方案应该适用于我们可以定义的任何连续PDF )R中是否有一个包可以从分布中模拟?我知道R的内置模拟器为许多发行版。
我可以在一组分位数中数值计算逆累积分布函数,将它们存储在一个表中,并使用该表从均匀变量映射到所需分布的变量。已经有这样的包裹了吗?
发布于 2014-05-09 19:42:20
下面是一种使用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")
当然,您也可以使用注释中任何一个链接中描述的方法来实现这一点。
发布于 2014-05-09 18:24:40
如果这是您要处理的函数,您可以只使用积分(或者,如果您像我一样对集成规则生疏,您可以使用像Wolfram这样的工具来实现为你而做)。
在所提供的函数的情况下,您可以使用以下方法进行模拟:
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")
https://stackoverflow.com/questions/23570952
复制相似问题