MAD.Rd
Compute the median absolute deviation, i.e., the (lo-/hi-) median of
the absolute deviations from the median, and (by default) adjust by a
factor for asymptotically normal consistency. This function wraps the specific base R function mad
and extends it for the use of weights.
MAD(x, weights = NULL, center = Median, constant = 1.4826,
na.rm = FALSE, low = FALSE, high = FALSE)
a numeric vector.
a numerical vector of weights the same length as x
giving the weights to use for elements of x
.
the centre given either as numeric value or as a function to be applied to x
(defaults to the DescTools::Median(x)
). Note in cases when weights are defined to provide a function that also support weights. If this is not possible fall back to a numeric value.
scale factor (default is 1.4826
)
if TRUE
then NA
values are stripped
from x
before computation takes place.
if TRUE
, compute the ‘lo-median’, i.e., for even
sample size, do not average the two middle values, but take the
smaller one.
if TRUE
, compute the ‘hi-median’, i.e., take the
larger of the two middle values for even sample size.
The actual value calculated is constant * cMedian(abs(x - center))
with the default value of center
being median(x)
, and
cMedian
being the usual, the ‘low’ or ‘high’ median, see
the arguments description for low
and high
above.
The default constant = 1.4826
(approximately
\(1/\Phi^{-1}(\frac 3 4)\) = 1/qnorm(3/4)
)
ensures consistency, i.e.,
$$E[mad(X_1,\dots,X_n)] = \sigma$$
for \(X_i\) distributed as \(N(\mu, \sigma^2)\)
and large \(n\).
If na.rm
is TRUE
then NA
values are stripped from x
before computation takes place.
If this is not done then an NA
value in
x
will cause MAD
to return NA
.
MAD(c(1:9))
#> [1] 2.9652
print(MAD(c(1:9), constant = 1)) ==
MAD(c(1:8, 100), constant = 1) # = 2 ; TRUE
#> [1] 2
#> [1] TRUE
x <- c(1,2,3,5,7,8)
sort(abs(x - median(x)))
#> [1] 1 1 2 3 3 4
c(MAD(x, constant = 1),
MAD(x, constant = 1, low = TRUE),
MAD(x, constant = 1, high = TRUE))
#> [1] 2.5 2.0 3.0
# use weights
x <- sample(20, 30, replace = TRUE)
z <- as.numeric(names(w <- table(x)))
(m1 <- MAD(z, weights=w))
#> [1] 9.6369
(m2 <- MAD(x))
#> [1] 9.6369
stopifnot(identical(m1, m2))