【问题标题】:R: Error in is.nloptr(ret) : objective in x0 returns NAR:is.nloptr(ret) 中的错误:x0 中的目标返回 NA
【发布时间】:2023-03-19 17:45:01
【问题描述】:

我正在尝试使用 nloptr 包来找到最大化非线性函数 F=b0+b1*x+b2*x^2+b3*x^3 的最佳 x 值。

我将以下代码与 apply() 函数一起使用,以便循环遍历回归数据帧的每一行,并为每一行获取函数的最佳值:

F <- function(x,b0,b1,b2,b3){return(b0+b1*x+b2*x^2+b3*x^3)}
Optimal <- apply(Regression,1,function(i){
                  nloptr( x0 <- c(0)
                         ,eval_f <- F
                         ,eval_g_ineq = NULL
                         ,eval_g_eq = NULL
                         ,eval_grad_f = NULL
                         ,eval_jac_g_ineq = NULL
                         ,eval_jac_g_eq = NULL
                         ,lb <- c(-Inf)
                         ,ub <- c(Inf)
                         ,opts <- list( "algorithm" = "NLOPT_LD_AUGLAG",
                                        "xtol_rel" = 1.0e-7,
                                        "maxeval" = 1000)
                         ,b0=Regression$b0[i]
                         ,b1=Regression$b1[i]
                         ,b2=Regression$b2[i]
                         ,b3=Regression$b3[i])})

代码为 b0,b1,b2,b3 值调用的回归数据帧具有以下格式:

Tag bo b1 b2 b3
A   5  6  1  3
B   8  8  7  3
C   9  2  7  5
D   1  6  1  3
E   3  6  2  1
..  .. .. .. ..

运行脚本时出现以下错误:

Error in is.nloptr(ret) : objective in x0 returns NA
In addition: Warning message:
In if (is.na(f0)) { :

【问题讨论】:

    标签: r optimization nonlinear-optimization


    【解决方案1】:

    如果您还打算访问函数内的项目,则不应使用 apply 传递“回归”行。当applyRegression 强制为单一类型时,也会出现问题。它将是字符而不是数字。相反,它应该是:

    library(nloptr)
    F <- function(x,b0,b1,b2,b3){return(b0+b1*x+b2*x^2+b3*x^3)}
    Optimal <- apply(Regression[-1],     #removes first column
                                     1, function(i){   # i-variable gets values
                      nloptr( x0 <- c(0)
                             ,eval_f <- F
                             ,eval_g_ineq = NULL
                             ,eval_g_eq = NULL
                             ,eval_grad_f = NULL
                             ,eval_jac_g_ineq = NULL
                             ,eval_jac_g_eq = NULL
                             ,lb <- c(-Inf)
                             ,ub <- c(Inf)
                             ,opts <- list( "algorithm" = "NLOPT_LD_AUGLAG",
                                            "xtol_rel" = 1.0e-7,
                                            "maxeval" = 1000)
                             ,b0=i[1]
                             ,b1=i[2]
                             ,b2=i[3]
                             ,b3=i[4])})
    

    使用您的“回归”对象进行测试。 (我担心在尝试使用三次多项式时是否会有最小值或最大值。)不幸的是,您选择了不一致的参数:

    Error in is.nloptr(ret) : 
      A gradient for the objective function is needed by algorithm NLOPT_LD_AUGLAG 
    but was not supplied.
    

    不过,计算多项式的梯度应该不会有太大困难。

    构造梯度函数后,我现在得到:

    grad_fun <- function(x,b0,b1,b2,b3) { b1 + x*b2/3 +x^2*b3/3 }
    > F <- function(x, b0,b1,b2,b3){return(b0+b1*x+b2*x^2+b3*x^3)}
    > Optimal <- apply(Regression[-1],     
    +                                  1, function(i){   
    +                   nloptr( x0 <- c(0)
    +                          ,eval_f <- F
    +                          ,eval_g_ineq = NULL
    +                          ,eval_g_eq = NULL
    +                          ,eval_grad_f = grad_fun
    +                          ,eval_jac_g_ineq = NULL
    +                          ,eval_jac_g_eq = NULL
    +                          ,lb <- c(-Inf)
    +                          ,ub <- c(Inf)
    +                          ,opts <- list( "algorithm" = "NLOPT_LD_AUGLAG",
    +                                         "xtol_rel" = 1.0e-7,
    +                                         "maxeval" = 1000)
    +                          ,b0=i[1]
    +                          ,b1=i[2]
    +                          ,b2=i[3]
    +                          ,b3=i[4])})
    Error in is.nloptr(ret) : 
      The algorithm NLOPT_LD_AUGLAG needs a local optimizer; specify an algorithm and termination condition in local_opts
    

    在我看来,我已经让你克服了几个障碍,所以这还不是一个真正的答案,但它似乎很有用,而且评论太长了。

    编辑;将算法更改为"algorithm" = "NLOPT_LD_LBFGS" 的进一步实验使代码运行没有错误,但据我所知,4 次运行所有返回的列表都带有$ message : chr "NLOPT_FAILURE: Generic failure code."。我的猜测是优化三次多项式通常会在没有约束的情况下失败,我在您的问题规范中没有看到。

    【讨论】:

    • 非常感谢。事实上,约束是我在克服你成功帮助我的障碍后打算添加的东西。非常感谢您的努力。非常感谢您的详细回复。
    猜你喜欢
    • 2017-09-06
    • 2021-07-05
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    相关资源
    最近更新 更多