class: center, middle, inverse, title-slide # Modelos de Regressão e Previsão (ACA228) ## Fundamentos de Séries Temporais ### Prof. Carlos Trucíos
ctruciosm.github.io
carlos.trucios@facc.ufrj.br
### Faculdade de Administração e Ciências Contábeis, Universidade Federal de Rio de Janeiro --- layout: true <a class="footer-link" href="http://ctruciosm.github.io">ctruciosm.github.io — Carlos Trucíos (FACC/UFRJ)</a> ---
## Introdução - Não existe um único padrão de série temporal. -- - Não existe uma única forma de modelar séries temporias. -- - Para utilizar melhor os modelos que aprenderemos, precisamos conhecer algumas caracteristicas da séries. Essas características nos ajudarão a determinar a melhor abordagem a ser utilizada. -- .bg-washed-green.b--dark-green.ba.bw2.br3.shadow-5.ph4.mt5[ Enquanto mais saibamos da nossa série, teremos uma melhor capacidade de construir modelos de previsão. ] --- class: inverse, right, middle # Conceitos básicos --- ## Conceitos básicos: .blue[**Processo Estocástico**] Uma coleção de variáveis aleatórias `\(\{ y_t \}\)` indexada pelo tempo `\(t\)` é chamado de **processo estocástico**. -- .blue[**Série Temporal**] Realização (os valores observados) de um processo estocástico . > Na prática nunca observamos o processo estocástico, mas apenas uma realização do processo. -- .blue[**Ruido Branco**] Coleção de variáveis aleatórias com médias zero, variância constante e que além disso são não correlacionadas. -- .center[.red[É muito comum chamar de série temporal tanto ao processo estocástico quando à realização do processo. ]] --- ## Conceitos básicos: ![](ACA228_ST_02_files/figure-html/unnamed-chunk-1-1.png)<!-- --> --- ## Conceitos básicos: - **Função de médias:** para cada instante `\(t\)`, `$$\mu_t = \mathbb{E}(y_t)$$` -- - **Função de variâncias:** para cada instante `\(t\)`, `$$\sigma_t = \mathbb{V}(y_t)$$` -- - **Função de autocovariâncias:** para dois instantes quaquer ( `\(t\)` e `\(t+h\)`), `$$\gamma(t,t+h) = \mathbb{Cov}(y_t, y_{t+h}) = \mathbb{E}[(y_t \mu_t)(y_{t+h}-\mu_{t+h})]$$` -- - **Função de autocorrelação:** para dois instantes quaquer ( `\(t\)` e `\(t+h\)`), `$$\rho(t,t+h) = \mathbb{Cor}(y_t, y_{t+h}) = \dfrac{\mathbb{Cov}(y_t, y_{t+h})}{\sigma_t \sigma_{t+h}}$$` -- Note que, como o processo estocástico é uma coleção de variáveis aleatórias `\(\{ y_t \}\)` indexadas pelo tempo `\(t\)`, para cada `\(t\)` temos que `\(y_t\)` tem sua própria distribuição (e então faz sentido pensar na esperança, variância, ...). --- ## Conceitos básicos: .bg-washed-green.b--dark-green.ba.bw2.br3.shadow-5.ph4.mt5[ ### Processo estacionário Um proceso estocástico `\(\{y_t\}_{t \geq 1}\)` com `\(\mathbb{E}(y_t^2) < \infty\)` é dito estacionário (ou estacionário de segunda ordem) se - `\(\mathbb{E}(y_t) = \mu, \quad \forall t\)` - `\(\mathbb{V}(y_t) = \sigma^2, \quad \forall t\)` - `\(\mathbb{Cov}(y_t, y_{t+h})\)` depende somente de `\(h\)` e não de `\(t\)`. ] -- - Como a covariância depende somente de `\(h\)`, a correlação `\(Cor(y_t, y_{t+h})\)` também depende somente de `\(h\)`. - .red[Visualmente, identificamos uma série estacionária se ela flutua em torno de uma média fixa e se a variância da série é constante ao longo do tempo.] -- > Se a série satisfaz essas condições é dita de **estacionária**, caso contrário é dita de **não estacionária**. --- class: inverse, right, middle # Autocovariância e Autocorrelação --- ### Autocovariância Seja `\(y_1, \ldots, y_n\)` um processo estocástico estacionários. A covariância de uma variável de `\(y_t\)` com `\(y_{t+k}\)` é chamada de *auto*covariância. `$$\gamma(k) = \mathbb{E}[(y_t-\mu)(y_{t+k}-\mu)] = \mathbb{Cov}(y_t, y_{t+k})$$` -- Na prática, nunca conhecemos o processo estocástico todo, apenas uma parte. Assim, estimamos `\(\gamma(k)\)` com os dados observados da nossa série temporal. `$$\hat{\gamma}(k) = \dfrac{\displaystyle \sum_{t=1}^{n-k} (y_t - \bar{y})(y_{t+k}-\bar{y})}{n}$$` -- - Note que, `\(\hat{\gamma}(k) = \hat{\gamma}(-k)\)` -- Chama-se **auto**covariância pois é a covariância de uma variável com ela mesma em outro instante de tempo. --- ### Autocorrelação É a correlação de variável `\(y_t\)` com `\(y_{t+k}\)` é chamada **auto**correlação `$$\rho(k) = \mathbb{Cor}(y_t, y_{t+k})$$` -- Na prática, nunca conhecemos o processo estocástico todo, apenas uma parte. Assim, estimamos `\(\rho(k)\)` com os dados observados da nossa série temporal. `$$\hat{\rho}(k) = \dfrac{\hat{\gamma}(k)}{\hat{\gamma}(0)}$$` -- - Note que, `\(\hat{\rho}(k) = \hat{\rho}(-k)\)` - `\(-1 \leq \hat{\rho}(k) \leq 1 \quad \forall k\)` -- Chama-se **auto**correlação pois é a correlação de uma variável com ela mesma em outro instante de tempo. -- > **Ps:** Como `\(y_1, \ldots, y_n\)` é estacionária a notação `\(\gamma(t,t+k)\)` ou `\(\rho(t,t+k)\)` vira `\(\gamma(k)\)` ou `\(\rho(k)\)`, pois, afinal, por definição de processo estacionários, as covariâncias e aucorrelações dependem unicamente de `\(k\)`. --- ### Autocovariância e Autocorrelação: como calcular .left-column[ | t| y| y_lag1| y_lag2| |--:|----:|------:|------:| | 1| -0.6| NA| NA| | 2| -0.2| -0.6| NA| | 3| 1.6| -0.2| -0.6| | 4| 0.1| 1.6| -0.2| | 5| 0.1| 0.1| 1.6| | 6| 1.7| 0.1| 0.1| | 7| 0.5| 1.7| 0.1| | 8| -1.3| 0.5| 1.7| | 9| -0.7| -1.3| 0.5| | 10| -0.4| -0.7| -1.3| `$$\hat{\gamma}(k) = \dfrac{\displaystyle \sum_{t=1}^{n-k} (y_t - \bar{y})(y_{t+k}-\bar{y})}{n}$$` ] -- .right-column[ `$$\hat{\gamma}(1) = \dfrac{(-0.6-\bar{y})(-0.2-\bar{y}) + (-0.2-\bar{y})(1.6-\bar{y}) + \cdots +(-0.7-\bar{y})(-0.4-\bar{y})}{10}$$` .panelset[ .panel[.panel-name[Autocovariâncias] ``` ## autocov0 autocov1 autocov2 ## 1 0.8396 0.13796 -0.28688 ``` ] .panel[.panel-name[Código] ```r dados %>% mutate(cov_elements1 = (y - mean(y))*(y_lag1 - mean(y))) %>% mutate(cov_elements2 = (y - mean(y))*(y_lag2 - mean(y))) %>% summarise(autocov0 = sum((y - mean(y))^2)/length(y), autocov1 = sum(cov_elements1, na.rm = TRUE)/length(y), autocov2 = sum(cov_elements2, na.rm = TRUE)/length(y), autocor1 = autocov1/autocov0, autocor2 = autocov2/autocov0) ``` ] .panel[.panel-name[Autocorrelação] ``` ## autocov0 autocov1 autocov2 autocor1 autocor2 ## 1 0.8396 0.13796 -0.28688 0.1643163 -0.3416865 ``` ] .panel[.panel-name[Código] ```r dados %>% mutate(cov_elements1 = (y - mean(y))*(y_lag1 - mean(y))) %>% mutate(cov_elements2 = (y - mean(y))*(y_lag2 - mean(y))) %>% summarise(autocov0 = sum((y - mean(y))^2)/10, autocov1 = sum(cov_elements1, na.rm = TRUE)/10, autocov2 = sum(cov_elements2, na.rm = TRUE)/10, autocor1 = autocov1/autocov0, autocor2 = autocov2/autocov0) ``` ] ] `$$\hat{\rho}(k) = \dfrac{\hat{\gamma}(k)}{\hat{\gamma}(0)}$$` ] --- ### Autocovariância e Autocorrelação ```r # Autocovariâncias acf(dados$y, type = "covariance", plot = F, lag = 4) ``` ``` ## ## Autocovariances of series 'dados$y', by lag ## ## 0 1 2 3 4 ## 0.8396 0.1380 -0.2869 0.0959 -0.0650 ``` ```r # Autocorrelações acf(dados$y, plot = F, lag = 4) ``` ``` ## ## Autocorrelations of series 'dados$y', by lag ## ## 0 1 2 3 4 ## 1.000 0.164 -0.342 0.114 -0.077 ``` -- > **Autocovariância** e **Autocorrelação** são duas medidas de dependência da série temporal. --- class: inverse, right, middle # Séries Temporais na prática (e com R) --- ## Séries Temporais na prática (e com R) .center[ <div class="figure"> <img src="imagens/ts_workflow.png" alt="Fonte: Livro 'Forecasting: Principles and Practice' " width="65%" /> <p class="caption">Fonte: Livro 'Forecasting: Principles and Practice' </p> </div> ] 1. **Tidy:** Precisamos preparar os dados para podermos utilizar os diversos modelos implementados. 2. **Visualise:** Fazer o gráfico da série temporal é muito importante e da os primeiros _insights_ do que deve ser feito. 3. Especificar, estimar e avaliar o modelo. (**Modelagem**) 4. Fazer previsões. --- ## Séries Temporais na prática (e com R) .bg-washed-green.b--dark-green.ba.bw2.br3.shadow-5.ph4.mt5[ ### Preparar os dados - Importar os dados. - Identificar a variável com o _index_ que define a série temporal (o R precisa entender que essa variável é um _index_ temporal). - Identificar valores faltantes. - Filtrar para trabalharmos unicamente com os casos de interesse (`filter()`). - Transformar variáveis (`mutate()`) - etc. ] -- O pacote [`tsibble`](https://tsibble.tidyverts.org) nos ajudará a organizar os dados em uma estrutura temporal. --- ## Séries Temporais na prática (e com R): Data preparation ```r library(tsibble) # Para trabalhar com séries temporais library(fpp3) # Carrega vários pacotes uteis para séries temporais e fornece o dataset global_economy library(dplyr) # Manipulação de dados glimpse(global_economy) ``` ``` ## Rows: 15,150 ## Columns: 9 ## Key: Country [263] ## $ Country <fct> "Afghanistan", "Afghanistan", "Afghanistan", "Afghanistan",… ## $ Code <fct> AFG, AFG, AFG, AFG, AFG, AFG, AFG, AFG, AFG, AFG, AFG, AFG,… ## $ Year <dbl> 1960, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 1968, 1969,… ## $ GDP <dbl> 537777811, 548888896, 546666678, 751111191, 800000044, 1006… ## $ Growth <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… ## $ CPI <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA,… ## $ Imports <dbl> 7.024793, 8.097166, 9.349593, 16.863910, 18.055555, 21.4128… ## $ Exports <dbl> 4.132233, 4.453443, 4.878051, 9.171601, 8.888893, 11.258279… ## $ Population <dbl> 8996351, 9166764, 9345868, 9533954, 9731361, 9938414, 10152… ``` -- ```r br_gdppc <- global_economy %>% filter(Country == "Brazil") %>% mutate(GDP_pc = GDP/Population) mercosul_gdppc <- global_economy %>% filter(Country == c("Brazil", "Argentina", "Paraguay", "Uruguay", "Venezuela, RB")) %>% mutate(GDP_pc = GDP/Population) ``` --- ## Séries Temporais na prática (e com R) .bg-washed-green.b--dark-green.ba.bw2.br3.shadow-5.ph4.mt5[ ### Visualização de dados - Primeiro passo antes de analisar os dados. - É parte da análise exploratória de dados (EDA). - Nos ajuda a entender e identificar as componentes da nossa série - Utilizaremos o pacote `ggplot2` para fazer gráficos a um nível mais profissional. ] -- ```r # Carregando o pacote library(ggplot2) ``` --- ## Séries Temporais na prática (e com R) .panelset[ .panel[.panel-name[Gráfico Brasil] ```r ggplot(data = br_gdppc) + geom_line(aes(x = Year, y = GDP_pc)) + xlab("Ano") + ylab("GDP per capita") + ggtitle("GDP per capita: Brasil") ``` ![](ACA228_ST_02_files/figure-html/unnamed-chunk-12-1.png)<!-- --> ] .panel[.panel-name[Gráfico Mercosul 1] ```r *ggplot(data = mercosul_gdppc) + geom_line(aes(x = Year, y = GDP_pc, color = Country)) + xlab("Ano") + ylab("GDP per capita") + ggtitle("GDP per capita") ``` ![](ACA228_ST_02_files/figure-html/unnamed-chunk-13-1.png)<!-- --> ] .panel[.panel-name[Gráfico Mercosul 2] ```r *ggplot(data = mercosul_gdppc) + geom_line(aes(x = Year, y = GDP_pc)) + facet_wrap(.~ Country) + xlab("Ano") + ylab("GDP per capita") + ggtitle("GDP per capita") ``` ![](ACA228_ST_02_files/figure-html/unnamed-chunk-14-1.png)<!-- --> ] ] --- .bg-washed-green.b--dark-green.ba.bw2.br3.shadow-5.ph4.mt5[ ### Modelagem de Séries Temporais .red[$$\text{Especificar } + \text{ Estimar } + \text{ Avaliar}$$] - **Especificar:** existem vários métodos que podem ser utilizados para fazer previsão de séries temporais. Nós precisamos especificar (escolher e avisar ao R) qual modelo utilizaremos. ```r nome_do_modelo(variavel_que_queremos_fazer_previsao ~ x) ``` - **Estimar:** uma vez definido (especificado) o modelo, precisamos ajustar (treinar) o modelo (o análogo a obter os `\(\hat{\beta}\)`s no modelo de regressão). Para isto utilizaremos a função `model()`. ```r fit <- dados %>% model(nome_qqr = nome_do_modelo(variavel_que_queremos_fazer_previsao ~ x)) ``` - **Avaliar:** antes de utilizar o modelo para fazer previsão precisamos avaliar o desempenho do modelo quando fazemos previsão. Veremos isto mais na frente. Para avaliar o modelo precisamos fazer alguma previsões com a função `forecast(h = passos_à_frente)`. ] --- ## Séries Temporais na prática (e com R) Para ilustrar como especificar e estimar o modelo, utilizaremos algums métodos simples. .panelset[ .panel[.panel-name[Média] `$$\hat{y}_{T+h|T} = \dfrac{\sum_{i=1}^T y_i}{T}$$` ```r fit <- br_gdppc %>% # br_gdppc é nosso dataset model(MEAN(GDP_pc)) # Ajusta o modelo escolhido (no caso, MEAN) ``` ] .panel[.panel-name[Gráfico] ```r fit %>% forecast(h = 12) %>% # h: número de passo à frente para as previsões autoplot(br_gdppc, level = NULL) # identifica o melhor gráfico ``` ![](ACA228_ST_02_files/figure-html/unnamed-chunk-18-1.png)<!-- --> ] .panel[.panel-name[Naive] .red[ `$$\text{Naive } \equiv \text{ Ingênuo}$$` ] Todas as previões são iguais à última observação, `$$\hat{y}_{T+h|T} = y_T$$` ```r fit <- br_gdppc %>% model(NAIVE(GDP_pc)) ``` ] .panel[.panel-name[Gráfico] ```r fit %>% forecast(h = 12) %>% autoplot(br_gdppc, level = NULL) ``` ![](ACA228_ST_02_files/figure-html/unnamed-chunk-20-1.png)<!-- --> ] .panel[.panel-name[Naive sazonal] As previões são iguais à última observação do mesmo período sazonal. Para ilustrar o método, vamos **supor** que nossos dados possuem um período sazonal `\(m = 10\)`, ou seja que de 10 em 10 anos existe um padrão (estamos apenas supondo, isso não acontece realmente com nossos dados). ```r fit <- br_gdppc %>% model(SNAIVE(GDP_pc ~ lag(10))) ``` ] .panel[.panel-name[Gráfico] ```r fit %>% forecast(h = 12) %>% autoplot(br_gdppc, level = NULL) ``` ![](ACA228_ST_02_files/figure-html/unnamed-chunk-22-1.png)<!-- --> ] .panel[.panel-name[Drift] .red[ `$$\text{Drift } \equiv \text{ quantidade de mudança ao longo do tempo}$$`] O **drift** é calculado como a mudança média nos dados históricos, `$$\hat{y}_{T+h|T} = y_T + \dfrac{h}{T-1} \displaystyle \sum_{t=2}^T (y_t-y_{t-1})$$` ```r fit <- br_gdppc %>% model(RW(GDP_pc ~ drift())) ``` ] .panel[.panel-name[Gráfico] ```r fit %>% forecast(h = 12) %>% autoplot(br_gdppc, level = NULL) ``` ![](ACA228_ST_02_files/figure-html/unnamed-chunk-24-1.png)<!-- --> ] ] --- class: inverse, right, middle # Case: O site [https://www.univates.br/nih/historico-de-dados](https://www.univates.br/nih/historico-de-dados) contém dados meteorológicos históricos da cidade de Lajeado/RS. Esses dados foram coletados e salvos no arquivo `lajeado_rs.csv` disponível [aqui](https://raw.githubusercontent.com/ctruciosm/ctruciosm.github.io/master/datasets/lajeado_rs.csv) e no Google Class. Utilizando esses dados, aplicaremos o diferentes métodos vistos até aqui. --- ## Case .panelset[ .panel[.panel-name[Importando dados] ```r lajeado_rs <- read.csv("/Users/ctruciosm/Desktop/lajeado_rs.csv", sep = ";") # uri <- "https://raw.githubusercontent.com/ctruciosm/ctruciosm.github.io/master/datasets/lajeado_rs.csv" # lajeado_rs <- read.csv(uri, sep = ";") glimpse(lajeado_rs) ``` ``` ## Rows: 79 ## Columns: 4 ## $ ano_mes <chr> "2015-01", "2015-02", "2015-03", "2015-04", "2015-05", "201… ## $ temp_media <dbl> 25.6, 24.8, 24.2, 21.2, 18.5, 16.2, 15.9, 21.0, 17.8, 19.4,… ## $ temp_max <dbl> 39.0, 35.1, 34.7, 32.4, 30.8, 29.7, 29.2, 34.2, 30.0, 35.0,… ## $ temp_min <dbl> 17.2, 17.5, 15.7, 13.4, 8.4, 4.7, 6.5, 9.5, 4.5, 9.0, 12.5,… ``` **R** não sabe que a variável `ano_mes` é nosso _index_ temporal. Precisamos primeiro transformar esse tipo de dados ("chr") para alguma estrutura temporal. Como nossos dados são mensais, utilizaremos a função `yearmonth()` do pacote `tsibble`. ] .panel[.panel-name[Preparando os dados] ```r lajeado_rs <- lajeado_rs %>% mutate(ano_mes = yearmonth(ano_mes)) %>% select(ano_mes, temp_media) %>% as_tsibble(index = ano_mes) glimpse(lajeado_rs) ``` ``` ## Rows: 79 ## Columns: 2 ## $ ano_mes <mth> 2015 Jan, 2015 Fev, 2015 Mar, 2015 Abr, 2015 Mai, 2015 Jun,… ## $ temp_media <dbl> 25.6, 24.8, 24.2, 21.2, 18.5, 16.2, 15.9, 21.0, 17.8, 19.4,… ``` ] .panel[.panel-name[Modelando] ```r fit <- lajeado_rs %>% model(media = MEAN(temp_media), naive = NAIVE(temp_media), snaive = SNAIVE(temp_media~lag(12)), drift = RW(temp_media ~ drift())) ``` ] .panel[.panel-name[Previsão] ```r fit %>% forecast(h = 12) %>% autoplot(lajeado_rs) ``` 🤷 O que acontece se fizermos `autoplot(lajeado_rs, level = NULL)`?? ] .panel[.panel-name[Gráfico] ![](ACA228_ST_02_files/figure-html/unnamed-chunk-29-1.png)<!-- --> ] ] --- class: inverse, right, middle # Previsão, valor estimado e resíduos --- ### Previsão, valor estimado e resíduos - **Previsão** ( `\(\hat{y}_{T+h|T}\)`): usamos a informação disponível até o tempo `\(T\)` para prever as observações *fora da amostra* ( `\(T+1, T+3, \ldots, T+h\)`). -- - **Valores estimados** ( `\(\hat{y}_{t|t-1}\)`): usamos a informação disponível até o tempo `\(t-1\)` para "prever" (na verdade estimar) o que acontece no tempo `\(t\)`. .red[Contudo, todos os parâmetros estimados do modelo são estimados utilizando a informação até o tempo `\(T\)`. Por isso, o valor estimado não é uma previsão]. - **Residuos:** é a diferença entre o valor verdadeiro e o valor estimado, `\(e_t = y_t - \hat{y}_{t|t-1}\)` -- - **resíduos de inovação:** Se a série é transformada (por exemplo `\(y_t* = \log(y_t)\)`), os resídus de inovação são a diferença entre o valor verdadeiro (transformado) e o valor estimados da série transformada `\(\log(y_t) - \hat{y}_t*\)` -- > No *R*, os valores ajustados (fitted), os resíduos (resid) e os resíduos de inovação (innov) podem ser obtidos com a função `augment()`. -- > Se não fizermos nenhuma transformação, os resíduos e os resíduos de inovação são iguais. --- ### Previsão, valor estimado e resíduos: exemplo .panelset[ .panel[.panel-name[Drift] Pense no modelo com drift: `$$\hat{y}_{T+h|T} = y_T + \dfrac{h}{T-1} \displaystyle \sum_{t=2}^T (y_t-y_{t-1}).$$` Os valores estimados serão calculados como `$$\hat{y}_{t|t-1} = y_{t-1} + \dfrac{1}{T-1} \displaystyle \sum_{t=2}^T (y_t-y_{t-1}).$$` Para calcular `\(\hat{y}_{t|t-1}\)` utilizamos `\(y_{t-1}\)` (a informação disponível até o tempo `\(t-1\)`) mas, também utilizamos o _drift_ que é calculado com todas as informações até o tempo `\(T\)`. .red[(por isso que não é uma previsão e sim um valor estimado)]. ] .panel[.panel-name[Código] ```r fit <- br_gdppc %>% model(RW(GDP_pc ~ drift())) augment(fit) ``` ``` ## # A tsibble: 58 x 7 [1Y] ## # Key: Country, .model [1] ## Country .model Year GDP_pc .fitted .resid .innov ## <fct> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> ## 1 Brazil RW(GDP_pc ~ drift()) 1960 210. NA NA NA ## 2 Brazil RW(GDP_pc ~ drift()) 1961 205. 379. -174. -174. ## 3 Brazil RW(GDP_pc ~ drift()) 1962 260. 374. -113. -113. ## 4 Brazil RW(GDP_pc ~ drift()) 1963 292. 429. -137. -137. ## 5 Brazil RW(GDP_pc ~ drift()) 1964 261. 461. -199. -199. ## 6 Brazil RW(GDP_pc ~ drift()) 1965 261. 430. -169. -169. ## 7 Brazil RW(GDP_pc ~ drift()) 1966 315. 430. -114. -114. ## 8 Brazil RW(GDP_pc ~ drift()) 1967 347. 484. -137. -137. ## 9 Brazil RW(GDP_pc ~ drift()) 1968 374. 516. -141. -141. ## 10 Brazil RW(GDP_pc ~ drift()) 1969 403. 543. -140. -140. ## # … with 48 more rows ``` ] .panel[.panel-name[Resíduos] Assim como no caso dos modelos de regressão, os resíduos (resíduos de inovação) nos ajudarão para saber se o modelo é **minimamente aceitável**. ] ] --- ## Exercícios Utilizando os dados de lajeado/RS (disponíveis [aqui](https://raw.githubusercontent.com/ctruciosm/ctruciosm.github.io/master/datasets/lajeado_rs.csv)): - Importe os dados (ver slide 22) - A variável `ano_mes` ainda não está como estrutura tempora. Transforme-a para formato temporal com a função `yearmonth` e convirta seu _dataset_ para um _dataset_ em formato de série temporal utilizando `as_tsiblle()` (ver slide 22). - Selecione as variáveis `ano_mes` e `temp_max`. - Ajuste os 4 modelos vistos até agora (MEAN, NAIVE, SNAIVE e drift) - Faça a previsão `\(h = 12\)` passos à frente e faça o gráfico correspondente utilizando `autoplot()`. -- > **Entregar até antes da próxima aula** (enviar o código pelo Google Class). --- ### Referências - [Hyndman, R.J., & Athanasopoulos, G. (2021). Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3.](https://otexts.com/fpp3/). Chapters 4--5.3 - Shumway R. H., & Stoffer, D. S. (1999). Time Series Analysis and Its Applications. Springer. Chapter 1 --