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

时间:2019-01-18 16:18:51

标签: r conditional-statements sampling montecarlo

我正在处理一个家庭作业问题,一家谷物公司正在开展一项促销活动,每个包装盒中包含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"直到终止R

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

2 个答案:

答案 0 :(得分:0)

我认为此循环不会非常有效,因为您需要在每次随机数生成器通过循环时重新启动它。我建议,取一个具有所需概率的大量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"

答案 1 :(得分:0)

正如评论中提到的@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))

}