計算能力のないCDFを含むディストリビューションからサンプリングするにはどうすればよいですか?


8

セミコンピューターサイエンスシミュレーション関連の問題はこちら。

私はディストリビューションを持っています

P(x)=(eb1)eb(nx)ebn+b1

一部の定数bおよびnの場合、xはような整数です。0xn

今、私はこの分布からサンプリングする必要があります。それは可逆CDFを持っているので、理論的にはこれを直接行うことが可能です。問題は、関係する数値が大きいことです。実際には非常に大きいため、どちらも従来の形式の変数をオーバーフローし、任意の精度の形式を使用して計算するには少なくとも数分かかります(ある時点で私はあきらめました...)。基本的に、逆CDF には、依然としてが含まれます。これにもかかわらず、出力数はの範囲のままなので、これを行う方法があるはずです。eb(n+1)350<n<35000n

私が探している約この分布からのサンプリングの方法である計算。サンプリングの代替方法はありますか?彼らは何ですか?


2
ドメインを削減するために、何らかの方法でデータを正規化またはスケーリングすることを検討しましたか?
EngrStudent 2013

回答:


7

CDFは容易に反転可能です。 反転の公式は、最も単純で最も適切な可能なソリューションの1つでなければならないものを導きます。

結果の確率、が比例することを確認することから始めます。したがって、と =間の均一な値を生成する場合、必要な最大のを見つけるだけですk0knebkq01 - E - B N + 1 /1 - E - Bqmax=k=0nebk(1eb(n+1))/(1eb)k

qi=0kebi=1e(k+1)b1eb.

簡単な代数が解を与える

k=ceiling(log(1q(1eb))b).

R他のすべての乱数ジェネレータと同じように構築実装次のとおりです。最初の引数は生成するiid値の数を指定し、残りの引数はパラメータ( as および as )に名前を付けます。nbbnn.max

rgeom.truncated <- function(n=1, b, n.max) {
  a <- 1 - exp(-b)
  q.max <- (1 - exp(-b*(n.max+1))) / a
  q <- runif(n, 0, q.max)
  return(-ceiling(log(1 - q*a) / b))
}

その使用例として、この分布に従って100万個のランダム変量を生成してみましょう。

b <- 0.001
n.max <- 3500
n.sim <- 10^6
set.seed(17)
system.time(sim <- rgeom.truncated(n.sim, b,n.max))

(秒必要でした。)0.10

h <- hist(sim+1, probability=TRUE, breaks=50, xlab="Outcome+1")
pmf <- exp(-b * (0: n.max)); pmf <- pmf / sum(pmf)
lines(0:n.max, pmf, col="Red", lwd=2)

ヒストグラム

