smoothEnds {stats} | R Documentation |
End Points Smoothing (for Running Medians)
Description
Smooth end points of a vector y
using subsequently smaller
medians and Tukey's end point rule at the very end. (of odd span),
Usage
smoothEnds(y, k = 3)
Arguments
y |
dependent variable to be smoothed (vector). |
k |
width of largest median window; must be odd. |
Details
smoothEnds
is used to only do the ‘end point smoothing’,
i.e., change at most the observations closer to the beginning/end
than half the window k
. The first and last value are computed using
Tukey's end point rule, i.e.,
sm[1] = median(y[1], sm[2], 3*sm[2] - 2*sm[3], na.rm=TRUE)
.
In R versions 3.6.0 and earlier, missing values (NA
)
in y
typically lead to an error, whereas now the equivalent of
median(*, na.rm=TRUE)
is used.
Value
vector of smoothed values, the same length as y
.
Author(s)
Martin Maechler
References
John W. Tukey (1977) Exploratory Data Analysis, Addison.
Velleman, P.F., and Hoaglin, D.C. (1981) ABC of EDA (Applications, Basics, and Computing of Exploratory Data Analysis); Duxbury.
See Also
runmed(*, endrule = "median")
which calls
smoothEnds()
.
Examples
require(graphics)
y <- ys <- (-20:20)^2
y [c(1,10,21,41)] <- c(100, 30, 400, 470)
s7k <- runmed(y, 7, endrule = "keep")
s7. <- runmed(y, 7, endrule = "const")
s7m <- runmed(y, 7)
col3 <- c("midnightblue","blue","steelblue")
plot(y, main = "Running Medians -- runmed(*, k=7, endrule = X)")
lines(ys, col = "light gray")
matlines(cbind(s7k, s7.,s7m), lwd = 1.5, lty = 1, col = col3)
eRules <- c("keep","constant","median")
legend("topleft", paste("endrule", eRules, sep = " = "),
col = col3, lwd = 1.5, lty = 1, bty = "n")
stopifnot(identical(s7m, smoothEnds(s7k, 7)))
## With missing values (for R >= 3.6.1):
yN <- y; yN[c(2,40)] <- NA
rN <- sapply(eRules, function(R) runmed(yN, 7, endrule=R))
matlines(rN, type = "b", pch = 4, lwd = 3, lty=2,
col = adjustcolor(c("red", "orange4", "orange1"), 0.5))
yN[c(1, 20:21)] <- NA # additionally
rN. <- sapply(eRules, function(R) runmed(yN, 7, endrule=R))
head(rN., 4); tail(rN.) # more NA's too, still not *so* many:
stopifnot(exprs = {
!anyNA(rN[,2:3])
identical(which(is.na(rN[,"keep"])), c(2L, 40L))
identical(which(is.na(rN.), arr.ind=TRUE, useNames=FALSE),
cbind(c(1:2,40L), 1L))
identical(rN.[38:41, "median"], c(289,289, 397, 470))
})