确定这种抽样算法? (R sample()函数)

时间:2013-03-17 21:50:31

标签: algorithm r probability sampling

我想更多地了解R中用于不等概率抽样的算法,但经过几个小时的搜索后,我无法对其进行任何改动。我认为它可能是一种计算机编程艺术算法,但我也无法证实这一点。 R的random.c中的特定函数称为ProbSampleNoReplace()

给出一个概率向量prob[]和一个所需样本大小n,其中包含所选项目的向量ans[]

For each element j in prob[] assign an index perm[j]
Sort the list in order of probability value, largest first

totalmass = 1
For (h=0, n1= n-1, h<nans, h++,n1-- )
    rt = totalmass * rand(in 0:1)
    mass = 0

    **sum the probabilities, largest first, until the sum is bigger than rt**
    for(j=0;j<n1;j++)
        mass += prob[j]
        if rt <= mass then break

    ans[h] = perm[j]
    **reduce size of totalmass to reflect removed item**
    totalmass -= prob[j]

    **reset the indices to be sequential**
    for(k=j, k<n1, k++)
        prob[k] = prob[k+1]
        perm[k] = perm[k+1]

1 个答案:

答案 0 :(得分:1)

sample函数支持不等概率参数。您的代码片段对于我们这些不读C的人的意图并不清楚。

> table( sample(1:4, 100, repl=TRUE, prob=4:1) )

 1  2  3  4 
46 23 24  7 

还有另一个SO Q&amp; A可能很有用(通过带有参数的SO搜索找到):

random.c ProbSampleNoReplace

Faster weighted sampling without replacement