Peter Dalgaard wrote:
Ben Bolker <[EMAIL PROTECTED]> writes:
*** Changed type of fullcoef from "numeric" to "list", and return fullcoef rather than unlist(fullcoef) from mle [couldn't see a rationale for this -- it destroys a lot of the information in fullcoef *and* is a pain, say, when the fixed arguments include a data frame with lots of information in it]
Wait a minute. How can a likelihood function have an argument that is
a data frame? I think you're abusing the fixed arguments if you use it
to pass in data. The natural paradigm for that would be to pass data
via a closure, i.e.
mll <- with(data, function(lambda=1,theta=0)sum(dpois(y, lambda+theta*x, log=TRUE)) )
*** Changed "coef" method to return [EMAIL PROTECTED], not [EMAIL PROTECTED] [this really seems to be the better choice to me -- I normally want to see the *fitted values* of the MLE, not all the other auxiliary stuff. Besides, [EMAIL PROTECTED] can be very long, and therefore a nuisance to see in the default show(object) method]
See above. This was never intended to contain auxiliary stuff (and AFAIR has already been changed once in the opposite direction, by Brian)
OK, I want to hear about this. My normal approach to writing likelihood functions that can be evaluated with more than one data
set is essentially
mll <- function(par1,par2,par3,X=Xdefault,Y=Ydefault,Z=Zdefault) { ... }where X, Y, Z are the data values that may change from one fitting exercise to the next. This seems straightforward to me, and I always thought it was the reason why optim() had a ... in its argument list,
so that one could easily pass these arguments down. I have to confess that I don't quite understand how your paradigm with with() works: if
mll() is defined as you have it above, "data" is a data frame containing
$x and $y, right? How do I run mle(minuslogl=mll,start=...) for different values of "data" (data1, data2, data3) in this case? Does
it go in the call as mle(minuslogl=mll,start=...,data=...)? Once I've
found my mle, how do I view/access these values when I want to see
what data I used to fit mle1, mle2, etc.?
I'm willing to change the way I do things (and teach my students differently), but I need to see how ... I don't see how what I've written is an "abuse" of the fixed arguments [I'm willing to believe that it is, but just don't know why]
added a cor method for mle objects -- which just normalizes the variance-covariance matrix to a correlation matrix. Is this a bad idea/perversion of the cor method?
Yes, I think so. cov2cor(vcov(ml.obj)) is easy enough.
OK. I wasn't aware of cov2cor().
changed call$fixed <- fix to call$fixed <- c(fix,eval(call$fixed)) for cases where there are non-trivial fixed arguments
Which there shouldn't be...
added "follow" argument to profile: this makes profiling use a continuation method where the starting point for each profile optimization is the previous best-fit solution, rather than the overall MLEs of the parameters. Actually fairly easy to implement (I think: I haven't really tested that it works on anything hard, just that it doesn't seem to break profiling) -- requires pfit to be assigned globally within onestep() and a few lines of code further down.
Sounds nice, but surely you don't need a global assignment there? A
superassign ("<<-") perhaps, but that doesn't need to go to
.GlobalEnv.
OK -- I think that's just my ignorance showing.
Added code that allows (1) default arguments (evaluated in the frame of the full coefficient list, with fixed values and starting values substituted and (2) arguments specified in the start list in arbitrary order (which seems like a reasonable expectation since it *is* specified as a list). The fundamental problem is that optim() loses names of the parameter vector somewhere. Example:
x = runif(200) y = 1+x+x^2+rnorm(200,sd=0.05) fn <- function(a,b,z=2,c,d) { -sum(dnorm(y,mean=a+c*x+d*x^2,sd=exp(b),log=TRUE)) }
m1 = mle(minuslogl=fn,start=list(a=1,b=1,c=1,d=1)) ## fails with "missing argument" warning, about wrong argument m1 = mle(minuslogl=fn,start=list(a=1,b=1,c=1,d=1),fixed=list(z=2)) ## works m2 = mle(minuslogl=fn,start=list(a=1,d=1,c=1,b=1),fixed=list(z=2)) ## fails -- coeffs returned in wrong order
Hmm.. I see the effect with the current version too. Depending on
temperament, it is the labels rather than the order that is wrong...
Hmmm. By "current version" do you mean you can still find ways to get wrong answers with my modified version? Can you send me an example? Can you think of a better way to fix this?
allow for fitting of transformed parameters (exp/log, tanh/atanh = logistic/logit)
The last one should be trivial, no?
mll2 <- function(a,b,c,d) mll1(log(a),atan(b),c,d)
Yes, but I was thinking of something convenient for my students -- syntactic sugar, if you like -- so that fitted values, confidence intervals, etc., would automatically be displayed on the original (non-transformed) scale
cheers, Ben Bolker
______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-devel
