R: is.nloptr(ret) 中的错误:x0 returns 中的 objective NA
R: Error in is.nloptr(ret) : objective in x0 returns NA
我正在尝试使用 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)) { :
如果您还打算访问函数内的项目,则不应使用 apply
传递 "Regression" 行。当 apply
强制 Regression
为单一类型时也会出现问题。它将是字符而不是数字。相反,它应该是:
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])})
已使用您的 "Regression" 对象进行测试。 (我担心尝试使用三次多项式时是否会有最小值或最大值。)不幸的是,您选择了不一致的参数:
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."
。我的猜测是,优化三次多项式通常会在没有约束的情况下失败,我在您的问题说明中看到 none。
我正在尝试使用 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)) { :
如果您还打算访问函数内的项目,则不应使用 apply
传递 "Regression" 行。当 apply
强制 Regression
为单一类型时也会出现问题。它将是字符而不是数字。相反,它应该是:
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])})
已使用您的 "Regression" 对象进行测试。 (我担心尝试使用三次多项式时是否会有最小值或最大值。)不幸的是,您选择了不一致的参数:
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."
。我的猜测是,优化三次多项式通常会在没有约束的情况下失败,我在您的问题说明中看到 none。