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

Wed Sep 15 00:00:30 CEST 2010

```Bill,

I am not able to get this to work for tracking inside the gradient function:

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 <<- rbind(VALUE, val) # stash value
val
}
}

fr <- function(x) { ## Rosenbrock Banana function
x1 <- x[1]
x2 <- x[2]
100 * (x2 - x1 * x1)^2 + (1 - x1)^2
}

grr <- function(x) { ## Gradient of 'fr'
x1 <- x[1]
x2 <- x[2]
c(-400 * x1 * (x2 - x1 * x1) - 2 * (1 - x1), 200 * (x2 - x1 * x1))
}

o <- optim(c(-1.2, 1), fr, tfr <- trackFn(grr))
#with(environment(tfr), matplot(X, VALUE, type="l"))
with(environment(tfr), plot(X, type="l"))

What is wrong here?

Ravi.

____________________________________________________________________

Assistant Professor,
Division of Geriatric Medicine and Gerontology
School of Medicine
Johns Hopkins University

Ph. (410) 502-2619

----- Original Message -----
From: William Dunlap <wdunlap at tibco.com>
Date: Tuesday, September 14, 2010 5:38 pm
Subject: RE: [R] Can I monitor the iterative/convergence process while	using Optim or MaxLik?
Cc: r-help at r-project.org

> 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
>  > [ 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)
>  > 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
>  > `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
>  >
>  >
>  > Hope this helps,
>  > Ravi.
>  >
>  > ____________________________________________________________________
>  >
>  > 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
>  > >  >
>  > >  > guide.html
>  > >  > and provide commented, minimal, self-contained,
>  > reproducible code.
>  > >
>  > >  ______________________________________________
>  > >  R-help at r-project.org mailing list
>  > >
>  > >  and provide commented, minimal, self-contained, reproducible code.
>  >
>  > ______________________________________________
>  > R-help at r-project.org mailing list
>  >