library(forecast)
library(cluster)
source("ArimaxMultipleInput_EDXU.R")

Time Series Analysis of Number of Passengers

## Data for dtu31761a3d
frameData <- function(){
    dat <- read.csv("passengers.csv", header = T)
    num_obs <- length(dat[,1])
    seq_12 <- seq(12)
    vec_month <- rep(0, num_obs)
    vec_year <- rep(0, num_obs)
    for (i in 1: (num_obs / 12)){
        vec_month[(12 * i - 11): (12 * i)] <- seq_12
        vec_year[(12 * i - 11): (12 * i)] <- rep(i, 12)
    }
    dat.f <- data.frame("series" = seq(1, num_obs), "year" = vec_year, "month" = vec_month, "pass" = dat[,1])
    return(dat.f)
}
dat.f <- frameData()
rm(frameData)
num_obs <- length(dat.f$series)

Box-Plot by Month and Year

par(bty="n")
plot(factor(dat.f$month), dat.f$pass, xlab = "Month", ylab = "1000 Passengers",
     main = "Box Plot of Passengers By Month")

plot(factor(dat.f$year), dat.f$pass, xlab = "Year", ylab = "1000 Passengers", bty = "n",
     main = "Box Plot of Passengers By Year")

vec_ave_year <- rep(0, 11)
vec_pass.ave <- rep(0, 132)
for (i in 1: 11){
    vec_ave_year[i] <- sum(dat.f$pass[dat.f$year == i]) / 12
    vec_pass.ave[dat.f$year == i] <-  dat.f$pass[dat.f$year == i] - vec_ave_year[i]
}
# dat.f["pass.ave"] <- vec_pass.ave

Transform the Data

dat.f["pass.log"] <- log(dat.f$pass)
plot(dat.f$series, dat.f$pass.log, type = "b", col = "blue", bty = "n")

plotTimeSeries(dat.f$pass.log, num_lag = 24)

Task 1: Fit ARIMA Model to the Data

ts_pass.log <- ts(dat.f$pass.log, frequency = 12)
mod_auto <- auto.arima(ts_pass.log)
plotTimeSeriesResidual(mod_auto$residuals, num_lag = 24)

mod_1 <- arima(dat.f$pass.log, order = c(0, 1, 1), seasonal = list(order = c(0, 1, 1), period = 12))
plotTimeSeriesResidual(mod_1$residual, num_lag = 24)

Task 2: Scenario Generation and Reduction

num_step <- 12 # predict the next 24 hours
num_scena <- 1000 # initial number of scenarios
num_scena.red <- 10 # Reduce number of scenarios
# Data structure to store the scenarios
mat_scena <- matrix(NA, nrow = num_scena, ncol = num_step)
# Loop over scenarios and simulate with the arima model a prediction for the next 24 hours
for(w in 1: num_scena){
  mat_scena[w,]  <- simulate(mod_1, nsim = num_step, future = TRUE, seed = w)
}
mat_scena.exp <- exp(mat_scena)
plot(dat.f$pass, type = 'l', col='red', lwd = 1, bty="n", cex = , xlab = 'Time (months)', 
     ylab = 'Number of Passengers (Thousands)', ylim = c(min(dat.f$pass), max(mat_scena.exp)),
     xlim = c(0, num_obs + 12), main = 'Scenario Generation for Number of Passengers in One Future Year')
for(w in 1: num_scena){
    lines(seq((num_obs + 1), (num_obs + 12)), mat_scena.exp[w, ], col = 'grey', lwd = 0.5)
}
legend('topleft', inset = .02, legend = c('Observations', 'Scenarios'),
       col = c('red', 'grey'), lwd = c(1, 0.5), lty = c(1, 1))

mod_pam <- pam(mat_scena.exp, num_scena.red)
There were 13 warnings (use warnings() to see them)
mat_scena.exp.red <- mod_pam$medoids
plot(dat.f$pass, type = 'l', col='red', lwd = 1, bty="n", cex = , xlab = 'Time (months)', 
     ylab = 'Number of Passengers (Thousands)', ylim = c(min(dat.f$pass), max(mat_scena.exp)),
     xlim = c(0, num_obs + 12), main = 'Scenario Reduction for Number of Passengers in One Future Year')
for(w in 1: num_scena.red){
    lines(seq((num_obs + 1), (num_obs + 12)), mat_scena.exp.red[w,], col = 'grey', lwd = 0.5)
}
legend('topleft', inset = .02, legend = c('Observations', 'Scenarios'),
       col = c('red', 'grey'), lwd = c(1, 0.5), lty = c(1, 1))

