1
votes

I am trying to use the optim function in R for a MLE of three variables, but i keep getting the error: Error in optim(fn = logL_geotest5_test, par = c(0.2, 1.5, 0.3), I = I, : L-BFGS-B needs finite values of 'fn'

I am trying to understand the reasons behind this error and it seems to be related to the maximal value of loglikelihood beeing beyond .Machine$double.xmax.

This Code is part of the geometricVaR Backtesting Method provided by Pelletier &Wei and i can provide you with the loglikelihood. However, optimization worked ( and occasionally didnt) before, so i assume that this is not the problem. If you wish, i can provide you with the formular for the LL, but it is a long code ( and i wanted to keep this post as short as possible).

I am thankful for any suggestions and ideas.

V is a vector of 250 values.

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: Thank you for your advises so far. I am still looking for the right place to insert the Browser function. Meanwhile I'll give you the LL-function:

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: Forgot to mention that V is a vector of Value-At-Risk computations, therefore beeing small values of around -0.02. Edit3:Thank you for your suggestions so far. I replaced any V by the VaR and c by z. VaR is a vector of computed Value-at-risks of length 250. All values are roughly around -0.018 to -0.024.

1
You seem to have a floating-point overflow in logL() and optim() cant handle Inf,-Inf. Without logL() we can only guess about the problem.J.R.
Please update your code to be reproducible -- it's important that we can run your code and replicate your error. Read more at stackoverflow.com/questions/5963269/…josliber
Don't assign values to c, especially when you want to use c(). Also V is not found. Follow the comment by josilber.J.R.
Thank you, i tried to operate your suggestions within the edits. Unfortunaltly, i am still confronted with the errorSimon
@Simon while adding the log likelihood function logL was helpful, we still can't reproduce your error. Running the code as posted yields: Error: object 'VaR' not found. Please update the example to make it reproducible.josliber

1 Answers

0
votes

I doubt anybody can guess what the issue is but I can tell you how to debug it yourself:

Use something like:

browser(expr=yourVariable==Inf)

in your likelihood code so that you can explore the variables values and understand why it comes up. Check the help of this function, very helpful as usual in R. Feel free to edit the answer if there is some typo, I cannot check it in R right now.