从R中的任意CDF生成随机数据?

时间:2018-01-05 00:11:14

标签: r random cdf

我有一个适用于点估计的任意CDF。我有许多这些点估计与相关的CDF,我需要模拟蒙特卡罗模拟的随机数据。

CDF我通过拟合表格中提供的任意点来生成。例如,分位数0.1是0.13 *点估计的乘积。分位数0.9是7.57 *点估计的乘积。它相当粗糙,基于一项大型研究,将这些模型与现实世界系统进行比较 - 现在请忽略它。

我使用样条拟合拟合CDF,如here所示。

如果我采用这个的衍生物,我会得到pdf(image)的形状。

我修改了函数" samplepdf"在此处找到Sampling from an Arbitrary Density,如下所示:

samplecdf <- function(n, cdf, spdf.lower = -Inf, spdf.upper=Inf) {
  my_fun <- match.fun(cdf)
  invcdf <- function(u) {
    subcdf <- function(t) my_fun(t) - u
    if (spdf.lower == -Inf) 
      spdf.lower <- endsign(subcdf, -1)
    if (spdf.upper == Inf) 
      spdf.upper <- endsign(subcdf)
    return(uniroot(subcdf, c(spdf.lower, spdf.upper))$root)
  }
 sapply(runif(n), invcdf)
}

这似乎工作正常 - 当我比较我从随机生成的数据估计的分位数时,它们非常接近初始值。然而,当我看到直方图时,在尾部发生了一些有趣的事情,看起来我的函数始终产生的值多于它应该根据pdf。这个函数在我的所有点估计中始终如一,即使我可以查看单个分位数并且它们看起来很接近,我可以看出整体蒙特卡罗模拟显示出比我预期的50%百分位更高的估计值。这是a plot of my histogram of the random samples

非常欢迎任何提示或建议。我认为最好的途径是适应CDF的指数分布,但我很难做到这一点。所有&#34;拟合&#34;假设您有需要安装的数据 - 这比那更随意。

0 个答案:

没有答案