【问题标题】:optim function in R: L-BFGS-B needs finite values of 'fn'R中的优化函数:L-BFGS-B需要'fn'的有限值
【发布时间】:2015-07-20 08:50:18
【问题描述】:

我正在尝试将 R 中的 optim 函数用于三个变量的 MLE,但我不断收到错误消息: optim 中的错误(fn = logL_geotest5_test,par = c(0.2, 1.5, 0.3), I = I, : L-BFGS-B 需要 'fn' 的有限值

我试图了解此错误背后的原因,它似乎与超过 .Machine$double.xmax 的对数似然的最大值有关。

本代码是 Pelletier &Wei 提供的geometricVaR Backtesting Method 的一部分,我可以为您提供对数似然。但是,优化之前有效(有时没有),所以我认为这不是问题。如果你愿意,我可以为你提供 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
}

编辑1: 感谢您迄今为止的建议。我仍在寻找插入浏览器功能的正确位置。同时,我会给你 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。 Edit3:感谢您迄今为止的建议。我用 VaR 替换了任何 V,用 z 替换了 c。 VaR 是一个长度为 250 的计算风险价值向量。所有值大致在 -0.018 到 -0.024 左右。

【问题讨论】:

  • 您似乎在logL()optim() 中有浮点溢出,无法处理Inf,-Inf。没有logL(),我们只能猜测问题。
  • 请更新您的代码以使其可重现——重要的是我们可以运行您的代码并复制您的错误。阅读更多stackoverflow.com/questions/5963269/…
  • 不要给c赋值,尤其是当你想使用c()时。也找不到V。关注 josilber 的评论。
  • 谢谢您,我尝试在编辑中操作您的建议。不幸的是,我仍然遇到错误
  • @Simon 添加对数似然函数logL 很有帮助,我们仍然无法重现您的错误。运行发布的代码会产生:Error: object 'VaR' not found。请更新示例以使其可重现。

标签: r optimization mathematical-optimization


【解决方案1】:

我怀疑有人能猜出问题所在,但我可以告诉你如何自己调试:

使用类似的东西:

浏览器(expr=yourVariable==Inf)

在您的可能性代码中,以便您可以探索变量值并了解它出现的原因。查看此功能的帮助,在 R 中像往常一样非常有用。如果有错字,请随时编辑答案,我现在无法在 R 中查看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-23
    • 2023-04-05
    • 2017-02-06
    • 2021-09-29
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 2017-07-14
    相关资源
    最近更新 更多