##------------------------------------------------------##
##                INSERINDO OS DADOS                    ##
##------------------------------------------------------##

dados <- read.csv(file.choose(), sep = ";", dec = ",", header = T)
attach(dados)

##-------------------------------------------------------------##
##                PLOTANDO A SÉRIE TEMPORAL                    ##
##-------------------------------------------------------------##

plot(ts(IPI, start = c(1985, 1), frequency = 12), type = "o",
     pch = 21, bg = "yellow", las = 1, ylab = "Quantidade", 
     xlab = "Ano", main = "Série Completa")
abline(v = seq(1986,2000,1), lty = 2, col = "gray")

##----------------------------------------------------##
##            PLOTANDO A SÉRIE SELECIONADA            ##
##----------------------------------------------------##

serie <- IPI[1:127]

plot(ts(serie, start = c(1985, 1), frequency = 12), type = "o", 
     xlab = "Ano", ylab = "Quantidade", las = 1, pch = 21, bg = "yellow",
     main = "Série Selecionada")

abline(v = seq(1986, 1995, 1), lty = 2, col = "gray")

##---------------------------------------------------------------------##
##            MODELANDO A SÉRIE PELO MÉTODO DE HOLT-WINTERS            ##
##---------------------------------------------------------------------##

##   Equações de Recorrência   ##

s = 12
a = 0.97
d = 0.2
c = 0.01

# Nível
Niv <- numeric(0)
Niv[s] = mean(serie[1:s])

# Tendência
Tend <- numeric(0)
Tend[s] = 0

# Sazonalidade
Saz <- numeric(0)
Saz[1:s] = serie[1:s]/Niv[s]

for (i in (s+1):length(serie)) {
  Niv[i] <- a*(serie[i]-Saz[i-s])+(1-a)*(Niv[i-1]+Tend[i-1])
  Tend[i] <- c*(Niv[i]-Niv[i-1])+(1-c)*Tend[i-1]
  Saz[i] <- d*(serie[i]-Niv[i])+(1-d)*Saz[i-s]
}

##--------------------------------------------------------------------##
##            PLOTANDO AS ESTIMATIVAS DA SÉRIE SELECIONADA            ##
##--------------------------------------------------------------------##

plot(Niv, type = "l", las = 1, col = "blue",
     xlab = "Nível", ylab = "Estimativa")

plot(Saz, type = "l", las = 1, col = "blue", 
     xlab = "Sazonalidade", ylab = "Estimativa")

plot(Tend, type = "l", las = 1, col = "blue",
     xlab = "Tendência", ylab = "Estimativa")

##------------------------------------------------##
##            OBTENDO O MODELO OBTIDO             ##
##------------------------------------------------##

modelo <- numeric(0)

for(i in s:length(serie)){
  modelo[i] = Niv[i] + Tend[i] + Saz[i]
}

##------------------------------------------------##
##            PLOTANDO O MODELO OBTIDO             ##
##------------------------------------------------##

plot(serie, type = "o", xlab = "Ano", ylab = "Quantidade", 
     las = 1, pch = 21, bg = "yellow",
     main = "Série Selecionada", axes = F)

lines(modelo, col = "red")

axis(1, at = seq(1, length(serie), 12), labels = seq(1985, 1995))

axis(2, seq(65, 127, 5), las = 1)

box()

legend(1, 126.9, c("Série dos Dados", "Modelo"), lty = c(1,1),
       col = c("black", "red"), pt.bg = c("yellow", NA), 
       pch = c(21,NA), bty = "n", y.intersp = 0.8)

##----------------------------------------------##
##            PREVISÕES DO DO MODELO            ##
##----------------------------------------------##

h = length(IPI)-length(serie)

Prev <- numeric(0)
Prev[length(serie)] <- modelo[length(serie)]

for (i in 1:h) {
  Prev[length(serie) + i] <- ifelse(i <= s, Niv[length(serie)]+i*Tend[length(serie)]+Saz[length(serie)+i-s],                   
                                    ifelse(i > s & i <= 2*s, Niv[length(serie)]+i*Tend[length(serie)]+Saz[length(serie)+i-2*s],
                                    ifelse(i > 2*s & i <= 3*s, Niv[length(serie)]+i*Tend[length(serie)]+Saz[length(serie)+i-3*s],
                                    ifelse(i > 3*s & i <= 4*s, Niv[length(serie)]+i*Tend[length(serie)]+Saz[length(serie)+i-4*s],
                                           Niv[length(serie)]+i*Tend[length(serie)]+Saz[length(serie)+i-5*s]))))  
  
}

