我正在尝试在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)
我得到以下曲线:
z的最大值接近参数值 - &gt; 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
问题是:
optim
该参数应该大于0? optim
我想要最大化这个功能? (我担心optim
正在尝试最小化,并且在函数返回最小值的情况下会变为非常小的值)。答案 0 :(得分:3)
最小化还是最大化?
尽管?optim
表示它可以进行最大化,但是它位于括号中,因此最小化是默认值:
fn: A function to be minimized (or maximized) ...
因此,如果我们想要最大化目标函数,我们需要将-1
乘以它,然后将其最小化。这是一种非常普遍的情况。在统计数据中,我们经常希望找到最大对数似然,因此要使用optim()
,我们别无选择,只能最小化负对数似然。
使用哪种方法?
如果我们只进行1D最小化,我们应该使用方法"Brent"
。此方法允许我们指定搜索区域的下限和上限。搜索将从一个边界开始,向另一个边界搜索,直到达到最小值,或者到达边界。这样的规范可以帮助您约束您的参数。例如,您不希望mu
小于0,然后只需设置lower = 0
。
当我们转向2D或更高维度时,我们应该求助于"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)
答案 1 :(得分:0)
optim
的帮助文件说:&#34;默认情况下,optim执行最小化,但如果控制$ fnscale为负,它将最大化。&#34;因此,如果您将函数输出乘以-1或更改控制对象输入,您应该得到正确的答案。