首页 > 解决方案 > 如何从样本中提取,直到获得每个样本值中的至少一个然后停止

问题描述

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

两种情况

1.每个玩具都有同样的可能性

2.玩具的选择概率分别为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))

我期待一个返回购买的盒子数量的函数。目前我得到的是一个无限循环,它给出了错误:"the condition has length > 1 and only the first element will be used"repeated until I terminate R

我怎样才能让循环进行采样,直到获得每个玩具中的至少一个,然后停止并退回购买的盒子数量?任何帮助表示赞赏。

标签: rconditional-statementssamplingmontecarlo

解决方案


我不认为这个循环会非常有效,因为你需要重新启动随机数生成器每次它通过循环。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"

推荐阅读