我正在使用拒绝方法模拟数据,其中X
的密度函数由f(x)= C * e^(x) for all x in [0,1]
给出。我将g(x) = 1
和C
定义为f(x)
的最大值,它等于1/(e-1)
。
我使用以下代码来模拟数据:
rejection <- function(f, C, g, rg, n) {
naccepts <- 0
result.sample <- rep(NA, n)
while (naccepts < n) {
y <- rg(1)
u <- runif(1)
if ( u <= f(y) / (C*g(y)) ) {
naccepts <- naccepts + 1
result.sample[naccepts] = y
}
}
result.sample
}
f <- function(x) ifelse(x>=0 & x<=1, (exp(x)), 0)
g <- function(x) 1
rg <- runif
C <- 1/(exp(1) -1)
result <- rejection(f, C, g,rg, 1000)
然后,我使用histogram
将模拟数据与原始curve
的pdf
进行比较
hist(result,freq = FALSE)
curve(f, 0, 1, add=TRUE)
但是结果情节有点奇怪! the plot is here,所以我正在寻求任何帮助以弄清我的工作中有什么问题。
这显示了整个曲线和直方图:
curve(f, 0, 1)
hist(result,freq = FALSE, add=TRUE)
但是当然现在直方图在图中有点小...
您的最大值是错误的。对于范围为[0 ... 1]的exp(x),规范化的PDF为
f(x) = exp(x)/(exp(1) - 1)
因此f(x)的最大值为exp(1)/(exp(1)-1)
更新
确定,这是在Rejection sampling上的Wiki文章之后的代码>
sampleRej <- function(f, g, rg, M, n) { # rejection sampling following wiki naccepts <- 0 result <- rep(NA, n) while (naccepts < n) { y <- rg(1) u <- runif(1) if ( u <= f(y) / (M*g(y)) ) { naccepts <- naccepts + 1 result[naccepts] = y } } result } g <- function(x) { # Normalized uniform distribution PDF 1.0 } f <- function(x) { # normalized sampling PDF exp(x)/(exp(1.0) - 1.0) } rg <- function(n) { # function to sample from g, which is uniform runif(n) } M <- exp(1.0)/(exp(1.0) - 1.0) # f(x) maximum value q <- sampleRej(f, g, rg, M, 100000) # sample 100K points # and plot everything together curve(f, 0.0, 1.0) hist(q, freq=FALSE, add=TRUE)
并且它产生如下图,对我来说很好