Zufallsstichprobe aus inversem Cdf ohne geschlossene Form generieren

7

Ich arbeite an einer bestimmten Distribution, deren inverses cdf nicht in geschlossener Form existiert. Das cdf der Distribution ist gegeben durch

F(x;d,m,p,α,β)=1(1+xm)dexp(βxα)1p(1+xm)dexp(βxα)

für streng positive und .m,d,α,β0<p<1

Mein Problem ist, dass ich neu im RPaket bin und eine Zufallsstichprobe aus der Verteilung mit generieren muss R.

Soma
quelle
3
NB: Diese Formel für gibt nicht immer ein cdf: Sie müssen es auf die Domäne damit es definiert und gültig ist. Fx0
whuber
Entschuldigung, ich habe vergessen, es auszudrücken. Es ist cdf mit x≥0. Danke @Whuber.
Soma
Um zu invertieren, müssen Sie numerisch lösen, da dies eine transzendentale Gleichung ist. Vielleicht ist hier ein cleveres Akzeptanz- / Ablehnungsschema angebracht? Fy=exp(βxα)/(1+xm)
StijnDeVuyst
Hast du diesen Thread
user603
Das direkte Lösen der Gleichung kann für die höchsten Quantile problematisch und unsicher sein . Löse stattdessen für und nimm . Mit einer kleinen Anzahl von Newton-Raphson-Iterationen erhalten Sie das Ergebnis mit hoher Präzision. (Dies ist so einfach, dass Sie es sogar in einer Tabelle implementieren können.)q
log(1q)=log(1F(x;d,m,p,1,1))=log(1pp+ez(zm+1)d)
z0x=(z/β)1/α
whuber

Antworten:

3

Hier sind zwei Möglichkeiten, um numerische Näherungen an die Umkehrung des cdf zu berechnen, vorausgesetzt, Sie haben Entscheidungen für m, d, α, β und p getroffen. Beide Methoden erfordern, dass Sie F (x) für ein gegebenes x berechnen können, also ...

m = 1
d = 2
a = 1
b = 2
p = 0.5
F = function(x) (1 - ((1+x^m)^-d) * exp(-b*x^a))  / 
    (1 - (p*(1+x^m)^-d) * exp(-b*x^a)) 

Methode 1

Um InvF (a) zu berechnen, lösen Sie die Gleichung F (x) = a

InvF1 = function(a) uniroot(function(x) F(x) - a, c(0,10))$root
InvF1(0.5)
[1] 0.1038906
F(InvF1(0.5))
[1] 0.4999983

Methode 2

Bewerten Sie y = F (x) für einen Bereich von x und passen Sie dann eine Kurve als Funktion von y an x ​​an.

x = c(seq(0,3, 0.001), seq(3.1,10,0.1))
y = F(x)
InvF2 = approxfun(y, x)

InvF2(0.5)
[1] 0.1038916
F(InvF2(0.5))
[1] 0.5000011

Sie können die Genauigkeit erhöhen, InvF2indem Sie eine dichtere Abtastung von x verwenden, insbesondere für kleine Werte von x.

G5W
quelle