THE ERROR:
In S-Plus 4.0, release 3, the help file for nlminb.control states that a
parameter diff.g may be set by the user, but setting this parameter within a
call to nlminb generates the error: "Error in call to nlminb.control():
Argument diff.g= not matched." However, examination of the code for nlminb
reveals that it does check to see if diff.g has been set by the user through a
call to nlminb.control.
WHO MIGHT CARE:
diff.g allows the user to set the size of increment to a parameter that is used
in numerical approximations to the gradient. That is, the gradient for a
parameter p is approximated by the calculation: ( f(p + diff.g) - f(p) ) /
diff.g. The default value for diff.g is .Machine$double.eps^(1/2), which works
out to 1.5e-008 on my machine.
Users inexperienced with optimization algorithms such as nlminb should leave
diff.g alone, but being able to alter its default value can be helpful on
occasion. For some problems, the default is too small. For example, I am
writing a procedure to fit a particular form of generalized nonlinear model
which, however, contains only a few parameters that cannot be estimated by glm.
I solve the problem by using a principle known as "concentrating the
likelihood"; i.e., by having nlminb find estimates for only the nonlinear
parameters, and nest calls to glm within the function definition for nlminb.
Thus what would otherwise be a 10 parameter problem for nlminb is reduced to a
3 parameter problem when only 3 of the 10 parameters cannot be estimated by
glm. This principle of concentrating the likelihood leads to much more stable
estimation. However, it also can, as in this example, lead to an increase the
numerical error in assessments of the loglikelihood function within nlminb.
Hence the need sometimes to increase the size of diff.g. Otherwise the
signal-to-noise ratio in nlminb's approximation of the gradient can be too low.
diff.g only affects how numerical gradients are calculated. If you supply an
analytical gradient to nlminb, then diff.g is irrelevant.
THE FIX:
A simple alteration to nlminb.control returns to users the ability to set the
diff.g parameter. The current function definition is:
nlminb.control <-
function(eval.max = NULL, iter.max = NULL, abs.tol = NULL, rel.tol = NULL,
x.tol = NULL,
step.min = NULL, step.max = NULL, scale.init = NULL, scale.upd = NULL,
scale.fac = NULL,
scale.tol = NULL, scale.mod = NULL, sing.tol = NULL, sing.step = NULL,
rel.err = NULL)
list(eval.max = eval.max, iter.max = iter.max, abs.tol = abs.tol, rel.tol =
rel.tol, x.tol =
x.tol, step.min = step.min, step.max = step.max, scale.init =
scale.init, scale.upd =
scale.upd, scale.fac = scale.fac, scale.tol = scale.tol, scale.mod =
scale.mod,
sing.tol = sing.tol, sing.step = sing.step, rel.err = rel.err)
The simple change is to:
nlminb.control<-
function(eval.max = NULL, iter.max = NULL, abs.tol = NULL, rel.tol = NULL,
x.tol = NULL, step.min = NULL, step.max = NULL, scale.init = NULL,
scale.upd = NULL, scale.fac = NULL, scale.tol = NULL, scale.mod = NULL,
sing.tol = NULL, sing.step = NULL, rel.err = NULL, diff.g = NULL)
list(eval.max = eval.max, iter.max = iter.max, abs.tol = abs.tol, rel.tol =
rel.tol, x.tol = x.tol, step.min = step.min, step.max = step.max,
scale.init = scale.init, scale.upd = scale.upd, scale.fac = scale.fac,
scale.tol = scale.tol, scale.mod = scale.mod, sing.tol = sing.tol,
sing.step = sing.step, rel.err = rel.err, diff.g = diff.g)
The only alterations are the addition of the argument diff.g = NULL to the
argument list, and the addition of diff.g = diff.g at the end of the single
expression in the function body.
I follow the recommendation of MathSoft of not actually altering S-Plus source
code, but instead place my altered nlminb.control function into a personal
library ("myfuncs") which is added to the search list ahead of the S-Plus
directories by the expression: library(myfuncs, T).
In my call to nlminb.control I also SLIGHTLY increase the values for abs.tol,
rel.tol, x.tol as well as for diff.g. These additional changes slightly relax
the convergence criteria for nlminb, which may also be called for when, as
here, there is more than the usual amount of error in the calculation of the
loglikelihood function.
WARNING:
Although nlminb.control allows relaxation of the convergence criteria for
nlminb, which may sometimes be called for, it is too easy to fall into the trap
of relaxing these criteria too casually and by too much.
Terry Elrod
--------
Terry Elrod; Assoc. Prof. of Marketing; 3-23 Fac. of Business; Univ. of Alberta;
Edmonton AB; Canada T6G 2R6
email: Terry.Elrod@Ualberta.ca; tel: (403) 492-5884; fax: (403) 492-3325
Web page: http://www.ualberta.ca/~telrod/
--------
-----------------------------------------------------------------------
This message was distributed by s-news@wubios.wustl.edu. To unsubscribe
send e-mail to s-news-request@wubios.wustl.edu with the BODY of the
message: unsubscribe s-news
|