2014-05-09 45 views
2

有關實線限定的歸一化的概率密度函數,例如模擬從一個(任意的)連續概率分佈

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

(這只是一個例子;該溶液應該適用於任何連續PDF我們可以定義)是否有R的包來模擬分佈?我知道R的許多發行版都內置了模擬器。

我能數值計算逆累積分佈函數以設定的位數的,將它們存儲在一個表中,並使用該表來從均勻映射個變量從所希望的分佈個變量。有沒有這樣的軟件包?

+2

谷歌建議[這](http://stackoverflow.com/q/1594121/324364)。 – joran

+0

謝謝,那個問題和我的確是一樣的。 – Fortranner

+1

見[此](http://stackoverflow.com/questions/20508400/generating-random-sample-from-the-quantiles-of-unknown-density-in-r/20509483#20509483)和[此](HTTP ://stackoverflow.com/questions/23258482/use-inverse-cdf-to-generate-random-variable-in-r/23259123#23259123)和[此](http://stackoverflow.com/questions/23223548 /如何-可以-I-生成-A-樣品從-A-數正態分佈與 - 帕累託收尾-R/23228354#23228354)。 – jlhoward

回答

5

這裏是一個辦法使用專爲此設計的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") 

你當然也可以做到這一點是使用在評論中的任意鏈路描述的方法基礎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") 

enter image description here

+0

謝謝,但我展示的p(x)的特殊形式僅僅是一個例子。 – Fortranner