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.