【问题标题】:How to optimize a function that contains an integral in R or Python?如何优化包含 R 或 Python 中的积分的函数?
【发布时间】:2025-12-18 07:00:02
【问题描述】:

第一次在这里提出问题,但绝对受益于浏览其他问题的所有惊人答案。

所以,问题是我正在尝试通过 R 中的 MLE 优化函数(或者 Python 也可以),并且函数的一部分是包含我正在估计的参数的积分。函数如下所示:

The log-likelihood function

其中,F(w) 是对数正态分布的 CDF,其均值和 sigma 未知,lambda 和 eta 也是如此。所有其他参数都是已知的,包括 w*。我尝试使用 R 中的 mle 命令估计此函数。但由于不可分割的部分,它无法通过。谁可以帮我这个事?我的代码如下。非常感谢!

Definitions of f(w) and F(w)

我的代码不起作用:

  func <- function(mu, sigma_w){
F_w = (-.5*(((log(w_star)-mu)/sigma_w))^2)

}

ll <- function(lambda,sigma_w,eta,mu) {
  R <- N*log(lambda) + N_u*log(1/sqrt(2*pi)*exp(integrate(func,lower = -Inf, upper = w_star, rel.tol=1e-5)$value)) - lambda*1/sqrt(2*pi)*exp(integrate(func,lower = -Inf, upper = w_star, rel.tol=1e-5)$value)*sum(T_ui) + N_u*log(eta) + sum(log(1/(sigma_w*w_i)*1/sqrt(2*pi)*exp(-.5*((log(w_i-mu)/sigma_w)^2)))) - N*log(eta+lambda*1/sqrt(2*pi)*exp(integrate(integrate(func,lower = -Inf, upper = w_star, rel.tol=1e-5)$value)))
  return(R)                           
}

fit <-mle(ll,start = list(lambda =0, sigma_w = 0, eta =0, mu = 0))

错误信息:

Error in f(x, ...) : argument "sigma_w" is missing, with no default 

【问题讨论】:

    标签: python r function optimization integral


    【解决方案1】:

    这是在 R 中使用闭包(返回函数的函数)的一个很好的例子。它们正好为 MLE 服务,用你的值试试这个代码:

    
    library(stats4)
    
    ll <- function(lambda, eta, sigma_w, mu, w_start, w_i, N, N_u )
    {
      # fix the others params
      w_start <- w_start
      mu <- mu
      T_ui <- T_ui #your sample
      w_i <- w_i #another sample
      sigma_w <- sigma_w
      N <- N
      N_u <- N_u 
      #return another funtion
      function(lambda, eta)
      {
        F_star <- log( plnorm( q = w_star,
                               meanlog = mu, sdlog = sigma_w) ) 
        ll.scalar <- N * lambda + N_u*log( F_star) - lambda * F_star * sum(T_ui) +
          N_u* log(eta) + sum( log( dlnorm(x = w_i))) - N * log(eta + F_star)
    
        return(-ll.scalar) # negative for use in stats4::mle
      }
    }
    
    # your values example
    w_star <- 1
    mu <- 1
    T_ui <- c(1,2,3) #your sample
    w_i <- c(1,2,3)/10 #another sample
    sigma_w <- 1
    N <- 1 
    N_u <- 1 
    # You build the function with the closure
    myLL <- ll(lambda , eta, sigma_w , mu, w_star , w_i , N, N_u  )
    
    
    # now optimitation 
    
    result <- mle(myLL, start= list(lambda=0,  eta=0))
    result
    
    ```
    

    【讨论】:

    • 非常感谢您的帮助。该对数正态分布的均值和方差是未知的,因此应与 lambda 和 eta 一起估计它们。你能重新考虑你的答案吗?我知道这应该非常接近。谢谢!
    • 另外,我在调用 MLE 函数时收到以下错误消息: optim(start, f, method = method, hessian = TRUE, ...) 中的错误:'vmmin' 中的初始值为不是有限另外:警告消息:在日志(F_star)中:产生了NaN希望你也可以考虑一下。
    • 这是一个类似的案例。您能否编辑您的问题并给出您正在使用的样本?w_star、N、N_u 的值以及向量 T_ui 和 w_i