Calculate the Probabilities of Reduced Scenatrios

vec_prob.red <- rep(0, 12) 
for (i in 1: num_scena.red) {
  vec_prob.red[i] <- (1 / num_scena) * sum(mod_pam$clustering == i, na.rm = TRUE)
}
sum(vec_prob.red) > 1 - 10^6  # Check if the sum of prob is 1
[1] TRUE
LS0tCnRpdGxlOiAiRFRVMDI0MzVBMzogUHJlZGljdGlvbiBhbmQgRGVjaXNpb24gTWFraW5nIGluIEFpcmxpbmUgQ29tcGFueSIKb3V0cHV0OiBodG1sX25vdGVib29rCmF1dGhvcjogRWR3YXJkIEouIFh1CnZlcnNpb246IDEuMApkYXRlOiBBcHJpbCAyN3RoLCAyMDE5Ci0tLQoKYGBge3IsIGluY2x1ZGU9RkFMU0V9CiMgQ2xlYXIgdmFyaWFibGVzCnJtKGxpc3Q9bHMoKSkKbGlicmFyeShrbml0cikKYGBgCgpgYGB7cn0KbGlicmFyeShmb3JlY2FzdCkKbGlicmFyeShjbHVzdGVyKQpzb3VyY2UoIkFyaW1heE11bHRpcGxlSW5wdXRfRURYVS5SIikKYGBgCgojIFRpbWUgU2VyaWVzIEFuYWx5c2lzIG9mIE51bWJlciBvZiBQYXNzZW5nZXJzCgpgYGB7cn0KIyMgRGF0YSBmb3IgZHR1MzE3NjFhM2QKZnJhbWVEYXRhIDwtIGZ1bmN0aW9uKCl7CiAgICBkYXQgPC0gcmVhZC5jc3YoInBhc3NlbmdlcnMuY3N2IiwgaGVhZGVyID0gVCkKICAgIG51bV9vYnMgPC0gbGVuZ3RoKGRhdFssMV0pCiAgICBzZXFfMTIgPC0gc2VxKDEyKQogICAgdmVjX21vbnRoIDwtIHJlcCgwLCBudW1fb2JzKQogICAgdmVjX3llYXIgPC0gcmVwKDAsIG51bV9vYnMpCiAgICBmb3IgKGkgaW4gMTogKG51bV9vYnMgLyAxMikpewogICAgICAgIHZlY19tb250aFsoMTIgKiBpIC0gMTEpOiAoMTIgKiBpKV0gPC0gc2VxXzEyCiAgICAgICAgdmVjX3llYXJbKDEyICogaSAtIDExKTogKDEyICogaSldIDwtIHJlcChpLCAxMikKICAgIH0KICAgIGRhdC5mIDwtIGRhdGEuZnJhbWUoInNlcmllcyIgPSBzZXEoMSwgbnVtX29icyksICJ5ZWFyIiA9IHZlY195ZWFyLCAibW9udGgiID0gdmVjX21vbnRoLCAicGFzcyIgPSBkYXRbLDFdKQogICAgcmV0dXJuKGRhdC5mKQp9CmRhdC5mIDwtIGZyYW1lRGF0YSgpCnJtKGZyYW1lRGF0YSkKbnVtX29icyA8LSBsZW5ndGgoZGF0LmYkc2VyaWVzKQpgYGAKCiMgQm94LVBsb3QgYnkgTW9udGggYW5kIFllYXIKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9CnBhcihidHk9Im4iKQpwbG90KGZhY3RvcihkYXQuZiRtb250aCksIGRhdC5mJHBhc3MsIHhsYWIgPSAiTW9udGgiLCB5bGFiID0gIjEwMDAgUGFzc2VuZ2VycyIsCiAgICAgbWFpbiA9ICJCb3ggUGxvdCBvZiBQYXNzZW5nZXJzIEJ5IE1vbnRoIikKYGBgCgpgYGB7ciwgZmlnLmhlaWdodCA9IDYsIGZpZy53aWR0aCA9IDExfQpwbG90KGZhY3RvcihkYXQuZiR5ZWFyKSwgZGF0LmYkcGFzcywgeGxhYiA9ICJZZWFyIiwgeWxhYiA9ICIxMDAwIFBhc3NlbmdlcnMiLCBidHkgPSAibiIsCiAgICAgbWFpbiA9ICJCb3ggUGxvdCBvZiBQYXNzZW5nZXJzIEJ5IFllYXIiKQpgYGAKCmBgYHtyfQp2ZWNfYXZlX3llYXIgPC0gcmVwKDAsIDExKQp2ZWNfcGFzcy5hdmUgPC0gcmVwKDAsIDEzMikKZm9yIChpIGluIDE6IDExKXsKICAgIHZlY19hdmVfeWVhcltpXSA8LSBzdW0oZGF0LmYkcGFzc1tkYXQuZiR5ZWFyID09IGldKSAvIDEyCiAgICB2ZWNfcGFzcy5hdmVbZGF0LmYkeWVhciA9PSBpXSA8LSAgZGF0LmYkcGFzc1tkYXQuZiR5ZWFyID09IGldIC0gdmVjX2F2ZV95ZWFyW2ldCn0KIyBkYXQuZlsicGFzcy5hdmUiXSA8LSB2ZWNfcGFzcy5hdmUKYGBgCgojIFRyYW5zZm9ybSB0aGUgRGF0YQoKYGBge3IsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KZGF0LmZbInBhc3MubG9nIl0gPC0gbG9nKGRhdC5mJHBhc3MpCnBsb3QoZGF0LmYkc2VyaWVzLCBkYXQuZiRwYXNzLmxvZywgdHlwZSA9ICJiIiwgY29sID0gImJsdWUiLCBidHkgPSAibiIpCmBgYAoKYGBge3IsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KcGxvdFRpbWVTZXJpZXMoZGF0LmYkcGFzcy5sb2csIG51bV9sYWcgPSAyNCkKYGBgCgojIFRhc2sgMTogRml0IEFSSU1BIE1vZGVsIHRvIHRoZSBEYXRhCgpgYGB7ciwgZmlnLmhlaWdodCA9IDEyLCBmaWcud2lkdGggPSAxMX0KdHNfcGFzcy5sb2cgPC0gdHMoZGF0LmYkcGFzcy5sb2csIGZyZXF1ZW5jeSA9IDEyKQptb2RfYXV0byA8LSBhdXRvLmFyaW1hKHRzX3Bhc3MubG9nKQpwbG90VGltZVNlcmllc1Jlc2lkdWFsKG1vZF9hdXRvJHJlc2lkdWFscywgbnVtX2xhZyA9IDI0KQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gMTIsIGZpZy53aWR0aCA9IDExfQptb2RfMSA8LSBhcmltYShkYXQuZiRwYXNzLmxvZywgb3JkZXIgPSBjKDAsIDEsIDEpLCBzZWFzb25hbCA9IGxpc3Qob3JkZXIgPSBjKDAsIDEsIDEpLCBwZXJpb2QgPSAxMikpCnBsb3RUaW1lU2VyaWVzUmVzaWR1YWwobW9kXzEkcmVzaWR1YWwsIG51bV9sYWcgPSAyNCkKYGBgCgojIyBUYXNrIDI6IFNjZW5hcmlvIEdlbmVyYXRpb24gYW5kIFJlZHVjdGlvbgoKYGBge3IsIGZpZy5oZWlnaHQgPSA2LCBmaWcud2lkdGggPSAxMX0KbnVtX3N0ZXAgPC0gMTIgIyBwcmVkaWN0IHRoZSBuZXh0IDI0IGhvdXJzCm51bV9zY2VuYSA8LSAxMDAwICMgaW5pdGlhbCBudW1iZXIgb2Ygc2NlbmFyaW9zCm51bV9zY2VuYS5yZWQgPC0gMTAgIyBSZWR1Y2UgbnVtYmVyIG9mIHNjZW5hcmlvcwojIERhdGEgc3RydWN0dXJlIHRvIHN0b3JlIHRoZSBzY2VuYXJpb3MKbWF0X3NjZW5hIDwtIG1hdHJpeChOQSwgbnJvdyA9IG51bV9zY2VuYSwgbmNvbCA9IG51bV9zdGVwKQojIExvb3Agb3ZlciBzY2VuYXJpb3MgYW5kIHNpbXVsYXRlIHdpdGggdGhlIGFyaW1hIG1vZGVsIGEgcHJlZGljdGlvbiBmb3IgdGhlIG5leHQgMjQgaG91cnMKZm9yKHcgaW4gMTogbnVtX3NjZW5hKXsKICBtYXRfc2NlbmFbdyxdICA8LSBzaW11bGF0ZShtb2RfMSwgbnNpbSA9IG51bV9zdGVwLCBmdXR1cmUgPSBUUlVFLCBzZWVkID0gdykKfQptYXRfc2NlbmEuZXhwIDwtIGV4cChtYXRfc2NlbmEpCnBsb3QoZGF0LmYkcGFzcywgdHlwZSA9ICdsJywgY29sPSdyZWQnLCBsd2QgPSAxLCBidHk9Im4iLCBjZXggPSAsIHhsYWIgPSAnVGltZSAobW9udGhzKScsIAogICAgIHlsYWIgPSAnTnVtYmVyIG9mIFBhc3NlbmdlcnMgKFRob3VzYW5kcyknLCB5bGltID0gYyhtaW4oZGF0LmYkcGFzcyksIG1heChtYXRfc2NlbmEuZXhwKSksCiAgICAgeGxpbSA9IGMoMCwgbnVtX29icyArIDEyKSwgbWFpbiA9ICdTY2VuYXJpbyBHZW5lcmF0aW9uIGZvciBOdW1iZXIgb2YgUGFzc2VuZ2VycyBpbiBPbmUgRnV0dXJlIFllYXInKQpmb3IodyBpbiAxOiBudW1fc2NlbmEpewogICAgbGluZXMoc2VxKChudW1fb2JzICsgMSksIChudW1fb2JzICsgMTIpKSwgbWF0X3NjZW5hLmV4cFt3LCBdLCBjb2wgPSAnZ3JleScsIGx3ZCA9IDAuNSkKfQpsZWdlbmQoJ3RvcGxlZnQnLCBpbnNldCA9IC4wMiwgbGVnZW5kID0gYygnT2JzZXJ2YXRpb25zJywgJ1NjZW5hcmlvcycpLAogICAgICAgY29sID0gYygncmVkJywgJ2dyZXknKSwgbHdkID0gYygxLCAwLjUpLCBsdHkgPSBjKDEsIDEpKQpgYGAKCmBgYHtyLCBmaWcuaGVpZ2h0ID0gNiwgZmlnLndpZHRoID0gMTF9Cm1vZF9wYW0gPC0gcGFtKG1hdF9zY2VuYS5leHAsIG51bV9zY2VuYS5yZWQpCm1hdF9zY2VuYS5leHAucmVkIDwtIG1vZF9wYW0kbWVkb2lkcwpwbG90KGRhdC5mJHBhc3MsIHR5cGUgPSAnbCcsIGNvbD0ncmVkJywgbHdkID0gMSwgYnR5PSJuIiwgY2V4ID0gLCB4bGFiID0gJ1RpbWUgKG1vbnRocyknLCAKICAgICB5bGFiID0gJ051bWJlciBvZiBQYXNzZW5nZXJzIChUaG91c2FuZHMpJywgeWxpbSA9IGMobWluKGRhdC5mJHBhc3MpLCBtYXgobWF0X3NjZW5hLmV4cCkpLAogICAgIHhsaW0gPSBjKDAsIG51bV9vYnMgKyAxMiksIG1haW4gPSAnU2NlbmFyaW8gUmVkdWN0aW9uIGZvciBOdW1iZXIgb2YgUGFzc2VuZ2VycyBpbiBPbmUgRnV0dXJlIFllYXInKQpmb3IodyBpbiAxOiBudW1fc2NlbmEucmVkKXsKICAgIGxpbmVzKHNlcSgobnVtX29icyArIDEpLCAobnVtX29icyArIDEyKSksIG1hdF9zY2VuYS5leHAucmVkW3csXSwgY29sID0gJ2dyZXknLCBsd2QgPSAwLjUpCn0KbGVnZW5kKCd0b3BsZWZ0JywgaW5zZXQgPSAuMDIsIGxlZ2VuZCA9IGMoJ09ic2VydmF0aW9ucycsICdTY2VuYXJpb3MnKSwKICAgICAgIGNvbCA9IGMoJ3JlZCcsICdncmV5JyksIGx3ZCA9IGMoMSwgMC41KSwgbHR5ID0gYygxLCAxKSkKYGBgCgojIyBDYWxjdWxhdGUgdGhlIFByb2JhYmlsaXRpZXMgb2YgUmVkdWNlZCBTY2VuYXRyaW9zCgpgYGB7cn0KdmVjX3Byb2IucmVkIDwtIHJlcCgwLCAxMikgCmZvciAoaSBpbiAxOiBudW1fc2NlbmEucmVkKSB7CiAgdmVjX3Byb2IucmVkW2ldIDwtICgxIC8gbnVtX3NjZW5hKSAqIHN1bShtb2RfcGFtJGNsdXN0ZXJpbmcgPT0gaSwgbmEucm0gPSBUUlVFKQp9CnN1bSh2ZWNfcHJvYi5yZWQpID4gMSAtIDEwXjYgICMgQ2hlY2sgaWYgdGhlIHN1bSBvZiBwcm9iIGlzIDEKYGBgCgo=