R optim() L-BFGS-B needs finite values of 'fn' - Weibull

前端 未结 1 1684
感动是毒
感动是毒 2021-01-16 20:16

I try to estimate the three parameters a, b0 and b1 with the optim() function. But I always get the error: Error in optim(par = c(1, 1, 1), fn = logweibull, me

1条回答
  •  梦毁少年i
    2021-01-16 21:07

    You may also consider

    (1) passing the additional data variables to the objective function along with the parameters you want to estimate.

    (2) passing the gradient function (added the gradient function)

    (3) the original objective function can be further simplified (as below)

    logweibull <- function (v,t,d,X) {
      a <- v[1] 
      b0 <- v[2] 
      b1 <- v[3] 
      sum(d*(1+a*log(t)+b0+X*b1) - t^a*exp(b0+X*b1) + log(a/t)) # simplified function
    }
    
    grad.logweibull <- function (v,t,d,X) {
      a <- v[1] 
      b0 <- v[2] 
      b1 <- v[3] 
      c(sum(d*log(t) - t^a*log(t)*exp(b0+X*b1) + 1/a), 
        sum(d-t^a*exp(b0+X*b1)),
        sum(d*X - t^a*X*exp(b0+X*b1)))
    }
    
    optim(par=c(1,1,1), fn = logweibull, gr = grad.logweibull,
          method = "L-BFGS-B",
          lower = c(0.1, 0.1,0.1), 
          upper = c(100, 100,100),
          control = list(fnscale = -1), 
          t=t, d=d, X=X)
    

    with output

    $par
    [1] 0.2604334 0.1000000 0.1000000
    
    $value
    [1] -191.5938
    
    $counts
    function gradient 
          10       10 
    
    $convergence
    [1] 0
    
    $message
    [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
    

    Also, below is a comparison between the convergence of with and without gradient function (with finite difference). With an explicit gradient function it takes 9 iterations to converge to the solution, whereas without it (with finite difference), it takes 126 iterations to converge.

    0 讨论(0)
提交回复
热议问题