[R] Not nice behaviour of nlminb (windows 32 bit, version 2.11.1)
Duncan Murdoch
murdoch.duncan at gmail.com
Mon Jul 12 01:05:17 CEST 2010
On 11/07/2010 10:22 AM, Ravi Varadhan wrote:
> Hi,
>
> I am ok with setting abs.tol=0. Here is an nlminb.patch that has this. There is just one line of code that has been added:
>
> control$abs.tol <- 0
>
> I have commented where this change happens.
>
> I am sorry if I was not being clear. I just wanted to have the authors to also have a look at the source of the problem.
I've put in a different patch that sets the default value of abs.tol to
zero, rather than forcing it to zero in all calls.
Duncan Murdoch
>
> Regards,
> Ravi.
>
> ____________________________________________________________________
>
> Ravi Varadhan, Ph.D.
> Assistant Professor,
> Division of Geriatric Medicine and Gerontology
> School of Medicine
> Johns Hopkins University
>
> Ph. (410) 502-2619
> email: rvaradhan at jhmi.edu
>
>
> ----- Original Message -----
> From: Duncan Murdoch <murdoch.duncan at gmail.com>
> Date: Sunday, July 11, 2010 7:49 am
> Subject: Re: [R] Not nice behaviour of nlminb (windows 32 bit, version 2.11.1)
> To: Matthew Killeya <matthewkilleya at googlemail.com>
> Cc: Ravi Varadhan <rvaradhan at jhmi.edu>, Peter Ehlers <ehlers at ucalgary.ca>, r-help at r-project.org, bates at stat.wisc.edu
>
>
>> On 11/07/2010 5:00 AM, Matthew Killeya wrote:
>> >Thanks. Seems to me the easiest sensible fix might be to change the
>> >default abs.tol=0 in R and add a warning in the help files?
>> >
>>
>> That was exactly my suggestion in the message to which Ravi was
>> replying, but he apparently has doubts.
>>
>> Duncan Murdoch
>> >Matt
>> >
>> >On 11 July 2010 01:41, Duncan Murdoch <murdoch.duncan at gmail.com> wrote:
>> >
>> >
>> >>On 10/07/2010 7:32 PM, Ravi Varadhan wrote:
>> >>
>> >>
>> >>>Hi,
>> >>>
>> >>>The best solution would be to identify where the problem is in the
>> FORTRAN
>> >>>code and correct it. However, this problem of premature
>> termination due to
>> >>>absolute function convergence is highly unlikely to occur in
>> practice. As
>> >>>John Nash noted, this is going to be highly unlikely for multi-dimensional
>> >>>parameters (it is also unlikely for one-dimensional problem). However,
>> >>>unless we understand the source of the problem, we cannot feel comfortable
>> >>>in saying with absolute certainty that this will not occur for n >
>> 1.
>> >>> Therefore, I would suggest that either we fix the problem at its
>> source or
>> >>>we set abs.tol=0, since there is little harm in doing so.
>> >>>
>> >>>
>> >>>
>> >>>
>> >>Just for future reference: that's not the kind of answer that
>> leads to
>> >>anything getting done. So I'll leave it to the authors of nlminb.
>> >>
>> >>Duncan Murdoch
>> >>
>> >> Ravi.
>> >>
>> >>>____________________________________________________________________
>> >>>
>> >>>Ravi Varadhan, Ph.D.
>> >>>Assistant Professor,
>> >>>Division of Geriatric Medicine and Gerontology
>> >>>School of Medicine
>> >>>Johns Hopkins University
>> >>>
>> >>>Ph. (410) 502-2619
>> >>>email: rvaradhan at jhmi.edu
>> >>>
>> >>>
>> >>>----- Original Message -----
>> >>>From: Duncan Murdoch <murdoch.duncan at gmail.com>
>> >>>Date: Saturday, July 10, 2010 7:32 am
>> >>>Subject: Re: [R] Not nice behaviour of nlminb (windows 32 bit, version
>> >>>2.11.1)
>> >>>To: Ravi Varadhan <rvaradhan at jhmi.edu>
>> >>>Cc: Matthew Killeya <matthewkilleya at googlemail.com>, Peter Ehlers
>> <
>> >>>ehlers at ucalgary.ca>, r-help at r-project.org, bates at stat.wisc.edu
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>>Ravi Varadhan wrote:
>> >>>> >Hi,
>> >>>> >
>> >>>> >The absolute function stopping criterion is not meant for any positive
>> >>>>objective function. It is meant for functions whose minimum is
>> 0. Here is
>> >>>>what David Gay's documentation from PORT says:
>> >>>> >
>> >>>> >"6 - absolute function convergence: |f (x)| < V(AFCTOL) =
>> V(31). This
>> >>>>test is only of interest in
>> >>>> >problems where f (x) = 0 means a ‘‘perfect fit’’, such as nonlinear
>> >>>>least-squares problems."
>> >>>> > Okay, I've taken a more careful look at the docs, and they
>> do say
>> >>>>that the return code 6 does not necessarily indicate convergence:
>> "The
>> >>>>desirable return codes are 3, 4, 5, and sometimes 6". So we
>> shouldn't by
>> >>>>default terminate on it, we should allow users to choose that if
>> they want
>> >>>>faster convergence to perfect fits.
>> >>>> Would changing the default for abs.tol to zero be a reasonable solution?
>> >>>> Duncan Murdoch
>> >>>> >For example, let us try a positive objective function:
>> >>>> >
>> >>>> > >>nlminb( obj = function(x) x^2 + 1, start=1, lower=-Inf, upper=Inf,
>> >>>>control=list(trace=TRUE)) > 0: 2.0000000: 1.00000
>> >>>> > 1: 1.0000000: 0.00000
>> >>>> > 2: 1.0000000: 0.00000
>> >>>> >$par
>> >>>> >[1] 0
>> >>>> >
>> >>>> >$objective
>> >>>> >[1] 1
>> >>>> >
>> >>>> >$convergence
>> >>>> >[1] 0
>> >>>> >
>> >>>> >$message
>> >>>> >[1] "relative convergence (4)"
>> >>>> >
>> >>>> >$iterations
>> >>>> >[1] 2
>> >>>> >
>> >>>> >$evaluations
>> >>>> >function gradient 3 2 >
>> >>>> >Here the absolute function criterion does not kicks in. >
>> >>>> >Now let us try a function whose minimum value is 0.
>> >>>> >
>> >>>> > >>nlminb( obj = function(x) x^2, start=6, grad=function(x) 2*x,
>> >>>>lower=-Inf, upper=Inf, control=list(trace=TRUE) )
>> >>>> >> > 0: 36.000000: 6.00000
>> >>>> > 1: 4.0000000: 2.00000
>> >>>> > 2: 4.9303807e-32: 2.22045e-16
>> >>>> >$par
>> >>>> >[1] 2.220446e-16
>> >>>> >
>> >>>> >$objective
>> >>>> >[1] 4.930381e-32
>> >>>> >
>> >>>> >$convergence
>> >>>> >[1] 0
>> >>>> >
>> >>>> >$message
>> >>>> >[1] "absolute function convergence (6)"
>> >>>> >
>> >>>> >$iterations
>> >>>> >[1] 2
>> >>>> >
>> >>>> >$evaluations
>> >>>> >function gradient 4 3 >We see that convergence is
>> >>>>attained and that the stoppage is due to absolute function criterion.
>> >>>>
>> >>>>>Suppose, we now set abs.tol=0:
>> >>>>>
>> >>>> >
>> >>>> > >>nlminb( obj = function(x) x^2, start=6, grad=function(x) 2*x,
>> >>>>lower=-Inf, upper=Inf, control=list(trace=TRUE, abs.tol=0) )
>> >>>> >> > 0: 36.000000: 6.00000
>> >>>> > 1: 4.0000000: 2.00000
>> >>>> > 2: 4.9303807e-32: 2.22045e-16
>> >>>> > 3: 2.4308653e-63: -4.93038e-32
>> >>>> > 4: 2.9962729e-95: -5.47382e-48
>> >>>> > 5:1.4772766e-126: 1.21543e-63
>> >>>> > 6:1.8208840e-158: 1.34940e-79
>> >>>> > 7:8.9776511e-190: -2.99627e-95
>> >>>> > 8:1.1065809e-221: -3.32653e-111
>> >>>> > 9:5.4558652e-253: 7.38638e-127
>> >>>> > 10:6.7248731e-285: 8.20053e-143
>> >>>> > 11:3.3156184e-316: -1.82088e-158
>> >>>> > 12: 0.0000000: -2.02159e-174
>> >>>> > 13: 0.0000000: -2.02159e-174
>> >>>> >$par
>> >>>> >[1] -2.021587e-174
>> >>>> >
>> >>>> >$objective
>> >>>> >[1] 0
>> >>>> >
>> >>>> >$convergence
>> >>>> >[1] 0
>> >>>> >
>> >>>> >$message
>> >>>> >[1] "X-convergence (3)"
>> >>>> >
>> >>>> >$iterations
>> >>>> >[1] 13
>> >>>> >
>> >>>> >$evaluations
>> >>>> >function gradient 15 13 > Now, we see that it
>> takes a
>> >>>>while to stop, eventhough it is clear that convergence has been attained
>> >>>>after 2 iterations. This demonstrates the need for the absolute
>> function
>> >>>>criterion for obj functions whose minimum is exactly 0.
>> Although, there is
>> >>>>nothing wrong with setting abs.tol=0, except for some loss of computational
>> >>>>efficiency. >Now, let us get back to Matthew' example:
>> >>>> >
>> >>>> > >>nlminb( obj = function(x) x, start=1, lower=-2, upper=2,
>> >>>>control=list(trace=TRUE)) > 0: 1.0000000: 1.00000
>> >>>> > 1: 0.0000000: 0.00000
>> >>>> >$par
>> >>>> >[1] 0
>> >>>> >
>> >>>> >$objective
>> >>>> >[1] 0
>> >>>> >
>> >>>> >$convergence
>> >>>> >[1] 0
>> >>>> >
>> >>>> >$message
>> >>>> >[1] "absolute function convergence (6)"
>> >>>> >
>> >>>> >$iterations
>> >>>> >[1] 1
>> >>>> >
>> >>>> >$evaluations
>> >>>> >function gradient 2 2 > >>nlminb( obj =
>> function(x) x,
>> >>>>start=1, lower=-2, upper=2, control=list(trace=TRUE, abs.tol=0))
>> > 0:
>> >>>> 1.0000000: 1.00000
>> >>>> > 1: 0.0000000: 0.00000
>> >>>> > 2: -2.0000000: -2.00000
>> >>>> > 3: -2.0000000: -2.00000
>> >>>> >$par
>> >>>> >[1] -2
>> >>>> >
>> >>>> >$objective
>> >>>> >[1] -2
>> >>>> >
>> >>>> >$convergence
>> >>>> >[1] 0
>> >>>> >
>> >>>> >$message
>> >>>> >[1] "both X-convergence and relative convergence (5)"
>> >>>> >
>> >>>> >$iterations
>> >>>> >[1] 3
>> >>>> >
>> >>>> >$evaluations
>> >>>> >function gradient 3 3 >
>> >>>> >Thus it is evident that setting abs.tol=0 is a reasonable, general
>> >>>>solution for functions whose minimum value is non-zero, because
>> it protects
>> >>>>against premature termination at iteration `n' whenever |f(x_n)|
>> < abs.tol.
>> >>>> The only limitation being that of loss of efficiency in problems
>> where
>> >>>>f(x*) = 0. where x* is the local minimum.
>> >>>> >
>> >>>> >Ravi.
>> >>>> >____________________________________________________________________
>> >>>> >
>> >>>> >Ravi Varadhan, Ph.D.
>> >>>> >Assistant Professor,
>> >>>> >Division of Geriatric Medicine and Gerontology
>> >>>> >School of Medicine
>> >>>> >Johns Hopkins University
>> >>>> >
>> >>>> >Ph. (410) 502-2619
>> >>>> >email: rvaradhan at jhmi.edu
>> >>>> >
>> >>>> >
>> >>>> >----- Original Message -----
>> >>>> >From: Duncan Murdoch <murdoch.duncan at gmail.com>
>> >>>> >Date: Friday, July 9, 2010 6:54 pm
>> >>>> >Subject: Re: [R] Not nice behaviour of nlminb (windows 32 bit,
>> version
>> >>>>2.11.1)
>> >>>> >To: Matthew Killeya <matthewkilleya at googlemail.com>
>> >>>> >Cc: Peter Ehlers <ehlers at ucalgary.ca>, Ravi Varadhan <
>> >>>>rvaradhan at jhmi.edu>, r-help at r-project.org, bates at stat.wisc.edu
>> >>>> >
>> >>>> >
>> >>>> > >>On 09/07/2010 6:09 PM, Matthew Killeya wrote:
>> >>>> >> >Yes clearly a bug... there are numerous variations ...
>> problem seems
>> >>>>to be
>> >>>> >> >for a linear function whenever the first function valuation
>> is 1.
>> >>>> >> > Not at all. You can get the same problem on a quadratic
>> that
>> >>>>happens to have a zero at an inconvenient place, e.g.
>> >>>> >> nlminb( obj = function(x) x^2-25, start=6, lower=-Inf,
>> upper=Inf )
>> >>>> >> Ravi's workaround of setting the abs.tol to zero fixes this
>> example,
>> >>>>but I think it's pretty clear from the documentation that the
>> whole thing
>> >>>>was designed for positive objective functions, so I wouldn't
>> count on his
>> >>>>workaround solving all the problems.
>> >>>> >> Duncan Murdoch
>> >>>> >> >e.g. two more examples:
>> >>>> >> > nlminb( obj = function(x) x+1, start=0, lower=-Inf,
>> upper=Inf )
>> >>>> >> > nlminb( obj = function(x) x+2, start=-1, lower=-Inf,
>> upper=Inf )
>> >>>> >> >
>> >>>> >> >(I wasn't sure where best to report a bug, so emailed the
>> help list)
>> >>>> >> >
>> >>>> >> >On 9 July 2010 22:10, Peter Ehlers <ehlers at ucalgary.ca> wrote:
>> >>>> >> >
>> >>>> >> > >>Actually, it looks like any value other than 1.0
>> >>>> >> >>(and in (lower, upper)) for start will work.
>> >>>> >> >>
>> >>>> >> >> -Peter Ehlers
>> >>>> >> >>
>> >>>> >> >>
>> >>>> >> >>On 2010-07-09 14:45, Ravi Varadhan wrote:
>> >>>> >> >>
>> >>>> >> >> >>>Setting abs.tol = 0 works! This turns-off the absolute
>> >>>>function
>> >>>> >> >>>convergence
>> >>>> >> >>>criterion.
>> >>>> >> >>>
>> >>>> >> >>>
>> >>>> >> >>> nlminb( objective=function(x) x, start=1, lower=-2, upper=2,
>> >>>> >> >>> control=list(abs.tol=0))
>> >>>> >> >>>$par
>> >>>> >> >>>[1] -2
>> >>>> >> >>>
>> >>>> >> >>>$objective
>> >>>> >> >>>[1] -2
>> >>>> >> >>>
>> >>>> >> >>>$convergence
>> >>>> >> >>>[1] 0
>> >>>> >> >>>
>> >>>> >> >>>$message
>> >>>> >> >>>[1] "both X-convergence and relative convergence (5)"
>> >>>> >> >>>
>> >>>> >> >>>$iterations
>> >>>> >> >>>[1] 3
>> >>>> >> >>>
>> >>>> >> >>>$evaluations
>> >>>> >> >>>function gradient
>> >>>> >> >>> 3 3
>> >>>> >> >>>
>> >>>> >> >>>
>> >>>> >> >>>This is clearly a bug.
>> >>>> >> >>>
>> >>>> >> >>>
>> >>>> >> >>>Ravi.
>> >>>> >> >>>
>> >>>> >> >>>-----Original Message-----
>> >>>> >> >>>From: r-help-bounces at r-project.org [
>> >>>> >> >>>On
>> >>>> >> >>>Behalf Of Ravi Varadhan
>> >>>> >> >>>Sent: Friday, July 09, 2010 4:42 PM
>> >>>> >> >>>To: 'Duncan Murdoch'; 'Matthew Killeya'
>> >>>> >> >>>Cc: r-help at r-project.org; bates at stat.wisc.edu
>> >>>> >> >>>Subject: Re: [R] Not nice behaviour of nlminb (windows 32
>> bit,
>> >>>>version
>> >>>> >> >>>2.11.1)
>> >>>> >> >>>
>> >>>> >> >>>Duncan, `nlminb' is not intended for non-negative
>> functions only.
>> >>>> There
>> >>>> >> >>>is
>> >>>> >> >>>indeed something strange happening in the algorithm!
>> >>>> >> >>>
>> >>>> >> >>>start<- 1.0 # converges to wrong minimum
>> >>>> >> >>>
>> >>>> >> >>>startp<- 1.0 + .Machine$double.eps # correct
>> >>>> >> >>>
>> >>>> >> >>>startm<- 1.0 - .Machine$double.eps # correct
>> >>>> >> >>>
>> >>>> >> >>> nlminb( objective=obj, start=start, lower=-2, upper=2)
>> >>>> >> >>> $par
>> >>>> >> >>>[1] 0
>> >>>> >> >>>
>> >>>> >> >>>$objective
>> >>>> >> >>>[1] 0
>> >>>> >> >>>
>> >>>> >> >>>$convergence
>> >>>> >> >>>[1] 0
>> >>>> >> >>>
>> >>>> >> >>>$message
>> >>>> >> >>>[1] "absolute function convergence (6)"
>> >>>> >> >>>
>> >>>> >> >>>$iterations
>> >>>> >> >>>[1] 1
>> >>>> >> >>>
>> >>>> >> >>>$evaluations
>> >>>> >> >>>function gradient
>> >>>> >> >>> 2 2
>> >>>> >> >>>
>> >>>> >> >>>
>> >>>> >> >>> >>>>nlminb( objective=obj, start=startp, lower=-2,
>> upper=2)
>> >>>> >> >>>>
>> >>>> >> >>>> >>>$par
>> >>>> >> >>>[1] -2
>> >>>> >> >>>
>> >>>> >> >>>$objective
>> >>>> >> >>>[1] -2
>> >>>> >> >>>
>> >>>> >> >>>$convergence
>> >>>> >> >>>[1] 0
>> >>>> >> >>>
>> >>>> >> >>>$message
>> >>>> >> >>>[1] "both X-convergence and relative convergence (5)"
>> >>>> >> >>>
>> >>>> >> >>>$iterations
>> >>>> >> >>>[1] 3
>> >>>> >> >>>
>> >>>> >> >>>$evaluations
>> >>>> >> >>>function gradient
>> >>>> >> >>> 3 3
>> >>>> >> >>>
>> >>>> >> >>>
>> >>>> >> >>> >>>>nlminb( objective=obj, start=startm, lower=-2,
>> upper=2)
>> >>>> >> >>>>
>> >>>> >> >>>> >>>$par
>> >>>> >> >>>[1] -2
>> >>>> >> >>>
>> >>>> >> >>>$objective
>> >>>> >> >>>[1] -2
>> >>>> >> >>>
>> >>>> >> >>>$convergence
>> >>>> >> >>>[1] 0
>> >>>> >> >>>
>> >>>> >> >>>$message
>> >>>> >> >>>[1] "both X-convergence and relative convergence (5)"
>> >>>> >> >>>
>> >>>> >> >>>$iterations
>> >>>> >> >>>[1] 3
>> >>>> >> >>>
>> >>>> >> >>>$evaluations
>> >>>> >> >>>function gradient
>> >>>> >> >>> 3 3
>> >>>> >> >>>
>> >>>> >> >>>
>> >>>> >> >>> From the convergence message the `absolute function convergence'
>> >>>>seems to
>> >>>> >> >>> be
>> >>>> >> >>>the culprit, although I do not understand why that stopping
>> >>>>criterion is
>> >>>> >> >>>becoming effective, when the algorithm is started at x=1,
>> but not
>> >>>>at any
>> >>>> >> >>>other values. The documentation in IPORT makes it clear
>> that this
>> >>>> >> >>>criterion
>> >>>> >> >>>is effective only for functions where f(x*) = 0, where x*
>> is a
>> >>>>local
>> >>>> >> >>>minimum. In this example, x=0 is not a local minimum for
>> f(x), so
>> >>>>that
>> >>>> >> >>>criterion should not apply.
>> >>>> >> >>>
>> >>>> >> >>>
>> >>>> >> >>>Ravi.
>> >>>> >> >>>
>> >>>> >> >>>
>> >>>> >> >>>-----Original Message-----
>> >>>> >> >>>From: r-help-bounces at r-project.org [
>> >>>> >> >>>On
>> >>>> >> >>>Behalf Of Duncan Murdoch
>> >>>> >> >>>Sent: Friday, July 09, 2010 3:45 PM
>> >>>> >> >>>To: Matthew Killeya
>> >>>> >> >>>Cc: r-help at r-project.org; bates at stat.wisc.edu
>> >>>> >> >>>Subject: Re: [R] Not nice behaviour of nlminb (windows 32
>> bit,
>> >>>>version
>> >>>> >> >>>2.11.1)
>> >>>> >> >>>
>> >>>> >> >>>On 09/07/2010 10:37 AM, Matthew Killeya wrote:
>> >>>> >> >>>
>> >>>> >> >>> >>>> nlminb( obj = function(x) x, start=1, lower=-Inf,
>> >>>>upper=Inf )
>> >>>> >> >>>>
>> >>>> >> >>>>
>> >>>> >> >>>> >>>If you read the PORT documentation carefully,
>> you'll
>> >>>>see that their
>> >>>> >> >>>convergence criteria are aimed at minimizing positive functions.
>> >>>> (They
>> >>>> >> >>>never state this explicitly, as far as I can see.) So one
>> >>>>stopping
>> >>>> >> >>>criterion is that |f(x)|< abs.tol, and that's what it
>> found for
>> >>>>you. I
>> >>>> >> >>>don't know if there's a way to turn this off.
>> >>>> >> >>>
>> >>>> >> >>>Doug or Deepayan, do you know if nlminb can be made to
>> work on
>> >>>>functions
>> >>>> >> >>>that go negative?
>> >>>> >> >>>
>> >>>> >> >>>Duncan Murdoch
>> >>>> >> >>>
>> >>>> >> >>> $par
>> >>>> >> >>> >>>>[1] 0
>> >>>> >> >>>>
>> >>>> >> >>>>$objective
>> >>>> >> >>>>[1] 0
>> >>>> >> >>>>
>> >>>> >> >>>>$convergence
>> >>>> >> >>>>[1] 0
>> >>>> >> >>>>
>> >>>> >> >>>>$message
>> >>>> >> >>>>[1] "absolute function convergence (6)"
>> >>>> >> >>>>
>> >>>> >> >>>>$iterations
>> >>>> >> >>>>[1] 1
>> >>>> >> >>>>
>> >>>> >> >>>>$evaluations
>> >>>> >> >>>>function gradient
>> >>>> >> >>>> 2 2
>> >>>> >> >>>>
>> >>>> >> >>>> [[alternative HTML version deleted]]
>> >>>> >> >>>>
>> >>>> >> >>>>
>> >>>> >> >>>> >
>> >>>> >> >
>> >>>>
>> >>>>
>> >
>> >
>>
More information about the R-help
mailing list