我得到了一个在任何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 :(得分: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 :(得分:1)
也许我错过了什么。根据{{3}},伽马随机变量的自然对数遵循对数伽马分布(根据名称有意义)。此外,R函数rgamma()
返回伽马随机变量。因此你可以使用例如log(rgamma(10,alpha,beta))
得到你想要的东西。
如果这不起作用,则包this具有rlgamma()
功能。