[R] wrapping mle()

Luke Tierney luke at stat.uiowa.edu
Wed Jan 3 16:49:20 CET 2007


On Sat, 30 Dec 2006, Sebastian P. Luque wrote:

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

No, since ll was defined at top level lexical scoping rules mean that
free variables in the definition of ll are top level variables,
regardless of where ll is called.

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

Not bad just not necessary. Calling fit.mle(ll ...) will do and you
then don't need match.call, which makes your code simpler.

Best,

luke

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

-- 
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:      luke at stat.uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu



More information about the R-help mailing list