Как управлять своим рандомайзером в R

1656603496 kak upravlyat svoim randomajzerom v r

от Мишель Джонс

Что происходит, когда вам нужен определенный тип рандомизации?

KcZO-yHw1nNM1n8Mnq6gGWolKXhE1UNd3d2z
200 случайных чисел посредством нормального распределения.

Обзор генерации случайных чисел в R

R имеет не менее 20 функций генератора случайных чисел. Каждый из них использует определенное распределение вероятностей для создания чисел. Все требуют указать нужное количество случайных чисел (на изображении выше показано 200). Все доступные в базе R – пакеты не нужны.

Общие распределения генератора случайных чисел:

  • нормальный (rnorm): среднее по умолчанию 0 и стандартное отклонение 1
  • биномиальный (rbinom): нет значений по умолчанию, укажите количество попыток и вероятность успеха для каждого испытания
  • uniform (runif): минимальное значение по умолчанию 0 и максимальное значение 1

Из трех вышеприведенных, только биномиальный генератор случайных чисел создает целые числа.

Зачем создавать случайные числа?

Проблемы, связанные со случайными числами, очень распространены — на Stack Exchange имеется около 50 000 вопросов по поводу случайных чисел.

Но зачем их использовать?

Случайные числа имеют множество практических применений. Они используются в моделировании Монте-Карло. Они используются в криптографии. Они использовались для создания содержимого CAPTCHA. Они используются в игровых автоматах. Они также использовались для более обычных задач, таких как создание случайного порядка сортировки для массива упорядоченных данных.

Проблемы со случайными числами

Часто задаваемые вопросы: «Мои ли случайные числа на самом деле случайны?» и «как я могу генерировать неповторяющиеся случайные числа?»

Примечание: последнее уменьшает случайность, поскольку совокупность возможных случайных чисел уменьшается на единицу всякий раз, когда извлекается случайное число. Этот метод уместен в таких ситуациях, как лотереи или бинго, когда каждый билет или мяч можно взять только один раз.

Эта проблема рождает другую проблему! Сгенерированная случайно выборка без чисел замены должна быть целыми числами. Никто не имеет билета 5,6932 или мяч для бинго 0,18967.

Практический пример задач со случайными числами

Возьмем пример, что у меня 20 сверстников. У меня есть четыре метода обучения, которые я хочу испытать. Я хочу испытать только один метод обучения для каждого учащегося. Легкая математика – мне нужно по пять учащихся в каждой группе.

Но как это сделать, чтобы каждый учащийся был назначен случайным образом?

И как я могу убедиться, что создал только целые числа?

И как мне всё это сделать, используя случайно сгенерированные числа без замены? Я не хочу, например, шесть учащихся в одной группе, а четверо в другой.

Сначала мне нужно создать фиктивные данные в R. Давайте создадим этот список имитационных студенток.

FemaleStudents <- data.frame(Names=c("Alice", "Betty", "Carol", "Denise", "Erica", "Frances", "Gina", "Helen", "Iris", "Julie", "Katherine",                           "Lisa", "Michelle", "Ngaire", "Olivia", "Penelope", "Rachel", "Sarah", "Trudy", "Uma"))

Теперь у нас есть одномерный набор данных о 20 наших студентах.

Мы знаем, что runif() функция не создает целых чисел. Почему бы нам не округлить случайные числа, чтобы получить только целые числа и не использовать эту функцию? Мы можем обратить случайное число в функцию округления.

Вопрос 1: почему я использую случайное равномерное распределение, а не другое, например случайное нормальное распределение?

У R имеется пять типов функций округления. Мы будем использовать round().

Чтобы мы получили одинаковые результаты, я установлю первоначальное значение для создания случайных чисел. Каждый раз, когда мы генерируем случайные числа, мы будем использовать одно и то же семя. Я выбрал 5 в качестве семян. Если вы не установите исходное значение или если вы установите значение, отличное от 5, ваши результаты будут отличаться от моих.

set.seed(5)FemaleStudents$Group <- round(runif(20, 1, 5))

Ну, казалось, это сработало. Каждого учащегося распределяем в группу от 1 до 5.

Давайте еще раз проверим наше распределение.

table(FemaleStudents$Group)
1 2 3 4 5 2 6 5 4 3

Блин. Только одна из пяти групп имеет правильное количество учащихся (группа 4). Почему это вышло?

Мы можем проверить фактически выводимые числа runif() без скругления, а исходный результат печатается на консоли. Здесь исходные данные печатаются, поскольку я не присвоил функцию объекту (например, переменной data.frame).

set.seed(5)runif(20,1,5)
[1] 1.800858 3.740874 4.667503 2.137598 1.418601 3.804230 3.111840 4.231741 4.826001 1.441812 2.093140 2.962053 2.273616 3.236691 2.050373[16] 1.807501 2.550103 4.551479 3.219690 4.368718

Как видим, округление вызвало нашу проблему. Но если бы мы не округлились, каждый ученик был бы отнесен к другой группе.

Что мы делаем?

образец()

sample() теперь одна из моих любимых функций в R. Давайте посмотрим, как она работает.

Произвольно распределить на группы одинакового размера (весит)

Как мы можем использовать его, чтобы случайно распределить наших 20 студентов в четыре группы одинакового размера?

Что произойдет, если мы попробуем sample() нормально?

set.seed(5)FemaleStudents$Sample <- sample(1:5, nrow(FemaleStudents), replace=TRUE)

Вопрос 2: какой результат вы получили, когда использовали table(FemaleStudents$Sample)?

