我希望在R中编写一个循环,在其中模拟泊松样本,但我希望丢弃不包含任何零的样本,并“再来一次”。我该怎么做呢?
例如:
X<-rep(999,100)
for(j in 1:100){
x<-rpois(100,4)
X[j]<-mean(x)
}有没有办法保留length(X[X==0])==0的样本,然后重新选择一个样本,直到从包含零的样本中获得100个均值?
发布于 2016-01-12 01:05:59
正如@Frank建议的那样,尽管我不认为if是最好的方法,但while循环是你最好的方法。
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]发布于 2016-01-13 02:50:54
我只想说,我已经意识到,如果我编辑Micheal的代码:
replicate(NN, {draws <- rpois(kk, lam)
while (all(draws)) draws <- rpois(kk, lam)
draws})它会做我想做的事。感谢所有回复的人。
https://stackoverflow.com/questions/34726834
复制相似问题