Tukey's (Running Median) Smoothing

Tukey's smoothers, 3RS3R, 3RSS, 3R, etc.

robust, smooth
smooth(x, kind = c("3RS3R", "3RSS", "3RSR", "3R", "3", "S"),
       twiceit = FALSE, endrule = c("Tukey", "copy"), do.ends = FALSE)
a vector or time series
a character string indicating the kind of smoother required; defaults to "3RS3R".
logical, indicating if the result should be twiced. Twicing a smoother $S(y)$ means $S(y) + S(y - S(y))$, i.e., adding smoothed residuals to the smoothed values. This decreases bias (increasing variance).
a character string indicating the rule for smoothing at the boundary. Either "Tukey" (default) or "copy".
logical, indicating if the 3-splitting of ties should also happen at the boundaries (ends). This is only used for kind = "S".

3 is Tukey's short notation for running medians of length 3, 3R stands for Repeated 3 until convergence, and S for Splitting of horizontal stretches of length 2 or 3.

Hence, 3RS3R is a concatenation of 3R, S and 3R, 3RSS similarly, whereas 3RSR means first 3R and then (S and 3) Repeated until convergence -- which can be bad.


  • An object of class "tukeysmooth" (which has print and summary methods) and is a vector or time series containing the smoothed values with additional attributes.


S and S-PLUS use a different (somewhat better) Tukey smoother in smooth(*). Note that there are other smoothing methods which provide rather better results. These were designed for hand calculations and may be used mainly for didactical purposes.

Since Rversion 1.2, smooth does really implement Tukey's end-point rule correctly (see argument endrule).

kind = "3RSR" has been the default till R-1.1, but it can have very bad properties, see the examples.

Note that repeated application of smooth(*) does smooth more, for the "3RS*" kinds.


Tukey, J. W. (1977). Exploratory Data Analysis, Reading Massachusetts: Addison-Wesley.

See Also

runmed for running medians; lowess and loess; supsmu and smooth.spline.

  • smooth
library(stats) require(graphics) ## see also demo(smooth) ! x1 <- c(4, 1, 3, 6, 6, 4, 1, 6, 2, 4, 2) # very artificial (x3R <- smooth(x1, "3R")) # 2 iterations of "3" smooth(x3R, kind = "S") sm.3RS <- function(x, ...) smooth(smooth(x, "3R", ...), "S", ...) y <- c(1, 1, 19:1) plot(y, main = "misbehaviour of "3RSR"", col.main = 3) lines(sm.3RS(y)) lines(smooth(y)) lines(smooth(y, "3RSR"), col = 3, lwd = 2) # the horror x <- c(8:10, 10, 0, 0, 9, 9) plot(x, main = "breakdown of 3R and S and hence 3RSS") matlines(cbind(smooth(x, "3R"), smooth(x, "S"), smooth(x, "3RSS"), smooth(x))) presidents[] <- 0 # silly summary(sm3 <- smooth(presidents, "3R")) summary(sm2 <- smooth(presidents,"3RSS")) summary(sm <- smooth(presidents)) all.equal(c(sm2), c(smooth(smooth(sm3, "S"), "S"))) # 3RSS === 3R S S all.equal(c(sm), c(smooth(smooth(sm3, "S"), "3R"))) # 3RS3R === 3R S 3R plot(presidents, main = "smooth(presidents0, *) : 3R and default 3RS3R") lines(sm3, col = 3, lwd = 1.5) lines(sm, col = 2, lwd = 1.25)
Documentation reproduced from package stats, version 3.3, License: Part of R 3.3

Community examples

Looks like there are no examples yet.