我在发布之前就在这里搜索了一些问题,我在这方面只发现了一个问题,但它并不适用于我的情况。
我已使用以下链接上传了PRD
,INJ
,tao
和lambda
的数据,这些链接将用于重现代码:
代码:
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)
由于
答案 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)
形式ti
是tao
的{{1}}和li
组件lambda
和{{1}的组件}}告诉你n
有多少组件。