class: center, middle, inverse, title-slide # Modelos de Regressão e Previsão (ACA228) ## Regressão e 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 - Os modelos de regressão aprendidos na primeira parte da disciplina também podem ser utilizados em um contexto de séries temporais (porém, algumas mudanças nas hipóteses do modelo são necessárias). -- - O processo de estimação dos parâmetros (obtenção dos `\(\hat{\beta}\)`s) continua o mesmo. -- - Esta abordagem é util quando queremos fazer a previsão de uma variável `\(y\)` em função de um conjunto de variáveis explicativas `\(x\)`. * Prever a demanda diaria de energia em função da temperatura, do dia da semana, da velocidade do vento. * Prever as vendas mensais em função dos gastos em publicidade, mes do ano, IPCA. * etc. -- - Embora a função `lm()` possa também ser utilizada, utilizaremos um formato um pouco diferente (seguindo a sintaxe das três aulas anteriores) que nos ajudará a fazer previsão, gráficos e análise de diagnóstico. --- class: inverse, right, middle # Análise de Regressão --- ## Análise de Regressão O _dataset_ `us_change` do pacote `fpp3` contém dados trimestrais sobre a variação percentual nas despesas de consumo, variação percentual na renda, variação percentual na produção industrial, variação percentual na poupança e a mudança na taxa de desemprego nos Estados Unidos desde 1970 até 2019. -- ```r library(tsibble) library(fpp3) glimpse(us_change) ``` ``` ## Rows: 198 ## Columns: 6 ## $ Quarter <qtr> 1970 Q1, 1970 Q2, 1970 Q3, 1970 Q4, 1971 Q1, 1971 Q2, 197… ## $ Consumption <dbl> 0.61856640, 0.45198402, 0.87287178, -0.27184793, 1.901344… ## $ Income <dbl> 1.0448013, 1.2256472, 1.5851538, -0.2395449, 1.9759249, 1… ## $ Production <dbl> -2.45248553, -0.55145947, -0.35865175, -2.18569087, 1.909… ## $ Savings <dbl> 5.2990141, 7.7898938, 7.4039841, 1.1698982, 3.5356669, 5.… ## $ Unemployment <dbl> 0.9, 0.5, 0.5, 0.7, -0.1, -0.1, 0.1, 0.0, -0.2, -0.1, -0.… ``` -- Queremos criar um modelo da forma `$$\text{Consumption} = \beta_0 + \beta_1 \text{Income } + u$$` > Queremos explicar a variação percentual nas despesas de consumo em função da variação percentual na renda. --- ## Análise de Regressão `$$\text{Consumption} = \beta_0 + \beta_1 \text{Income } + u$$` ```r us_change %>% model(TSLM(Consumption ~ Income)) %>% # Equivalente ao lm() report() # Equivalente ao summary() ``` ``` ## Series: Consumption ## Model: TSLM ## ## Residuals: ## Min 1Q Median 3Q Max ## -2.58236 -0.27777 0.01862 0.32330 1.42229 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 0.54454 0.05403 10.079 < 2e-16 *** ## Income 0.27183 0.04673 5.817 2.4e-08 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 0.5905 on 196 degrees of freedom ## Multiple R-squared: 0.1472, Adjusted R-squared: 0.1429 ## F-statistic: 33.84 on 1 and 196 DF, p-value: 2.4022e-08 ``` --- ## Análise de Regressão ```r us_change %>% GGally::ggpairs(columns = 2:6) # a Coluna 1 é Quarter e não nos interessa por enquanto ``` ![](ACA228_ST_04_files/figure-html/unnamed-chunk-3-1.png)<!-- --> --- ## Análise de Regressão ```r us_change %>% model(TSLM(Consumption ~ Income + Production + Savings + Unemployment)) %>% report() ``` ``` ## Series: Consumption ## Model: TSLM ## ## Residuals: ## Min 1Q Median 3Q Max ## -0.90555 -0.15821 -0.03608 0.13618 1.15471 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 0.253105 0.034470 7.343 5.71e-12 *** ## Income 0.740583 0.040115 18.461 < 2e-16 *** ## Production 0.047173 0.023142 2.038 0.0429 * ## Savings -0.052890 0.002924 -18.088 < 2e-16 *** ## Unemployment -0.174685 0.095511 -1.829 0.0689 . ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 0.3102 on 193 degrees of freedom ## Multiple R-squared: 0.7683, Adjusted R-squared: 0.7635 ## F-statistic: 160 on 4 and 193 DF, p-value: < 2.22e-16 ``` --- ## Análise de Regressão Aparentemente, usamos o modelo como sempre. **O que mudou?** .center[ > Na estimação de parâmetros ( `\(\hat{\beta}\)`s) nada, mas nas hipóteses do modelo, algumas coisas! ] -- ### Hipóteses - **HST1**: `\(y_t = \beta_0 + \beta_1 x_{t1} + \cdots + \beta_k x_{tk} + u_t\)`, `\(t = 1, \ldots, n\)` - **HST2**: Não existe colinearidade perfeita entre as variáveis independêntes e nenhuma das variáveis independentes é constante. - **HST3**: `\(E(u_t|X) = 0\)`, `\(t = 1, \ldots, n\)` - **HST4**: Homocedasticidade, `\(V(u_t|X) = V(u_t) = \sigma^2\)`, `\(t=1, \ldots, n\)` - **HST5**: `\(Corr(u_t, u_s | X) = 0\)`, `\(\forall t\neq s\)` - **HST6**: Os erros `\(u_t\)` são independentes de `\(X\)` e `\(u_t \sim N(0, \sigma^2)\)` -- > **HST4** e **HST6** são desejadas (nos ajudarão muitos nos cálculos posteriores), mas se elas não são verificadas, existem formas de contornar esse problema. --- class: inverse, right, middle # Estimação de parâmetros --- ## Estimação de parâmetros O processo de estimação continua o mesmo e o método MQO (ou OLS em inglês) trabalha da mesma forma como aprendido na primeira parte da disciplina. -- Utilizaremos a função `TSLM()` que trabalha da mesma forma do que `lm()`, mas oferece algumas facilidades adicionais em um contexto de séries temporais. -- ```r modelo <- us_change %>% model(tslm = TSLM(Consumption ~ Income + Production + Unemployment + Savings)) ``` -- Se quisermos o summary do modelo, basta fazer ```r report(modelo) ``` -- Se quisermos apenas a tabela de coeficientes, basta fazer ```r coef(modelo) ``` -- Se quisermos saber quão bem os valores ajustados ( `\(\hat{y}_t\)`) acompanham os valores observados ( `\(y_t\)`)? -- > Usaremos a função `augment()` que já vimos na aula anterior.! --- ## Estimação de parâmetros ```r augment(modelo) ``` ``` ## # A tsibble: 198 x 6 [1Q] ## # Key: .model [1] ## .model Quarter Consumption .fitted .resid .innov ## <chr> <qtr> <dbl> <dbl> <dbl> <dbl> ## 1 tslm 1970 Q1 0.619 0.474 0.145 0.145 ## 2 tslm 1970 Q2 0.452 0.635 -0.183 -0.183 ## 3 tslm 1970 Q3 0.873 0.931 -0.0583 -0.0583 ## 4 tslm 1970 Q4 -0.272 -0.212 -0.0603 -0.0603 ## 5 tslm 1971 Q1 1.90 1.64 0.264 0.264 ## 6 tslm 1971 Q2 0.915 1.07 -0.158 -0.158 ## 7 tslm 1971 Q3 0.794 0.658 0.137 0.137 ## 8 tslm 1971 Q4 1.65 1.30 0.347 0.347 ## 9 tslm 1972 Q1 1.31 1.05 0.262 0.262 ## 10 tslm 1972 Q2 1.89 1.37 0.513 0.513 ## # … with 188 more rows ``` -- ```r augment(modelo) %>% ggplot() + geom_line(aes(x = Quarter, y = Consumption)) + geom_line(aes(x = Quarter, y = .fitted), color = "blue") + ggtitle("Variação percentual nas despesas de consumo USA. Período 1970.Q1 -- 2019.Q2") ``` --- ## Estimação de parâmetros ![](ACA228_ST_04_files/figure-html/unnamed-chunk-10-1.png)<!-- --> --- class: inverse, right, middle # Avaliando o modelo --- ## Avaliando o modelo. - Na aula anterior, aprendimos que o **diagnóstico do modelo** nos ajuda a saber se nosso modelo capturou a dinâmica dos dados. -- - O diagnóstico do modelo é feito utilizando os resíduos de inovação (que, quando o modelo não é transformado é igual aos resíduos `\(e_t = y_t - \hat{y}_t\)` ) -- - As 3 ferramentas gráficas mais utilizadas para a análise de diagnóstico são: correlograma (gráfico das autocorrelações), histograma, e gráfico da sequência temporal. -- - Como já vimos, a função `gg_tsresiduals()` fornece esses gráficos que nos ajudam a fazer o diagnóstico do modelo. -- ```r modelo %>% gg_tsresiduals() ``` --- ## Avaliando o modelo. ![](ACA228_ST_04_files/figure-html/unnamed-chunk-12-1.png)<!-- --> -- - Os resíduos se distribuem em torno do zero (de fato, quando rodamos um modelo de regressão com intercepto os resíduos sempre tem média zero, lembre-se das equações para obter o estimador MQO). - Parece que existem períodos onde os resíduos são mais dispersos, isso parece indicar falta de homocedasticidade. - Tem uma correlação na defasagem 7 fora das bandas, mas não fica claro se o modelo precisa ser melhorado ou é apenas algo esperado. **Geralmente nos preocupamos com as primeiras defasagens ou com aquelas que são multiplo do período sazonal.** (na dúvida, podemos utilizar os testes de _Box-Pierce_ ou _Ljung-Box _) --- ## Avaliando o modelo. ```r # Quantos parâmetros foram estimados? tidy(modelo) ``` ``` ## # A tibble: 5 × 6 ## .model term estimate std.error statistic p.value ## <chr> <chr> <dbl> <dbl> <dbl> <dbl> ## 1 tslm (Intercept) 0.253 0.0345 7.34 5.71e-12 ## 2 tslm Income 0.741 0.0401 18.5 1.65e-44 ## 3 tslm Production 0.0472 0.0231 2.04 4.29e- 2 ## 4 tslm Unemployment -0.175 0.0955 -1.83 6.89e- 2 ## 5 tslm Savings -0.0529 0.00292 -18.1 2.03e-43 ``` -- .pull-left[ ```r augment(modelo) %>% features(.innov, box_pierce, lag = 8, dof = 5) ``` ``` ## # A tibble: 1 × 3 ## .model bp_stat bp_pvalue ## <chr> <dbl> <dbl> ## 1 tslm 16.5 0.000879 ``` ] -- .pull-right[ ```r augment(modelo) %>% features(.innov, ljung_box, lag = 8, dof = 5) ``` ``` ## # A tibble: 1 × 3 ## .model lb_stat lb_pvalue ## <chr> <dbl> <dbl> ## 1 tslm 17.1 0.000671 ``` ] --- ## Avaliando o modelo. No caso dos modelos de regressão, aprendimos que: - Fazer um gráfico de dispersão dos **resíduos versus cada uma das variáveis explicativas** nos ajuda a ver não lineariedades. * Se encontramos algum padrão, por exemplo quadrático, incluir a variável ao quadrado na regressão pode melhorar o modelo. * Se não encontramos nenhum padrão (o que de fato esperamos), não há nada que possa ser feito com essa variável. -- - Fazer um gráfico de dispersão dos **resíduos versus cada uma das variáveis não incluidas no modelo** (mas disponíveis no dataset) nos ajuda a ver se essa variável omitida deve ou não ser incluida no modelo. * Se encontramos algum padrão, por exemplo linear ou quadrático, devemos incluir a variável no modelo. * Se não encontramos nenhum padrão (o que de fato esperamos), não há nada que possa ser feito com essa variável. -- - Fazer um gráfico de dispersão dos **resíduos versos os valores ajustados** ( `\(\hat{y}_t\)`) nos ajuda a ver não lineariedades, heterocedasticidade. * Se temos suspeita de heterocedasticidade, aplicar `\(\log(y_t)\)` pode nos ajudar. --- ## Avaliando o modelo. .panelset[ .panel[.panel-name[Gráfico 1] Residuais versus variáveis explicativas ![](ACA228_ST_04_files/figure-html/unnamed-chunk-16-1.png)<!-- --> ] .panel[.panel-name[Gráfico 2] Residuais versus `\(\hat{y}_t\)` ![](ACA228_ST_04_files/figure-html/unnamed-chunk-17-1.png)<!-- --> ] .panel[.panel-name[Códigos] ```r # Gráfico 1 library(patchwork) # Para juntar os gráficos feitos com ggplot2 # a função left_join nos ajudará a juntar tabelas us_change_new <- augment(modelo) %>% select(Quarter, .fitted, .resid, .innov) %>% left_join(us_change, by = "Quarter") p1 <- us_change_new %>% ggplot() + geom_point(aes(Income, .innov)) p2 <- us_change_new %>% ggplot() + geom_point(aes(Production, .innov)) p3 <- us_change_new %>% ggplot() + geom_point(aes(Savings, .innov)) p4 <- us_change_new %>% ggplot() + geom_point(aes(Unemployment, .innov)) (p1 + p2) / (p3 + p4) # Isto é possivel por causa do patchwork # Gráfico 2 ggplot(us_change_new) + geom_point(aes(x = .fitted, y = .innov)) ``` ] ] --- class: inverse, right, middle # Regressões espúrias: Cuidado quando fizer regressões em um contexto de ST --- ## Regressões espúrias Quando trabalhamos com séries temporais, na maioria das vezes, as séries são não estacionárias, ou seja os valores da série não flutuam ao redor de uma média contante e/ou variância constante. -- .bg-washed-green.b--dark-green.ba.bw2.br3.shadow-5.ph4.mt5[ 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\)`. ] -- Séries não estacionárias, tem, na maioria das vezes, um efeito no modelo de regressão conhecido como **regressão espúria**, ou seja, o modelo tem `\(R^2\)` alto, `\(\beta\)`s signifativos e parece estar tudo perfeito, mas na verdade é apenas uma descoberta espúria (falsa). -- > Veremos no próximo slide o que isso significa na prática! --- ## Regressões espúrias Os _datasets_ `aus_airpassengers` a `guinea_rice` do pacote `fpp3`, contém informações do número total de passageiros (em milhões) na Austráia e da produção anual de arroz (em milhões de toneladas) na Guiné, respectivamente. -- .pull-left[ ```r aus_airpassengers %>% ggplot() + geom_line(aes(x = Year, y = Passengers)) ``` ![](ACA228_ST_04_files/figure-html/unnamed-chunk-19-1.png)<!-- --> ] .pull-right[ ```r guinea_rice %>% ggplot() + geom_line(aes(x = Year, y = Production)) ``` ![](ACA228_ST_04_files/figure-html/unnamed-chunk-20-1.png)<!-- --> ] --- ## Regressões espúrias Obviamente, essas duas sérias não tem nenhuma relação, mas... -- ```r modelo <- guinea_rice %>% left_join(aus_airpassengers, by = "Year") %>% model(tslm = TSLM(Passengers ~ Production)) report(modelo) ``` ``` ## Series: Passengers ## Model: TSLM ## ## Residuals: ## Min 1Q Median 3Q Max ## -5.9448 -1.8917 -0.3272 1.8620 10.4210 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) -7.493 1.203 -6.229 2.25e-07 *** ## Production 40.288 1.337 30.135 < 2e-16 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 3.239 on 40 degrees of freedom ## Multiple R-squared: 0.9578, Adjusted R-squared: 0.9568 ## F-statistic: 908.1 on 1 and 40 DF, p-value: < 2.22e-16 ``` --- ## Regressões espúrias Aparentemente, temos um achado!! a cada unidade (milhão de toneladas) de aumento na produção de arroz na Guiné, o número de passageiros na Austrália aumenta em 40 unidades (milhões) 🤣 -- Essa falsa descoberta (espúria) é devido à não estacionariedade das séries. Informalmente falando, essa não estacionariedade faz com que encontremos relações onde não há (elas são confundidas pelas tendências de ambas as séries). -- > **Cuidado!** Muitos dos grandes **achados** encontrados _por aí_ são, na verdade, relações espúrias. Analise tudo! --- ### Regressões espúrias **Fiz uma regressão em um contexo de séries temporais, como sei se ela é espúria?** -- - Utilizou séries não estacionárias? - Obteve um `\(R^2\)` bem alto? - Os resíduos são autocorrelacionádos? -- > Se a resposta for SIM, Regressão espúria detetada! -- ```r modelo %>% gg_tsresiduals() ``` ![](ACA228_ST_04_files/figure-html/unnamed-chunk-22-1.png)<!-- --> --- ### Regressões espúrias **Mas, como sei se a série que estou utilizando é não estacionária?** -- .red[Lembre-se, da definição da estacionariedade temos que, uma série é estacionária se tem média e variância constante.] -- - **Podemos olhar para o gráfico da série temporal:** Se a série tiver tendência e/ou a variabilidade aumenta (ou diminui) ao longo do tempo, a série é não estacionária. -- ![](ACA228_ST_04_files/figure-html/unnamed-chunk-23-1.png)<!-- --> --- ### Regressões espúrias Às vezes, olhando para o gráfico da série temporal, não é facil de verificar se a série é não estacionária. ![](ACA228_ST_04_files/figure-html/unnamed-chunk-24-1.png)<!-- --> -- Ainda bem, temos outra ferramenta para verificar se a série é não estacionária. - **Podemos fazer o gráfico da função de autocorrelação (correlograma):** Se as autocorrelações forem significativas e cairem devagar 🐢 , a série é não estacionária. --- ### Regressões espúrias ![](ACA228_ST_04_files/figure-html/unnamed-chunk-25-1.png)<!-- --> --- ### Regressões espúrias **As séries que estou analisando são não estacionárias, e agora?** -- .pull-left[ ![keep+calm](https://media3.giphy.com/media/oMHBBmFZ8kQ2Q/giphy.gif) ] -- .pull-right[ Em alguns casos, existem alternativas simples para continuar utilizando modelos de regressão no contexto de séries temporais e não cair na regressão espúria. ] --- class: inverse, right, middle # Séries com tendência ## e modelos de regressão --- ## Séries com tendência e modelos de regressão ### Alternativa 1: Quando as séries têm alguma tendência (linear, quadrática, cúbica, exponencial, etc), podemos incluir algumas variaveis explicativas no modelo que nos ajudarão a capturar o comportamento da tendência e fugir das regressões espúrias. -- - Tendência Linear: `\(y_t = \alpha_0 + \alpha_1t + e_t\)` - Tendência Quadrática: `\(y_t = \alpha_0 + \alpha_1t + \alpha_2 t^2 +e_t\)` - Tendência Cúbica: `\(y_t = \alpha_0 + \alpha_1t + \alpha_2 t^2 + \alpha_3 t^3+e_t\)` - Tendência Exponencial: `\(\log(y_t) = \alpha_0 + \alpha_1t + e_t\)` ( `\(y_t > 0\)`) > Incluir `\(t\)`, `\(t^2\)`, `\(t^3\)`, ... no modelo, atuará como um **removedor de tendência** -- .red[O que será que acontece com a regressão do número de passageiros na Austrália e a produção de arroz da Giné?] -- Incluiremos uma tendência quadrática no modelo (veja slide 21, a tendência parece mais uma função de segundo grau do que uma linha reta). -- Para isso, utilizaremos a função `trend()` que funciona como um `\(t\)` na equação de regressão. --- ## Séries com tendência e modelos de regressão ```r modelo <- guinea_rice %>% left_join(aus_airpassengers, by = "Year") %>% model(tslm = TSLM(Passengers ~ Production + trend() + I(trend()^2))) report(modelo) ``` ``` ## Series: Passengers ## Model: TSLM ## ## Residuals: ## Min 1Q Median 3Q Max ## -4.17183 -1.25445 -0.01282 1.23435 4.08528 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 10.46423 2.94060 3.559 0.00102 ** ## Production -2.72724 9.45961 -0.288 0.77468 ## trend() -0.14602 0.16021 -0.911 0.36783 ## I(trend()^2) 0.03347 0.00452 7.405 7.01e-09 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 2.001 on 38 degrees of freedom ## Multiple R-squared: 0.9847, Adjusted R-squared: 0.9835 ## F-statistic: 815.6 on 3 and 38 DF, p-value: < 2.22e-16 ``` --- ## Séries com tendência e modelos de regressão > `Production` não é mais estatísticamente significativa 🤭. Ao remover o efeito da tendência, a variável produção de arroz na Guiné não é mais significativa (não explica em nada o número de passageiros nas aerolinhas da Austrália), o que faz muito mais sentido 🏄♀️ 🏄♀️ . -- Mesmo com a variável `Production` não sendo estatísticamente significativa, o `\(R^2\)` do modelo deu `\(\approx\)` 0.98!. Será que o modelo capturou mesmo a dinâmica dos dados? (faremos o diagnostico do modelo). -- ```r modelo %>% gg_tsresiduals() ``` ![](ACA228_ST_04_files/figure-html/unnamed-chunk-27-1.png)<!-- --> -- > **Cuidado**, quando trabalhamos com séries temporais não estacionárias, não devemos olhar para o `\(R^2\)`. --- ## Séries com tendência e modelos de regressão - Se quisermos utilizar o `\(R^2\)` precisamos fazer alguns ajustes. Ver o artigo do [Wooldridge (1991)](https://www.sciencedirect.com/science/article/pii/016517659190054O) para mais detalhes -- **Como saber se incluir uma tendência temporal no modelo?** -- - Se alguma variavel (dependênte ou independênte) apresentar tendência, então incluir t (ou `\(t^2\)` ou `\(t^3\)`) é uma boa ideia. -- - Se ao incluir a tendência temporal, o termo de tendência for estatísticamente significativo e os resultados mudarem de forma susbtancial, o modelo deve incluir a tendência temporal **mesmo**. -- - Se o tendência temporal não for incluida, então nao ocorrera remoção da tendência e poderemos encontrar relaciones espúrias (**grandes achados** que na verdade são espúrios). -- > Relações espúrias são indesejadas e levam ao erro. Quando trabalharmos com séries com tendência, inclua **sempre** os termos de tendência temporal ( `\(t\)`, `\(t^2\)`, `\(t^3\)`) no modelo. Isso removerá o efeito da tendência das séries e evitará cairmos na regressão espúria. --- class: inverse, right, middle # Outros regressores Importantes --- ## Outros regressores Importantes Quando trabalhamos com análise de regressão em um contexto de séries temporais, além da tendência temporal ( `\(t\)`, `\(t^2\)`, etc) existem outros regressores que podem ser muito úteis: -- - **Variáveis Dummy sazonais:** Utilizada para tomar conta das diferenças nos diversos períodos sazonais. Por exemplo: .pull-left[ |dias | D1| D2| D3| D4| D5| D6| |:-------|--:|--:|--:|--:|--:|--:| |Segunda | 1| 0| 0| 0| 0| 0| |Terça | 0| 1| 0| 0| 0| 0| |Quarta | 0| 0| 1| 0| 0| 0| |Quinta | 0| 0| 0| 1| 0| 0| |Sexta | 0| 0| 0| 0| 1| 0| |Sábado | 0| 0| 0| 0| 0| 1| |Domingo | 0| 0| 0| 0| 0| 0| |Segunda | 1| 0| 0| 0| 0| 0| ] -- .pull-right[ |Estacoes | D1| D2| D3| |:----------|--:|--:|--:| |Primaveira | 1| 0| 0| |Verão | 0| 1| 0| |Outono | 0| 0| 1| |Inverno | 0| 0| 0| |Primaveira | 1| 0| 0| |Verão | 0| 1| 0| ] -- isso é feito automáticamente com a função `seasonal()` dentro do `TSLM()`. --- ## Outros regressores Importantes ```r aus_production %>% filter(year(Quarter) >= 1992) %>% autoplot(Beer) ``` ![](ACA228_ST_04_files/figure-html/unnamed-chunk-30-1.png)<!-- --> -- Contruiremos um modelo da forma `$$Berr_t = \beta_0 + \beta_1 t + \beta_2 D_{2,t} + \beta_3 D_{3,t} + \beta_4 D_{4,t} \epsilon_t,$$` em que `\(D_{i,t} = 1\)` se `\(t \in\)` Trimestre `\(i\)` e 0, caso contrário. --- ## Outros regressores Importantes ```r modelo <- aus_production %>% filter(year(Quarter) >= 1992) %>% model(TSLM(Beer ~ trend() + season())) report(modelo) ``` ``` ## Series: Beer ## Model: TSLM ## ## Residuals: ## Min 1Q Median 3Q Max ## -42.9029 -7.5995 -0.4594 7.9908 21.7895 ## ## Coefficients: ## Estimate Std. Error t value Pr(>|t|) ## (Intercept) 441.80044 3.73353 118.333 < 2e-16 *** ## trend() -0.34027 0.06657 -5.111 2.73e-06 *** ## season()year2 -34.65973 3.96832 -8.734 9.10e-13 *** ## season()year3 -17.82164 4.02249 -4.430 3.45e-05 *** ## season()year4 72.79641 4.02305 18.095 < 2e-16 *** ## --- ## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ## ## Residual standard error: 12.23 on 69 degrees of freedom ## Multiple R-squared: 0.9243, Adjusted R-squared: 0.9199 ## F-statistic: 210.7 on 4 and 69 DF, p-value: < 2.22e-16 ``` --- ## Outros regressores Importantes .panelset[ .panel[.panel-name[Gráfico] ![](ACA228_ST_04_files/figure-html/unnamed-chunk-32-1.png)<!-- --> ] .panel[.panel-name[Código] ```r augment(modelo) %>% ggplot(aes(x = Quarter)) + geom_line(aes(y = Beer, colour = "Data")) + geom_line(aes(y = .fitted, colour = "Fitted")) + scale_colour_manual(values = c(Data = "black", Fitted = "red")) + ylab("Megalitros") + xlab("Trimestre") + ggtitle("Produção trimestral de cerveja australiana") + guides(colour = guide_legend(title = "Séries")) ``` ] ] --- ## Outros regressores Importantes ```r modelo %>% gg_tsresiduals() ``` ![](ACA228_ST_04_files/figure-html/unnamed-chunk-34-1.png)<!-- --> --- ## Outros regressores Importantes - **Variáveis Dummy:** utilizadas para dividir períodos de tempo. Por exemplo: * posicionamento politico na presidencia: direita ou esquerda, * período covid: antes do covid e depois do covid (março 12, 2020), * antes e depois do 11-09-2001, * antes e depois de determinada politica na empresa (ou politica pública), * feriados * eventos raros: copa do mundo, jogos olimpicos, etc. -- - **Dias de negociação:** dependo do que queremos prever, o numero de dias úteis (ou dias de negociação) pode influenciar em, por exemplo, o volume de vendas mensal. * Incluir uma variável com o número de dias úteis no mês pode ser útil para nosso modelo. * Outra alternativa é incluir o número de segundas - `\(x_1\)`, número de terças- `\(x_2\)`, ..., número de domingos - `\(x_7\)`. -- - **Variáveis defasadas:** Podemos pensar que, por exemplo, o número de vendas depende dos gastos em publicidade. Contudo, as vezes os gastos em publicidade do mês anterior poderiam ter um efeito nas vendas do mês atual. Nesse sentido, incluir variáveis defasadas pode ajudar a melhorar o modelo. --- ## Outros regressores Importantes - **Páscoa:** A páscoa não acontece todo ano no mesmo periodo, páscoa pode afetar diferentes negócios (turismo, por exemplo). Incluir no modelo uma variáveis que tome conta desse fator pode ser interessante. Isto pode ser feito com uma varível dummy. * Uma dummy nos dias da páscoa, * Se trabalharmos com dados mensais, podemos incluir uma dummy no mês que a páscoa cair, * etc. -- A função `mutate()` do pacote `dplyr` pode ser útil para criar novas variáveis no seu _dataset_. -- > Não existe uma regra sobre quais dos regressores visto aqui pode ajudar ou não. Obviamente, se tivermos tendência ou sazonalidade, incluir `trend()` e/ou `seasonal()` podem ajudar a melhorar nosso modelo. A construção de variáveis dummy para períodos específicos dependem muito da área com a qual estivermos trabalhando. --- ## Exercício. O _dataset_ referente à temperatura de Lajeado/RS está disponível [aqui](https://raw.githubusercontent.com/ctruciosm/ctruciosm.github.io/master/datasets/lajeado_rs.csv). O seguinte código importa os dados e deixa eles em um formato de série temporal ```r library(tsibble) library(fpp3) url <- "https://raw.githubusercontent.com/ctruciosm/ctruciosm.github.io/master/datasets/lajeado_rs.csv" lajeado_rs <- read.csv(url, sep = ";") lajeado_rs <- lajeado_rs %>% mutate(ano_mes = yearmonth(ano_mes)) %>% select(ano_mes, temp_media) %>% as_tsibble(index = ano_mes) ``` 1. Construa um modelo para prever a temperatura média em Lajeado/RS, que inclua a componente de tendência e a componente sazonal (as funções `TSLM()`, `trend()` e `seasonal()` podem ser de ajuda). 2. Faça um gráfico dos valores observados ( `\(y_t\)`) e os valores estimados ( `\(\hat{y}_t\)`). Ver slide 38 3. Faça uma análise de diagnóstico (veja slide 39). Acha ue o modelo capturou a dinâmica dos dados? (explique) > Entregar pelo Google Class até antes da próxima aula. --- ### Referências - [Hyndman, R.J., & Athanasopoulos, G. (2021). Forecasting: principles and practice, 3rd edition, OTexts: Melbourne, Australia. OTexts.com/fpp3.](https://otexts.com/fpp3/). Chapter 7. - [Wooldridge, J. M. (1991). A note on computing r-squared and adjusted r-squared for trending and seasonal data. Economics Letters, 36(1), 49-54.](https://www.sciencedirect.com/science/article/pii/016517659190054O) - Wooldridge, Jeffrey M. *Introdução à Econometria: Uma abordagem moderna*. (2016). Cengage Learning. -- **Cap 10**