我尝试比较多达数千个估计的beta分布。每个beta分布由两个形状参数alpha和beta来描述。现在,我从每个分布中抽取10万个样本。最终结果是要得到每个样本抽取中概率最高的分布顺序。我的第一个方法是使用lapply生成一个N * NDRAWS数字值的矩阵,当N超过10000时会消耗太多内存(10000 * 100000 * 8字节)。因此,我决定采用顺序方法对每个单独的抽样进行排序,然后累加所有抽样的顺序,得到最终的顺序,如下面的示例所示:
set.seed(12345)
N=100
NDRAWS=100000
df <- data.frame(alpha=sample(1:20, N, replace=T), beta=sample(1:200, N, replace=T))
vec <- vector(mode = "integer", length = N )
for(i in 1:NDRAWS){
# order probabilities after a single draw for every theta
pos <- order(rbeta(N, shape1=df$alpha, shape2=df$beta) )
# sum up winning positions for every theta
vec[pos] <- vec[pos] + 1:N
}
# order thetas
ord <- order(-vec)
df[ord,]
这只消耗了N * 4字节的内存,因为没有巨大的矩阵,而是一个长度为N的单个向量。我的问题是,如何利用我的4个CPU核心,而不仅仅使用一个核心,通过使用snowfall(或任何其他多核包)来加速此操作?
# parallelize using snowfall pckg
library(snowfall)
sfInit( parallel=TRUE, cpus=4, type="SOCK")
sfLapply( 1:NDRAWS, function(x) ?????? )
sfStop()
非常感谢您的帮助!
vec[pos] <- vec[pos] + 1:N
。你试图将一个向量放入一个值中? - PascalVKooten