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.
Usage
madX(
x,
weights = NULL,
center = medianX,
constant = 1.4826,
medianType = c("standard", "low", "high"),
na.rm = FALSE
)Arguments
- x
a numeric vector
- weights
a numerical vector of weights the same length as
xgiving the weights to use for elements ofx- center
a numeric center or a function applied to
x. When weights are supplied, the function must support aweightsargument. Defaults tomedianX.- constant
scale factor (default is
1.4826)- medianType
character string selecting the
"standard","low", or"high"median for even sample sizes- na.rm
if
TRUEthenNAvalues are stripped fromxbefore computation takes place
Details
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 madX to return NA.
Confidence intervals are provided by lumen::madCI().
Examples
madX(c(1:9))
#> [1] 2.9652
print(madX(c(1:9), constant = 1)) ==
madX(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(madX(x, constant = 1, medianType="standard"),
madX(x, constant = 1, medianType="low"),
madX(x, constant = 1, medianType="high"))
#> [1] 2.5 2.0 3.0
# use weights
x <- sample(20, 30, replace = TRUE)
z <- as.numeric(names(w <- table(x)))
(m1 <- madX(z, weights=w))
#> [1] 6.6717
(m2 <- madX(x))
#> [1] 6.6717
stopifnot(identical(m1, m2))
