wght.sum <- function(x, w, trunc=NULL) { # assumes n <= m n <- length(x) m <- length(w) if (n == m) { return(sum(x*w)) } else if (trunc == 'L') { return(sum(x*w[(m-n+1):m])/sum(w[(m-n+1):m])) } else if (trunc == 'R') { return(sum(x*w[1:n])/sum(w[1:n])) } else { return('error') } } smooth <- function(x, w) { # assumes m is odd n <- length(x) m <- length(w) k <- floor(m/2) y <- rep(0, n) for (i in 1:k) y[i] <- wght.sum(x[1:(i+k)], w, 'L') for (i in (k+1):(n-k)) y[i] <- wght.sum(x[(i-k):(i+k)], w) for (i in (n-k+1):n) y[i] <- wght.sum(x[(i-k):n], w, 'R') return(y) } x <- scan('http://www.ms.unimelb.edu.au/~s620374/timeseries/hsales.csv') t <- seq(1973, 1996-2/12, 1/12) plot(t, x, type='l', xlab='year', ylab='total sales', main='Sales of new one-family homes, USA') y1 <- smooth(x, rep(1/7,7)) lines(t, y1, lwd=2, col='green') y2 <- smooth(x, c(1/24, rep(1/12, 11), 1/24)) lines(t, y2, lwd=2, col='red') z <- matrix(x - y2, nrow=12) s <- apply(z, 1, mean) show(s)