R中的nlminb有什么问题吗?

时间:2018-09-12 05:08:56

标签: r optimization

我正在尝试使用nlminb作为统计问题的一部分来解决R中的最小化问题。但是,将nlminb提供的解决方案与我要最小化的函数图进行比较时,出现了问题。这是目标函数的R代码

library(cubature)
Objective_Function <- function(p0){
    F2 <- function(x){
        u.s2 <- x[1]
        u.c0 <- x[2]
        u.k0 <- x[3]
        s2 <- u.s2^(-1) - 1
        c0 <- u.c0^(-1) - 1
        k0 <- u.k0/p0
        L <- 1/2 * c0 * s2 - 1/c0 * log(1 - k0 * p0)
        A <- 1 - pnorm(L, mean = 1, sd = 1)
        A <- A * dgamma(k0, shape = 1, rate = 1)
        A <- A * dgamma(c0, shape = 1, rate = 1)
        A <- A * dgamma(s2, shape = 1, rate = 1)
        A * u.s2^(-2) * u.c0^(-2) * 1/p0
        }

    Pr <- cubature::adaptIntegrate(f = F2, 
        lowerLimit = rep(0, 3),
        upperLimit = rep(1, 3))$integral

    A <- 30 * Pr * (p0 - 0.1)
    B <- 30 * Pr * (1 - Pr) * (p0 - 0.1)^2
    0.4 * B + (1 - 0.4) * (-A)
    }

遵循R命令

curve(Objective_Function, 0.1, 4)

一个人观察到接近2的临界点。但是,当一个人执行时

nlminb(start = runif(1, min = 0.1, max = 4), 
    objective = Objective_Function,
    lower = 0.1, upper = 4)$par

该函数的最小值发生在0.6755844点。

我想知道你能否告诉我我的错误在哪里。 有没有可靠的R指令来解决优化问题?

如果这是一个非常基本的问题,我深表歉意。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

问题不是nlminb(),而是您尚未在curve()中提供矢量化函数这一事实。您可以使用以下代码获得正确的数字,从中您可以看到nlminb()确实找到了最小值:

min_par <- nlminb(start = runif(1, min = 0.1, max = 4), 
                  objective = Objective_Function,
                  lower = 0.1, upper = 4)$par

vec_Objective_Function <- function (x) sapply(x, Objective_Function)
curve(vec_Objective_Function, 0.1, 4)
abline(v = min_par, lty = 2, col = 2)

此外,对于单变量优化,您还可以使用函数optimize(),即

optimize(Objective_Function, c(0.1, 4))