Как извлечь из образца, пока не будет получено хотя бы одно значение каждого образца, а затем остановить - PullRequest
0 голосов
/ 18 января 2019

Я работаю над проблемой домашнего задания, когда зерновая компания проводит акцию, в которой в каждую коробку входит 1 из 4 бесплатных игрушек.Цель состоит в том, чтобы собрать все 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 голосов
/ 19 января 2019

Как упомянуто в комментарии @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))

}
0 голосов
/ 18 января 2019

Я не думаю, что этот цикл будет очень эффективным, потому что вам нужно перезапускать генератор случайных чисел каждый раз, когда он проходит цикл.Вместо этого я бы предложил взять большую выборку 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...