我希望在R中编写一个循环,在其中模拟泊松样本,但我希望丢弃不包含任何零的样本,并且"让另一个变为"。我怎么能这样做?。
例如:
X<-rep(999,100)
for(j in 1:100){
x<-rpois(100,4)
X[j]<-mean(x)
}
有什么方法可以保存length(X[X==0])==0
的样品,然后重新选择样品,并继续直到获得含有零的样品的100个均值?
答案 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})
它会按我的意愿行事。感谢所有回答的人。