使用Runif从pdf进行Monte Carlo模拟

时间:2019-02-11 15:01:20

标签: r montecarlo

我得到了X的pdf,其中x在0和1之间时,f(x)= 2x,否则f(x)= 0。在课堂上,我们学习了从均匀分布中采样并转换数据以求解y的问题,但是,我不确定如何在此处应用该方法,因为如果我从均匀分布中生成数据,那么大多数数据将在0到1之间。

我按错误的顺序执行这些步骤吗?有一个PDF导致大多数数据乘以2似乎很奇怪。

2 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。一种方法是拒绝采样https://en.wikipedia.org/wiki/Rejection_sampling。简单地说

  1. 在提案分配的x轴上采样一个点。
  2. 在此x位置绘制一条垂直线,直至提案分布的曲线。
  3. 沿着这条线从0到概率密度函数的最大值均匀采样。如果采样值大于此垂直线上的所需分布的值,请返回步骤1。

    n = 1e5
    x = runif(n)
    t = runif(n)
    hist(x [ifelse(2 * t <2 * x,T,F)])

答案 1 :(得分:1)

我将使用R的约定,将PDF的名称开头为d,将CDF的名称开头为p
这很简单。计算dmydist(x) = 2*x的反导数即可得到pmydist = sqrt(x)。关联的RNG是即时的。

dmydist <- function(x) {
  ifelse(x >= 0 & x <= 1, 2*x, 0)
}
pmydist <- function(y) {
  ifelse(x >= 0 & x <= 1, sqrt(y), 0)
}
rmydist <- function(n) pmydist(runif(n))

set.seed(1234)
x <- rmydist(10000)

hist(x, prob = TRUE)
lines(seq(0, 1, by = 0.01), dmydist(seq(0, 1, by = 0.01)))

enter image description here