【发布时间】:2016-06-20 14:25:14
【问题描述】:
我正在尝试优化 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的最大值接近参数值 --> 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正试图最小化,并且会达到一个非常小的值,函数返回最小值)
【问题讨论】:
-
谢谢。我使用了
optim(par = theta, fn = EMV, data = data, method = "Brent", lower = 0, upper = 1E5),结果得到了 1E5。看来,优化是最小化区间内的函数。 -
请将您的评论表述为我很乐意接受的答案。非常感谢。
-
当然...慢慢来。我的问题已经解决了。
标签: r optimization