0

在发布之前我确实在这里搜索了问题,我在这方面只发现了一个问题,但这不适用于我的情况。

我已经上传了 、 和 的数据,PRD并带有以下链接,这些链接将用于重现代码:INJtaolambda

珠三角

英杰

拉姆达

编码:

PRD=read.csv(file="PRD.csv")
INJ=read.csv(file="INJ.csv")
PRD=do.call(cbind, PRD)
INJ=do.call(cbind, INJ)
tao=do.call(cbind, read.csv(file="tao.csv",header=FALSE))
lambda=do.call(cbind, read.csv(file="lambda.csv",header=FALSE))
fn1 <- function (tao,lambda) {
#perparing i.dash  
  i.dash=matrix(ncol=ncol(INJ), nrow=(nrow(INJ)))
  for (i in 1:ncol(INJ)){
     for (j in 1:nrow (INJ)){
      temp=0
      for (k in 1:j){
        temp=(1/tao[i])*exp((k-j)/tao[i])*INJ[k,i]+temp
      }
      
      i.dash[j,i]=temp
     }
  
  #preparing lambdaXi.dash
  
  lambda.i=matrix(ncol=ncol(INJ),nrow=nrow(INJ))
 for (i in 1: ncol(INJ)){
   lambda.i[,i]=lambda[i+1]*i.dash[,i]
 }
  
 #calc. q. hat (I need to add the pp term)
 q.hat=matrix(nrow=nrow(INJ),1 )
  for (i in 1:nrow(INJ)){
    q.hat[i,1]=sum(lambda.i[i,1:ncol(INJ)])
  target= sum((PRD[,1]-q.hat[,1])^2)
   }
  }
}

我要做的是target通过优化来最小化该值,lambda并且tao起始值将与上面上传的值相同。我曾经optim这样做,但我仍然收到错误cannot coerce type 'closure' to vector of type double

我使用了许多变体,optim但仍然收到相同的错误。

我使用的最后一个语法是optim(fn1, tao=tao, lambda=lambda, hessian=T)

谢谢

4

1 回答 1

1

的调用形式optim

optim(par, fn, gr = NULL, ...,
      method = c("Nelder-Mead", "BFGS", "CG", "L-BFGS-B", "SANN",
             "Brent"),
      lower = -Inf, upper = Inf,
      control = list(), hessian = FALSE)

所以,你需要先传递参数,而不是函数。请注意,“闭包”是“函数”的另一个术语,它解释了错误消息:当optim预期初始参数值时,您已将函数作为第一个参数传递。

还要注意,optim这只优化了函数的第一个参数fn,所以你需要重新设计你的函数fn1,使它只需要一个函数。例如,它可以是单个向量 where 的组件和组件的形式c(n, t1, t2,...,tn, l1, l2, l3, ... lm)titao告诉lilambdan多少组件tao

于 2013-08-14T10:59:34.783 回答