[Rd] Optimization in R

Duncan Murdoch murdoch at stats.uwo.ca
Sat Aug 4 20:29:01 CEST 2007


On 04/08/2007 2:23 PM, Gabor Grothendieck wrote:
> For the same reason that generic functions exist.  They don't have
> a lot of common code but it makes easier to use.  Perhaps the argument
> is not as strong here since the class tends to be implicit whereas the
> method is explicit but it would still be a convenience.

Can you give other examples where we do this?  The ones I can think of 
(graphics drivers and finalizers) involve a large amount of common 
machinery that it's difficult or impossible for the user to duplicate. 
That's not the case here.

Duncan Murdoch

> On 8/4/07, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
>> On 04/08/2007 1:05 PM, Gabor Grothendieck wrote:
>>> I think it would be desirable for optim to have a dispatching mechanism
>>> that allows users to add their own optimization techniques to those
>>> provided without having to modify optim and without having to come
>>> up with a new visible function.  For example, if we call optim as
>>> optim(...whatever..., method = "X") then that might dispatch
>>> optim.X consistent with S3 except here X is explicitly given rather
>>> than being a class.
>> Why?  This would make sense if optim() had a lot of code common to all
>> methods, but it doesn't.
>>
>> Duncan Murdoch
>>
>>> On 8/4/07, Duncan Murdoch <murdoch at stats.uwo.ca> wrote:
>>>> On 04/08/2007 10:30 AM, Andrew Clausen wrote:
>>>>> Hi Duncan,
>>>>>
>>>>> On Sat, Aug 04, 2007 at 09:25:39AM -0400, Duncan Murdoch wrote:
>>>>>> This is interesting work; thanks for doing it.  Could I make a
>>>>>> suggestion?  Why not put together a package containing those test
>>>>>> optimization problems, and offer to include other interesting ones as
>>>>>> they arise?
>>>>> Good idea.
>>>>>
>>>>>> You could also include your wrapper for the gsl function
>>>>>> and your own improvements to optim.
>>>>> I have submitted my gsl multimin() wrapper for inclusion into the Rgsl package,
>>>>> which seems to be the "right" place for it.  (Its maintainer is currently
>>>>> enjoying a vacation :)
>>>>>
>>>>> It would be nice if all of these methods could be accessed with the existing
>>>>> optim() interface, so that users could easily try different algorithms.
>>>>> That is, users could specify method="BFGS" or "BFGS-R" or "BFGS-GSL", etc.
>>>>> Is there a convenient mechanism for packages registering new methods?
>>>> No there isn't, but I don't really see it as necessary.  The R optim()
>>>> function is reasonably short, mainly setting up defaults specific to
>>>> each of the supported optimization methods.  The C do_optim() function
>>>> has a bit more code common to the methods, but still only about 50
>>>> lines. You could copy this common part into your own function following
>>>> the same argument and return value conventions and a user would just
>>>> need to change the function name in addition to specifying your method,
>>>> not really that much harder.  (You could call your function optim and
>>>> use it as a wrapper for stats::optim if you wanted to avoid even this,
>>>> but I wouldn't recommend it, since then behaviour would depend on the
>>>> search list ordering.)
>>>>
>>>> There's a small risk that the argument list to optim() will change
>>>> incompatibly sometime in the future, but I think that's unlikely.
>>>>
>>>>> One incompatibility with my BFGS implementation is that it returns the
>>>>> *inverse* Hessian, which is a natural by-product of the BFGS algorithm.
>>>>> Indeed, R's existing BFGS implementation also calculates the inverse Hessian,
>>>>> and discards it!  (Disclaimer: as far as I know, there are no theorems that say
>>>>> that BFGS's inverse Hessians are any good.  In practice, they seem to be.)
>>>> If you return more than optim() returns it shouldn't have any serious
>>>> ill effects.
>>>>
>>>>> The inverse Hessian is more useful than the Hessian for statistics because it
>>>>> gives the variance-covariance matrix for maximum likelihood estimators.  When
>>>>> the Hessian is close to being singular (aka "computationally singular"),
>>>>> solve() sometimes fails to invert it.
>>>>>
>>>>> I think this means we should change the optim() interface.  For example, an
>>>>> extra logical parameter, "inv.hessian" could control whether an inv.hessian
>>>>> matrix is returned.
>>>> I'd suggest always returning it if it's useful and the calculation is
>>>> reliable and cheap.  Adding "inv.hessian" as a general parameter would
>>>> be troublesome with some of the other methods, where the inverse Hessian
>>>> isn't already calculated, because of the inversion problem you mention
>>>> above.
>>>>
>>>> Duncan Murdoch
>>>>
>>>>>> On your first point:  I agree that a prototype implementation in R makes
>>>>>> sense, but I suspect there exist problems where the overhead would not
>>>>>> be negligible (e.g. ones where the user has written the objective
>>>>>> function in C for speed).  So I think you should keep in mind the
>>>>>> possibility of moving the core of your improvements to C once you are
>>>>>> happy with them.
>>>>> Fair enough.
>>>>>
>>>>> Cheers,
>>>>> Andrew
>>>>>
>>>>> ______________________________________________
>>>>> R-devel at r-project.org mailing list
>>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>> ______________________________________________
>>>> R-devel at r-project.org mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>>
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>



More information about the R-devel mailing list