optim in r :non finite finite difference error

11,948

The error you ran into is because ϕ becomes negative beyond a certain number of iterations (which indicates that the constraints are not being applied correctly by the algorithm). Also, the solution does not converge to a single value but jumps between a few small values before reaching a situation where the updated covariance matrix is no-longer positive definite. At that stage you get det(v) < 0 and log[det(v)] is undefined. The optim algorithm bails out at that stage.

To see what's happening, play with the maxit and ndeps parameters in the code below.

require("matrixcalc")

#-------------------------------------------------
# Log-likelihood function
#-------------------------------------------------
loglike <- function(phi, y) {

  # Shift the covariance matrix
  print(paste("phi = ", phi))
  #v = phi*I + (1 - phi)*C
  v = phi*I + C
  stopifnot(is.positive.definite(v))

  # Invert shifted matrix
  vi = solve(v)

  # Compute log likelihood
  loglike = -.5*(log(det(v)) + (t(y) %*% vi %*% y))
  print(paste("L = ", loglike))

  return(-loglike)
}

#-------------------------------------------------
# Data
#-------------------------------------------------
y = c(-0.01472, 0.03942, 0.03592, 0.02776, -9e-04) 
C =  structure(c(0.00166, -0.00012, -6.78e-06, 0.000102, -4e-05, -0.00012, 
                 0.001387, 7.9e-05, -0.00014, -8e-05, -6.78e-06, 7.9e-05, 
                 0.001416, -7e-05, 8.761e-06, 0.000102, -0.00014, -7e-05, 
                 0.001339, -6e-05, -4e-05, -8e-05, 8.761e-06, -6e-05, 0.001291), 
                 .Dim = c(5L, 5L ))

#--------
# Initial parameter
#--------
I = diag(5)
phi = 50

#--------
# Minimize
#--------
parm <- optim(par = phi, fn = loglike, y = y, NULL, hessian = TRUE, 
              method = "L-BFGS-B", lower = 0.0001, upper = 1000,
              control = list(trace = 3,
                             maxit = 1000,
                             ndeps = 1e-4) )
Share:
11,948

Related videos on Youtube

jack
Author by

jack

Updated on July 13, 2022

Comments

  • jack
    jack almost 2 years

    I have a simple likelihood function (from a normal dist with mean=0) that I want to maximize. optim keeps giving me this error: Error in optim(par = phi, fn = loglike, estimates = estimates, NULL, hessian = TRUE, : non-finite finite-difference value [1]

    Here is my data and likelihood function:

    y =  [ -0.01472  0.03942  0.03592 0.02776 -0.00090 ]
    
    C = a varcov matrix:
    
      1.66e-03 -0.000120 -6.780e-06  0.000102 -4.000e-05
    
     -1.20e-04  0.001387  7.900e-05 -0.000140 -8.000e-05
    
     -6.78e-06  0.000079  1.416e-03 -0.000070  8.761e-06
    
      1.02e-04 -0.000140 -7.000e-05  0.001339 -6.000e-05
    
     -4.00e-05 -0.000080  8.761e-06 -0.000060  1.291e-03
    

    my log likelihood function is: lglkl = -.5*(log(det(v)) + (t(y)%%vi%%y))` where v = phi*I + C and vi=inverse(v) and I= 5*5 Identity matrix.

    I am trying to get the mle estimate for "phi". I thought this would be a simple optimization problem but am struggling. Would really appreciate any help. Thanks in advance. My code is below:

    loglike <- function(phi,y) {
    
    v = phi*I + C
    vi = solve(v)
    loglike = -.5*(log(det(v)) + (t(y)%*%vi%*%y))
    return(-loglike)
    }
    
    phi = 0
    parm <- optim(par=phi,fn=loglike,y=y,NULL,hessian = TRUE, method="L-BFGS-B",lower=0,upper=1000)
    

    • Gregor Thomas
      Gregor Thomas over 8 years
      It would be awesome if you'd share your data (y and V) using valid R syntax. Using dput() works very well for this.