ip <- read.csv("data/INDPRO.csv"); g <- 100 * diff(log(ip$INDPRO))
N <- length(g); R <- 240; P2 <- N - R; y <- g[(R + 1):N]
fc <- sapply(0:12, function(p) sapply(1:P2, function(j) { z <- g[j:(R + j - 1)]
if (p == 0) return(mean(z)); E <- embed(z, p + 1)
sum(lm.fit(cbind(1, E[, -1]), E[, 1])$coefficients * c(1, g[(R + j - 1):(R + j - p)])) }))
colnames(fc) <- c("mean", paste0("AR", 1:12)); fc <- cbind(fc, RW = g[R:(N - 1)])
L <- (y - fc)^2; I2 <- sboot(P2, 999, mean_len = 12)
Lb <- apply(I2, 2, function(i) colMeans(L[i, ])) # models x B
D <- L[, 1] - L[, -1]; dbar <- colMeans(D); Db <- Lb[1, ] - t(Lb[-1, ])
om <- apply(Db, 2, sd) * sqrt(P2); tj <- sqrt(P2) * dbar / om
p_RC <- mean(apply(t(Db) - dbar, 2, function(x) max(sqrt(P2) * x)) >= max(sqrt(P2) * dbar))
mu_c <- dbar * (tj >= -sqrt(2 * log(log(P2))))
p_SPA <- mean(apply(t(Db) - mu_c, 2, function(x) max(sqrt(P2) * x / om, 0)) >= max(tj, 0))
M <- colnames(L); pv <- setNames(numeric(ncol(L)), M); pmax_ <- 0 # MCS, T_max rule
while (length(M) > 1) {
di <- colMeans(L[, M]) - mean(colMeans(L[, M])); dib <- sweep(Lb[M, ], 2, colMeans(Lb[M, ]))
se <- apply(dib, 1, sd); tt <- di / se
pmax_ <- max(pmax_, mean(apply((dib - di) / se, 2, max) >= max(tt)))
w <- M[which.max(tt)]; pv[w] <- pmax_; M <- setdiff(M, w) }
pv[M] <- 1
round(colMeans(L) / mean(L[, 1]), 2) # MSPE relative to the mean
data.frame(p_RC = round(p_RC, 3), p_SPA = round(p_SPA, 3), MCS90_size = sum(pv >= 0.10))
names(pv)[pv < 0.10] # eliminated from the 90% MCS