09 мая 2012

Воспроизводимость результатов при использовании генератора случайных чисел



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

В системе R реализован целый ряд алгоритмов, позволящих генерировать случайные числа (см. ?RNGkind; по умолчанию используется один из наиболее быстрых генераторов - т.н. "Вихрь Мерсенна" (Mersenne twister)). Очень важно понимать, что практически все эти алгоритмы детерминированы, и поэтому генерируемые с их помощью числа правильно называть "псевдослучайными".


Генератор псевдослучайных чисел (ГПСЧ) начинает свою работу с определенной точки в пространстве возможных чисел. Эта точка называется начальным числом (англ. seed). В R имеется возможность зафиксировать это число так, что при повторном использовании ГПСЧ будет генерироваться точно та же последовательность чисел, что и в первый раз. Это может оказаться полезным в случаях, когда исследователь (по тем или иным причам) желает иметь точную воспроизводимость результатов, получаемых с задействованием ГПСЧ.

В качестве примера создадим таблицу example с двумя столбцами. В первом столбце будут храниться коды уровней гипотетического фактора Factor (три уровня, A, B, и C). Для каждого из этих уровней сгенерируем (псевдо-)случайным образом по 300 нормально распределенных значений с разными средними и стандартными отклонениями:

example = data.frame(
    Factor = rep(c("A", "B", "C"), each = 300),
    Variable = c(rnorm(300, 5, 2),
                 rnorm(300, 4, 3),
                 rnorm(300, 2, 1))
    )
 
 
tapply(example$Variable, example$Factor, summary)
$A
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
-0.9135  3.5950  5.0190  4.8520  6.2250 10.4900 
 
$B
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 -4.407   2.194   4.226   4.028   5.962  13.750 
 
$C
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
 -0.517   1.365   1.997   1.975   2.582   4.458


Изобразим на одном графике кривые плотности вероятности для каждой из трех групп А, В, и С (для построения графика испозован ggplot2 - графический пакет для R):

library(ggplot2)
p <- ggplot(example, aes(x = Variable))
p <- p + geom_density(aes(fill = Factor), alpha = 1/2)




Если бы мы повторили создание таблицы example описанным выше способом еще несколько раз, мы получили бы очень похожие, но все-таки несколько различающиеся распределения для групп А, В и С. На следующем рисунке приведен пример для четырех таких таблиц, созданных при помощи ГПСЧ:


Для того, чтобы каждый раз при использовании ГПСЧ в R получать идентичные последовательности чисел, используется функция set.seed() (от set - задать, установить, и seed - начальное число). Как следует из названия, эта функция фиксирует число, служащее начальной точкой для запуска алгоритма генерации (псевдо-)случайных чисел. В качестве аргумента функции указывают любое целое число (не важно, какое именно). Так, при повторном выполнении следующего кода мы будем всегда получать одинаковые последовательности значений для групп А, В и С:

set.seed(1020)
example = data.frame(
    Factor = rep(c("A", "B", "C"), each = 300),
    Variable = c(rnorm(300, 5, 2),
                 rnorm(300, 4, 3),
                 rnorm(300, 2, 1))
    )

Повторив приведенный код четыре раза, мы получили бы четыре идентичные таблицы и, соответственно, четыре идентичных рисунка, изображающих распределения плотностей вероятности:




Комментариев нет :

Отправить комментарий