[R] Relatively Simple Maximization Using Optim Doesnt Optimize
Duncan Murdoch
murdoch@dunc@n @end|ng |rom gm@||@com
Fri Mar 13 02:42:54 CET 2020
On 12/03/2020 1:22 p.m., Abby Spurdle wrote:
> I'm sorry, Duncan.
> But I disagree.
>
> This is not a "bug" in optim function, as such.
> (Or at least, there's nothing in this discussion to suggest that there's a bug).
> But rather a floating point arithmetic related problem.
>
> The OP's function looks simple enough, at first glance.
> But it's not.
>
> Plotting a numerical approximation of the derivative, makes the
> problem more apparent:
There is nothing in that plot to indicate that the result given by
optim() should be accepted as optimal. The numerical approximation to
the derivative is 0.055851 everywhere in your graph, with numerical
errors out in the 8th decimal place or later. Clearly the max occurs
somewhere to the right of that. Yes, the 2nd derivative calculation
will be terrible if R chooses a step size of 0.00001 when calculating
it, but why would it do that, given that the 1st derivative is 3 orders
of magnitude larger?
> ----------
> plot_derivative <- function (f, a = sol - offset, b = sol + offset,
> sol, offset=0.001, N=200)
> { FIRST <- 1:(N - 2)
> LAST <- 3:N
> MP <- 2:(N - 1)
>
> x <- seq (a, b, length.out=N)
> y <- f (x)
> dy <- (y [LAST] - y [FIRST]) / (x [LAST] - x [FIRST])
>
> plot (x [MP], dy, type="l", xlab="x", ylab="dy/dx (approx)")
> }
>
> optim.sol <- optim (1001, production1 ,method="CG", control = list
> (fnscale=-1) )$par
> plot_derivative (production1, sol=optim.sol)
> abline (v=optim.sol, lty=2, col="grey")
> ----------
>
> So, I would say the optim function (including the CG method) is doing
> what it's supposed to do.
>
> And collating/expanding on Nash's, Jeff's and Eric's comments:
> (1) An exact solution can be derived quickly, so using a numerical
> method is unnecessary, and inefficient.
> (2) Possible problems with the CG method are noted in the documentation.
> (3) Numerical approximations of the function's derivative need to be
> well-behaved for gradient-based numerical methods to work properly.
>
>
> On Fri, Mar 13, 2020 at 3:42 AM Duncan Murdoch <murdoch.duncan using gmail.com> wrote:
>>
>> It looks like a bug in the CG method. The other methods in optim() all
>> work fine. CG is documented to be a good choice in high dimensions; why
>> did you choose it for a 1 dim problem?
>>
>> Duncan Murdoch
More information about the R-help
mailing list