From ggrothendieck at gmail.com  Fri Dec  7 14:32:26 2007
From: ggrothendieck at gmail.com (Gabor Grothendieck)
Date: Fri, 7 Dec 2007 08:32:26 -0500
Subject: [Rd] suggested modification to the 'mle' documentation?
In-Reply-To: <4759463E.3010904@biostat.ku.dk>
References: <4758338E.3080802@pdf.com> <47587F30.6020701@biostat.ku.dk>
	<971536df0712061512k47f89415v5146c61b346239b8@mail.gmail.com>
	<14206100.post@talk.nabble.com> <4759463E.3010904@biostat.ku.dk>
Message-ID: <971536df0712070532hb528e80oa04a60534a3e615b@mail.gmail.com>

On Dec 7, 2007 8:10 AM, Peter Dalgaard <P.Dalgaard at biostat.ku.dk> wrote:
> Ben Bolker wrote:
> >   At this point I'd just like to advertise the "bbmle" package
> > (on CRAN) for those who respectfully disagree, as I do, with Peter over
> > this issue.  I have added a data= argument to my version
> > of the function that allows other variables to be passed
> > to the objective function.  It seems to me that this is perfectly
> > in line with the way that other modeling functions in R
> > behave.
> >
> This is at least cleaner than abusing the "fixed" argument. As you know,
> I have reservations, one of which is that it is not a given that I want
> it to behave just like other modeling functions, e.g. a likelihood
> function might refer to more than one data set, and/or data that are not
> structured in the traditional data frame format. The design needs more
> thought than just adding arguments.
>
> I still prefer a design based a plain likelihood function. Then we can
> discuss how to construct such a function so that  the data are
> incorporated in a flexible way.  There are many ways to do this, I've
> shown one, here's another:
>
> > f <- function(lambda) -sum(dpois(x, lambda, log=T))
> > d <- data.frame(x=rpois(10000, 12.34))
> > environment(f)<-evalq(environment(),d)
> > mle(f, start=list(lambda=10))
>
> Call:
> mle(minuslogl = f, start = list(lambda = 10))
>
> Coefficients:
>  lambda
> 12.3402
>

The explicit environment manipulation is what I was referring to but
we can simplify it using proto.  Create a proto object to hold
f and x then pass the f in the proto object (rather than the
original f) to mle.  That works because proto automatically resets
the environment of f when its added to avoiding the evalq.

> set.seed(1)
> library(proto)
> f <- function(lambda) -sum(dpois(x, lambda, log=TRUE))
> p <- proto(f = f, x = rpois(100, 12.34))
> mle(p[["f"]], start = list(lambda = 10))

Call:
mle(minuslogl = p[["f"]], start = list(lambda = 10))

Coefficients:
  lambda
12.46000

> It is not at all an unlikely design to have mle() as a generic function
> which works on many kinds of objects, the default method being
> function(object,...) mle(minuslogl(obj)) and minuslogl is an extractor
> function returning (tada!) the negative log likelihood function.
> >   (My version also has a cool formula interface and other
> > bells and whistles, and I would love to get feedback from other
> > useRs about it.)
> >
> >    cheers
> >     Ben Bolker
> >
> >
>
>
> --
>
>   O__  ---- Peter Dalgaard             ?ster Farimagsgade 5, Entr.B
>  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
>  (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
> ~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)                  FAX: (+45) 35327907
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



[Rd] suggested modification to the 'mle' documentation?
Gabor Grothendieck