Мы можем решить эту проблему, создав вектор номеров групп, а затем используя выборку без замены этого вектора. The rep Команда используется для создания диапазона повторяющихся значений. Вы можете использовать его для повторения каждого числа в серии, как я использовал здесь. Число 1 повторяется четырежды, затем число 2 повторяется четырежды и так далее. Вы также можете использовать его для повторения последовательности чисел, если вместо этого вы используете этот код: rep(1:5,4)

OurGroups <- rep(1:5, each=4)set.seed(5)FemaleStudents$Sample <- sample(OurGroups, nrow(FemaleStudents), replace=FALSE)

Мы использовали наш вектор чисел (OurGroups), чтобы распределить наших студентов в группы. Мы использовали выборку без замены (replace=FALSE) от OurGroups потому что нам нужно использовать каждое значение в этом векторе. Нам следует удалить каждое значение, когда мы его используем.

И мы получаем желаемый результат!

table(FemaleStudents$Sample)
1 2 3 4 5 4 4 4 4 4

Вопрос 3: почему я все-таки посадил зернышко?

Еще одно преимущество sample() заключается в том, что это не заботится о типе. Мы можем повторить распределение, используя вектор строк. Это может быть полезно, если вы не желаете постоянно обращаться к тому, что означает «1».

OurNamedGroups <- rep(c("Up", "Down", "Charmed", "Strange", "Top"), each=4)set.seed(5)FemaleStudents$Sample2 <- sample(OurNamedGroups, nrow(FemaleStudents), replace=FALSE)table(FemaleStudents$Sample2)
Charmed    Down Strange     Top      Up       4       4       4       4       4

Поскольку мы использовали то же первоначальное значение, мы видим, что было выполнено одинаковое распределение студентов, независимо от того, использовали ли мы для задания числовые или символьные данные.

table(FemaleStudents$Sample,FemaleStudents$Sample2)       Charmed Down Strange Top Up  1       0    0       0   0  4  2       0    4       0   0  0  3       4    0       0   0  0  4       0    0       4   0  0  5       0    0       0   4  0

Произвольное распределение, если размер группы не ограничен

Иногда мы хотим случайным образом распределить группы, но у нас нет вектора групп. Мы все еще распределяем каждую единицу (лицо, овцу, блок сыра) только одной группе и используем полностью случайное распределение.

Скажем, в нашей школе есть новая специальная комната библиотеки. Он был сконструирован так, чтобы быть звукоизоляционным, чтобы обеспечить студентам лучшую среду для обучения. Главный библиотекарь хотел бы узнать опыт студентов в этой комнате. Единственная проблема в том, что помещение ограничено по размеру. Главный библиотекарь считает, что около четырех учеников достаточно большая группа, чтобы предоставить первоначальный отзыв.

Опять же, мы можем использовать sample() выбрать наши студенческие группы. В этом случае у нас есть «студенты, которые проверят комнату» и «студенты, которые не будут тестировать комнату». Я буду называть их «Тест» и «Не тест». Эти этикетки были выбраны за то, что 1. короткие и 2. легко различаются.

Поскольку раньше мы делали выборку без замены, мы не указывали вероятности отнесения к группам — просто вытягивали присвоение из вектора. Теперь мы будем использовать подборку с заменой. Под заменой относится к группе, а не к учащимся.

Нам нужно сделать выборку с заменой, поскольку у нас только две группы («Тест», «Не тест») и 20 учеников. Если мы попытаемся произвести выборку без замены, наш код окажется ошибкой.

Наш код очень похож:

set.seed(5)FemaleStudents$Library <- sample(c("Test", "Not test"), nrow(FemaleStudents), replace=TRUE, prob=c(4/20,16/20))table(FemaleStudents$Library)
Not test     Test       15        5

Как видим, мы выделили пятерых учащихся для тестирования комнаты, а не четырех. Этот тип результата можно ожидать при работе с небольшими образцами. Однако у нас распределение студентов совершенно случайно. Каждый ученик имел одинаковую возможность быть предназначенным для проверки комнаты. То, были ли предыдущие студенты тестировщиками или нет, не повлияло на распределение следующего студента.

Давайте пройдемся по некоторым из этого кода.

Я создал новую переменную в data.frame чтобы собрать выделение (Library).

Вместо того чтобы иметь дело с числами для названий групп, я использовал строки, о которых я упоминал раньше. Поскольку я использовал струны, c() необходимо обратить названия групп (“Test”, “Not test”), а название каждой группы отделяется запятой.

Замена установлена TRUE.

Необходимо указать вероятность отнесения к любой группе. Это prob=c(4/20,16/20) часть sample() функция. Снова обратите внимание, как c() используется для удержания вероятностей. Интересно также то, что вероятности могут быть выражены в виде дробей, а не десятичных.

Ура для образца()

я использую sample() все время для работы, которую я выполняю. Возможность использовать строки, а также ограничивать числовой выход целыми числами (и определять нужный диапазон целых чисел) предоставляет мне больше контроля, чем попытка использовать одну из функций случайных чисел.

Ответы

Ответ 1: Я использовал случайное равномерное распределение, поскольку хотел, чтобы каждое значение было одинаково вероятным.

Ответ 2: Я получил такой выход:

1 2 3 4 5 2 7 4 2 5

Ответ 3: Если мы не установим исходное значение или используем другое, распределение отдельных учащихся будет другим. Например, когда исходный код равен 5, Алиса распределяется в группу 2. Если начальная часть равна 7, Алиса выделяется в группу 5. Репликация важна, когда код нужно повторно запустить (например, во время тестирования).

Добавить комментарий

Ваш адрес email не будет опубликован.