compareDerivatives {maxLik} | R Documentation |
This function compares analytic and numerical derivative and prints a few diagnostics. It is intended for testing pre-programmed derivative routines for maximisation algorithms.
compareDerivatives(f, grad, hess=NULL, t0, eps=1e-6, print=TRUE, ...)
f |
function to be differentiated. The parameter (vector) of interest must be the first argument. The function may return a vector. |
grad |
analytic gradient. This may be either a function,
returning the analytic gradient, or a numeric vector, the pre-computed
gradient. The function must use the same set of
parameters as |
hess |
function returning the analytic hessian. If present, hessian matrices are compared too. Only appropriate for scalar-valued functions. |
t0 |
parameter vector indicating the point at which the derivatives are compared. The derivative is taken with respect to this vector. |
eps |
numeric. Step size for numeric differentiation. Central derivative is used. |
print |
logical: TRUE to print a summary, FALSE to return the comparison only (invisibly). |
... |
further arguments to |
For every component of f
, the parameter value, analytic and
numeric derivative and their relative difference
rel.diff = (analytic - numeric)/(0.5*(analytic+numeric))
are printed; if analytic = 0 = numeric, we define rel.diff = 0. If analytic derivatives are correct and the function is sufficiently smooth, expect the relative differences to be less than 1e-7.
A list with the following components:
t0 |
the input argument |
f.t0 |
f(t0) |
compareGrad |
a list with components |
maxRelDiffGrad |
max(abs(rel.diff)) |
If hess
is also provided, the following optional components
are also present:
compareHessian |
a list with components |
maxRelDiffHess |
max(abs(rel.diff)) for the Hessian |
Ott Toomet otoomet@ut.ee and Spencer Graves
## A simple example with sin(x)' = cos(x) f <- function(x)c(sin=sin(x)) Dsin <- compareDerivatives(f, cos, t0=c(angle=1)) D2sin <- compareDerivatives(f, cos, function(x)-sin(x), t0=1) ## ## Example of log-likelihood of normal density. Two-parameter ## function. ## x <- rnorm(100, 1, 2) # generate rnorm x l <- function(b) sum(log(dnorm((x-b[1])/b[2])/b[2])) # b[1] = mu, b[2] = sigma gradl <- function(b) { c(mu=sum(x - b[1])/b[2]^2, sigma=sum((x - b[1])^2/b[2]^3 - 1/b[2])) } gradl. <- compareDerivatives(l, gradl, t0=c(mu=1,sigma=2)) ## ## An example with f returning a vector, t0 = a scalar ## trig <- function(x)c(sin=sin(x), cos=cos(x)) Dtrig <- function(x)c(sin=cos(x), cos=-sin(x)) Dtrig. <- compareDerivatives(trig, Dtrig, t0=1) D2trig <- function(x)-trig(x) D2trig. <- compareDerivatives(trig, Dtrig, D2trig, t0=1)