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 <[EMAIL PROTECTED]> 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
>>
>> ______________________________________________
>> [email protected] 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.
>>
>
> ______________________________________________
> [email protected] 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:      [EMAIL PROTECTED]
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu

______________________________________________
[email protected] 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.

Reply via email to