R Optim() 函数:截断对数正态最大似然估计(求解 mu 和 sd)

R Optim() function: Truncated Log-normal Maximum Likelihood Estimation (solve for mu and sd)

我正在尝试在 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(取决于输入的最大值和最小值)。但是,我似乎无法在 R 中复制它。我尝试了上述代码的各种版本,包括:

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

戴夫

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

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)

回复评论中进一步问题的注释:

  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