优化2组可变长度向量

时间:2013-08-14 09:54:12

标签: r optimization

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

我已使用以下链接上传了PRDINJtaolambda的数据,这些链接将用于重现代码:

PRD

INJ

lambda

tao

代码:

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)
   }
  }
}

我要做的是通过优化targetlambda来最小化值tao,其中起始值与上面上传的值相同。我已使用optim这样做但仍收到错误cannot coerce type 'closure' to vector of type double

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

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

由于

1 个答案:

答案 0 :(得分: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,因此它只需要一个函数。例如,它可以是单个向量,其中c(n, t1, t2,...,tn, l1, l2, l3, ... lm)形式titao的{​​{1}}和li组件lambda和{{1}的组件}}告诉你n有多少组件。