0

投稿する前にここで質問を検索しましたが、この点に関して1つの質問しか見つかりませんでしたが、私の場合には当てはまりません.

PRDINJtaoおよびのデータを以下のリンクにアップロードしましたlambda。これを使用してコードを再現します。

PRD

インジ

ラムダ

タオ

コード:

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、最適化によって値を最小限に抑えることlambdataoあり、開始値は上記でアップロードされた値と同じになります。以前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たとえば、c(n, t1, t2,...,tn, l1, l2, l3, ... lm)where tiare the componentstaoおよびlicomponents ofという形式の単一のベクトルであり、コンポーネントの数lambdan示しますtao

于 2013-08-14T10:59:34.783 に答える