Ich versuche, ein Programm in R zu schreiben, das Pseudozufallszahlen aus einer Verteilung mit der kumulativen Verteilungsfunktion simuliert:
wobei
Ich habe versucht, die inverse Transformation abzutasten, aber die inverse scheint analytisch nicht lösbar zu sein. Ich würde mich freuen, wenn Sie eine Lösung für dieses Problem vorschlagen könnten
r
random-generation
Sebastian
quelle
quelle
Antworten:
Es gibt eine einfache (und wenn ich hinzufügen darf, elegante) Lösung für diese Aufgabe: da wie ein Produkt zweier Überlebensverteilungen erscheint: die Verteilung ist die Verteilung von In diesem Fall ist F_1 die Exponential \ mathcal {E} (a) -Verteilung und F_2 ist die 1 / (p + 1) -te Potenz einer Exponential \ mathcal {E} (b / (p + 1)) - Verteilung.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))
Der zugehörige R-Code ist so einfach wie es nur geht
und es ist definitiv viel schneller als das Inverse PDF und das Akzeptieren-Ablehnen von Auflösungen:
mit einer nicht überraschend perfekten Passform:
quelle
Sie können die inverse Transformation immer numerisch lösen.
Im Folgenden führe ich eine sehr einfache Halbierungssuche durch. Für eine gegebene Eingabewahrscheinlichkeit (ich verwende da Sie bereits ein in Ihrer Formel haben) beginne ich mit und . Dann ich bis . Schließlich halbiere ich iterativ das Intervall bis seine Länge kürzer als und sein Mittelpunkt erfüllt .q q p xL=0 xR=1 xR F(xR)>q [xL,xR] ϵ xM F(xM)≈q
Das ECDF passt gut genug zu Ihrem für meine Auswahl von und , und es ist ziemlich schnell. Sie könnten dies wahrscheinlich beschleunigen, indem Sie anstelle der einfachen Halbierungssuche eine Optimierung nach Newton verwenden.F a b
quelle
Es gibt eine etwas verworrene, wenn direkte Auflösung durch Akzeptieren-Ablehnen. Zunächst zeigt eine einfache Unterscheidung, dass das PDF der Distribution Zweitens, da Wir haben die obere Schranke drittes nehme man unter Berücksichtigung des zweiten Terms in die Änderung der Variablen , dh . Dann ist ist der Jacobi der Variablenänderung. Wennf(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 hat eine Dichte der Form wobei die Normalisierungskonstante ist, dann ist hat die Dichte
was bedeutet, dass (i) ist verteilt als Exponential variate und (ii) die Konstante ist gleich eins. Daher ist gleich der gleichgewichteten Mischung einer Exponential -Verteilung und der -ten Potenz einer 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)) Verteilung, modulo eine fehlende multiplikative Konstante von , um die Gewichte zu berücksichtigen:
Und ist einfach als Mischung zu simulieren.2 f(x)≤g(x)=2(12ae−ax+12bxpe−bxp+1/(p+1)) g
Ein R-Rendering des Accept-Reject-Algorithmus liegt somit vor
und für eine n-Probe:
Hier ist eine Illustration für a = 1, b = 2, p = 3:
quelle