使用函数'nlminb'时使用integrate()的非限定函数值

时间:2016-08-31 09:03:20

标签: r

我的目的是找出最佳参数。

首先,我有函数“func”,它产生5个参数的结果。 其次,我使用R的函数'nlminb'来找出最佳参数。 功能“func”似乎没问题。但是在运行'nlminb'之后我收到错误消息,消息是:integrate(function(u)){:non-finite function value}。 集成是函数“func”的一部分。如果它有错误,函数“func”不应该工作。但是,它工作正常。所以我不明白错误在哪里。

func<- function(params){

lambda<-params[1]
rho<-params[2]
eta<-params[3]
vbar<-params[4]
v<-params[5]

res <- function(k,t){
fj <- function(u, t, j){
  al <- -exp(log(u)+log(u))*(1/2) - exp(log(1i)+log(u))*(1/2) + exp(log(1i)+log(u))*j;
  bet <- lambda - rho*eta*exp(log(1i)+log(u))-rho*eta*j;
  gam <- eta^2/2;
  d <- sqrt(bet*bet - 4*al*gam);
  rp <- (bet + d)/(2*gam);
  rm <- (bet - d)/(2*gam);
  g <- rm / rp;
  D <- rm * (1 - exp(-d*t))/ (1 - g*exp(-d*t));
  C <- lambda * (rm * t - 2/eta^2 * log( (1 - g*exp(-(d*t)))/(1 - g) ) );
  return(exp(C*vbar + D*v));} 
x <- -k;
p1 <- 1/2+1/pi*integrate(function(u){Re(fj(u,t,1)*exp(1i*u*x)/(1i*u))},lower=0,upper=Inf,stop.on.error=FALSE)$value;
p0 <- 1/2+1/pi*integrate(function(u){Re(fj(u,t,0)*exp(1i*u*x)/(1i*u))},lower=0,upper=Inf,stop.on.error=FALSE)$value;
return(exp(k)*(exp(x)*p1-p0));
}
return(res);
}

我的初始参数是

 params<-c(1.15,-0.64,0.39,0.04,0.04)

为了运行函数'nlminb',我还应该定义目标函数,上下边界:

 lower<-c(0,-1,0,0,0)
 upper<-c(10,1,1,1,5)

目标函数是

 obj<-function(params)
 {
  re<-NULL
  for(i in 1:length(k))
  {re[i]<-func(params)(k[i],myExpiry[i])*2072-resDF$Mid[i]}
  return(sum(re^2))
  }

k,myExpiry和resDF $ Mid是导入的数据。 最后一步是运行'nlminb':

 nlminb(start=params,objective = obj,lower=lower,upper=upper)

提前感谢您的帮助!

0 个答案:

没有答案