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
Tukey JW (1977). Exploratory Data Analysis, number 2 series Addison-Wesley series in behavioral science. Addison-Wesley Publishing Company. ISBN 9780201076165.
Velleman PF, Hoaglin DC (1981). Applications, Basics, and Computing of Exploratory Data Analysis, series Duxbury series in statistics and decision sciences. Duxbury Press. ISBN 9780878722730.
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))
})