2017-03-14 3 views
3

Rパッケージでは見つけられない確率分布が与えられました。ランダムな値を生成するように指示されました。確率分布関数は、LogGamma分布と呼ばれ、以下の確率分布関数を有する。乱数生成を最適化するにはどうすればよいですか?

[;

このように、f(x)= \ frac {\ alpha^\ beta} {\ガンマ(\ ln {x})^ {\ beta-1} x^{

この式の積分の逆数の明示的な式が見つからないので、一連の値を反復して、目的の確率を返す停止ポイントに到達するまで関数を作成しました。

LogGammaPDF <- function(x){ 
     return(alpha^beta * log(x)^(beta - 1) * x^(-alpha-1)/gamma(beta)) 
     } 

MakeLogGammaRV <- function(n){ 
     LogGammaRandomValues = c() 
     for(j in seq(1:n)){ 
     i = 1 
     Prob = runif(1) 
     while(integrate(LogGammaPDF, lower=1, upper=i)$value < Prob){ 
      i = i + .0001 
     } 
     LogGammaRandomValues[j] = i 
     } 
} 

MakeLogGammaRV(10) 

ランダム変数を10にするには約1分かかります。どのようにしてこのプロセスを最適化できますか?


あなたは私の式を参照するTeX the Worldが必要になります。

+0

このページ(https://cran.r-project.org/web/views/Distributions.html)には、log-gamma – HFBrowning

+0

の可能なパッケージのリストがあります。また、この質問に関する2番目の回答(https:/Meta.stackexchange.com/questions/30559/latex-on-stack-overflow)Stack OverflowでのLaTeXのより優れた選択肢を提供します - 将来的に数式を投稿する必要がある場合) – HFBrowning

+3

任意の分布から値を生成するにはその分布のCDFを反転させて、ランダムなUniform(0、1)値をフィードに入れることができます:https://en.wikipedia.org/wiki/Inverse_transform_samplingを参照してください。パッケージが配布されていない場合に便利です。 – Marius

答えて

3

である、それはあなたの定義と一致するかどうかは分かりませんが、?VGAM::rlgammalibrary("sos"); findFn("log-gamma")見つける:

function (n, location = 0, scale = 1, shape = 1) 
{ 
    ans <- location + scale * log(rgamma(n, shape)) 
    ans[scale < 0] <- NaN 
    ans 
} 
1

たぶん私は何かが欠けています。 thisによると、ガンマランダム変数の自然対数は、対数ガンマ分布(名前を考えれば意味をなさない)に従います。さらに、R関数rgamma()はガンマランダム変数を返します。たとえば、 log(rgamma(10,alpha,beta))あなたが欲しいものを得るために。

これが機能しない場合、VGAMパッケージにはrlgamma()機能があります。

+0

これは基本的にVGAM :: rlgammaが何をしているのか、位置パラメータの追加で説明しています –

+0

@BenBolkerお役立ち情報私はこのディストリビューションを利用する機会がなかったし、Googleの検索で 'log-gamma'という名前のちょっとしたディストリビューションが登場するように思われたのは幾分混乱していた。 –

+0

@JohnColeman" Google検索log-gammaという名前の微妙に異なるディストリビューションが登場したようだ」 - それが私の問題だった! –

関連する問題