Problema relacionado à simulação de semi-informática aqui.
Eu tenho uma distribuição onde
P (x) =
para algumas constantes b e n, e x é um número inteiro tal que .
Agora, preciso provar dessa distribuição. Ele tem um CDF invertível, portanto é possível fazer isso diretamente na teoria. O problema é que os números envolvidos são GRANDES. Tão grande, de fato, que ambas transbordam variáveis formatadas convencionalmente e levam pelo menos minutos (em algum momento eu desisti ...) para calcular usando formatos de precisão arbitrários. Basicamente, o CDF inverso ainda envolve um termo de , para . Apesar disso, os números de saída ainda estarão no intervalo , portanto parece que deve haver uma maneira de fazer isso.
O que estou procurando é uma maneira de amostrar aproximadamente dessa distribuição que é computável. Existem métodos alternativos de amostragem? O que eles são?
fonte
Respostas:
O CDF é prontamente invertível. Uma fórmula para a inversão leva ao que deve ser uma das soluções mais simples e convenientes possíveis.
Álgebra simples fornece a solução
Aqui está umab n
R
implementação construída como todos os outros geradores de números aleatórios: seu primeiro argumento especifica quantos valores de iid a serem gerados e o restante dos argumentos nomeia os parâmetros ( as e as ):nb
n.max
Como exemplo de seu uso, vamos gerar um milhão de variáveis aleatórias de acordo com esta distribuição:
( Foram necessários segundos.)0.10
( foi adicionado a cada valor para criar um histograma melhor: o procedimento tem uma idiossincrasia (= bug) na qual a primeira barra é muito alta quando o ponto de extremidade esquerdo é definido como zero.) A curva vermelha é a distribuição de referência que esta simulação tenta se reproduzir. Vamos avaliar a qualidade do ajuste com um teste do qui-quadrado:1
R
hist
O valor de p é : um ajuste bonito.0.84
fonte
Você está lidando com uma distribuição geométrica truncada com . Existem várias maneiras de abordar isso.p=1−e−b
Eu aconselharia diferentes opções em diferentes situações; algumas opções envolveriam a simulação de um ponto geométrico e a regeneração quando estiver fora do intervalo, levando a parte inteira de um exponencial truncado apropriado ( como aqui ) ou usando qualquer uma das várias técnicas rápidas personalizadas para distribuições discretas em um intervalo finito. Dado que é grande, tomar o piso de um exponencial truncado provavelmente será relativamente rápido, mas se é a melhor opção também depende de .n b
Aqui está uma pergunta relacionada sobre math.SE
Antes de tentar sugestões específicas, qual é o intervalo típico de valores para ?b
fonte
Primeiro, observe que que, se fosse contínuo, estaria relacionado a uma distribuição exponencial. Então, o que você pode fazer é simular a partir de uma distribuição exponencial truncada e pegar a (parte inteira) das observações.P(x)∝e−bx x
floor()
O cdf de um exponencial truncado é
Então, se fizermos , obtemos que . Se for grande, que sugere aproximar .F(x;n,b)=u x=−1blog[1−u(1−e−bn)] bn e−bn≈0 x≈−1blog[1−u]
fonte
rweirdp
é modificado para mudarn
paran+1
. (Como indicado aqui, ele nunca retornará um valor igual an
: esse é o efeito da aproximação.) Uma análise um pouco mais rigorosa é dada em minha resposta. Embora eu obtenha uma fórmula com aparência diferente, ela é equivalente à (mais simples!), Dada aqui, uma vez que a modificaçãon
->n+1
é feita.Uma maneira de obter amostra da distribuição de destino ép(k)∝exp{−bk}
execute um experimento Metropolis-Hastings para determinar o suporte (interessante) da distribuição, ou seja, em qual subconjunto de ele se concentra;{0,1,…,n}
Use o suporte assim determinado, digamos, para calcular as probabilidades exatas como para evitar estouros.{k0,…,k1} p(k)∝exp{−bk+bk0}
Atualização: Ao pensar mais sobre isso, como está diminuindo em k, o suporte efetivo da distribuição sempre começará em . Se for muito grande, esse suporte terminará muito rapidamente, caso em que não importa muito, pois grandes valores de nunca serão visitados. Se for muito pequeno, o pdf será quase plano, o que significa que é possível usar uma distribuição uniforme em como uma proposta de aceitação / rejeição. E use logs na etapa de aceitação para evitar estouros.k 0 = 0 b n k b { 0 , 1 , … , n }p(⋅) k0=0 b n k b {0,1,…,n}
fonte