首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >由(任意)连续概率分布模拟

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

Stack Overflow用户
提问于 2014-05-09 17:45:48
回答 2查看 7.2K关注 0票数 2

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

代码语言:javascript
运行
复制
p(x) = (2/pi) * (1/(exp(x)+exp(-x))

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-09 19:42:20

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

代码语言:javascript
运行
复制
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")

当然,您也可以使用注释中任何一个链接中描述的方法来实现这一点。

票数 7
EN

Stack Overflow用户

发布于 2014-05-09 18:24:40

如果这是您要处理的函数,您可以只使用积分(或者,如果您像我一样对集成规则生疏,您可以使用像Wolfram这样的工具来实现为你而做)。

在所提供的函数的情况下,您可以使用以下方法进行模拟:

代码语言:javascript
运行
复制
draw.val <- function(numdraw) log(tan(pi*runif(numdraw)/2))

直方图证实我们的抽样是正确的:

代码语言:javascript
运行
复制
hist(draw.val(10000), breaks=100, probability=T)
x <- seq(-10, 10, .001)
lines(x, (2/pi) * (1/(exp(x)+exp(-x))), col="red")

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23570952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档