[R] optim() not finding optimal values

Ravi Varadhan rvaradhan at jhmi.edu
Sun Jun 27 06:41:19 CEST 2010


Derek,

The problem is that your function is poorly scaled.   You can see that the parameters vary over 10 orders of magnitude (from 1e-04 to 1e06).   You can get good convergence once you properly scale your function.  Here is how you do it:

par.scale <- c(1.e06, 1.e06, 1.e-06, 1.0)
 
SPoptim <- optim(pars, SPsse, B=d$catch, CPE=d$cpe, control=list(maxit=1500, parscale=par.scale))

> SPoptim
$par
          B0            K            q            r 
7.329553e+05 1.160097e+06 1.484375e-04 4.050476e-01 

$value
[1] 1619.487

$counts
function gradient 
    1401       NA 

$convergence
[1] 0

$message
NULL


Hope this helps,
Ravi.

____________________________________________________________________

Ravi Varadhan, Ph.D.
Assistant Professor,
Division of Geriatric Medicine and Gerontology
School of Medicine
Johns Hopkins University

Ph. (410) 502-2619
email: rvaradhan at jhmi.edu


----- Original Message -----
From: Derek Ogle <DOgle at northland.edu>
Date: Saturday, June 26, 2010 4:28 pm
Subject: [R] optim() not finding optimal values
To: "R (r-help at R-project.org)" <r-help at r-project.org>


> I am trying to use optim() to minimize a sum-of-squared deviations 
> function based upon four parameters.  The basic function is defined as 
> ...
>  
>  SPsse <- function(par,B,CPE,SSE.only=TRUE)  {
>    n <- length(B)                             # get number of years of 
> data
>    B0 <- par["B0"]                            # isolate B0 parameter
>    K <- par["K"]                              # isolate K parameter
>    q <- par["q"]                              # isolate q parameter
>    r <- par["r"]                              # isolate r parameter
>    predB <- numeric(n)
>    predB[1] <- B0
>    for (i in 2:n) predB[i] <- predB[i-1]+r*predB[i-1]*(1-predB[i-1]/K)-B[i-1]
>    predCPE <- q*predB
>    sse <- sum((CPE-predCPE)^2)
>    if (SSE.only) sse
>      else list(sse=sse,predB=predB,predCPE=predCPE)
>  }
>  
>  My call to optim() looks like this
>  
>  # the data
>  d <- data.frame(catch= 
> c(90000,113300,155860,181128,198584,198395,139040,109969,71896,59314,62300,65343,76990,88606,118016,108250,108674), 
> cpe=c(109.1,112.4,110.5,99.1,84.5,95.7,74.1,70.2,63.1,66.4,60.5,89.9,117.0,93.0,116.6,90.0,105.1))
>  
>  pars <- c(800000,1000000,0.0001,0.17)                   # put all 
> parameters into one vector
>  names(pars) <- c("B0","K","q","r")                      # name the parameters
>  ( SPoptim <- optim(pars,SPsse,B=d$catch,CPE=d$cpe) )    # run optim()
>  
>  
>  This produces parameter estimates, however, that are not at the 
> minimum value of the SPsse function.  For example, these parameter 
> estimates produce a smaller SPsse,
>  
>  parsbox <- c(732506,1160771,0.0001484,0.4049)
>  names(parsbox) <- c("B0","K","q","r")        
>  ( res2 <- SPsse(parsbox,d$catch,d$cpe,SSE.only=FALSE) )
>  
>  Setting the starting values near the parameters shown in parsbox even 
> resulted in a movement away from (to a larger SSE) those parameter values.
>  
>  ( SPoptim2 <- optim(parsbox,SPsse,B=d$catch,CPE=d$cpe) )    # run optim()
>  
>  
>  This "issue" most likely has to do with my lack of understanding of 
> optimization routines but I'm thinking that it may have to do with the 
> optimization method used, tolerance levels in the optim algorithm, or 
> the shape of the surface being minimized.
>  
>  Ultimately I was hoping to provide an alternative method to fisheries 
> biologists who use Excel's solver routine.
>  
>  If anyone can offer any help or insight into my problem here I would 
> be greatly appreciative.  Thank you in advance.
>  
>  ______________________________________________
>  R-help at r-project.org mailing list
>  
>  PLEASE do read the posting guide 
>  and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list