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 中复制它。我尝试了上述代码的各种版本,包括:
- 将输入最小值和输入最大值设置为特定值,例如分别为 1 和 100,000。
- Optim() 调用顺序,即输入 x、par 和 fn 顺序)
非常感谢任何帮助,谢谢!
戴夫
我想你想优化一个只有两个参数的函数。所以,我们可以这样做:
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)
回复评论中进一步问题的注释:
par = c(3,1)
的作用是什么?这有两个功能。 (1) 是初始点(猜测)。 (2) 它确定要优化的参数数量。在这种情况下,这是 2。请注意,您可以(并且应该)计算出非常好的初始值。只需计算平均值和样本标准差,您就可以获得 μ 和 σ 的非常好的估计值。 (在统计中,这有时称为 method of moments
)这将使 optim
的任务变得容易得多。因此,我们真正应该做的不是 par=c(3,1)
:par = c(mean(x),sd(x))
.
y[1]/y[2]
是做什么的?。 optim
函数将所有要优化的参数组织为 单个向量 。所以我用单个向量 y
(长度为 2)表示 (μ,σ)。在函数 f
中,这个数组被解包并作为单独的参数传递给 log.lklh.lnorm
。
我正在尝试在 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 中复制它。我尝试了上述代码的各种版本,包括:
- 将输入最小值和输入最大值设置为特定值,例如分别为 1 和 100,000。
- Optim() 调用顺序,即输入 x、par 和 fn 顺序)
非常感谢任何帮助,谢谢!
戴夫
我想你想优化一个只有两个参数的函数。所以,我们可以这样做:
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)
回复评论中进一步问题的注释:
par = c(3,1)
的作用是什么?这有两个功能。 (1) 是初始点(猜测)。 (2) 它确定要优化的参数数量。在这种情况下,这是 2。请注意,您可以(并且应该)计算出非常好的初始值。只需计算平均值和样本标准差,您就可以获得 μ 和 σ 的非常好的估计值。 (在统计中,这有时称为method of moments
)这将使optim
的任务变得容易得多。因此,我们真正应该做的不是par=c(3,1)
:par = c(mean(x),sd(x))
.y[1]/y[2]
是做什么的?。optim
函数将所有要优化的参数组织为 单个向量 。所以我用单个向量y
(长度为 2)表示 (μ,σ)。在函数f
中,这个数组被解包并作为单独的参数传递给log.lklh.lnorm
。