Your function is very irregular, so the optim is likely to return local minima rather than global minima.

Try different methods (SANN, CG, BFGS) and see if you get the result you need. As with all numerical optimsation, I would check the sensitivity of the results to starting values.


Nikhil Kaza
Asst. Professor,
City and Regional Planning
University of North Carolina

nikhil.l...@gmail.com

On Jun 26, 2010, at 4:27 PM, Derek Ogle wrote:

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@r-project.org mailing list
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.

______________________________________________
R-help@r-project.org mailing list
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.

Reply via email to