如何从样本中抽取,直到获得每个样本值中的至少一个,然后停止

How to draw from sample until at least one of each sample value is obtained and then stop

我正在解决一个家庭作业问题,其中一家麦片公司正在 运行 进行促销,每个盒子中包含 4 个免费玩具中的 1 个。目标是通过一次购买一盒来收集所有 4 个玩具。

两种情况:

1.Each玩具同样有可能

2.The 玩具的选择概率为 0.10、0.25、0.25 和 0.40

我想设计一个函数,将每个玩具编号和每个玩具的选择概率作为输入,通过从玩具编号中抽样模拟购买一盒麦片,直到每个玩具至少获得一个,然后停止并报告如何买了很多箱子。

最终目标是在 Monte Carlo 模拟研究中使用此函数来了解消费者平均需要购买多少箱子才能收集所有玩具,以及需要购买的消费者比例至少买14盒来收集所有的玩具。

我尝试创建一个 loop (while, repeat) 样本,直到向量包含所有玩具值,但循环具有无限 运行。我怀疑我正在喂循环的条件有问题。

box_buyer <- function (purchase_options, probabilities) {

  boxes <- numeric()

  while (!purchase_options %in% boxes) {

    append(boxes, sample(purchase_options, 1, probabilities, replace = TRUE))

  }

  return(length(boxes))

}

box_buyer(c(1, 2, 3, 4), c(1/4, 1/4, 1/4, 1/4))

我期待 return 购买的盒子数量的功能。目前我得到的是一个给出错误的无限循环:"the condition has length > 1 and only the first element will be used" 重复直到我终止 R.

如何让循环进行采样,直到每个玩具至少获得一个,然后停止并 return 购买的盒子数量?感谢任何帮助。

我认为这个循环的效率不会很高,因为每次执行循环时都需要重新启动随机数生成器。相反,我建议取一个具有所需概率的 c('A', 'B', 'C', 'D') 的大样本,然后查看您何时首次获得每个元素,并取其中的最大值。如果您碰巧没有绘制任何一种类型,但样本足够大而变得几乎不可能,这可能会失败。这是我的建议的实现。

set.seed(1)

probs <- c(.1, .25, .25, .40)
samp <- sample(c('A', 'B', 'C', 'D'), size = 1000, replace = TRUE, prob = probs)

max(c(min(which(samp == 'A')), min(which(samp == 'B')), min(which(samp == 'C')), min(which(samp == 'D'))))
[1] 6
samp[1:6] # we get the final missing item on draw 6
[1] "D" "D" "C" "A" "D" "B"

正如@qdread 在评论中提到的,您必须包含 "any"。此外,您还必须在每次循环迭代中重新分配框,否则它只会保持为数字空向量:

box_buyer <- function (purchase_options, probabilities) {

  boxes <- numeric()

  while (any(!purchase_options %in% boxes)) {

    boxes <- append(boxes, sample(purchase_options, 1, probabilities, replace = TRUE))

  }

  return(length(boxes))

}