[R] nlminb error

Rodrigo Andres Cristancho Castellanos cristanchocc at gmail.com
Sun Apr 9 02:21:00 CEST 2017


Hi, I´m having troubel using nlminb this is the warning that shows up.

Warning: Cholesky factorization 'dpotrf' exited with status: 1
Variance of the prediction error can not be computed.
Warning: Cholesky factorization 'dpotrf' exited with status: 1
Determinant of the variance of the prediction error can not be computed.

I´m trying to optimize a likelihood function. The code is a little messy,
you can find it at the end of the email.

I´ll appreciate any kind of help.

Regards.

Rodrigo Cristancho.



library(foreach)
library(FKF)
library(ggplot2)
library(gridExtra)

# Model setup
#3 Factor Independent Model

delta1<- c(0.006, 0.003, 0.007)
kappa <- c(0.001, 0.002, 0.004)
sigma <- c(0.002, 0.005, 0.003)
rc    <- c(0.00002)
r1    <- c(0.00002)
r2    <- c(0.5)

#All other parameters
T         <- 110  # years
delta_t   <- 1 # monthly zeros observations
dt        <- 1 # monthly r simulations
n         <- T/dt # number of r simulations
r_0       <- delta1
measurement_error <- 0.001 # for zero-coupon rates
m         <- length(delta1)   # dimension of state variables
# maturity  <- c(1/12 ,1/4, 1/2, 10) # zeros for 1 factor simulation
# maturity  <- c(1/12 ,1/4, 1/2, 1, 2, 3, 5, 7, 10) # zeros for 2 factor
simulation

maturity  <- 61-xc #
d         <- length(maturity)   # dimension of observations
N         <- T/delta_t # number of observations
premubar1=list(premubar)

# PARAMETER ESTIMATION
# ----------------------------------------------------------
# Random initialization of parameters
init_params_if <- function()
{
  delta1_init <<- runif(m, min=0.0, max=0.05)
  kappa_init <<- runif(m, min=0.0, max=0.05)
  sigma_init <<- runif(m, min=0.0, max=0.05)
  rc_init <<- runif(1, min=0.0, max=0.001)
  r1_init <<- runif(1, min=0.0, max=0.001)
  r2_init <<- runif(1, min=0.0, max=0.001)
}
# optimization parameter bounds

upper_bound <- c(rep(c(1.0, 1.0, 1.0, 1.0),each=m), rep(0.1,d))
lower_bound <- c(rep(c(0.0001, 0.0001, 0.0001,-1.0 ),each=m), rep(0.0001,d))
actual_param <- c(kappa=kappa, delta1=delta1, sigma=sigma, rc=rep(rc,1),
r1=rep(r1,1), r2=rep(r2,1))

#
#------------------------------------------------------------------------------------------------------------
#


#Kalman Filter for 3 Factor Indipendent Model
Ind_Fact_KF <- function(delta1, kappa, sigma, rc, r1, r2, observations)
{
  # initial state variable (a0: m x 1)
  #r_init <- as.vector(delta1)                    # unconditional mean of
state variable

  r_init <- as.vector(c(rep(0,m)))

  # variance of state variable (P0: m x m)
  #P_init <- (sigma^2/(2*(delta1^3)))*diag(1,m,m)   # unconditional
variance of state variable

  P_init <- (sigma^2/(2*(delta1)))*diag(1,m,m)

  # intercept of state transition equation (dt: m x 1)
  C <- matrix(0,nrow = m,ncol = 1)

  # factor of transition equation (Tt: m x m x 1)
  F_ <- array(exp(-kappa*delta_t)*diag(m),dim=c(m,m,1))

  # factor of measurement equation (Zt: d x m x 1)
  B <-
array(1/matrix(rep(delta1,d),d,byrow=TRUE)*(1-exp(-matrix(rep(delta1,d),d,byrow=TRUE)
* matrix(rep(maturity,m),d))),dim=c(d,m,1))

  # intercept of measurement equation (ct: d x 1)

  A <-
(1/2)*t(sigma^2/delta1^3)%*%t(((1/2)*(1-exp(-2*(matrix(rep(delta1,d),d,byrow=TRUE)*matrix(rep(maturity,m),d)))))

 -2*(1-exp(-2*(matrix(rep(delta1,d),d,byrow=TRUE)*matrix(rep(maturity,m),d))))
          -(matrix(rep(delta1,d),d,byrow=TRUE)*matrix(rep(maturity,m),d)))

  A <- matrix(-t(A)/maturity,nrow=length(maturity))

  B <- array(B[,,1]/matrix(rep(maturity,m),d),dim=c(d,m,1))

  # variance of innovations of transition (HHt: m x m x 1)
  Q <-
array(sigma^2/(2*kappa)*(1-exp(-2*kappa*delta_t))*diag(m),dim=c(m,m,1))

  # variance of measurement error (GGt: d x d x 1)

  R <- array(diag(d)*(rc+r1*exp(r2)),dim=c(d,d,1))
  #R <- array(diag(d)*(rc),dim=c(d,d,1))

  ##Funcion de filtro de Kalman rapido con base al desarrollo del modelo
arriba
  filtered_process <- fkf(a0=r_init, P0=P_init, dt=C, ct=A, Tt=F_, Zt=B,
HHt=Q, GGt=R, yt=observations)
  return(filtered_process)
}

#aaaa=fkf(a0=r_i(nit, P0=P_init, dt=C, ct=A, Tt=F_, Zt=B, HHt=Q, GGt=R,
yt=t(premubar))
aaaa=Ind_Fact_KF(delta1, kappa, sigma, rc, r1, r2,observations=t(premubar))
aaaa$logLik
aaaa$Ft

# Retrieve short rates using Kalman Filter
retrieve_short_rates_if <- function(rates, optim_controls,
lower_bound=NULL, upper_bound=NULL)
{
  observations <- rates
  init_params_if()
  initial_param <<- c(delta1=delta1_init,kappa=kappa_init,
sigma=sigma_init, rc=rc_init, r1=r1_init, r2=r2_init)

  if_KF_loglik <- function(x)
  {
    delta1 <- x[1:m]; kappa <- x[(m+1):(2*m)]; sigma <- x[(2*m+1):(3*m)];
rc <- x[(3*m+1):(3*m+1)]; r1 <- x[(3*m+2):(3*m+2)];r2 <-
x[(3*m+3):length(x)]
    return(-Ind_Fact_KF(delta1,kappa,sigma,rc,r1,r2,observations)$logLik)
  }

  # optimization of log likelihood function
  fitted_model <- nlminb(initial_param, if_KF_loglik,
control=optim_controls, lower=lower_bound, upper=upper_bound)
  return(fitted_model)
}

rrif=retrieve_short_rates_if(rates=t(premubar),optim_controls=optim_controls,upper=upper_bound,lower=lower_bound)

	[[alternative HTML version deleted]]



More information about the R-help mailing list