R中的优化函数:L-BFGS-B需要有限值'fn'

时间:2015-05-09 13:53:45

标签: r optimization mathematical-optimization

我正在尝试使用R中的optim函数来获取三个变量的MLE,但我一直得到错误:optim中的错误(fn = logL_geotest5_test,par = c(0.2,1.5,0.3),I = I, :   L-BFGS-B需要有限值'fn'

我试图理解这个错误背后的原因,它似乎与loglikelihood超出的最大值有关.Machine $ double.xmax。

本规范是Pelletier& Wei提供的geometricVaR Backtesting方法的一部分,我可以为您提供对数似然。然而,之前优化工作(偶尔也没有),所以我认为这不是问题。如果你愿意,我可以为你提供LL的公式,但这是一个很长的代码(我希望尽可能缩短这篇文章)。

我感谢任何建议和想法。

V是250个值的向量。

N<-100
iTest<-mat.or.vec(250,N)
iTest<-replicate(n=N,rbinom(n= 250, size=1, prob = 0.01))

LL_H0<-mat.or.vec(1,N)
for(i in 1:N){
I<-iTest[,i]
logL_gtest<-function(Omega,I,VaR){
  a=Omega[1]; b=Omega[2]; z=Omega[3]
  logL(I,a,b,z,VaR)
}
lower_boundary<- c(1e-8,0,0); upper_boundary<-rep(1,2,2)
LL_H0help <- optim(fn=logL_gtest, par=c(0.2, 1.5,0.3), I=I,VaR=VaR, lower=lower_boundary, upper=upper_boundary, method= "L-BFGS-B")
LL_H0[,i] <- LL_H0help$value
}

EDIT1: 感谢您的建议到目前为止。我仍在寻找插入浏览器功能的正确位置。同时我会给你LL功能:

logL<-function(I,a,b,z,VaR){
  m <- sum(I)
  v<-which(I == 1)
  v<-c(0,v,250) 
  d<-c(diff(v))
  if(a<0 | a>=1 | b<0 | b>1 | z<0 | (m-1)<3){logL<-NA 
  }else{
    s<-rep(0,length(d))
    f<-rep(0,length(d))
    for(i in 1:length(d)){ 
      lambda<-mat.or.vec(length(d),1)
      lambda<- function(a, b, z, d, VaR){
        lambda <- a*ds^(b-1)*(exp(-z*(VaR1))) 
        return(lambda)
      }

      VaR1<-VaR[(v[i]+1):v[i+1]]
      ds<-seq(1:d[i])

      lhelp<-lambda(a, b, z, ds,  VaR1)
      lhelp<-na.omit(lhelp)
      lf<-c(1-lhelp[1:(length(lhelp)-1)], lhelp[length(lhelp)]) 
      f[i]<-prod(lf) 

      ls<-c(1-lhelp[1:(length(lhelp)-1)])
      s[i]<-prod(ls)
    } 

    part1 <- ifelse(d[1]>0,log(s[1]), log(f[1]) )
    part2 <- sum(log(f[2:(length(d)-1)])) 
    part3 <- ifelse(d[length(d)]<250,log(s[length(d)]),    log(f[length(d)]))

    logL <- part1 + part2 + part3
    return(-logL)

  }
}

Edit2:忘了提到V是价值风险计算的向量,因此大约为-0.02的小值。 编辑3:感谢您的建议到目前为止。我用VaR替换了任何V,用z替换了c。 VaR是计算出的长度为250的风险值的向量。所有值大致在-0.018到-0.024左右。

1 个答案:

答案 0 :(得分:0)

我怀疑任何人都可以猜出问题是什么,但我可以告诉你如何自己调试它:

使用类似:

  

浏览器(表达式= yourVariable == Inf文件)

在您的似然代码中,以便您可以探索变量值并理解其出现的原因。检查这个功能的帮助,像往常一样在R中非常有用。如果有一些错字,可以随意编辑答案,我现在无法在R中查看。