##------------------------------------------------------------------##
##            PLOTANDO AS PREVISÕES DA SÉRIE SELECIONADA            ##
##------------------------------------------------------------------##

plot(IPI[(length(serie)+1):length(IPI)], type = "o", xlab = "Ano", ylab = "Quantidade", 
     las = 1, pch = 21, bg = "yellow", axes = F)

lines(Prev[(length(serie)+1):length(IPI)], type = "l", col = "red")

axis(1, at = seq(1,60,2), labels = c("Ago/95", "Out/95","Dez/95",
                                     "Fev/96", "Abr/96", "Jun/96",
                                     "Ago/96", "Out/96","Dez/96",
                                     "Fev/97", "Abr/97", "Jun/97",
                                     "Ago/97", "Out/97","Dez/97",
                                     "Fev/98", "Abr/98", "Jun/98",
                                     "Ago/98", "Out/98","Dez/98",
                                     "Fev/99", "Abr/99", "Jun/99",
                                     "Ago/99", "Out/99","Dez/99",
                                     "Fev/00", "Abr/00", "Jun/00"), cex.axis = 0.5)
axis(2, seq(80,200,10), las = 1)
box()

legend(1,200, c("IPI Observado", "Previsão Direta"), lty = c(1,1), col = c("black", "red"),
       pt.bg = c("yellow", NA), pch = c(21,NA), bty = "n", y.intersp = 0.8)

##------------------------------------------------------------------##
##            PLOTANDO PREVISÃO DESATUALIZADA DO MODELO             ##
##------------------------------------------------------------------##

plot(IPI, type = "o", pch = 21, bg = "yellow", las = 1, 
     ylab = "Quantidade", xlab = "Ano", axes = F)

lines(modelo, type = "l", col = "red")

lines(Prev, type = "l", col = "green4")

axis(1, at = seq(0,187, 12), labels = c("1985", "1986", "1987",
                                        "1988", "1989", "1990",
                                        "1991", "1992", "1993",
                                        "1994", "1995", "1996",
                                        "1997", "1998", "1999",
                                        "2000"))

axis(2, seq(60, 200, 10), las = 1)

legend(1,200, c("IPI Observado", "Estimativa", "Previsão"),
       col = c("black", "red", "green4"), pch = c(21, NA, NA),
       pt.bg = c("yellow", NA, NA), bty = "n", y.intersp = 0.7,
       lty = c(1,1,1))
box()

##----------------------------------------------------------------##
##            PLOTANDO OS COEFICIENTES DO MODELO                  ##
##----------------------------------------------------------------##

Prev1 <- numeric(0)
Prev1[length(serie)] = modelo[length(serie)]

for (i in 1:h) {
  Niv[length(serie)+i] <- a*(IPI[length(serie)+i]-Saz[length(serie)+i-s])+(1-a)*(Niv[length(serie)+i-1]+Tend[length(serie)+i-1])
  Tend[length(serie)+i] <- c*(Niv[length(serie)+i]-Niv[length(serie)+i-1])+(1-c)*Tend[length(serie)+i-1]
  Saz[length(serie)+i] <- d*(IPI[length(serie)+i]-Niv[length(serie)+i])+(1-d)*Saz[length(serie)+i-s]
  Prev1[length(serie)+i] <- ifelse(i <= s, Niv[length(serie)+i-1]+Tend[length(serie)+i-1]+Saz[length(serie)+i-s],                   
                                    ifelse(i > s & i <= 2*s, Niv[length(serie)+i-1]+Tend[length(serie)+i-1]+Saz[length(serie)+i-2*s],
                                           ifelse(i > 2*s & i <= 3*s, Niv[length(serie)+i-1]+Tend[length(serie)+i-1]+Saz[length(serie)+i-3*s],
                                                  ifelse(i > 3*s & i <= 4*s, Niv[length(serie)+i-1]+Tend[length(serie)+i-1]+Saz[length(serie)+i-4*s],
                                                         Niv[length(serie)+i-1]+Tend[length(serie)+i-1]+Saz[length(serie)+i-5*s]))))  
}

plot(Niv[(length(serie)+1):length(IPI)], type = "l", col = "blue", xlab = "Nível", ylab = "Estimativa")

plot(Saz[(length(serie)+1):length(IPI)], type = "l", col = "blue", xlab = "Sazonalidade", ylab = "Estimativa")

plot(Tend[(length(serie)+1):length(IPI)], type = "l", col = "blue", xlab = "Tendência", ylab = "Estimativa")

##---------------------------------------------------------------##
##            PLOTANDO PREVISÃO ATUALIZADA DO MODELO             ##
##---------------------------------------------------------------##

