---
slideOptions:
transition: slide
---
###### tags: `educação` `serie temporal`
# IPCA via suavização exponencial
Palestrante: Euler Alencar
---
## Modelos a serem estudados
- Médias Móveis Simples (MMS)
- Série localmente constante
- Suavização Exponencial Simples (SES)
- Série localmente constante
- Suavização Exponencial de Holt (SEH)
- Série que apresenta tendência
- Suavização Exponencial de Holt - Winters (HW)
- Série sazonais
---
## Conceitos Básicos
Métodos de Previsão baseiam-se na ideia que observações passadas contêm informações sobre o padrão de comportamento da série temporal. O propósito do é distinguir padrão do ruído e modelar este padrão de forma a prever valores futuros.
Importância:
> Tales de Mileto mostrou a importância da filosofia dos conhecimentos sobre a natureza. Previu que uma safra próxima de azeitona seria excepcional; assim, passou a comprar grande quantidade prensas, o que permitiu ganhar bastante dinheiro e a importância da ciência.
---
## Dados
[Dados IPCA via IBGE](https://ww2.ibge.gov.br/home/estatistica/indicadores/precos/inpc_ipca/defaultseriesHist.shtm)
Caminho para carregar dados diretamente da internet.
```{r}
# Importard dados
library(readr)
pub_output_csv <- read_csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQelZWLtxzH-KIAwVtVIsHJk3i308sczzGv0sZ14QNae5RnSNsnrne9SoBZ5PcjZ9wUl0wRx4ft5Vaf/pub?output=csv")
View(pub_output_csv)
```
[Dados IPCA (formatado)](https://docs.google.com/spreadsheets/d/1_wrc75pyFjoVy5TS2amt_eYRDlIE86h0lQdTIfrfWzw/edit?usp=sharing)
---
## Modelos de Suavização
### Média Móvel Simples
Considere a série temporal $Z_1$, $Z_2$, ... , $Z_n$, estacionária e localmente constante, composta de seu nível e mais um ruído aleatório da seguinte forma
:::warning
$Z_t = \mu_t + a_t, \quad t=1,\dots,N$
:::
onde E($a_t$) = 0, Var($a_t$) = $\sigma_a^2$ e $\mu_t$ é um parâmetro desconhecido que varia com o tempo.
---
### Matematicamente
A técnica de média móvel consiste em calcular a média aritmética das k observações mais recentes, ou seja
:::info
$M_t = \dfrac{Z_t + Z_{t-1} + \dots + Z_{t-k+1}}{k}.$
:::
Denotamos por k como sendo o comprimento da média.
---
### Previsão
$M_t$ é uma estimativa do nível $\mu_t$ que não leva em consideração as observações mais antigas (após nível k). A cada período a observação mais antiga é substituída pela mais recente, calculando-se uma média nova.
Portanto, a previsão dos h valores futuros é dada pela última média móvel calculada, ou seja,
:::danger
$\hat{Z}_t(h) = M_t.$
:::
---
### Vantagens
- Aplicação simples
- Aplicável quando se tem um número pequeno de observações
- Flexibilidade, dado que é possível modificar "k" que é o período da média.
---
### Desvantagens
- Aplicação somente em séries estacionárias
- Dificuldade de escolher o valor de "k"
- Pesos atribuídos as observações na média é igual
---
## Modelos de Suavização
### Suavização Exponencial Simples
Podemos descrever uma SES por
:::warning
$\bar{Z}_t = \alpha\sum_{j=0}^{t-1}(1- \alpha)^jZ_{t-j} + (1-\alpha)^t\bar{Z}_0,$
:::
onde $t=1,\dots,N$ e $\bar{Z}_t$ é denominado valor exponencialmente suavizado e $\alpha$ é a constante de suavização, tal que $0 \le \alpha \le 1$.
---
### Matematicamente
Expandindo a equação acima temos
:::info
$\bar{Z}_t = \alpha Z_t + \alpha(1-\alpha)Z_{t-1} +$
$\quad \quad + \alpha(1-\alpha)^2Z_{t-2} + \dots + (1-\alpha)^t\bar{Z}_0$
:::
então, podemos concluir que a SES é uma média ponderada que da pesos maiores às observações mais recentes, eliminando uma das desvantagens do método de MMS.
---
### Previsão
A previsão dos h valores futuros é dada pelo último valor exponencialmente suavizado, ou seja
:::danger
$\hat{Z}(h) = \bar{Z}_t, \quad \forall h$
:::
:::danger
$\hat{Z}(h) = \alpha Z_t + (1 - \alpha)\hat{Z}_{t-1}(h+1)$
:::
---
### Determinação da Constante $\alpha$
- Quanto menor o valor de $\alpha$ mais estáveis serão as previsões finais, pois implica maior peso as observações passadas. Assim, flutuações no presente exercerão menor influência em previsões;
- Quanto mais aleatórias foram as séries, menores serão os valores da constante $\alpha$;
---
### Vantagens
- Fácil entendimento;
- Aplicação simples;
- Grande flexibilidade dada pela constante de suavização;
- Necessidade de armazenar poucas informações para previsão;
- O valor de $\alpha$ = 2/(r-1) fornece previsãoes semelhantes à media móvel com parâmetro r;
---
### Desvantagens
- Principal desvantagem é a determinação da constante de suavização.
---
## Modelos de Suavização
### Suavização Exponencial de Holtz
Esta técnica de suavização é recomendada para séries que apresentam tendência. Considere o caso de uma série temporal que é composta localmente da soma de nível, tendencia e resíduo com média zero e variância constante $\sigma_a^2$, isto é
:::warning
$Z_t = \mu_t + T_t + a_t, \quad t = 1, \dots , N$
:::
---
Esta técnica é similar a uma Suavização Exponencial Simples (SES) com uma constante extra para modelar a componente de tendência.
:::info
$\bar{Z}_t = AZ_t + (1-A)(\bar{Z}_{t-1} + \hat{T}_{t-1}),$
:::
tal que, $\quad 0\leq A \leq 1 \quad e \quad t = 2, \dots , N$ e
:::info
$\hat{T}_t = C(\bar{Z}_t - \bar{Z}_{t-1}) + (1-C)\hat{T}_{t-1},$
:::
tal que $\quad 0 \leq C \leq 1 \quad e \quad t = 2, \dots , N,$
onde A e C são denominados constantes de suavização, tal que $A \ge C$.
O procedimento para determinação da constante de suavização é semelhantes ao modelo simples de suavização, porém ao invés de determinar $\alpha$ determina-se o valor do vetor (A,C).
---
### Previsão
Assim, a previsão do valor $Z_{t+h}$ com origem em t é dada por
:::danger
$\hat{Z}_t(h) = \bar{Z}_t + h\hat{T}_t \quad \forall h \geq 0$
:::
A previsão é feita adicionando o valor básico $\bar{Z}_t$ a tendência multiplicada pelo número de passos à frente que deseja prever (h).
---
### Vantagens
- Semelhantes ao caso simples.
---
### Desvantagens
- Dificuldade em determinar A e C.
---
## Modelos de Suavização
### Suavização Exponencial de Holt-Winters
No caso de séries com sazonalidade, utiliza-se a suavização de Holt - Winters.
Essa técnica envolve três equações com três parâmetros de suavização que são associados a cada componente da série: **nível, tendência e sazonalidade.**
---
### Tipos de Modelos
Portanto, temos dois casos a serem considerados:
- Modelo Multiplicativo
:::warning
$Z_t = \mu_t F_t + T_t + a_t, \quad t = 1, \dots , N.$
:::
- Modelo Aditivo
:::warning
$Z_t = \mu_t + T_t + F_t + a_t, \quad t = 1, \dots , N.$
:::
Ou seja, utilizaremos modelo aditivo ou multiplicativo quando tratamos de Sazonalidade. Há três constantes de suavização: A, C e D (sazonalidade).
**Referência**: Morettin e Toloi, Cap. 4, Pág. 97.
___
### Vantagens
- Semelhante ao modelo simples.
---
### Desvantagens
- Determinar as constantes de suavização;
- Dificuldade em estudar propriedades estatísticas: média, variância da previsão.
---
# Aplicação no R
- Passos
- Instalação de pacotes
- Carregamento dos dados
- Transformação dos dados
- Construção do modelo
- Avaliação do Modelo
---
## Pacotes necessários
```{r}
#Primeiros pacotes a instalar
install.packages("forecast")
require(forecast)
install.packages("ggplot2")
require(ggplot2)
install.packages("readr")
library(readr)
# instalar pacote TTR
install.packages("TTR") #para SMA
require(TTR)
# Previsão Médias Móveis - função sma
install.packages("smooth")
require(smooth)
install.packages("Mcomp")
require(Mcomp)
```
---
## Carregar dados
Caminho para carregar dados diretamente da internet.
```{r}
# Importard dados
library(readr)
pub_output_csv <-
read_csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vQelZWLtxzH-KIAwVtVIsHJk3i308sczzGv0sZ14QNae5RnSNsnrne9SoBZ5PcjZ9wUl0wRx4ft5Vaf/pub?output=csv")
View(pub_output_csv)
```
---
## Transformação dos dados
```{r}
# Transformar em Série Temporal
pibtsmes <- ts(pib[,5], start=c(1994, 1), end=c(2018, 8), frequency=12)
pibtsano <- ts(pib[,8], start=c(1994, 1), end=c(2018, 8), frequency=12)
autoplot(pibtsmes)
# Série mais comportada
pibtsmes2 <- window(pibtsmes, start=c(2004, 1), end=c(2018, 8))
# Divido a série entre treino e teste
pibtsmes2_treino <- window(pibtsmes, start=c(2004, 1), end=c(2017, 12))
pibtsmes2_teste <- window(pibtsmes, start=c(2018, 1), end=c(2018, 8))
#Plot com os dados ano a ano
autoplot(pibtsmes2, ylab= 'pib', xlab='mes.ano', main="PIB 2004 - 2018")
```
---

---

---
## Modelagem com Médias Móveis - função ma()
```{r}
# Modelagem com Médias Móveis
pibtsmes_mms = ma(pibtsmes2, order=5)
autoplot(pibtsmes_mms)
plot(pibtsmes2)
lines(pibtsmes_mms, col="red")
pibtsmes_mms12 = ma(pibtsmes2, order=12)
lines(pibtsmes_mms12, col="blue")
legend("topleft",
legend = c("Orig", "MA5", "MA12"),
col = c("black", "red", "blue"),
lty=1.2, cex=0.8)
```
---
## Modelagem com Médias Móveis - função SMA()
```{r}
install.packages("TTR") #para SMA
require(TTR)
o.pibtsmes_mms <- SMA(pibtsmes2,n=5)
plot.ts(o.pibtsmes_mms)
plot.ts(pibtsmes2)
lines(o.pibtsmes_mms, col="red")
o.pibtsmes_mms12 = SMA(pibtsmes2, n=12)
lines(o.pibtsmes_mms12, col="blue")
legend("topleft",
legend = c("Orig", "MA5", "MA12"),
col = c("black", "red", "blue"),
lty=1.2, cex=0.8)
```
---

---
::: success
## Exercício: compare as duas estimativas.
:::
---
## Previsão Médias Móveis - função sma()
```{r}
# previsão Média Móveis - função sma
install.packages("smooth")
require(smooth)
install.packages("Mcomp")
require(Mcomp)
sma.prev1 <- sma(pibtsmes2, h=5)
sma.prev1$forecast
sma.prev1 <- sma(pibtsmes2, order = 5, h=5)
sma.prev1$forecast
#> sma.prev1$forecast
# Jan Feb Mar Apr May Jun Jul Aug Sep # Oct Nov Dec
#2018 0.4240000 0.4648000 0.4777600 0.3213120
#2019 0.3195744
# Conferindo com 5 últimos
x <- c(0.22, 0.40, 1.26, 0.33, -0.09)
print(mean(x))
print(mean(c((x[-1]),mean(x))))
```
---
## Suavização Exponencial Simples
```{r}
# Suavização Exponencial
# Função holt
autoplot(pibtsmes2)
mdl1 = holt(pibtsmes2, h=16)
autoplot(mdl1)
mdl1$model
# Smoothing parameters:
# alpha = 0.7611
# beta = 1e-04 #damped=FALSE
# Modelo modificando o valor alfa
mdl2 <- holt(pibtsmes2, h=16, alpha=0.5)
autoplot(mdl2)
# Diferença entre modelo 1 e modelo 2
plot(mdl1)
lines(mdl2$mean, col="red")
```
---

---
## Amortecimento da Suavização
```{r}
# damped = amortecido
mdl3 <- holt(pibtsmes2, damped = T, phi=0.9, h=16)
#autoplot(mdl3)
mdl4 <- holt(pibtsmes2, damped = T, phi=0.8, h=16)
#autoplot(mdl4)
# Comparando os dois modelos com phi = 0.9 e phi = 0.8
plot(mdl3)
lines(mdl4$mean, col = "red")
print(mdl3$mean)
print(mdl4$mean)
```
---

---
## Exemplos de Suavização com dados com tendência
Será utilizado o conjunto de dados AirPassengers por possuir um padrão cíclico com tendência e multiplicativo.
```javascript=
plot(AirPassengers, type="l") # original series
mdl5 = holt(AirPassengers, h=16)
plot(mdl5)
mdl5$model
mdl5$mean
mdl6 = hw(AirPassengers, seasonal = "additive", h=16)
autoplot(mdl6)
mdl6$model
mdl6$mean
mdl7 = hw(AirPassengers, seasonal = "multiplicative", h=16)
autoplot(mdl7)
mdl7$model
mdl7$mean
#Modelo com amortecimento
mdl8 <- hw(AirPassengers, seasonal="multiplicative",
damped = T, phi=0.9, h=16)
autoplot(mdl8)
mdl8$residuals
#Comparando modelos
plot(mdl5)
lines(mdl6$mean, col = "red")
lines(mdl7$mean, col = "green")
lines(mdl8$mean, col = "blue")
legend("topleft",
legend = c("Mdl5", "Mdl6", "Mdl7", "Mdl8"),
col = c("black", "red", "green","blue"),
lty=1.2, cex=0.8)
```
---

---
Histograma dos erros
```javascript=
PlotForecastErrors <- function(forecasterrors){
mybinsize <- IQR(forecasterrors)/4
mysd <- sd(forecasterrors)
mymin <- min(forecasterrors)-mysd*5
mymax <- max(forecasterrors)+mysd*5
mynorm <- rnorm(10000,mean=0,sd=mysd)
mymin2 <- min(mynorm)
mymax2 <- max(mynorm)
if (mymin2<mymin)
{
mymin<-mymin2
}
if (mymax2>mymax)
{
mymax<-mymax2
}
mybins <- seq(mymin,mymax,mybinsize)
hist(forecasterrors, col="red", freq=FALSE, breaks=mybins)
myhist <- hist(mynorm, plot=FALSE, breaks=mybins)
points(myhist$mids, myhist$density, type="l", col="blue", lwd=2)
}
```
---

---

---
# Fontes
Livro - Análise de Séries Temporais. Morettin e Toloi.
[Modelos](http://www.portalaction.com.br/series-temporais/34-suavizacao-exponencial-de-holt-winters-hw)
[How To - Importar dados do googledocs](https://exploredata.wordpress.com/2012/08/20/importing-a-google-spreadsheet-into-r/)
[Git-OnlineCurseR](https://github.com/euleralencar/time-series/blob/master/onlinecourses_science.R)
[Git-HoltWinters](https://github.com/euleralencar/time-series/blob/master/forecast_HoltWinters.R)
[Forecast-TS](https://github.com/euleralencar/time-series/blob/master/forecast_ts.R)
[Smooth](https://cran.r-project.org/web/packages/smooth/vignettes/smooth.html)
[SQL in R](http://dept.stat.lsa.umich.edu/~jerrick/courses/stat701/notes/sql.html)
---