[R] wrapping mle()

Luke Tierney luke at stat.uiowa.edu
Sat Dec 30 22:46:01 CET 2006


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
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>>
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>

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