2017-03-14 20 views
3

我被給了一個概率分佈,我無法在任何R軟件包中找到,並且我被告知從它生成隨機值。概率分佈函數稱爲LogGamma分佈,具有以下概率分佈函數。如何優化我的隨機值生成?

[; f(x)= \ frac {\ alpha^\ beta} {\ Gamma(\ beta)}(\ ln {x})^ {\ beta-1} x^{ - \ alpha-1};]

因爲我找不到表達式來表達這個表達式的整數,所以我創建了一個函數來迭代一系列值,直到它到達返回所需概率的停止點。

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個隨機變量需要大約一分鐘的時間。我怎樣才能優化這個過程?您需要TeX the World才能看到我的公式。

+0

此頁面(https://cran.r-project.org/web/views/Distributions.html)有一個可能的日誌伽瑪包的列表 – HFBrowning

+0

另外,關於這個問題的第二個答案(https:/ /meta.stackexchange.com/questions/30559/latex-on-stack-overflow)爲堆棧溢出提供了一個更好的替代LaTeX的方法 - 如果您需要在將來發布公式:) – HFBrowning

+3

要從任意分佈生成值,您可以反轉該分佈的CDF並向其中輸入隨機統一(0,1)值:請參閱https://en.wikipedia.org/wiki/Inverse_transform_sampling。當分發在任何軟件包中不可用時很有用。 – Marius

回答

3

我不知道這是否符合你的定義或沒有,但library("sos"); findFn("log-gamma")發現?VGAM::rlgamma,那就是:

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的名字出現「 - 這是我的問題! –