Ни один из ответов здесь не дает эффективного метода генерации усеченных нормальных переменных, который не предполагает отклонения произвольно большого числа сгенерированных значений. Если вы хотите сгенерировать значения из усеченного нормального распределения, с указанными нижними и верхними границамиа < б, это может быть сделано - без отклонения - путем генерации однородных квантилей в диапазоне квантилей, разрешенных усечением, и с использованием выборки обратного преобразования для получения соответствующих нормальных значений.
Позволять Φобозначим 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это не среднее значение и дисперсия усеченного распределения.