rpeng@jhsph.edu
2004-Jul-14 16:38 UTC
[Rd] Re: [R] constrOptim and function with additional parameters? (PR#7089)
Okay, looking at the docs, then it's not a bug, since the "..." argument is not actually documented as "other arguments passed to f or grad". However, that *is* how it's document in `optim', so one can see how this might cause some confusion. Now, it's not clear to me which other arguments need to be passed to `optim' except perhaps `hessian'. Am I missing something? -roger Duncan Murdoch wrote:> 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 >>> > > >