[Rd] feature request: optim() iteration of functions that return multiple values
Enrico Schumann
e@ @end|ng |rom enr|co@chum@nn@net
Fri Aug 4 10:22:03 CEST 2023
On Thu, 03 Aug 2023, Sami Tuomivaara writes:
> Dear all,
>
> I have used optim a lot in contexts where it would
> useful to be able to iterate function myfun that, in
> addition to the primary objective to be minimized
> ('minimize.me'), could return other values such as
> alternative metrics of the minimization, informative
> intermediate values from the calculations, etc.
>
> myfun <- function()
> {
> ...
> return(list(minimize.me = minimize.me, R2 = R2, pval = pval, etc.))
> }
>
> During the iteration, optim could utilize just the first value from the myfun return list; all the other values calculated and returned by myfun could be ignored by optim.
> After convergence, the other return values of myfun
> could be finally extracted and appended into the optim
> return value (which is a list) as additional entry
> e.g.: $aux <- list(R2, pval, etc.), (without
> 'minimize.me' as it is already returned as $value).
>
> The usual ways for accessing optim return values, e.g.,
> $par, $value, etc. are not affected. Computational
> cost may not be prohibitive either. Is this feasible
> to consider?
>
If you only wish to store additional information, you could do
so with an environment, without changing optim. For instance,
like so (using the first example from ?optim):
data <- new.env()
data$i <- 0
data$fun.value <- numeric(1000)
fr <- function(x, data) { ## Rosenbrock Banana function
x1 <- x[1]
x2 <- x[2]
ans <- 100 * (x2 - x1 * x1)^2 + (1 - x1)^2
data$i <- data$i + 1
data$fun.value[data$i] <- ans
ans
}
optim(c(-1.2,1), fr, data = data)
## $par
## [1] 1.000260 1.000506
##
## $value
## [1] 8.825241e-08
##
## $counts
## function gradient
## 195 NA
##
## ....
data$i
## 195
plot(data$fun.value[1:data$i])
--
Enrico Schumann
Lucerne, Switzerland
http://enricoschumann.net
More information about the R-devel
mailing list