Поиск…


Вступление

Язык R обычно используется для статистического анализа. Таким образом, он содержит надежный набор вариантов рандомизации. Для получения конкретной информации о выборке из распределений вероятности см. Документацию для функций распределения .

замечания

Пользователи, которые приходят с других языков программирования, могут быть смущены отсутствием функции rand эквивалентной тому, что они могли испытывать раньше. Генерация основного случайного числа выполняется с использованием семейства функций r* для каждого распределения (см. Ссылку выше). Случайные числа, нарисованные равномерно из диапазона, могут быть сгенерированы с использованием runif для «случайной однородности». Поскольку это также выглядит подозрительно, как «запустить if», часто бывает трудно найти новых пользователей R.

Случайные ничьи и перестановки

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

Обратите внимание, что в этом примере set.seed используется для обеспечения воспроизводимости кода примера. Однако sample будет работать без явного вызова set.seed .

Случайная перестановка

В простейшей форме sample создает случайную перестановку вектора целых чисел. Это может быть выполнено с помощью:

set.seed(1251)
sample(x = 10)

[1]  7  1  4  8  6  3 10  5  2  9

При отсутствии других аргументов sample возвращает случайную перестановку вектора от 1 до x . Это может быть полезно при попытке рандомизировать порядок строк в кадре данных. Это общая задача при создании таблиц рандомизации для испытаний или при выборе случайного подмножества строк для анализа.

library(datasets)
set.seed(1171)
iris_rand <- iris[sample(x = 1:nrow(iris)),]

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

> head(iris_rand)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
145          6.7         3.3          5.7         2.5  virginica
5            5.0         3.6          1.4         0.2     setosa
85           5.4         3.0          4.5         1.5 versicolor
137          6.3         3.4          5.6         2.4  virginica
128          6.1         3.0          4.9         1.8  virginica
105          6.5         3.0          5.8         2.2  virginica

Ничья без замены

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

set.seed(7043)
sample(x = LETTERS,size = 7)

[1] "S" "P" "J" "F" "Z" "G" "R"

Обратите внимание: если аргумент size совпадает с длиной аргумента x , вы создаете случайную перестановку. Также обратите внимание, что вы не можете указать размер, превышающий длину x при выполнении выборки без замены.

set.seed(7305)
sample(x = letters,size = 26)

[1] "x" "z" "y" "i" "k" "f" "d" "s" "g" "v" "j" "o" "e" "c" "m" "n" "h" "u" "a" "b" "l" "r" "w" "t" "q" "p"

sample(x = letters,size = 30)
Error in sample.int(length(x), size, replace, prob) : 
  cannot take a sample larger than the population when 'replace = FALSE'

Это подводит нас к рисованию с заменой.

Рисование с заменой

Чтобы сделать случайные ничьи из набора с заменой, вы используете аргумент replace для sample . По умолчанию replace FALSE . Установка его в значение TRUE означает, что каждый элемент набора, который вытягивает, может появляться более одного раза в конечном результате.

set.seed(5062)
sample(x = c("A","B","C","D"),size = 8,replace = TRUE)

[1] "D" "C" "D" "B" "A" "A" "A" "A"

Изменение вероятности рисования

По умолчанию, когда вы используете sample , он предполагает, что вероятность выбора каждого элемента одинакова. Рассмотрите это как основную проблему «урны». Приведенный ниже код эквивалентен вычерчиванию цветного мрамора из урны 20 раз, записывая цвет и затем помещая мрамор обратно в урну. Урна содержит один красный, один синий и один зеленый мрамор, что означает, что вероятность рисования каждого цвета составляет 1/3.

set.seed(6472)
sample(x = c("Red","Blue","Green"),
       size = 20,
       replace = TRUE)

Предположим, что вместо этого мы хотели выполнить ту же задачу, но наша урна содержит 2 красных мрамора, 1 синий мрамор и 1 зеленый мрамор. Один из вариантов - изменить аргумент, который мы отправляем на x чтобы добавить дополнительный Red . Однако лучший выбор - использовать аргумент prob для sample .

Аргумент prob принимает вектор с вероятностью рисования каждого элемента. В нашем примере выше вероятность рисования красного мрамора составит 1/2, а вероятность рисования синего или зеленого мрамора составит 1/4.

set.seed(28432)
sample(x = c("Red","Blue","Green"),
       size = 20,
       replace = TRUE,
       prob = c(0.50,0.25,0.25))

Контр-интуитивно аргумент, заданный для prob , не должен суммироваться до 1. R всегда будет преобразовывать данные аргументы в вероятности, равные 1. Например, рассмотрим наш приведенный выше пример из 2 красных, 1 синих и 1 зеленых. Вы можете добиться тех же результатов, что и наш предыдущий код, используя эти цифры:

set.seed(28432)
frac_prob_example <- sample(x = c("Red","Blue","Green"),
                            size = 200,
                            replace = TRUE,
                            prob = c(0.50,0.25,0.25))

set.seed(28432)
numeric_prob_example <- sample(x = c("Red","Blue","Green"),
                               size = 200,
                               replace = TRUE,
                               prob = c(2,1,1))

> identical(frac_prob_example,numeric_prob_example)
[1] TRUE

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

Вы также можете использовать prob если для параметра replace установлено значение FALSE . В этой ситуации после того, как каждый элемент нарисован, пропорции prob значений для остальных элементов дают вероятность для следующего розыгрыша. В этой ситуации у вас должно быть достаточно ненулевых вероятностей для достижения size образца, который вы рисуете. Например:

set.seed(21741)
sample(x = c("Red","Blue","Green"),
       size = 2,
       replace = FALSE,
       prob = c(0.8,0.19,0.01))

В этом примере красный рисуется в первом розыгрыше (в качестве первого элемента). 80% шансов на то, что Red будет нарисован, 19% -ный шанс нанесения Синего и 1% шанс нарисовать Грина.

Для следующего розыгрыша, Красный больше не находится в урне. Общее количество вероятностей среди остальных предметов составляет 20% (19% для синего и 1% для зеленого). Для этой ничьей вероятность 95% будет синей (19/20) и 5% -ной вероятностью будет зеленый (1/20).

Установка семян

Функция set.seed используется для установки случайного семени для всех функций рандомизации. Если вы используете R для создания рандомизации, которую хотите воспроизвести, сначала следует использовать set.seed .

set.seed(1643)
samp1 <- sample(x = 1:5,size = 200,replace = TRUE)

set.seed(1643)
samp2 <- sample(x = 1:5,size = 200,replace = TRUE)

> identical(x = samp1,y = samp2)
[1] TRUE

Обратите внимание, что для параллельной обработки требуется специальная обработка случайного семени, описанная в другом месте.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow