如何通过调用R中的另一个函数的优化函数传递常数参数



我试图最小化一个函数,在概念上类似于:

minim<-function(a,b,state){
if(state=="TRUE"){out<-2*a^2+b}else{out<-2*a^3-b}
return(out) }

我这样调用GenSA(我希望只优化ab,而不优化state):

upper_limits<-c(10,10)
lower_limits<-c(-10,-10)
params<-c(1,1)
minim<-function(a,b,state){
  if(state=="TRUE"){out<-2*a^2+b}else{out<-2*a^3-b}
  return(out)
  }
minim_state_TRUE_fit<-GenSA(par=params,function(params) minim(params[1],params[2]), 
                      lower=lower_limits, upper=upper_limits, 
                      control=list(max.time=100),state="TRUE")

得到的错误是:

Error in fn(par, ...) : unused argument (state = "TRUE")

GenSA应该能够接受额外的参数,它将传递给被调用的函数。由于某种原因,state="TRUE"似乎没有被传递给minim。我写错了吗?我没能找到GenSA使用的一个例子,其中一个额外的参数被用来检查我的R语法。

您正在优化函数function(params) minim(params[1],params[2])。这个函数不包含参数state。你可以这样修改:

minim <- function(a, b, state) {
  if (state) {
    out <- 2 * a^2 + b
  } else {
    out<-2 * a^3 - b
  }
  return(out)
}
fn = function(params, state) minim(params[1],params[2], state)
minim_state_TRUE_fit<-GenSA(par=params,fn = fn, 
                            lower=lower_limits, upper=upper_limits, 
                            control=list(max.time=100), state = TRUE)

还注意我将state = "TRUE"更改为state = TRUE。如果您将其用于逻辑测试,则最好尽可能将其更改为逻辑测试。

如果您想将命名参数传递给函数,则需要提供接受它们的正式参数,因此在fn参数定义和minim调用中放入"dots":

minim_state_TRUE_fit<-GenSA(par=params,fn=function(params, ...) {     
                                                minim(params[1],params[2], ...) }, 
                            lower=lower_limits, upper=upper_limits, 
                            control=list(max.time=100), state="TRUE")

最新更新