plot(IPI[(length(serie)+1):length(IPI)], type = "o", xlab = "Ano", ylab = "Quantidade", 
     las = 1, pch = 21, bg = "yellow", axes = F)

lines(Prev1[(length(serie)+1):length(IPI)], type = "l", col = "red")

axis(1, at = seq(1,60,2), labels = c("Ago/95", "Out/95","Dez/95",
                                     "Fev/96", "Abr/96", "Jun/96",
                                     "Ago/96", "Out/96","Dez/96",
                                     "Fev/97", "Abr/97", "Jun/97",
                                     "Ago/97", "Out/97","Dez/97",
                                     "Fev/98", "Abr/98", "Jun/98",
                                     "Ago/98", "Out/98","Dez/98",
                                     "Fev/99", "Abr/99", "Jun/99",
                                     "Ago/99", "Out/99","Dez/99",
                                     "Fev/00", "Abr/00", "Jun/00"), cex.axis = 0.5)
axis(2, seq(80,150,10), las = 1)
box()

legend(1,150, c("IPI Observado", "Previsão Atualizada"), lty = c(1,1), col = c("black", "red"),
       pt.bg = c("yellow", NA), pch = c(21,NA), bty = "n", y.intersp = 0.8)

##---------------------------------------------------------------##
##            PLOTANDO PREVISÃO ATUALIZADA DO MODELO             ##
##---------------------------------------------------------------##

plot(IPI, type = "o", pch = 21, bg = "yellow", las = 1, 
     ylab = "Quantidade", xlab = "Ano", axes = F)

lines(modelo, type = "l", col = "red")

lines(Prev1, type = "l", col = "green4")

axis(1, at = seq(0,187, 12), labels = c("1985", "1986", "1987",
                                        "1988", "1989", "1990",
                                        "1991", "1992", "1993",
                                        "1994", "1995", "1996",
                                        "1997", "1998", "1999",
                                        "2000"))

axis(2, seq(60, 150, 10), las = 1)

legend(1,150, c("IPI Observado", "Estimativa", "Previsão"),
       col = c("black", "red", "green4"), pch = c(21, NA, NA),
       pt.bg = c("yellow", NA, NA), bty = "n", y.intersp = 0.7,
       lty = c(1,1,1))
box()

##--------------------------------------------------------##
##             MEDIDAS DE ACURÁCIA DO MODELO              ##
##--------------------------------------------------------##

EQM <- sum((serie[s:length(serie)]-modelo[s:length(serie)])^2)/(length(serie)-s+1)
MAPE <- (sum(abs(serie[s:length(serie)]-modelo[s:length(serie)])/serie[s:length(serie)])*100)/(length(serie)-s+1)
MAD <- sum(abs(serie[s:length(serie)]-modelo[s:length(serie)]))/(length(serie)-s+1)

data.frame(EQM,MAPE,MAD)
##         EQM      MAPE       MAD
## 1 0.1392587 0.2209183 0.2110252
##----------------------------------------------------------##
##             MEDIDAS DE ACURÁCIA DE PREVISÁO              ##
##----------------------------------------------------------##

EQM1 <- sum((IPI[(length(serie)+1):length(IPI)]-Prev[(length(serie)+1):length(IPI)])^2)/h
MAPE1 <- (sum(abs(IPI[(length(serie)+1):length(IPI)]-Prev[(length(serie)+1):length(IPI)])/IPI[(length(serie)+1):length(IPI)])*100)/h
MAD1 <- sum(abs(IPI[(length(serie)+1):length(IPI)]-Prev[(length(serie)+1):length(IPI)]))/h

EQM2 <- sum((IPI[(length(serie)+1):length(IPI)]-Prev1[(length(serie)+1):length(IPI)])^2)/h
MAPE2 <- (sum(abs(IPI[(length(serie)+1):length(IPI)]-Prev1[(length(serie)+1):length(IPI)])/IPI[(length(serie)+1):length(IPI)])*100)/h
MAD2 <- sum(abs(IPI[(length(serie)+1):length(IPI)]-Prev1[(length(serie)+1):length(IPI)]))/h

Previsão <- c("Desatualizado", "Atualizado")
EQM <- c(EQM1, EQM2)
MAPE <- c(MAPE1, MAPE2)
MAD <- c(MAD1, MAD2)
data.frame(Previsão, EQM, MAPE, MAD)
##        Previsão      EQM      MAPE       MAD
## 1 Desatualizado 286.9519 12.978538 14.204537
## 2    Atualizado 105.4109  7.436937  8.553676