r - 如何从样本中提取,直到获得每个样本值中的至少一个然后停止
问题描述
我正在处理一个家庭作业问题,一家谷物公司正在进行促销活动,其中每个盒子中包含 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
。
我怎样才能让循环进行采样,直到获得每个玩具中的至少一个,然后停止并退回购买的盒子数量?任何帮助表示赞赏。
解决方案
我不认为这个循环会非常有效,因为你需要重新启动随机数生成器每次它通过循环。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"
推荐阅读
- node.js - 如何在传递函数中返回值 (Node.js)
- game-engine - 您可以使用 PascalABC.NET 保存文本文件吗?
- javascript - 以下语句的函数将存储在该函数的原型中的位置
- c# - 泛型类型参数是实现接口的类
- sql-server - 如何在 Group By 查询中显示子元素的数量 - Pivoted
- swift - WKWebView 是否需要 URL?
- biml - BIML:FilySystemTask 缺少用于操作创建目录的 UseDirectoryIfExists 属性
- javascript - 如何用多种语言翻译 jquery ui datepicker?
- c++ - 我应该将哪种有效负载类型发送到 webrtc::PayloadRouter 的构造函数?
- javascript - 这