【问题标题】:How can I optimize my random value generation?如何优化我的随机值生成?
【发布时间】:2017-08-05 12:09:33
【问题描述】:

我得到了一个在任何 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 才能看到我的方程式。

【问题讨论】:

标签: r


【解决方案1】:

我不知道它是否符合你的定义,但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
}

【讨论】:

    【解决方案2】:

    也许我错过了什么。根据this,伽马随机变量的自然对数遵循对数伽马分布(给定名称是有意义的)。此外,R 函数rgamma() 返回伽马随机变量。因此你可以使用例如log(rgamma(10,alpha,beta)) 得到你想要的。

    如果这不起作用,包VGAM 有一个rlgamma() 函数。

    【讨论】:

    • 这基本上描述了 VGAM::rlgamma 的作用,并添加了一个位置参数
    • @BenBolker 很高兴知道。我没有机会使用此发行版,并且对 Google 搜索似乎出现了几个以 log-gamma 命名的细微不同发行版的方式感到有些困惑@
    • @JohnColeman “Google 搜索似乎发现了几个以 log-gamma 为名的细微不同的分布” - 这是我的问题!
    猜你喜欢
    • 2021-05-23
    • 2017-05-02
    • 1970-01-01
    • 2013-12-04
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    相关资源
    最近更新 更多