It is much cleaner to do this sort of thing with lexical scope. For
example,
mkll <- function(x, y) {
function(ymax=15, xhalf=6) {
-sum(stats::dpois(y, lambda=ymax/(1+x/xhalf), log=TRUE))
}
}
creates a log-likelihood likelyhood function for data x,y that can
then be used by
fit.mle <- function(mkfun, x, y) {
loglik.fun <- mkfun(x, y)
mle(loglik.fun, method="L-BFGS-B", lower=c(0, 0))
}
as in
> fit.mle(mkll, x=0:10, y=c(26, 17, 13, 12, 20, 5, 9, 8, 5, 4, 8))
Call:
mle(minuslogl = loglik.fun, method = "L-BFGS-B", lower = c(0,
0))
Coefficients:
ymax xhalf
24.999420 3.055779
It is not clear why you want to be able to pass ll as a character
string or why you want to assume that the thing passed in will refer
to variables named 'x' and 'y', both usually bad ideas, so this
specific approach may not apply, but something variant should.
The ability to use environment(f)<-env to change the environment of a
function is one of the most dubious language features of R (maybe the
most dubious, though there are a couple of other strong contenders)
and should not be used except in very rare circumstances.
Best,
luke
On Sat, 30 Dec 2006, Gabor Grothendieck wrote:
Add the line marked ### so that the environment of loglik.fun is reset to
the environment within fit.mle so that it can find y there:
library(stats4)
ll <- function(ymax=15, xhalf=6) {
-sum(stats::dpois(y, lambda=ymax/(1+x/xhalf), log=TRUE))
}
fit.mle <- function(FUN, x, y) {
loglik.fun <- match.fun(FUN)
environment(loglik.fun) <- environment() ###
mle(loglik.fun, method="L-BFGS-B", lower=c(0, 0))
}
fit.mle("ll", x=0:10, y=c(26, 17, 13, 12, 20, 5, 9, 8, 5, 4, 8))
On 12/30/06, Sebastian P. Luque <spluque at gmail.com> wrote:
Hi,
How can we set the environment for the minuslog function in mle()? The
call in this code fails because the "ll" function cannot find the object
'y'. Modifying from the example in ?mle:
library(stats4)
ll <- function(ymax=15, xhalf=6) {
-sum(stats::dpois(y, lambda=ymax/(1+x/xhalf), log=TRUE))
}
fit.mle <- function(FUN, x, y) {
loglik.fun <- match.fun(FUN)
mle(loglik.fun, method="L-BFGS-B", lower=c(0, 0))
}
fit.mle("ll", x=0:10, y=c(26, 17, 13, 12, 20, 5, 9, 8, 5, 4, 8))
How should "fit.mle" be constructed so that "ll" works on the appropriate
environment? Thanks in advance for any advice on this.
--
Seb