Ninguna de las respuestas da un método eficiente para generar truncado variables normales que no implique el rechazo de un número arbitrariamente grande de valores generados. Si desea generar valores a partir de una distribución normal truncada, con límites inferiores y superiores especificados a<b esto se puede hacer -sin rechazo- generando cuantiles uniformes sobre el rango de cuantiles permitido por el truncamiento, y utilizando muestreo por transformación inversa para obtener los valores normales correspondientes.
Dejemos que Φ denotan la FDA de la distribución normal estándar. Queremos generar X1,...,XN de una distribución normal truncada (con parámetro de media μ y el parámetro de varianza σ2 ) † con límites de truncamiento inferior y superior a<b . Esto puede hacerse de la siguiente manera:
Xi=μ+σ⋅Φ−1(Ui)U1,...,UN∼IID U[Φ(a−μσ),Φ(b−μσ)].
No hay ninguna función incorporada para generar valores a partir de la distribución truncada, pero es trivial programar este método utilizando las funciones ordinarias para generar variables aleatorias. A continuación se presenta un sencillo R
función rtruncnorm
que implementa este método en unas pocas líneas de código.
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); }
Esta es una función vectorizada que generará N
Variables aleatorias IID de la distribución normal truncada. Sería fácil programar funciones para otras distribuciones truncadas mediante el mismo método. Tampoco sería demasiado difícil programar funciones de densidad y cuantiles asociadas para la distribución truncada.
† Obsérvese que el truncamiento altera la media y la varianza de la distribución, por lo que μ y σ2 son no la media y la varianza de la distribución truncada.
0 votos
¿Por qué quieres hacer esto? Si está acotado, entonces no puede ser realmente normal. ¿Qué quieres conseguir?
2 votos
x <- rnorm(n, mean, sd); x <- x[x > lower.limit & x < upper.limit]
3 votos
@Hugh eso es genial... siempre y cuando no te importe la cantidad de valores aleatorios que obtengas.