根据条件丢弃样品

时间:2016-01-11 16:47:35

标签: r loops sampling

我希望在R中编写一个循环,在其中模拟泊松样本,但我希望丢弃不包含任何零的样本,并且"让另一个变为"。我怎么能这样做?。

例如:

X<-rep(999,100)
for(j in 1:100){
x<-rpois(100,4)
X[j]<-mean(x)
}

有什么方法可以保存length(X[X==0])==0的样品,然后重新选择样品,并继续直到获得含有零的样品的100个均值?

2 个答案:

答案 0 :(得分:2)

正如@Frank建议的那样,while循环是您最好的方法,但我不认为if是最好的方法。

NN <- 100
kk <- 100
lam <- 4

draws <- matrix(rpois(kk * NN, lam), ncol = NN)

while (!all(idx <- apply(draws, 2, all))){
  draws[ , nidx] <- matrix(rpois(sum(nidx <- !idx) * NN, lam), ncol = NN)
}

然后完成:

colMeans(draws)

另一种方法是使用replicate

colMeans(replicate(NN, {draws <- rpois(kk, lam)
while (!all(draws)) draws <- rpois(kk, lam)
draws}))

我的快速基准测试表明后者实际上更快。

更精明的是从一开始就简单地消除所有糟糕的抽奖(基本上是从截断的分布中抽取)。

我们知道在给定抽奖中获得0的概率为exp(-lambda),因此如果我们在(exp(-lambda), 1]上反转统一抽奖,我们将设置:

colMeans(matrix(qpois(runif(kk * NN, min = exp(-lam)), lam), ncol = NN))

同样具有竞争力的是使用data.table

library(data.table)
grps <- rep(1:NN, each = kk)
data.table(qpois(runif(kk * NN, min = exp(-lam)), lam))[ , mean(V1), grps]

答案 1 :(得分:0)

只是说我已经意识到如果我将Micheal的代码编辑为:

replicate(NN, {draws <- rpois(kk, lam)
while (all(draws)) draws <- rpois(kk, lam)
draws})

它会按我的意愿行事。感谢所有回答的人。