[R] More help with stl?

Ryan Hafen rhafen at purdue.edu
Tue Sep 2 20:41:16 CEST 2008

Trying your example:

y <- numeric(365) y y[250] = 1 y

y.stl <- stl(ts(y, frequency=7), s.window="periodic")

First of all, pay attention to the axes on your plot - the scales are
different for each panel. Your seasonal component is quite small in magnitude
compared to everything else.

Also, if you are unsure that data = seasonal + trend + remainder, just try

apply(y.stl$time.series, 1, sum)

which adds up the three components. This will get you back your original time

The problem with your example is that you need to be giving sensible data to
the stl procedure. How does data with a bunch of zeros and one 1 represent
anything with weekly periodicity? For example, try the following plot:

library(lattice) xyplot(y ~ 1:365 | factor(rep(1:7, 53)[1:365]))

This groups your data into all Mondays, all Tuesdays, etc. Do you see anything
here indicating periodicity?

It was your specification of frequency=7 that created the cyclical pattern you
see in the seasonal component. The STL procedure has a step where it smooths,
in this case, each day of the week, and then strings each of those fitted
values back together. In the case of this data, it gets a positive value for
day 5 (refer to lattice plot above), and hence the seasonal pattern you see.

If you read the documentation, you will see that s.window="periodic" causes
the mean to be taken for each day of the week, which forces the day of the
week to be constant. If you would like the seasonal to be able to adapt, try
something like:

y.stl <- stl(ts(y, frequency=7), s.window=9, s.degree=1) plot(y.stl)

This will use local linear fitting to each week day and allow the seasonal to
evolve over time. You can play with s.window argument.

If you provided this example just as an example, hopefully this explanation
will be helpful. However, if this is what your data actually looks like, I
don't see how stl will do you any good.

More information about the R-help mailing list