首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据条件丢弃样本

根据条件丢弃样本
EN

Stack Overflow用户
提问于 2016-01-12 00:47:35
回答 2查看 60关注 0票数 0

我希望在R中编写一个循环,在其中模拟泊松样本,但我希望丢弃不包含任何零的样本,并“再来一次”。我该怎么做呢?

例如:

代码语言:javascript
复制
X<-rep(999,100)
for(j in 1:100){
x<-rpois(100,4)
X[j]<-mean(x)
}

有没有办法保留length(X[X==0])==0的样本,然后重新选择一个样本,直到从包含零的样本中获得100个均值?

EN

回答 2

Stack Overflow用户

发布于 2016-01-12 01:05:59

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

代码语言:javascript
复制
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)
}

然后结束:

代码语言:javascript
复制
colMeans(draws)

另一种方法是使用replicate

代码语言:javascript
复制
colMeans(replicate(NN, {draws <- rpois(kk, lam)
while (!all(draws)) draws <- rpois(kk, lam)
draws}))

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

更明智的做法是简单地从一开始就消除所有糟糕的抽签(本质上是从截断分布中抽出)。

我们知道在给定的抽奖中得到0的概率是exp(-lambda),所以如果我们在(exp(-lambda), 1]上颠倒均匀抽奖,我们将被设置为:

代码语言:javascript
复制
colMeans(matrix(qpois(runif(kk * NN, min = exp(-lam)), lam), ncol = NN))

与之竞争的还有使用data.table

代码语言:javascript
复制
library(data.table)
grps <- rep(1:NN, each = kk)
data.table(qpois(runif(kk * NN, min = exp(-lam)), lam))[ , mean(V1), grps]
票数 2
EN

Stack Overflow用户

发布于 2016-01-13 02:50:54

我只想说,我已经意识到,如果我编辑Micheal的代码:

代码语言:javascript
复制
replicate(NN, {draws <- rpois(kk, lam)
while (all(draws)) draws <- rpois(kk, lam)
draws})

它会做我想做的事。感谢所有回复的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34726834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档