J'essaie d'écrire un programme en R qui simule des nombres pseudo aléatoires à partir d'une distribution avec la fonction de distribution cumulative:
où
J'ai essayé l'échantillonnage par transformée inverse mais l'inverse ne semble pas résoluble analytiquement. Je serais heureux si vous pouviez suggérer une solution à ce problème
r
random-generation
Sébastien
la source
la source
Réponses:
Il existe une solution simple (et si je peux ajouter, élégante) à cet exercice: puisque apparaît comme le produit de deux distributions de survie: la distribution est la distribution de Dans ce cas, est la distribution exponentielle et est la -ième puissance d'une distribution exponentielle .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))
Le code R associé est aussi simple que possible
et il est nettement plus rapide que les résolutions PDF inverses et acceptation-rejet:
avec un ajustement parfait sans surprise:
la source
Vous pouvez toujours résoudre numériquement la transformation inverse.
Ci-dessous, je fais une recherche de bissection très simple. Pour une probabilité d'entrée donnée (j'utilise puisque vous avez déjà un dans votre formule), je commence par et . Ensuite, je double jusqu'à . Enfin, je bissecte itérativement l'intervalle jusqu'à ce que sa longueur soit plus courte que et que son point milieu satisfasse .q q p xL=0 xR=1 xR F(xR)>q [xL,xR] ϵ xM F(xM)≈q
L'ECDF s'adapte assez bien à votre pour mes choix de et , et c'est assez rapide. Vous pourriez probablement accélérer cela en utilisant une optimisation de type Newton au lieu de la recherche de bissection simple.F a b
la source
Il y a une résolution quelque peu compliquée si directe par acceptation-rejet. Tout d'abord, une différenciation simple montre que le pdf de la distribution est Deuxièmement, puisque nous avons la borne supérieure Troisièmement, considérant le deuxième terme en , prendre le changement de variable , c'est-à-dire . Alors est le jacobien du changement de variable. Sif(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 a une densité de la forme où est la constante de normalisation, alors a la densité
ce qui signifie que (i) est distribué comme une variable exponentielle et (ii) la constante est égale à un. Par conséquent, finit par être égal au mélange également pondéré d'une distribution exponentielle et de la puissance -ième d'une puissance exponentielleκ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)) distribution, modulo une constante multiplicative manquante de pour tenir compte des poids:
Et est simple à simuler comme un mélange.2 f(x)≤g(x)=2(12ae−ax+12bxpe−bxp+1/(p+1)) g
Un rendu R de l'algorithme d'acceptation-rejet est donc
et pour un n-échantillon:
Voici une illustration pour a = 1, b = 2, p = 3:
la source