Se denomina distribución normal truncada:
http://en.wikipedia.org/wiki/Truncated_normal_distribution
Christian Robert escribió acerca de un enfoque para hacerlo para una variedad de situaciones (utilizando diferentes dependiendo de dónde estaban los puntos de truncamiento) aquí:
Robert, C.P. (1995) "Simulación de variables normales truncadas",
Statistics and Computing, Volume 5, Issue 2, June, pp 121-125
Documento disponible en http://arxiv.org/abs/0907.4010
Aquí se discuten varias ideas diferentes para distintos puntos de truncamiento. No es la única manera de abordar estos de ninguna manera, pero por lo general tiene un rendimiento bastante bueno. Si quieres hacer un montón de diferentes normales truncadas con varios puntos de truncamiento, sería un enfoque razonable. Como usted ha señalado, msm::tnorm
se basa en el planteamiento de Robert, mientras que truncnorm::truncnorm
implementa el muestreador de aceptación-rechazo de Geweke (1991); está relacionado con el enfoque del artículo de Robert. Obsérvese que msm::tnorm
incluye funciones de densidad, CDF y cuantiles (CDF inversa) en la forma habitual R
moda.
Una referencia más antigua con un enfoque es El libro de Luc Devroye Desde que se agotó, ha recuperado los derechos de autor y lo ha puesto a disposición de los lectores como descarga.
Su ejemplo particular es el mismo que el muestreo de una normal estándar truncada en 1 (si $t$ es el punto de truncamiento, $(t-\mu)/\sigma = (5-3)/2 = 1$ ) y, a continuación, escalar el resultado (multiplicar por $\sigma$ y añada $\mu$ ).
En ese caso concreto, Robert sugiere que su idea (en la segunda o tercera encarnación) es bastante razonable. Obtienes un valor aceptable aproximadamente el 84% de las veces y así generas unos $1.19 n$ normales de media (se pueden calcular límites de forma que se generen suficientes valores utilizando un algoritmo vectorizado, digamos, el 99,5% de las veces, y luego, de vez en cuando, generar los últimos de forma menos eficiente, incluso de uno en uno).
También se habla de una implementación en código R aquí (y en Rccp en otra respuesta a la misma pregunta, pero el código R allí es realmente más rápido). El código R simple genera 50000 normales truncadas en 6 milisegundos, aunque esa normal truncada en particular sólo corta las colas extremas, por lo que un truncamiento más sustancial significaría que los resultados serían más lentos. Implementa la idea de generar "demasiadas" calculando cuántas debe generar para estar casi seguro de obtener suficientes.
Si necesitara un tipo concreto de normal truncada muchas veces, probablemente buscaría adaptar una versión del método del zigurat, o algo similar, al problema.
De hecho, parece que Nicolas Chopin ya lo hizo, así que no soy la única persona a la que se le ha ocurrido:
http://arxiv.org/abs/1201.6140
Discute varios otros algoritmos y compara el tiempo de 3 versiones de su algoritmo con otros algoritmos para generar 10^8 normales aleatorias para varios puntos de truncamiento.
Como era de esperar, su algoritmo resulta ser relativamente rápido.
A partir del gráfico del artículo, incluso el más lento de los algoritmos con los que se compara en los (para ellos) peores puntos de truncamiento está generando $10^8$ en unos 3 segundos, lo que sugiere que cualquiera de los algoritmos comentados puede ser aceptable si se aplica razonablemente bien.
Edición: Uno que no estoy seguro de que se menciona aquí (pero tal vez es en uno de los enlaces) es transformar (a través de cdf normal inversa) un truncado uniforme - pero el uniforme puede ser truncado por la simple generación de un uniforme dentro de los límites de truncamiento. Si la normal inversa cdf es rápida esto es a la vez rápido y fácil y funciona bien para una amplia gama de puntos de truncamiento.