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

R 从(任意)连续概率分布模拟,r,random,distribution,R,Random,Distribution,例如,对于实线上定义的归一化概率密度函数 p(x) = (2/pi) * (1/(exp(x)+exp(-x)) (这只是一个示例;解决方案应该适用于我们可以定义的任何连续PDF)R中是否有一个包可以从分发中进行模拟?我知道R的许多发行版的内置模拟器 我可以数值计算一组分位数的逆累积分布函数,将它们存储在一个表中,并使用该表从均匀变量映射到所需分布的变量。已经有这样的软件包了吗?如果这是您正在处理的函数,您可以只取积分(或者,如果您对像我这样的积分规则感到生疏,您可以使用Wolfram Alp

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

p(x) = (2/pi) * (1/(exp(x)+exp(-x))
(这只是一个示例;解决方案应该适用于我们可以定义的任何连续PDF)R中是否有一个包可以从分发中进行模拟?我知道R的许多发行版的内置模拟器


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

如果这是您正在处理的函数,您可以只取积分(或者,如果您对像我这样的积分规则感到生疏,您可以使用Wolfram Alpha这样的工具来计算积分)

对于提供的功能,您可以使用以下工具进行模拟:

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

draw.val这里有一种使用
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")
库(发行版)

p谷歌建议。谢谢,这个问题和我的问题确实是一样的。看和,和。事实上,你的问题和@joran评论中的谷歌参考不一样。您正在询问R中是否有一个包来执行此操作。2009年,当这个问题被提出并得到回答时,没有任何一揽子计划。但现在有了(见下面我的回答)。在我看来,这是一个完美的例子,说明了为什么将问题“重复”作为一种非常可怕的做法(尽管没有人针对你的问题提出这样的建议)。@jlhoward,说得好,尽管我们进入了“因为要求推荐一个包而结束”的局面。。。(我不完全清楚这个紧密标准是否真的应该像适用于其他标签一样适用于[r])谢谢,但我展示的p(x)的特殊形式只是一个例子。
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")