Ни один из ответов здесь не дает эффективного метода генерации усеченных нормальных переменных, который не предполагает отклонения произвольно большого числа сгенерированных значений. Если вы хотите сгенерировать значения из усеченного нормального распределения, с указанными нижними и верхними границамиа < б, это может быть сделано - без отклонения - путем генерации однородных квантилей в диапазоне квантилей, разрешенных усечением, и с использованием выборки обратного преобразования для получения соответствующих нормальных значений.
Позволять Φобозначим CDF стандартного нормального распределения. Мы хотим генерироватьИкс1, . , , , XN из усеченного нормального распределения (со средним параметром μ и параметр дисперсии σ2)† с нижней и верхней границей усечения а < б, Это можно сделать следующим образом:
Икся= μ + σ⋅ Φ- 1( Uя)U1, . , , , UN∼ IID U [ Φ ( a - μσ) ,Ф ( б - μσ) ] .
Не существует встроенной функции для сгенерированных значений из усеченного распределения, но программировать этот метод тривиально, используя обычные функции для генерации случайных величин. Вот простая R
функция, rtruncnorm
которая реализует этот метод в несколько строк кода.
rtruncnorm <- function(N, mean = 0, sd = 1, a = -Inf, b = Inf) {
if (a > b) stop('Error: Truncation range is empty');
U <- runif(N, pnorm(a, mean, sd), pnorm(b, mean, sd));
qnorm(U, mean, sd); }
Это векторизованная функция, которая будет генерировать N
случайные величины IID из усеченного нормального распределения. Было бы легко программировать функции для других усеченных распределений тем же методом. Также не было бы слишком сложно программировать связанные функции плотности и квантили для усеченного распределения.
† Обратите внимание, что усечение изменяет среднее значение и дисперсию распределения, поэтому μ и σ2это не среднее значение и дисперсия усеченного распределения.