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

2010-09-14 Thread Ravi Varadhan
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: rvarad...@jhmi.edu


- Original Message -----
From: William Dunlap 
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 , Greg Snow 
Cc: r-help@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-boun...@r-project.org 
>  > [ On Behalf Of Ravi Varadhan
>  > Sent: Tuesday, September 14, 2010 2:19 PM
>  > To: Greg Snow
>  > Cc: r-help@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.
>  > 
>  > 

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

2010-09-14 Thread William Dunlap
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-boun...@r-project.org 
> [mailto:r-help-boun...@r-project.org] On Behalf Of Ravi Varadhan
> Sent: Tuesday, September 14, 2010 2:19 PM
> To: Greg Snow
> Cc: r-help@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: rvarad...@jhmi.edu
> 
> 
> - Original Message -
> From: Greg Snow 
> 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 , "r-help@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.s...@imail.org
> >  801.408.8111
> >  
> >  
> >  > -Original Message-
> >  > From: r-help-boun...@r-project.org [
> >  > project.org] On Behalf Of Sally Luo
> >  > Sent: Tuesday, September 14, 2010 1:50 PM
> >  > To: r-help@r-project.org
> >  > Subject: [R] Can I monitor the iterative/convergence 
> process while
> >  &

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

2010-09-14 Thread Ravi Varadhan
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: rvarad...@jhmi.edu


----- Original Message -
From: Greg Snow 
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 , "r-help@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.s...@imail.org
>  801.408.8111
>  
>  
>  > -Original Message-
>  > From: r-help-boun...@r-project.org [
>  > project.org] On Behalf Of Sally Luo
>  > Sent: Tuesday, September 14, 2010 1:50 PM
>  > To: r-help@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@r-project.org mailing list
>  > 
>  > PLEASE do read the posting guide 
>  > guide.html
>  > and provide commented, minimal, self-contained, reproducible code.
>  
>  __
>  R-help@r-project.org mailing list
>  
>  PLEASE do read the posting guide 
>  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.


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

2010-09-14 Thread Arne Henningsen
On 14 September 2010 21:49, Sally Luo  wrote:

> 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?
>

You can call maxLik() with argument "print.level" set to a value larger than
0.

/Arne

-- 
Arne Henningsen
http://www.arne-henningsen.name

[[alternative HTML version deleted]]

__
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.


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

2010-09-14 Thread Greg Snow
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.s...@imail.org
801.408.8111


> -Original Message-
> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-
> project.org] On Behalf Of Sally Luo
> Sent: Tuesday, September 14, 2010 1:50 PM
> To: r-help@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@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.