R 评估结果模拟数据

R 评估结果模拟数据,r,probability,sampling,statistical-sampling,R,Probability,Sampling,Statistical Sampling,我使用拒绝法模拟数据,X的密度函数由[0,1]中所有X的f(X)=C*e^(X)给出。我将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(

我使用拒绝法模拟数据,
X
的密度函数由[0,1]中所有X的
f(X)=C*e^(X)给出。我将
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)

但最终的情节有点古怪!因此,我正在寻找任何帮助来澄清我工作中的错误

这显示了整个曲线和直方图:

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)

更新

好的,下面是维基文章后面的代码


sampleRej这是正确的,但是您需要扩展y轴
f
on(0,1)从1变为e-它的左端出现在图表上。当然,这可能不是你想要策划的@但是为什么采样数据与曲线不匹配呢?正如你所看到的,当使用下面答案中的修改时,在循环中的
if
语句中,曲线和你应该相乘时除以
C
的Historogramare之间存在巨大差异?@AndrewGustar+1。你发现了,这就是问题所在,谢谢,或者我的代码有问题,我不知道是什么。这是base
plot
的正常行为。对
plot
的第一次调用定义了绘图的大小(即缩放级别)。首先,通过绘制具有更大范围值的曲线图,我们确保所有内容都符合要求。我理解这一部分,但我想知道为什么直方图和曲线a之间没有匹配,好吧。。对我来说,曲线看起来不像1的整数。是的,但是当你考虑C时,考虑到G(x)是什么?“亚当,你的代码不遵循拒绝采样规则——你的PDF没有被正确地归一化。
f(x) = exp(x)/(exp(1) - 1)
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)