閉じたフォームなしで逆Cdfからランダムサンプルを生成する


7

私は、逆累積分布関数が閉じた形で存在しない特定の分布に取り組んでいます。分布の累積分布関数は、

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

正に m,d,α,β そして 0<p<1

私の問題は、Rパッケージが初めてで、を使用して配布からランダムサンプルを生成する必要があることですR


3
注意:この式は F 常にCDFを提供するわけではありません。ドメインに制限する必要があります バツ0それを定義して有効にするためです。
whuber

すみません、入れ忘れました。x≥0のcdfです。@Whuberありがとうございます。
相馬

反転する F あなたは解決しなければならないでしょう y=expβバツα/1+バツメートルそれは超越方程式であるため、数値的に。たぶん、ここでいくつかの巧妙な受け入れ/拒否スキームが整いますか?
StijnDeVuyst 2017年


方程式を直接解くのは問題が多く、最高の分位数にとって不確実な場合があります q。代わりに、解決
ログ1q=ログ1Fバツ;dメートルp11=ログ1pp+ezzメートル+1d
ために z0 そしてとる バツ=z/β1/α。少数のニュートンラフソン反復により、高精度の結果が得られます。(これは非常に簡単なので、スプレッドシートに実装することもできます。)
whuber

回答:


3

m、d、α、β、pを選択したと仮定して、cdfの逆数の数値近似を計算する2つの方法を次に示します。どちらの方法でも、特定のxに対してF(x)を計算できる必要があるため、...

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)) 

方法1

InvF(a)を計算するには、方程式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

方法2

xの範囲についてy = F(x)を評価し、yの関数としてxに曲線を近似します。

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

InvF2特にxの値が小さい場合は、xの密度の高いサンプリングを使用することで精度を上げることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.