[R] wrapping mle()

Sebastian P. Luque spluque at gmail.com
Sat Dec 30 23:42:42 CET 2006


On Sat, 30 Dec 2006 15:46:01 -0600 (CST),
Luke Tierney <luke at stat.uiowa.edu> wrote:

> 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

Thanks Luke, this looks excellent.


> 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.

In the real case, I need to provide two different log likelihood
functions, and then tell fit.mle() which one to use in a given call.  I
was actually defining 'x' and 'y' as formal arguments to fit.mle().
Wouldn't that ensure that the original ll() would refer to the correct
variables?  In any case, it was easy to use your suggestion almost by
direct analogy, which makes the code much more readable.  Thanks a lot.

In the case I describe though, why would it be a bad idea to use a string
to refer to the function, and then use match.fun()?  I actually picked up
the idea from functions such as apply() and friends.


> 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.

Keeping the lexical scoping technique you showed in mind should help stay
away from that.


Cheers,

-- 
Seb



More information about the R-help mailing list