[R] Can I monitor the iterative/convergence process whileusing Optim or MaxLik?
Ravi Varadhan
rvaradhan at jhmi.edu
Wed Sep 15 04:27:18 CEST 2010
Yes, of course! The Nelder-Mead is derivative-free.
Thanks,
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: William Dunlap <wdunlap at tibco.com>
Date: Tuesday, September 14, 2010 6:15 pm
Subject: RE: RE: [R] Can I monitor the iterative/convergence process whileusing Optim or MaxLik?
To: Ravi Varadhan <rvaradhan at jhmi.edu>
Cc: Greg Snow <greg.snow at imail.org>, r-help at r-project.org
> I think the default method for optim never evaluates
> the gradient function: VALUE and X are both NULL in
> your example. Also o$counts shows NA for the gradient
> entry. Use method="BGFS":
>
> > o <- optim(c(-1.2, 1), fr, tfr <- trackFn(grr), method="BFGS")
> > with(environment(tfr), str(VALUE))
> num [1:43, 1:2] -215.6 136.42 56.44 10.27 9.35 ...
> - attr(*, "dimnames")=List of 2
> ..$ : chr [1:43] "val" "val" "val" "val" ...
> ..$ : NULL
>
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
> > -----Original Message-----
> > From: Ravi Varadhan [
> > Sent: Tuesday, September 14, 2010 3:01 PM
> > To: William Dunlap
> > Cc: Greg Snow; r-help at r-project.org
> > Subject: Re: RE: [R] Can I monitor the iterative/convergence
> > process whileusing Optim or MaxLik?
> >
> > 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.
> >
> > ____________________________________________________________________
> >
> > 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: 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?
> > To: Ravi Varadhan <rvaradhan at jhmi.edu>, Greg Snow
> > <greg.snow at imail.org>
> > 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)
> > > > 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
> > > >
> > > > PLEASE do read the posting guide
> > > >
> > > > and provide commented, minimal, self-contained,
> > reproducible code.
> > > >
> >
More information about the R-help
mailing list