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