smooth
Tukey's (Running Median) Smoothing
Tukey's smoothers, 3RS3R, 3RSS, 3R, etc.
Usage
smooth(x, kind = c("3RS3R", "3RSS", "3RSR", "3R", "3", "S"), twiceit = FALSE, endrule = "Tukey", do.ends = FALSE)
Arguments
 x
 a vector or time series
 kind
 a character string indicating the kind of smoother required;
defaults to
"3RS3R"
.  twiceit
 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).
 endrule
 a character string indicating the rule for smoothing at the
boundary. Either
"Tukey"
(default) or"copy"
.  do.ends
 logical, indicating if the 3splitting of ties should
also happen at the boundaries (ends). This is only used for
kind = "S"
.
Details
3
is Tukey's short notation for running median
s
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.
Value

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.
Note
S and SPLUS 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 R version 1.2, smooth
does really implement
Tukey's endpoint rule correctly (see argument endrule
).
kind = "3RSR"
has been the default till R1.1,
but it can have very bad properties, see the examples.
Note that repeated application of smooth(*)
does
smooth more, for the "3RS*"
kinds.
References
Tukey, J. W. (1977). Exploratory Data Analysis, Reading Massachusetts: AddisonWesley.
See Also
runmed
for running medians;
lowess
and loess
;
supsmu
and
smooth.spline
.
Examples
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[is.na(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)