gpt4 book ai didi

r - optim() 错误 : searching for global minimum for a univariate function

转载 作者:行者123 更新时间:2023-12-03 16:48:28 25 4
gpt4 key购买 nike

我正在尝试优化 R 中的一个函数

该函数是仅估计 mu 参数时负二项式的似然函数。这应该不是问题,因为该函数显然只有一个最大值。但是,我无法达到理想的结果。

需要优化的功能是:

EMV <- function(data, par) {

Mi <- par
Phi <- 2
N <- NROW(data)

Resultado <- log(Mi/(Mi + Phi))*sum(data) + N*Phi*log(Phi/(Mi + Phi))
return(Resultado)
}

数据是负二项式变量的向量,参数为2和2

data <- rnegbin(10000, mu = 2, theta = 2)

当我使用以下代码绘制具有 mu 作为变量的函数时:

x <- seq(0.1, 100, 0.02)
z <- EMV(data,0.1)
for (aux in x) {z <- rbind(z, EMV(data,aux))}
z <- z[2:NROW(z)]
plot(x,z)

我得到以下曲线:

Generated Curve

并且z的最大值接近于参数值--> 2

x[which.max(z)]

但优化不适用于 BFGS

Error in optim(par = theta, fn = EMV, data = data, method = "BFGS") : 
non-finite finite-difference value [1]

并且不会使用 SANN 来正确计算值,例如:

$par
[1] 5.19767e-05

$value
[1] -211981.8

$counts
function gradient
10000 NA

$convergence
[1] 0

$message
NULL

问题是:

  1. 我做错了什么?
  2. 有没有办法告诉 optim 参数应该大于 0?
  3. 有没有办法告诉 optim 我要最大化函数? (我担心 optim 正在尝试最小化并且会变成一个非常小的值,函数返回最小值)

最佳答案

最小化还是最大化?

虽然 ?optim 说它可以做最大化,但那是在括号里,所以默认是最小化:

fn: A function to be minimized (or maximized) ...

因此,如果我们想最大化一个目标函数,我们需要将一个-1乘以它,然后最小化它。这是很常见的情况。在统计中,我们经常想找到最大对数似然,因此要使用 optim(),我们别无选择,只能最小化负对数似然。

使用哪种方法?

如果我们只做一维最小化,我们应该使用方法"Brent"。此方法允许我们指定搜索区域的下限和上限。搜索将从一个边界开始,并向另一个边界搜索,直到达到最小值或到达边界。这样的规范可以帮助您限制参数。比如你不希望mu小于0,那么就设置lower = 0即可。

当我们移动到二维或更高维度时,我们应该求助于“BFGS”。在这种情况下,如果我们想限制我们的参数之一,比如 a,为正数,我们需要进行对数变换 log_a = log(a),并重新参数化我们的目标函数使用 log_a。现在,log_a 不受约束。当我们希望将多个参数约束为正数时也是如此。

如何更改代码?

EMV <- function(data, par) {

Mi <- par
Phi <- 2
N <- NROW(data)

Resultado <- log(Mi/(Mi + Phi))*sum(data) + N*Phi*log(Phi/(Mi + Phi))
return(-1 * Resultado)
}

optim(par = theta, fn = EMV, data = data, method = "Brent", lower = 0, upper = 1E5)

关于r - optim() 错误 : searching for global minimum for a univariate function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37738423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com