如何从自定义分发中进行采样?

时间:2015-02-20 11:05:54

标签: r

我有分发版的pdf。该分布不是标准分布,R中没有函数可以从中进行采样。如何使用R?

从这个pdf中提取样本

1 个答案:

答案 0 :(得分:0)

这更像是一个统计问题,因为它需要抽样,但总的来说,你可以采用这种方法解决问题:

  1. 查找分布f,其pdf乘以任何给定的常量k时,总是大于相关分布的{pdmp,g

  2. 对于每个样本,请执行以下步骤:

  3. 从分发x中抽取随机数f

  4. 计算C = f(x)*k/g(x)。这应该等于或小于1.

  5. 从均匀分布U(0,1)中绘制一个随机数u。如果是C < u,请返回步骤3.否则请将x作为号码,并根据需要继续提取。

  6. 此过程称为拒绝抽样,通常用于不均匀的随机数生成器。

    正态分布和均匀分布是一些比较常见的分布,但你可以做其他分布。通常,您希望k*f(x)g(x)的形状非常接近,因此您不必拒绝大量样本。

    以下是一个示例实现:

    #n is sample size
    #g is pdf you want to sample from
    #rf is sampling function for f
    #df is density function for f
    #k is multiplicative constant
    #... is any necessary parameters for f
    function.sample <- function(n,g,rf,df,k,...){
        results = numeric(n)
        counter = 0
        while(counter < n){
            x = rf(1,...)
            x.pdf = df(x,...)
            if (runif(0,1) >= x.pdf * k/g(x)){
                results[counter+1] = x
                counter = counter + 1
            }
        }
    }
    

    还有其他方法可以进行随机抽样,但这通常是最简单的,并且适用于大多数函数(除非他们的PDF很难计算,但他们的CDF不是很好)。