(より良いヒストグラムを作成するためにが各値に追加されました:の手順には、左端がゼロに設定されている場合、最初のバーが高すぎる特異性(=バグ)があります。赤い曲線は参照分布ですこのシミュレーションは再現しようとしています。カイ二乗検定で適合度評価しましょう1Rhist

observed <- table(sim)
expected <- n.sim * pmf
chi.square <- (observed-expected)^2 / expected
pchisq(sum(chi.square), n.max, lower.tail=FALSE)

p値はです。0.84


3
素晴らしいソリューション。この方法でサンプリングできることは知りませんでした(つまり、ではなくサンプルに依存している)が、振り返ってみると明らかです。U N I 0 1 Uni(0,k),k>1Uni(0,1)
Cam.Davidson.Pilon 2013

6

あなたは切り捨てられた幾何分布を扱っています。これに取り組むにはさまざまな方法があります。p=1eb

さまざまな状況でさまざまなオプションをお勧めします。一部のオプションには、ジオメトリからシミュレーションして範囲外にある場合に再生成する、適切な切り捨て指数の整数部分を取得する(ここに示すように)、または有限範囲の離散分布に合わせて調整されたいくつかの高速手法を使用することが含まれます。が大きいことを考えると、切り捨てられた指数のフロアをとるのは比較的高速ですが、それが最良の選択であるかどうかも依存します。bnb

math.SEに関する関連質問です

特定の提案を試みる前に、典型的な値の範囲は何ですか?b


ご回答有難うございます!B〜LNイプシロンは、追加のパラメータ> 0である(1 +イプシロン)、
ジョン・ドーセット

1
それで、bの典型的な範囲についての私の質問を、εの典型的な範囲についての質問に変換しました。特定の提案を試みる前に、εの典型的な値の範囲は何ですか?
Glen_b-モニカを復元する

私が尋ねる理由は、どの特定のアプローチがより効率的であるかは、状況の特性に依存するからです。あなたはもう他の答えにすでに満足しているように聞こえるので、潜在的な効率の追加について心配する価値がないかもしれません。
Glen_b-モニカを復活させる2013

@JohnDoucette:bがほぼゼロの場合、分布はほぼ均一ですしたがって、上限はひどいものではないので、受け入れ拒否アルゴリズムの提案として均一を使用できます。{0,,n\]
西安

1
西安@あなたは、必要があるだろうのではなく、かなり小さく合格率があるので、一様分布を使用するのが適切であろう前に、これは場合に非効率的に低くなります。nbb0(1e(n+1)b)/((n+1)(1eb)) (1exp(nb))/(nb)nb1
whuber

4

まず、は、が連続の場合、指数分布に関連することに注意してください。次に、実行できるのは、切り捨てられた指数分布からシミュレーションし、観測値の(整数部分)を取得することです。P(x)ebxxfloor()

切り捨てられた指数の累積分布関数は

F(x;n,b)=1ebx1ebn.

次に、とすると、ます。場合大きく、次いで近似することを示唆している。F(x;n,b)=ux=1blog[1u(1ebn)]bnebn0x1blog[1u]

rweirdp <- function(ns,n,b){
u <- runif(ns)
samp <- - log(1-u*(1-exp(-n*b)))/b
return(floor(samp))
}

rweirdp(1000,10,1)

これは基本的に私が探していたものだと思います。bnは常に非常に大きく、比例サンプリングは理にかなっています。振り返ってみると明らかですが、マッピングを認識していませんでした。ありがとう!
John Doucette 2013

お役に立てて嬉しいです。私は適切に説明しなかったと思いますが、このアプローチは正確なターゲット分布からサンプルを生成します。乾杯。

@ Xi'an値を使用して整数部分を取る場合、重みは同じではありませんか?ebn
2013

@ Xi'anこの項は分子に、因数分解まで表示されると思います...P(x)
人物

1
@ Xi'an実際、提供rweirdpされているこの作品はに変更されるように変更さnれていn+1ます。(ここに示されているように、それはn:に等しい値を返すことは決してありません。それは近似の効果です。)私の回答では、もう少し厳密な分析が与えられています。別の外観の数式を取得しますが、n-> n+1変更を行うと、ここで指定された(より単純な!)数式と同等になります。
whuber

4

ターゲット分布からサンプリングする方法は、p(k)exp{bk}

  1. Metropolis-Hastings実験を実行して、分布の(興味深い)サポート、つまり、それがサブセットに集中しているかを判断します。{0,1,,n}

    metro=function(N,b,n){
    x=sample(0:n,N,rep=TRUE)
    for (t in 2:N){
      x[t]=prop=x[t-1]+sample(c(-1,1),1)
    
      if ((prop<0)||(prop>n)||(log(runif(1))>b*(x[t]-prop)))
          x[t]=x[t-1]
      }
    return(x)
    }
    
  2. このようにして決定されたサポート(など)を使用して、正確な確率をとして計算し、オーバーフローを回避します。p k exp { b k + b k 0 }{k0,,k1}p(k)exp{bk+bk0}

更新:さらに考えると、はkで減少しているため、分布の効果的なサポートは常にから始まり。が非常に大きい場合、このサポートはすぐに終了します。この場合、大きな値にアクセスすることはないため、はそれほど重要ではありません。場合非常に小さい、PDFは、どちらが上に均一な分布を使用することができることを意味する、ほぼ平坦である受け入れるリジェクト提案として。そして、オーバーフローを回避するために、受け入れステップでログを使用します。K 0 = 0 、B N K B 、{ 0 1 ... N }p()k0=0bnkb{0,1,,n}

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