首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R中的Optim()函数

R中的Optim()函数
EN

Stack Overflow用户
提问于 2022-01-12 08:43:45
回答 2查看 447关注 0票数 0

我正在尝试使用R的optim()函数来优化具有绑定的函数的参数。下面是函数:函数,因为mathjax不工作。下面的代码片段是我实现的它的日志-似然函数,即这里

代码语言:javascript
运行
复制
likelihood_levy <- function(params, x){
  mu <- params[1]
  sigma <- params[2]
  n <- length(x)

  ans <- ((1.5 * n) * log(sigma)) +
      sum(log(1 / (x - mu))) -
      (n * log(sqrt(2*pi) * sigma)) - 
      (0.5 * sigma * sum(1 / (x - mu)))
  }

  return(ans)
}

optim(c(-10, 2), likelihood_levy, x = sample1, method="L-BFGS-B",
      lower = c(min(sample1) - 0.001, 0))

如何向函数定义中添加参数边界?例如,第一个参数必须小于x,第二个参数不应该低于0。

注意:如果我使用optim()函数的“L B”方法,我会得到一个错误:“L B需要‘fn’的有限值”--任何解决这个问题的方法都会很好!

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-12 13:37:25

有许多问题:

  1. 返回语句之前有一个多余的右大括号。
  2. 即使更低的值确保x- mu是正的,当计算数值梯度时,我们仍然会遇到问题,所以使用导数自由方法(我们在下面做的),或者向optim提供一个梯度函数。
  3. optim计算最小值,但我们需要的是最大的可能性,而不是最小的可能性。告诉optim最大化(我们在下面做的),或者使用负日志可能性而不是日志可能性。
  4. 起始值应该是可行的,即在满足mu < min(x)的约束条件下,可以计算出对数似然并产生一个有限值。
  5. 我们需要处理mu < min(x)不成立的情况。
  6. sample1不见了,所以我们不能重现问题中的问题。

修复我们所有的这些

代码语言:javascript
运行
复制
likelihood_levy <- function(params, x){
  mu <- params[1]
  sigma <- params[2]
  n <- length(x)
  ans <- if (mu >= min(x)) -Inf
    else ((1.5 * n) * log(sigma)) +
      sum(log(1 / (x - mu))) -
      (n * log(sqrt(2*pi) * sigma)) - 
      (0.5 * sigma * sum(1 / (x - mu)))
  return(ans)
}

set.seed(123)
sample1 <- rnorm(25)
st <- c(min(sample1) - 0.001, 1)
res <- optim(st, likelihood_levy, x = sample1, control = list(fnscale = -1))

str(res)

给予

代码语言:javascript
运行
复制
List of 5
 $ par        : num [1:2] -2.25 1.61
 $ value      : num -46.6
 $ counts     : Named int [1:2] 45 NA
  ..- attr(*, "names")= chr [1:2] "function" "gradient"
 $ convergence: int 0
 $ message    : NULL
票数 0
EN

Stack Overflow用户

发布于 2022-01-12 09:46:03

问题是,函数likelihood_levy要么返回大于.Machine$double.xmax的值,要么在函数中发生除法。这条线可能是罪魁祸首:

代码语言:javascript
运行
复制
sum(log(1 / (x - mu))) 

如果x等于或非常接近mu,就会出现问题。您可以添加一些防御代码来检查这一点。然而:

第一个参数必须小于x。

我不认为optim有办法做到这一点

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70678537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档