relErr {sfsmisc} | R Documentation |
Relative Error When Appropriate, Absolute Otherwise
Description
relErrV()
:-
Compute the signed relative error componentwise (“vectorized”) between the
target
andcurrent
vectors, using the absolute error, i.e., the difference in case the relative error is not well defined, i.e., whentarget
is zero or infinite. relErr()
:simply the mean absolute value of the relative errors between
target
andcurrent
vectors; typically the “same” asall.equal.numeric(target, vector, tolerance=0, countEQ=TRUE)
.Currently useful only when both vectors are finite.
Usage
relErrV(target, current, eps0 = .Machine$double.xmin)
relErr (target, current)
Arguments
target |
numeric, possibly scalar. |
current |
numeric vector of |
eps0 |
non-negative number; values |
Value
relErrV()
:a numeric vector of the same length (or array of the same dimension) as
current
.relErr()
:a single number.
Author(s)
Martin Maechler, originally as part of Matrix package's ‘test-tools.R’.
See Also
all.equal.numeric()
is similar in spirit but returns TRUE
or
string containing the mean relative or absolute error.
Examples
## relErrV() test example: showing how it works fine with {NA, Inf, 0} :
eps <- 1e-4*c(-9, -8, -6, -4, 0.5, 1, 5)
target <- c(-1:1, 0, 0, NA, NaN, Inf, -Inf, Inf, 0 , Inf, 1 , -3:3)
current <- c(-1:1,1e-7,NaN,NA, 0 , Inf, Inf, 0, Inf, 1, Inf, -3:3+ eps)
cbind(target, current, absE = current-target,
relE = relErrV(target,current)) -> M ; M
stopifnot(exprs = {
is.logical(isFr <- is.finite(rF <- M[,"relE"]))
target==current | isFr == is.finite(aF <- M[,"absE"])
identical(aF[!isFr] , rF[!isFr])
identical(numeric(), relErrV(numeric(), integer())) # length 0 {used to fail}
})
tools::assertError(relErrV(1, numeric()), verbose=TRUE) # no longer allowed
## relErr() is pretty simple --- (possibly too simple, currently)
relErr
relErr(target, current) # NA (of course)
all.equal.numeric(target, current) ## "'is.NA' value mismatch ..."
## comparison after dropping NA's :
hasN <- is.na(target) | is.na(current)
all.equal(target[!hasN], current[!hasN], tolerance=0) # "Mean abs. diff.: Inf"
relErr(target[!hasN], current[!hasN]) # NaN (to improve?)
## comparison after only keeping cases where both are finite:
finN <- is.finite(target) & is.finite(current)
all.equal(target[finN], current[finN], tol=0) # "Mean abs.d.: 0.000279.."
all.equal(target[finN], current[finN], tol=0, countEQ=TRUE) # " " : 0.000239..
relErr(target[finN], current[finN]) # 0.0002392929