从不同概率向量中采样的有效方法

luk*_*man 5 r sampling

我正在寻找一种更有效的方法来从整数列表1:n中抽样,多次,其中概率向量(也是长度n)每次都不同.对于n = 10的20次试验,我知道可以这样做:

probs <- matrix(runif(200), nrow = 20)
answers <- numeric(20)
for(i in 1:20) answers[i] <- sample(10,1,prob=probs[i,])
Run Code Online (Sandbox Code Playgroud)

但是,每次调用样本10次只是为了得到一个数字,所以它可能不是最快的方式.速度会有所帮助,因为代码会这么做很多次.

非常感谢!

卢克

编辑:非常感谢Roman,他对基准测试的想法帮助我找到了一个很好的解决方案.我现在把它转到了答案.

Rom*_*rik 2

只是为了好玩,我又尝试了两个版本。您进行这次抽样的规模是多少?我认为所有这些都非常快并且或多或少等效(我没有包括为您的解决方案创建问题)。很乐意看到其他人对此进行尝试。

library(rbenchmark)
benchmark(replications = 1000,
          luke = for(i in 1:20) answers[i] <- sample(10,1,prob=probs[i,]),
          roman = apply(probs, MARGIN = 1, FUN = function(x) sample(10, 1, prob = x)),
          roman2 = replicate(20, sample(10, 1, prob = runif(10))))

    test replications elapsed relative user.self sys.self user.child sys.child
1   luke         1000    0.41    1.000      0.42        0         NA        NA
2  roman         1000    0.47    1.146      0.46        0         NA        NA
3 roman2         1000    0.47    1.146      0.44        0         NA        NA
Run Code Online (Sandbox Code Playgroud)