dmurdoch@pair.com
2004-Jul-14 16:25 UTC
[Rd] Re: [R] constrOptim and function with additional parameters? (PR#7088)
I've moved this from r-help to r-bugs. If you reply, please be careful that replies go to the right place: r-bugs if your comment is specifically about the bug (and it contains the PR# in the subject that will be added when this is cc'd to r-devel), r-devel if general discussion, not both. On Wed, 14 Jul 2004 10:01:45 -0400, "Roger D. Peng" <rpeng@jhsph.edu> wrote :>Actually, I think this is a bug. Take a look at this part of constrOptim:This is the problem all right, but it's a little tricky to fix. The problem is that "..." is documented as being additional parameters to pass through to optim(). You don't want to pass all of those to f(), only the ones that don't match optim()'s arg list. (And that has to be done carefully, because of partial argument matching.) I don't know of other cases where we edit the "..." list before passing it onwards. Are there any?> > > constrOptim >function (theta, f, grad, ui, ci, mu = 1e-04, control = list(), > method = if (is.null(grad)) "Nelder-Mead" else "BFGS", >outer.iterations = 10 >0, > outer.eps = 1e-05, ...) >{ > if (!is.null(control$fnscale) && control$fnscale < 0) > mu <- -mu > [...] > obj <- f(theta) > ^^^^^^^^^^^^^^^ > r <- R(theta, theta) > for (i in 1:outer.iterations) { > obj.old <- obj > r.old <- r > [...] >} > >So the object function `f' is called on the starting value `theta' but >the `...' is not passed through. > >-roger > >Duncan Murdoch wrote: >> On Wed, 14 Jul 2004 14:59:01 +0200 (MEST), "Marlene Mueller" >> <Marlene.Mueller@gmx.de> wrote : >> >> >>>How can I use a function with some additional input parameters >>>in constrOptim? For example, something like >>> >>>fr <- function(x,a) { ## Rosenbrock Banana function >>> x1 <- x[1] >>> x2 <- x[2] >>> a * (x2 - x1 * x1)^2 + (1 - x1)^2 >>>} >>> >>>where the optimum is to be found w.r.t. x. Calling >>>optim(c(-1.2,1), fr, NULL, a=100) works as expected, but I fail >>>to provide the a=100 in the constrained case: >>> >>> >>>> constrOptim(c(-1.2,0.9), fr, NULL, ui=rbind(c(-1,0),c(0,-1)), >>> >>>ci=c(-1,-1),a=100) >>>Error in f(theta) : Argument "a" is missing, with no default >>> >>>Is this a bug or is there a different solution that I miss here? >> >> >> I can't spot why your use of constrOptim isn't working, but you should >> be able to workaround it by doing something like this: >> >> applyDefaults <- function(fn, ...) { >> function(x) fn(x, ...) >> } >> >> constrOptim(c(-1.2,0.9), applyDefaults(fr, a=100), NULL, >> ui=rbind(c(-1,0),c(0,-1)),ci=c(-1,-1)) >> >> The applyDefaults function creates a new function which evaluates the >> old one with some of the parameters set to fixed values. >> >> Duncan Murdoch >> >> ______________________________________________ >> R-help@stat.math.ethz.ch mailing list >> https://www.stat.math.ethz.ch/mailman/listinfo/r-help >> PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >>