Генерация случайных распределений
Выбирайте случайные значения из нормального, равномерного, биномиального распределений и распределения Пуассона
«Генерация случайных распределений» — бесплатный урок R Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Функции распределений в R
Для каждого распределения R предоставляет четыре функции: r (случайная величина), d (плотность), p (накопленная вероятность), q (квантиль). Функции r* генерируют случайные выборки.
# Pattern: r<dist>(n, param1, param2, ...)
# d<dist>(x, ...) -> density/probability
# p<dist>(q, ...) -> cumulative probability
# q<dist>(p, ...) -> quantile
# Example with normal distribution:
rnorm(5, mean = 0, sd = 1) # 5 random draws
dnorm(0, mean = 0, sd = 1) # density at x=0
pnorm(1.96, mean = 0, sd = 1) # P(X <= 1.96)
qnorm(0.975, mean = 0, sd = 1) # z-score for 97.5%
cat('Four functions: r, d, p, q for each distribution')rnorm(): нормальное распределение
rnorm(n, mean, sd) генерирует n выборочных значений из N(mean, sd²). По умолчанию используется стандартное нормальное распределение N(0,1). Нормальное распределение — рабочий инструмент статистики: центральная предельная теорема объясняет его повсеместное применение.
set.seed(42)
# Standard normal (mean=0, sd=1)
z_scores <- rnorm(1000)
mean(z_scores) # ~0
sd(z_scores) # ~1
# Custom normal (IQ scores: mean=100, sd=15)
set.seed(42)
iq_scores <- rnorm(100, mean = 100, sd = 15)
mean(iq_scores) # ~100
sd(iq_scores) # ~15
summary(iq_scores)
# About 68% within 1 sd
mean(abs(iq_scores - 100) < 15) # ~0.68runif(): равномерное распределение
runif(n, min, max) генерирует n выборочных значений, равномерно распределённых между min и max. Все значения в этом диапазоне равновероятны. По умолчанию runif(n) возвращает значения из [0, 1].
set.seed(7)
# Default: uniform on [0, 1]
u <- runif(5)
print(u) # values in (0, 1)
# Uniform on [a, b]
temps <- runif(100, min = -10, max = 40) # temperatures
mean(temps) # ~15 (midpoint)
range(temps) # should be within [-10, 40]
# Discrete simulation using floor()
dice_rolls <- floor(runif(10, min = 1, max = 7))
print(dice_rolls) # integers 1-6
table(floor(runif(600, 1, 7))) # roughly equal countsrbinom(): биномиальное распределение
rbinom(n, size, prob) моделирует n биномиальных экспериментов, каждый из которых состоит из size испытаний Бернулли с вероятностью успеха prob. Для получения испытаний Бернулли используйте size=1.
set.seed(123)
# 10 coin flips (prob=0.5), repeated 5 times
coin_flips <- rbinom(5, size = 10, prob = 0.5)
print(coin_flips) # number of heads each time
# Bernoulli: single flip (size=1)
flips <- rbinom(20, size = 1, prob = 0.5)
print(flips) # 0s and 1s
mean(flips) # ~0.5
# Biased coin (prob=0.7)
biased <- rbinom(1000, size = 1, prob = 0.7)
mean(biased) # ~0.7
# Many trials: normal approximation kicks in
hundred_flips <- rbinom(1000, size = 100, prob = 0.5)
mean(hundred_flips) # ~50rpois(): распределение Пуассона
rpois(n, lambda) генерирует n выборочных значений из распределения Пуассона с интенсивностью λ. Используется для моделирования данных о количестве событий за интервал: посещений сайта в минуту, дефектов на единицу продукции, звонков в час.
set.seed(5)
# Calls received per hour (average 3)
calls <- rpois(24, lambda = 3) # 24 hours
print(calls) # integers, mostly 1-6
mean(calls) # ~3 (expectation = lambda)
var(calls) # ~3 (variance = lambda for Poisson)
# Count the distribution
table(calls)
# Rare events (lambda=0.5)
rare_events <- rpois(100, lambda = 0.5)
table(rare_events) # mostly 0s and 1s
mean(rare_events) # ~0.5rexp(): экспоненциальное распределение
rexp(n, rate) генерирует n выборочных значений из экспоненциального распределения с указанной интенсивностью. Используется для моделирования времени между событиями (интервалов между событиями). Среднее значение = 1/rate. Свойство отсутствия памяти.
set.seed(42)
# Time between customer arrivals (rate=2 per minute)
# Mean wait time = 1/2 = 0.5 minutes
arrival_times <- rexp(100, rate = 2)
mean(arrival_times) # ~0.5
sd(arrival_times) # ~0.5 (mean = sd for exponential)
# Simulate a queue
cumulative_arrivals <- cumsum(rexp(10, rate = 3))
print(round(cumulative_arrivals, 3))
# Exponential CDF: P(X <= x) = 1 - exp(-rate*x)
pexp(0.5, rate = 2) # P(wait <= 0.5 min)
mean(arrival_times <= 0.5) # empirical estimatesample(): дискретная выборка
sample(x, size, replace) выбирает size элементов из вектора x. replace=FALSE (по умолчанию) означает выборку без возвращения; replace=TRUE допускает повторяющиеся значения.
set.seed(10)
# Sample without replacement (like drawing cards)
cards <- 1:52
hand <- sample(cards, size = 5, replace = FALSE)
print(hand) # 5 unique cards
# Sample with replacement (bootstrap)
x <- c(10, 20, 30, 40, 50)
bootstrap_sample <- sample(x, size = 5, replace = TRUE)
print(bootstrap_sample) # may have repeats
# Simulate rolling two dice 1000 times
dice <- function() sum(sample(1:6, 2, replace = TRUE))
rolls <- replicate(1000, dice())
table(rolls) / 1000 # empirical probabilitiesВзвешенная выборка
sample(x, size, replace, prob) использует вероятностные веса. Вектор prob задаёт относительные вероятности для каждого элемента — это удобно для неравномерных дискретных распределений.
set.seed(99)
# Loaded die: 6 is twice as likely
faces <- 1:6
weights <- c(1, 1, 1, 1, 1, 2) # relative
norm_weights <- weights / sum(weights)
rolls <- sample(faces, size = 1000, replace = TRUE,
prob = norm_weights)
table(rolls) / 1000
# 6 appears ~2/7 ~= 0.286 of the time
# Categorical sampling
categories <- c('A', 'B', 'C')
probs <- c(0.5, 0.3, 0.2)
sample(categories, 10, replace = TRUE, prob = probs)rgeom() и rnbinom(): распределения количества
rgeom(n, prob) подсчитывает число неудач до первого успеха. rnbinom(n, size, prob) подсчитывает число неудач до size успехов. Оба распределения моделируют сверхдисперсионные данные о количестве событий, то есть данные с большей дисперсией, чем у распределения Пуассона.
set.seed(42)
# Geometric: flips until first head (prob=0.3)
# Number of FAILURES before first success
flips_until_head <- rgeom(10, prob = 0.3) + 1 # +1 for the success
print(flips_until_head)
mean(flips_until_head) # ~1/0.3 = 3.33
# Negative binomial: overdispersed count data
# e.g., number of parasites per host
counts <- rnbinom(100, size = 2, prob = 0.4)
mean(counts) # ~3 (theoretical: size*(1-p)/p)
var(counts) # much larger than mean -> overdispersed
# Compare variance to Poisson with same mean
pois_counts <- rpois(100, lambda = mean(counts))
var(counts) / var(pois_counts) # > 1rt() и rf(): t- и F-распределения
rt(n, df) генерирует выборочные значения из t-распределения с df степенями свободы. При df → ∞ оно сходится к нормальному распределению. rf(n, df1, df2) генерирует выборочные значения из F-распределения — отношения величин, имеющих распределение хи-квадрат.
set.seed(1)
# t distribution: heavier tails than normal
t_vals <- rt(1000, df = 5)
mean(t_vals) # ~0
sd(t_vals) # > 1 (inflated by heavy tails)
# Compare to normal
n_vals <- rnorm(1000)
# t has more extreme values (heavy tails)
sum(abs(t_vals) > 3) # e.g., ~30
sum(abs(n_vals) > 3) # e.g., ~3
# F distribution: used in ANOVA F-tests
f_vals <- rf(1000, df1 = 5, df2 = 20)
range(f_vals) # always positive
mean(f_vals) # ~df2/(df2-2) = 20/18 = 1.11Визуализация случайных распределений
Гистограммы и графики плотности показывают форму смоделированных распределений. Сравнивайте эмпирическую плотность с теоретическими кривыми плотности, используя hist() с наложением curve(dnorm(...)).
set.seed(42)
x <- rnorm(10000, mean = 5, sd = 2)
# Quick summary statistics
summary(x)
cat('Mean:', mean(x), '\n')
cat('SD:', sd(x), '\n')
cat('Skewness (should be ~0 for normal):',
mean(((x - mean(x))/sd(x))^3), '\n')
# Empirical quantiles vs theoretical
quantile(x, c(0.025, 0.25, 0.5, 0.75, 0.975))
# Compare to theoretical:
qnorm(c(0.025, 0.25, 0.5, 0.75, 0.975),
mean = 5, sd = 2)Быстрая проверка
Проверьте свои знания о функциях случайных распределений в R.
Итоги: случайные распределения
Главные выводы: rnorm(n, mean, sd) — для нормального распределения; runif(n, min, max) — для равномерного; rbinom(n, size, prob) — для биномиального; rpois(n, lambda) — для подсчёта событий по Пуассону; rexp(n, rate) — для экспоненциального распределения времени ожидания; sample(x, size, replace) — для дискретной выборки. В воспроизводимом анализе всегда используйте set.seed() перед генерацией случайных чисел.
set.seed(42)
# Quick reference of common distributions:
rnorm(3, mean = 0, sd = 1) # Normal
runif(3, min = 0, max = 1) # Uniform
rbinom(3, size = 10, prob = 0.5) # Binomial
rpois(3, lambda = 3) # Poisson
rexp(3, rate = 1) # Exponential
rt(3, df = 10) # Student t
rf(3, df1 = 5, df2 = 20) # F distribution
rgeom(3, prob = 0.3) # Geometric
sample(1:10, 3, replace = TRUE) # Discrete uniform
cat('R has 20+ built-in distributions')Часто задаваемые вопросы
Урок «Генерация случайных распределений» бесплатный?
Да — полный текст урока «Генерация случайных распределений» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Генерация случайных распределений»?
Выбирайте случайные значения из нормального, равномерного, биномиального распределений и распределения Пуассона Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Генерация случайных распределений»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- set.seed() и воспроизводимость
- Генерация случайных распределений
- Основы метода Монте-Карло
- Бутстреп-ресэмплинг в R