【问题标题】:Simulate from an (arbitrary) continuous probability distribution [duplicate]从(任意)连续概率分布模拟[重复]
【发布时间】:2014-06-27 13:37:43
【问题描述】:

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

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

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

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

【问题讨论】:

  • 谷歌建议this
  • 谢谢,这个问题和我的确实一样。
  • thisthis,和this
  • 其实你的问题和@joran 的评论中的谷歌参考一样。您在问 R 中是否有一个包来执行此操作。 2009 年,当这个问题被提出和回答时,没有包。但现在有(见下面我的回复)。 IMO 这是一个完美的例子,说明为什么将问题禁止为“重复”是一种非常可怕的做法(尽管没有人建议你的问题)。
  • @jlhoward ,好点子,虽然后来我们进入“关闭,因为要求推荐一个包”的情况......(我并不完全清楚这个关闭标准是否真的适用于[r] 与其他标签一样...)

标签: r random distribution


【解决方案1】:

这是一种使用 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")

您当然也可以使用 cmets 中任何一个链接中描述的方法在 base R 中执行此操作。

【讨论】:

    【解决方案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")
    

    【讨论】:

    • 谢谢,我展示的 p(x) 的特殊形式只是一个例子。
    猜你喜欢
    • 2015-05-19
    • 2010-09-28
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    相关资源
    最近更新 更多