# File src/library/stats/tests/ts-tests.R # Part of the R package, https://www.R-project.org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # https://www.R-project.org/Licenses/ ## tests of time-series functionality .proctime00 <- proc.time() library(stats) pdf("ts-test.pdf") ### ar ar(lh) ar(lh, method = "burg") ar(lh, method = "ols") ar(lh, FALSE, 4) # fit ar(4) ar.ols(lh) ar.ols(lh, FALSE, 4) # fit ar(4) by OLS ar(LakeHuron) ar(LakeHuron, method = "burg") ar(LakeHuron, method = "ols") ar(LakeHuron, method = "mle") ar(sunspot.year, method = "yw") ar(sunspot.year, method = "burg") ar(sunspot.year, method = "ols") ar(sunspot.year, method = "mle") ### tests using presidents, contains missing values acf(presidents, na.action = na.pass) pacf(presidents, na.action = na.pass) ## graphs in example(acf) suggest order 1 or 3 (fit1 <- arima(presidents, c(1, 0, 0))) tsdiag(fit1) (fit3 <- arima(presidents, c(3, 0, 0))) # smaller AIC tsdiag(fit3) ## Short example for bug PR#15832: e <- rep(c(1.48e-6, 1.49e-6, 1.5e-6, 1.51e-6), c(2,3,9,7)) stopifnot(abs(acf(e, plot=FALSE)$acf) <= 1) ## Failed for R <= 3.2.0 ### tests of arima: arima(USAccDeaths, order = c(0,1,1), seasonal = list(order=c(0,1,1))) arima(USAccDeaths, order = c(0,1,1), seasonal = list(order=c(0,1,1)), method = "CSS") # drops first 13 observations. ## test fitting with NAs tmp <- LakeHuron trend <- time(LakeHuron) - 1920 tmp[c(17, 45, 96)] <- NA arima(tmp, order=c(2,0,0), xreg=trend) arima(tmp, order=c(1,1,1), xreg=trend) trend[c(20, 67)] <- NA arima(tmp, order=c(2,0,0), xreg=trend) ## tests of prediction predict(arima(lh, order=c(1,0,1)), n.ahead=5) predict(arima(lh, order=c(1,1,0)), n.ahead=5) predict(arima(lh, order=c(0,2,1)), n.ahead=5) ## test of init arima(lh, order = c(1,0,1), init = c(0.5, 0.5, NA)) arima(lh, order = c(1,0,1), init = c(0.5, 2, NA)) try(arima(lh, order = c(1,0,1), init = c(2, NA, NA))) ## test of fixed arima(lh, order = c(1,0,1), fixed = c(0.5, NA, NA), trans = FALSE) trend <- time(LakeHuron) - 1920 arima(LakeHuron, order=c(2,0,0), xreg=trend) arima(x = LakeHuron, order = c(2, 0, 0), xreg = trend, fixed = c(NA, NA, 580, -0.02)) arima(x = LakeHuron, order = c(2, 0, 0), xreg = trend, fixed = c(NA, NA, 580, 0)) ### model selection from WWWusage aics <- matrix(, 6, 6, dimnames=list(p=0:5, q=0:5)) for(q in 1:5) aics[1, 1+q] <- arima(WWWusage, c(0,1,q), optim.control = list(maxit = 500))$aic for(p in 1:5) for(q in 0:5) aics[1+p, 1+q] <- arima(WWWusage, c(p,1,q), optim.control = list(maxit = 500))$aic round(aics - min(aics, na.rm=TRUE), 2) ### nottem nott <- window(nottem, end=c(1936,12)) fit <- arima(nott,order=c(1,0,0), list(order=c(2,1,0), period=12)) nott.fore <- predict(fit, n.ahead=36) ts.plot(nott, nott.fore$pred, nott.fore$pred+2*nott.fore$se, nott.fore$pred-2*nott.fore$se, gpars=list(col=c(1,1,4,4))) ### StructTS (fit <- StructTS(log10(UKgas), type = "BSM")) (fit <- StructTS(log10(UKgas), type = "BSM", fixed=c(0, NA, NA, NA))) (fit <- StructTS(log10(UKgas), type = "BSM", fixed=c(NA, 0, NA, NA))) (fit <- StructTS(log10(UKgas), type = "BSM", fixed=c(NA, NA, NA, 0))) ### from AirPassengers ## The classic `airline model', by full ML (fit <- arima(log10(AirPassengers), c(0, 1, 1), seasonal = list(order=c(0, 1 ,1), period=12))) update(fit, method = "CSS") update(fit, x=window(log10(AirPassengers), start = 1954)) pred <- predict(fit, n.ahead = 24) tl <- pred$pred - 1.96 * pred$se tu <- pred$pred + 1.96 * pred$se ts.plot(AirPassengers, 10^tl, 10^tu, log = "y", lty = c(1,2,2)) ## full ML fit is the same if the series is reversed, CSS fit is not ap0 <- rev(log10(AirPassengers)) attributes(ap0) <- attributes(AirPassengers) fr1 <- arima(ap0, c(0, 1, 1), seasonal = list(order=c(0, 1 ,1), period=12)) fr2 <- arima(ap0, c(0, 1, 1), seasonal = list(order=c(0, 1 ,1), period=12), method = "CSS") i <- c("coef", "sigma2", "var.coef") stopifnot(all.equal(fr1[i], fit[i], tol=4e-4))# 64b: 9e-5 is ok ## Structural Time Series ap <- log10(AirPassengers) - 2 (fit <- StructTS(ap, type= "BSM")) par(mfrow=c(1,2)) plot(cbind(ap, fitted(fit)), plot.type = "single") plot(cbind(ap, tsSmooth(fit)), plot.type = "single") ## PR14925 a <- ts(matrix(1:36, 12), start = 2000, freq = 12) b <- ts(matrix(1:48, 16), start = c(1999,9), freq = 12) window(a, start = c(2000,6)) <- window(b, start = c(2000,6), end = c(2000,12)) ## failed in R < 2.15.1 ## ts() and t(ts(.)) classes and is.mts() (mCls <- class(aics)) # == c("matrix", "array") (nmAmat <- names(attributes(aics))) # == c("dim", "dimnames") ata <- attributes(ta <- t(a)) str(att <- attributes(tts <- t(TS <- ts(cbind(1, 1:20))))) cat("TS: "); class(TS) ; cat(" attributes(TS): "); str(attributes(TS), indent.str=" attr> ") tools::assertError(verbose = TRUE, ts(numeric())) stopifnot(exprs = { is.mts(a) is.mts(b) identical(class(ta), mCls) # no "ts" identical(names(ata), nmAmat) # no "class" is.mts(EuStockMarkets) is.mts(Seatbelts) !is.mts(t(b)) { ap3 <- AiP <- AirPassengers; dim(ap3) <- c(3,4,12) is.character(class(ap3) <- class(AiP) <- class(Seatbelts)) } !is.mts(AiP) # is.mts(.) was TRUE, wrongly in R <= 4.2.x identical(class(tts), mCls) identical(names(att), nmAmat)# had "class" at some point is.ts(ts())# an NA !is.mts(structure(numeric(), class = "mts")) !is.mts(structure(numeric(), class = c("mts", "ts", "matrix"))) }) ## is.mts() was too simplistic in R <= 4.2.x cat('Time elapsed: ', proc.time() - .proctime00,'\n')