Isso é chamado de distribuição normal truncada:
http://en.wikipedia.org/wiki/Truncated_normal_distribution
Christian Robert escreveu sobre uma abordagem para fazê-lo em várias situações (usando diferentes dependendo de onde estavam os pontos de truncamento) aqui:
Robert, CP (1995) "Simulação de variáveis normais truncadas",
Statistics and Computing, Volume 5, Edição 2, Junho, pp 121-125
Artigo disponível em http://arxiv.org/abs/0907.4010
Isso discute várias idéias diferentes para diferentes pontos de truncamento. Não é a única maneira de abordá-los por qualquer meio, mas geralmente apresenta um desempenho muito bom. Se você deseja fazer muitos normais truncados diferentes com vários pontos de truncamento, seria uma abordagem razoável. Como você observou, msm::tnorm
é baseado na abordagem de Robert, enquanto truncnorm::truncnorm
implementa o amostrador de aceitação / rejeição de Geweke (1991); isso está relacionado à abordagem no trabalho de Robert. Observe que msm::tnorm
inclui as funções densidade, cdf e quantil (cdf inverso) da R
maneira usual .
Uma referência mais antiga com uma abordagem é o livro de Luc Devroye ; desde que saiu do papel, ele recuperou os direitos autorais e os disponibilizou para download.
t( t - μ ) / σ= ( 5 - 3 ) / 2 = 1σμ
1,19 n
Também há discussão de uma implementação no código R aqui (e no Rccp em outra resposta para a mesma pergunta, mas o código R é realmente mais rápido). O código R simples lá gera 50000 normais truncados em 6 milissegundos, embora esse normal truncado em particular apenas elimine as caudas extremas, portanto, um truncamento mais substantivo significaria que os resultados seriam mais lentos. Ele implementa a idéia de gerar "muitos", calculando quantos deve gerar para ter quase certeza de obter o suficiente.
Se eu precisasse apenas de um tipo específico de normal truncado muitas vezes, provavelmente tentaria adaptar uma versão do método zigurate, ou algo semelhante, ao problema.
Na verdade, parece que Nicolas Chopin já fez exatamente isso, então eu não sou a única pessoa que ocorreu:
http://arxiv.org/abs/1201.6140
Ele discute vários outros algoritmos e compara o tempo para três versões de seu algoritmo com outros algoritmos para gerar 10 ^ 8 normais aleatórios para vários pontos de truncamento.
Talvez sem surpresa, seu algoritmo acaba sendo relativamente rápido.
108
Edit: Um que não tenho certeza é mencionado aqui (mas talvez esteja em um dos links) é transformar (via cdf normal inverso) um uniforme truncado - mas o uniforme pode ser truncado simplesmente gerando um uniforme dentro dos limites de truncamento . Se o cdf normal inverso for rápido, isso é rápido e fácil e funciona bem para uma ampla variedade de pontos de truncamento.