ts.plot(AirPassengers) airpass.log<-log(AirPassengers) ts.plot(airpass.log) length(airpass.log) par(mfrow=c(1,2)) acf(airpass.log) pacf(airpass.log) # use a linear model for detrending # airpass.fit<-lm(airpass.log ~ c(1:144)) airpass.fit.detrend<-airpass.fit$residual plot.ts(airpass.fit.detrend) # filter spencer.wts<- c(-3,-6,-5,3,21,46,67,74,67,46,21,3,-5,-6,-3)/320 airpass.filt<-filter(airpass.log, spencer.wts) ts.plot(airpass.log, airpass.filt, lty=c(2,1)) airpass.detrend.filt<-filter(airpass.fit.detrend, spencer.wts) ts.plot(airpass.fit.detrend, airpass.detrend.filt, lty=c(2,1)) # check that spencer filter leaves cubic polynomials undisturbed x<-c(1:1000) for(i in 1:1000){ x[i] <- 0.003 * i^3 - 2 * i^2 + 1 } ts.plot(x) x.filt<-filter(x, spencer.wts) ts.plot(x, x.filt, lty=c(2,1)) # differencing airpass.diff<-diff(airpass.log) ts.plot(airpass.diff) airpass.diff2<-diff(airpass.diff, lag=12) ts.plot(airpass.diff2) # stl decomposition airpass.log.freq<-ts(as.vector(airpass.log), start=1, frequency=12) airpass.log.stl<-stl(airpass.log.freq, s.window="periodic") plot(airpass.log.stl) # fit arima model par(mfrow=c(2,1)) acf(airpass.diff2) pacf(airpass.diff2) airpass.arima<-arima(airpass.diff2, order =c(0,0,1)) tsdiag(airpass.arima) airpass.arima2<-arima(airpass.diff2, order=c(0,0,1), seasonal=list(order=c(0,0,1), period=NA) ) tsdiag(airpass.arima2) airpass.arima3<-arima(airpass.log, order=c(0,1,1), seasonal=list(order=c(0,1,1), period=12 ) ) tsdiag(airpass.arima3) # cumulative periodogram fit2.res<-airpass.arima3$residuals fit2.res par(mfrow=c(1,2)) acf(fit2.res) pacf(fit2.res) # are consistent with white noise cpgram(fit2.res)