| compareDerivatives {micEcon} | 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, ...)
f |
function to be differentiated. The parameter (vector) of interest must be the first argument. The function may return a vector. |
grad |
function returning the analytic gradient.
Must use the same set of parameters as f.
If f is a vector-valued function, grad must return a matrix where the
number of rows equals the number of components of f, and the number
of columns must equal to the number of components in t0. |
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. |
... |
further arguments to f, grad and hess. |
For every component of f, the parameter value, analytic and numeric
derivative and their relative difference (analytic - numeric)/analytic
are printed. If analytic derivatives are correct and the function is
sufficiently smooth, expect the relative differences to be less than 1e-7.
Ott Toomet siim@obs.ee
## A simple example with sin(x)' = cos(x)
f <- sin
compareDerivatives(f, cos, 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(sum(x - b[1])/b[2]^2,
sum((x - b[1])^2/b[2]^3 - 1/b[2]))
}
compareDerivatives(l, gradl, t0=c(1,2))