【问题标题】:R Optim() function: Truncated Log-normal Maximum Likelihood Estimation (solve for mu and sd)R Optim() 函数:截断对数正态最大似然估计(求解 mu 和 sd)
【发布时间】:2020-06-28 09:15:24
【问题描述】:

我正在尝试在 R 中拟合截断的对数正态分布。下面的 x 是整数列表。我相信函数 Optim() 可能是最好的方法,如下所示。

log.lklh.lnorm <- function(x, mu, sd, input_min, input_max){-sum(log(dlnorm(x, meanlog = mu, sdlog = sd, log = FALSE)/((plnorm(input_max, meanlog = mu, sdlog = sd, lower.tail = TRUE, log.p = FALSE)) - (plnorm(input_min, meanlog = mu, sdlog = sd, lower.tail = TRUE, log.p = FALSE)))))}


optim(par = c(0,1,1,100000), log.lklh.lnorm)

我使用 excel 求解器来求解 mu 和 sd(取决于输入的 max 和 min)(即找到这个总和的最大值)。但是,我似乎无法在 R 中复制这一点。我尝试了上述代码的各种版本,包括:

  • 将输入最小值和输入最大值设置为特定值,例如分别为 1 和 100,000。
  • Optim() 调用的顺序,即输入 x、par 和 fn 顺序)

非常感谢任何帮助,谢谢!

戴夫

【问题讨论】:

    标签: r function statistics mathematical-optimization mle


    【解决方案1】:

    我想你想优化一个只有两个参数的函数。所以,我们可以这样做:

    x <- c(1,2,3,3,3,4,4,5,5,6,7)
    
    log.lklh.lnorm <- function(x, mu, sd, input_min, input_max){-sum(log(dlnorm(x, meanlog = mu, sdlog = sd, log = FALSE)/((plnorm(input_max, meanlog = mu, sdlog = sd, lower.tail = TRUE, log.p = FALSE)) - (plnorm(input_min, meanlog = mu, sdlog = sd, lower.tail = TRUE, log.p = FALSE)))))}
    
    
    f <- function(y) {
      log.lklh.lnorm(x,y[1],y[2],1,100000)    
    }
    
    optim(par = c(3,1), f)
    

    回答 cmets 中进一步问题的说明:

    1. par = c(3,1)的作用是什么?这有两个功能。 (1) 它是初始点(猜测)。 (2) 它确定要优化的参数数量。在这种情况下,这是 2。请注意,您可以(并且应该)计算非常好的初始值。只需计算平均值和样本标准差,您就可以获得很好的 μ 和 σ 估计值。 (在统计中,这有时称为method of moments)这将使optim 的任务更容易。所以我们真的应该这样做而不是par=c(3,1)par = c(mean(x),sd(x))

    2. y[1]/y[2] 有什么作用? optim 函数将所有要优化的参数组织为一个单个向量。所以我用一个向量y(长度为2)表示(μ,σ)。在函数f 中,这个数组被解包并作为单独的参数传递给log.lklh.lnorm

    【讨论】:

    • 这是一个完美的答案。检查我的 excel 工具,它提供了相同的解决方案。非常感谢欧文!我发现 Optim 是一个非常令人困惑的函数。请您解释一下“par = c(3,1)”和 y[1]/y[2] 的作用?
    • 我会在答案中添加一些注释。
    • 啊,我认为它们可能是初始值。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    相关资源
    最近更新 更多