---
# System prepended metadata

title: IPCA via suavização exponencial
tags: [serie temporal, educação]

---

---
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")
```

---

![Dados94a18](https://diariodefilosofocom.files.wordpress.com/2018/12/Inflacao_94.jpeg?w=450 =700x400)

---

![Dados04a18](https://diariodefilosofocom.files.wordpress.com/2018/12/Inflacao_04.jpeg?w=450 =700x400)

---

## 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)
```

---

![ModeloMMA](https://diariodefilosofocom.files.wordpress.com/2018/12/Modelagem-via-M%C3%A9dias-M%C3%B3veis.jpeg?w=450 =700x400)

---

:::	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")

```

---

![Model1e2](https://diariodefilosofocom.files.wordpress.com/2018/12/Holt_model1and2.jpeg?w=450 =700x400)

---

## 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)
```

---

![Model3e4](https://diariodefilosofocom.files.wordpress.com/2018/12/Holt_modelo3and4.jpeg?w=450 =700x400)

---

## 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)

```

---

![ModelTendencia](https://diariodefilosofocom.files.wordpress.com/2018/12/comparacao-modelos.jpeg?w=450 =700x400)

---

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)
}
```

---

![Erros1](https://diariodefilosofocom.files.wordpress.com/2018/12/erros.png?w=450 =700x350)

---

![Erros1](https://diariodefilosofocom.files.wordpress.com/2018/12/erros2.png?w=450 =700x350)

---

# 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)

---