[R] Can I monitor the iterative/convergence process while using Optim or MaxLik?

William Dunlap wdunlap at tibco.com
Tue Sep 14 23:38:16 CEST 2010


You can also save the objective (or gradient) function
arguments and values in datasets so you can later plot
or print them.  E.g., the following lets you avoid hand
editing the objective function to do this.  If you wanted
to track the gradient, replace th c(VALUE,val) with
rbind(VALUE,val).  (Either would be ok with the objective.)

trackFn <- function (fn) {
    # return function like fn that stashes its
    # inputs and outputs in local datasets.
    X <- NULL
    VALUE <- NULL
    force(fn)
    function(x) {
        X <<- rbind(X, x) # stash arguments
        val <- fn(x)
        VALUE <<- c(VALUE, val) # stash value
        val
    }
}

Typical usage would be

> fr <- function(x) { ## Rosenbrock Banana function 
+ x1 <- x[1] 
+ x2 <- x[2] 
+ 100 * (x2 - x1 * x1)^2 + (1 - x1)^2 
+ } 
> o <- optim(c(-1.2, 1), tfr <- trackFn(fr))
> with(environment(tfr), matplot(X, VALUE, type="l"))
> with(environment(tfr), plot(X, type="l"))

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com  

> -----Original Message-----
> From: r-help-bounces at r-project.org 
> [mailto:r-help-bounces at r-project.org] On Behalf Of Ravi Varadhan
> Sent: Tuesday, September 14, 2010 2:19 PM
> To: Greg Snow
> Cc: r-help at r-project.org
> Subject: Re: [R] Can I monitor the iterative/convergence 
> process while using Optim or MaxLik?
> 
> This is generally not the best way to do it for the following 
> reasons.   
> 
> The objective function may be evaluated multiple times within 
> a single iteration, for various reasons including (i) 
> gradient evaluation when analytic gradient is not specified, 
> and (ii) during line-search stretgy for steplength 
> determination.  Therefore, embedding a `cat' or `print' 
> statement inside the objective function may generate a lot of 
> noise.  You can run your suggested `optim' example to verify this!
> 
> A better approach is to embed the `cat' statement inside the 
> gradient function, in addition to using the `trace' and 
> `REPORT' arguments, which are integers in `optim'.  Here is 
> the `optim' example that you suggested:
> 
> fr <- function(x) { ## Rosenbrock Banana function 
> x1 <- x[1] 
> x2 <- x[2] 
> 100 * (x2 - x1 * x1)^2 + (1 - x1)^2 
> } 
> 
> grr.print <- function(x) { ## Gradient of 'fr' 
> cat("pars: ", x, '\n')
> flush.console()
> x1 <- x[1] 
> x2 <- x[2] 
> c(-400 * x1 * (x2 - x1 * x1) - 2 * (1 - x1), 200 * (x2 - x1 * x1)) 
> } 
> 
> > optim(c(-1.2,1), fr, grr.print, method = "BFGS", 
> control=list(trace=1, REPORT=1)) 
> 
> This prints out both parameter values and the function value 
> at each iteration.
> 
> This approach cannot, however, be used in `optim' when 
> analytic gradient is not available (or for derivative free 
> methods, e.g. Nelder-Mead).  
> 
> 
> 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: Greg Snow <Greg.Snow at imail.org>
> Date: Tuesday, September 14, 2010 4:27 pm
> Subject: Re: [R] Can I monitor the iterative/convergence 
> process while	using Optim or MaxLik?
> To: Sally Luo <shali623 at gmail.com>, "r-help at r-project.org" 
> <r-help at r-project.org>
> 
> 
> > The simple way to do this is just to rewrite your function to be 
> > optimized to print out the current values that it was called with, 
> > this way you will see where it is and what it is doing.  
> Look at the 
> > cat function for how to print the values, also look at the 
> > flush.console function.
> >  
> >  For example you could take the 1st example on the optim 
> help page and 
> > insert the following 2 lines as the 1st 2 lines of the f function:
> >  
> >  cat(x, '\n')
> >  flush.console()
> >  
> >  and then at each iteration you can see the values tried.
> >  
> >  -- 
> >  Gregory (Greg) L. Snow Ph.D.
> >  Statistical Data Center
> >  Intermountain Healthcare
> >  greg.snow at imail.org
> >  801.408.8111
> >  
> >  
> >  > -----Original Message-----
> >  > From: r-help-bounces at r-project.org [
> >  > project.org] On Behalf Of Sally Luo
> >  > Sent: Tuesday, September 14, 2010 1:50 PM
> >  > To: r-help at r-project.org
> >  > Subject: [R] Can I monitor the iterative/convergence 
> process while
> >  > using Optim or MaxLik?
> >  > 
> >  > Hi R-helpers,
> >  > 
> >  > Is it possible that I have the estimates from each 
> step/iteration shown
> >  > on
> >  > the computer screen in order to monitor the process 
> while I am using
> >  > Optim
> >  > or MaxLik?
> >  > 
> >  > Thanks for your help.
> >  > 
> >  > Maomao
> >  > 
> >  > 	[[alternative HTML version deleted]]
> >  > 
> >  > ______________________________________________
> >  > R-help at r-project.org mailing list
> >  > 
> >  > PLEASE do read the posting guide 
> >  > guide.html
> >  > and provide commented, minimal, self-contained, 
> reproducible code.
> >  
> >  ______________________________________________
> >  R-help at r-project.org mailing list
> >  
> >  PLEASE do read the posting guide 
> >  and provide commented, minimal, self-contained, reproducible code.
> 
> ______________________________________________
> R-help at 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.
> 



More information about the R-help mailing list