[R] nlminb error

Bert Gunter bgunter.4567 at gmail.com
Sun Apr 9 19:18:49 CEST 2017


I suspect, as you hinted,  there's little to no hope that anyone will
be willing or able to navigate your code. **Usually** (whatever that
means!)  these sorts of problems can be traced back to
overparameterization -- too few data, which could also mean a lot of
"correlated" data, chasing too many parameters (leading to ridges in
the surface or problems near the boundaries). This is the bane of
numerical optimizers.

Try fitting simpler models with fewer parameters if possible, at least
to see if convergence can be achieved.  Better starting values, other
optimizers, and/or use of analytical gradients and hessians can also
sometimes help.

Sorry I can't be more specific. Perhaps someone more knowledgeable
than I can be.

Cheers,
Bert


Bert Gunter

"The trouble with having an open mind is that people keep coming along
and sticking things into it."
-- Opus (aka Berkeley Breathed in his "Bloom County" comic strip )


On Sat, Apr 8, 2017 at 5:21 PM, Rodrigo Andres Cristancho Castellanos
<cristanchocc at gmail.com> wrote:
> 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]]
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list