R Language
Случайность
Поиск…
Вступление
Язык 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
Обратите внимание, что для параллельной обработки требуется специальная обработка случайного семени, описанная в другом месте.