Eu estou tentando escrever um programa em R que simula números pseudo-aleatórios de uma distribuição com a função de distribuição cumulativa:
onde
Tentei amostragem por transformada inversa, mas a inversa não parece analiticamente solucionável. Ficaria feliz se você pudesse sugerir uma solução para este problema
r
random-generation
Sebastian
fonte
fonte
Respostas:
Existe uma solução direta (e, se for o caso, elegante) para este exercício: como aparece como um produto de duas distribuições de sobrevivência: a distribuição é a distribuição de Nesse caso, é a distribuição exponencial e é o -ésimo poder de uma distribuição Exponencial .1−F(x) (1−F(x))=exp{−ax−bp+1xp+1}=exp{−ax}1−F1(x)exp{−bp+1xp+1}1−F2(x) F X=min{X1,X2}X1∼F1,X2∼F2 F1 E(a) F2 1/(p+1) E(b/(p+1))
O código R associado é o mais simples possível
e é definitivamente muito mais rápido que o pdf inverso e as resoluções de aceitação e rejeição:
com um ajuste surpreendentemente perfeito:
fonte
Você sempre pode resolver numericamente a transformação inversa.
Abaixo, faço uma pesquisa de bissecção muito simples. Para uma dada probabilidade de entrada (eu uso desde que você já tenha um em sua fórmula), começo com e . Então até . Por fim, iterativamente o intervalo até que seu comprimento seja menor que e seu ponto médio satisfaça .q q p xL=0 xR=1 xR F(xR)>q [xL,xR] ϵ xM F(xM)≈q
O ECDF se adequa ao seu bem o suficiente para minhas escolhas de e , e é razoavelmente rápido. Você provavelmente poderia acelerar isso usando alguma otimização do tipo Newton, em vez da simples pesquisa de bissecção.F a b
fonte
Existe uma resolução um tanto complicada, se direta, por aceitação-rejeição. Primeiro, uma diferenciação simples mostra que o pdf da distribuição é Segundo, uma vez que temos o limite superior Terceiro, considerando o segundo termo em , faça a alteração da variável , ou seja, . Então é o jacobiano da mudança de variável. Sef(x)=(a+bxp)exp{−ax−bp+1xp+1} f(x)=ae−axe−bxp+1/(p+1)≤1+bxpe−bxp+1/(p+1)e−ax≤1 f(x)≤g(x)=ae−ax+bxpe−bxp+1/(p+1) g ξ=xp+1 x=ξ1/(p+1) dxdξ=1p+1ξ1p+1−1=1p+1ξ−pp+1 X tem uma densidade na forma que é a constante de normalização, então tem a densidade
que significa que (i) é distribuído como uma variável exponencial e (ii) a constante é igual a um. Portanto, acaba sendo igual à mistura igualmente ponderada de uma distribuição Exponential e a -ésima potência de uma Exponentialκbxpe−bxp+1/(p+1) κ Ξ=X1/(p+1) κbξpp+1e−bξ/(p+1)1p+1ξ−pp+1=κbp+1e−bξ/(p+1) Ξ E(b/(p+1)) κ g(x) E(a) 1/(p+1) E(b/(p+1)) distribuição, module uma constante multiplicativa ausente de para explicar os pesos:
E é simples de simular como uma mistura.2 f(x)≤g(x)=2(12ae−ax+12bxpe−bxp+1/(p+1)) g
Uma renderização R do algoritmo de aceitação-rejeição é assim
e para uma n-amostra:
Aqui está uma ilustração para a = 1, b = 2, p = 3:
fonte