Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- library(readxl)
- library(urca)
- library(tseries)
- library(forecast)
- library(lmtest)
- library(FinTS)
- library(ggplot2)
- ## importação dos dados
- dados <- read_excel(
- "C:/Users/55319/Documents/Materiais - Ciências Econômicas/2020_1/Econometria II/serieagriepeccom020.xls")
- ## Dados em série temporal
- export <- ts(dados$Export, start = c(1996,1), end = c(2019,12), freq = 12)
- ### ETAPA 1. IDENTIFICAÇÃO ###
- ## 1.1 Gráfico da série
- plot(export,
- main = "Exportações do setor da agricultura e pecuária - US$ (milhões)\nPeriodicidade: mensal",
- xlab = "Período", ylab = "", col = "blue", lwd = 2)
- ## 1.2 Identicação da presença de sazonalidade
- # 1.2.1 Função monthplot: detectar sazonalidade
- monthplot(export, main = "Monthplot", ylab = "")
- # 1.2.2 Função boxplot: detectar sazonalidade
- boxplot(export ~ cycle(export), main = "Boxplot", ylab = "", xlab = "")
- # 1.2.3 Decomposição da serie temporal
- plot(stl(export, s.window="periodic"))
- plot(decompose(export)) +
- labs(title = "Decomposição dos componentes da série temporal")
- ## 1.3 FAC e FACP
- par(mfrow=c(1,1))
- acf(export,lag.max=36, main = "FAC", xlab = "Defasagem", ylab = "")
- pacf(export,lag.max=36, main = "FACP", xlab = "Defasagem", ylab = "")
- ## 1.4 Gráfico da série em primeira diferença
- par(mfrow=c(1,1))
- ts.plot(diff(export, lag = 1, differences = 1), main = "Gráfico da série em primeira diferença",
- xlab = "Período", ylab = "")
- ## 1.4 Testes de raiz unitária ##
- ## 1.4.1 Teste ADF (H0: não estacionário)
- # Em nível
- summary(ur.df(export, type=c("trend"),lags=24, selectlags = "BIC"))
- summary(ur.df(export, type=c("drift"),lags=24, selectlags = "BIC"))
- summary(ur.df(export, type=c("none"),lags=24, selectlags = "BIC"))
- # Em primeira diferença
- summary(ur.df(diff(export), type=c("trend"),lags=24, selectlags = "BIC"))
- summary(ur.df(diff(export), type=c("drift"),lags=24, selectlags = "BIC"))
- summary(ur.df(diff(export), type=c("none"),lags=24, selectlags = "BIC"))
- # Em primeira diferença sazonal
- summary(ur.df(diff(export, lag = 12), type = "trend", lags = 24, selectlags = "BIC"))
- summary(ur.df(diff(export, lag = 12), type = "drift", lags = 24, selectlags = "BIC"))
- summary(ur.df(diff(export, lag = 12), type = "none", lags = 24, selectlags = "BIC"))
- ## 1.4.2 Teste de PP (H0: não estacionário)
- # Em nível
- summary(ur.pp(export,type=c("Z-tau"), model=c("trend"), lags=c("short")))
- summary(ur.pp(export,type=c("Z-tau"), model=c("constant"), lags=c("short")))
- # Em primeira diferença
- summary(ur.pp(diff(export, lag = 12),type=c("Z-tau"), model=c("trend"), lags=c("short")))
- summary(ur.pp(diff(export, lag = 12),type=c("Z-tau"), model=c("constant"), lags=c("short")))
- ## 1.5 Comparando a variável em nível e em primeira diferença
- par(mfrow=c(2,1))
- plot(export,
- main = "Valor das Exportações",
- xlab = "Período", ylab = "")
- plot(diff(export),
- main = "Valor das Exportações\n(Em primeira diferença)",
- xlab = "Período", ylab = "")
- # 1.5.1 FAC e FACP em nível e primeira diferença
- par(mfrow=c(2,2))
- acf(export,lag.max=36, main = "FAC", xlab = "Defasagem", ylab = "")
- pacf(export,lag.max=36, main = "FACP", xlab = "Defasagem", ylab = "")
- acf(diff(export),lag.max=36, main = "FAC - Diff", xlab = "Defasagem", ylab = "")
- pacf(diff(export),lag.max=36, main = "FACP - Diff", xlab = "Defasagem", ylab = "")
- ### ETAPA 2. ESTIMAÇÃO ###
- ## 2.1 Candidatos a melhor modelo SARIMA(p,d,q)x(P,D,Q)
- fit1=coeftest(Arima(export, order=c(1,0,0), seasonal=list(order=c(0,1,0), period=12))); fit1 ## Candidato a melhor modelo ##
- fit2=coeftest(Arima(export, order=c(1,0,0), seasonal=list(order=c(1,1,0), period=12))); fit2 ## Candidato a melhor modelo ##
- fit3=coeftest(Arima(export, order=c(1,0,0), seasonal=list(order=c(0,0,1), period=12))); fit3 ## Candidato a melhor modelo ##
- fit4=coeftest(Arima(export, order=c(1,1,0), seasonal=list(order=c(0,1,0), period=12))); fit4 ## Candidato a melhor modelo ##
- fit5=coeftest(Arima(export, order=c(1,1,0), seasonal=list(order=c(1,1,0), period=12))); fit5 ## Candidato a melhor modelo ##
- fit6=coeftest(Arima(export, order=c(1,1,0), seasonal=list(order=c(0,1,1), period=12))); fit6 ## Candidato a melhor modelo ##
- fit7=coeftest(Arima(export, order=c(0,1,1), seasonal=list(order=c(0,1,0), period=12))); fit7 ## Candidato a melhor modelo ##
- fit8=coeftest(Arima(export, order=c(0,1,1), seasonal=list(order=c(1,1,0), period=12))); fit8 ## Candidato a melhor modelo ##
- fit9=coeftest(Arima(export, order=c(0,1,1), seasonal=list(order=c(0,1,1), period=12))); fit9 ## Candidato a melhor modelo ##
- fit10=coeftest(Arima(export, order=c(1,1,1), seasonal=list(order=c(0,1,0), period=12))); fit10 ## Candidato a melhor modelo ##
- fit11=coeftest(Arima(export, order=c(1,1,1), seasonal=list(order=c(1,1,0), period=12))); fit11 ## Candidato a melhor modelo ##
- fit12=coeftest(Arima(export, order=c(1,1,1), seasonal=list(order=c(0,1,1), period=12))); fit12 ## Candidato a melhor modelo ##
- fit13=coeftest(Arima(export, order=c(2,0,0), seasonal=list(order=c(0,1,0), period=12))); fit13 ## Candidato a melhor modelo ##
- fit14=coeftest(Arima(export, order=c(2,0,0), seasonal=list(order=c(1,1,0), period=12))); fit14 ## Candidato a melhor modelo ##
- fit15=coeftest(Arima(export, order=c(3,0,0), seasonal=list(order=c(0,1,1), period=12))); fit15 ## Candidato a melhor modelo* ##
- # Nota: * Fit 15 não possui todos coeficientes significativos, porém possui mais componentes AR - vamos testar os resíduos com esse modelo
- auto.arima(export)
- fit16=coeftest(auto.arima(export)); fit16 ## Candidato a melhor modelo ##
- ## 2.2 Critérios de informação
- mod1=Arima(export, order=c(1,0,0), seasonal=list(order=c(0,1,0), period=12)); mod1 ## Candidato a melhor modelo ##
- mod2=Arima(export, order=c(1,0,0), seasonal=list(order=c(1,1,0), period=12)); mod2 ## Candidato a melhor modelo ##
- mod3=Arima(export, order=c(1,0,0), seasonal=list(order=c(0,0,1), period=12)); mod3 ## Candidato a melhor modelo ##
- mod4=Arima(export, order=c(1,1,0), seasonal=list(order=c(0,1,0), period=12)); mod4 ## Candidato a melhor modelo ##
- mod5=Arima(export, order=c(1,1,0), seasonal=list(order=c(1,1,0), period=12)); mod5 ## Candidato a melhor modelo ##
- mod6=Arima(export, order=c(1,1,0), seasonal=list(order=c(0,1,1), period=12)); mod6 ## Candidato a melhor modelo ##
- mod7=Arima(export, order=c(0,1,1), seasonal=list(order=c(0,1,0), period=12)); mod7 ## Candidato a melhor modelo ##
- mod8=Arima(export, order=c(0,1,1), seasonal=list(order=c(1,1,0), period=12)); mod8 ## Candidato a melhor modelo ##
- mod9=Arima(export, order=c(0,1,1), seasonal=list(order=c(0,1,1), period=12)); mod9 ## Candidato a melhor modelo ##
- mod10=Arima(export, order=c(1,1,1), seasonal=list(order=c(0,1,0), period=12)); mod10 ## Candidato a melhor modelo ##
- mod11=Arima(export, order=c(1,1,1), seasonal=list(order=c(1,1,0), period=12)); mod11 ## Candidato a melhor modelo ##
- mod12=Arima(export, order=c(1,1,1), seasonal=list(order=c(0,1,1), period=12)); mod12 ## Candidato a melhor modelo ##
- mod13=Arima(export, order=c(2,0,0), seasonal=list(order=c(0,1,0), period=12)); mod13 ## Candidato a melhor modelo ##
- mod14=Arima(export, order=c(2,0,0), seasonal=list(order=c(1,1,0), period=12)); mod14 ## Candidato a melhor modelo ##
- mod15=Arima(export, order=c(3,0,0), seasonal=list(order=c(0,1,1), period=12)); mod15 ## Candidato a melhor modelo ##
- mod16=auto.arima(export); mod16
- AIC(mod1,mod2,mod3,mod4,mod5,mod6,mod7,mod8,
- mod9, mod10, mod11, mod12, mod13, mod14, mod15, mod16)
- BIC(mod1,mod2,mod3,mod4,mod5,mod6,mod7,mod8,
- mod9, mod10, mod11, mod12, mod13, mod14, mod15, mod16)
- # Nota:3 melhores modelos selecionados + modelo 15
- # Nota: Vamos considerar critério BIC, pois tende a ser mais parcimonioso
- ### 3.VERIFICAÇÃO ###
- # Nota: Vamos avaliar os modelos 16, 12, 9 e 15
- ## 3.1 Teste de estabilidade - saber se as raizes do polinômio característico do modelo satisfazem a propriedade de estacionariedade
- autoplot(mod16)
- autoplot(mod12)
- autoplot(mod9)
- autoplot(mod15)
- # Nota: todos os modelos são estáveis
- ## 3.2 Testes dos resíduos
- # 3.2.1 Diagnóstico da série temporal
- tsdiag(mod16)
- tsdiag(mod12)
- tsdiag(mod9)
- tsdiag(mod15)
- # 3.2.2 Autocorrelação Teste de Ljung-Box| H0: os residuos sao iid (não há autocorrelação)
- res12<-residuals(mod12)
- Box.test(res12,lag=12,type="Ljung-Box")
- Box.test(res12,lag=24,type="Ljung-Box")
- Box.test(res12,lag=36,type="Ljung-Box")
- # Nota: mod 12 tem autocorrelação
- res16<-residuals(mod16)
- Box.test(res16,lag=12,type="Ljung-Box")
- Box.test(res16,lag=24,type="Ljung-Box")
- Box.test(res16,lag=36,type="Ljung-Box")
- # Nota: mod16 tem autocorrelação
- tsdiag(mod9)
- res9<-residuals(mod9)
- Box.test(res9,lag=12,type="Ljung-Box")
- Box.test(res9,lag=24,type="Ljung-Box")
- Box.test(res9,lag=36,type="Ljung-Box")
- # Nota: mod 9 tem autocorrelação
- tsdiag(mod15)
- res15<-residuals(mod15)
- Box.test(res15,lag=12,type="Ljung-Box")
- Box.test(res15,lag=24,type="Ljung-Box")
- Box.test(res15,lag=36,type="Ljung-Box")
- # Nota: tem autocorrelação
- # 3.2.2 Normalidade Teste de Jarque-Bera| H0: normalidade dos residuos (normalmente distribuídos)
- # Análise visual mod16
- par(mfrow=c(2,2))
- hist(res16, freq=F, ylab='Densidade', xlab='Resíduos', main='Resíduos')
- plot(density(res16, kernel = c("gaussian")), main="Resíduos") #Função de densidade estimada
- qqnorm(res16, ylab='Quantis amostrais', xlab='Quantis teóricos', main='Quantil-Quantil')
- qqline(res16, col = "red")
- # Nota: próximo do centro se aproxima aproxima a distribuição normal, mas nas extremidades se afasta bastante
- # Teste Shapiro e Jarque Bera
- shapiro.test(res16)
- jarque.bera.test(res16)
- # Nota: ambos rejeitam a hipótese de normalidade dos erros
- # Análise visual mod12
- par(mfrow=c(2,2))
- hist(res12, freq=F, ylab='Densidade', xlab='Resíduos', main='Resíduos')
- plot(density(res12, kernel = c("gaussian")), main="Resíduos") #Função de densidade estimada
- qqnorm(res12, ylab='Quantis amostrais', xlab='Quantis teóricos', main='Quantil-Quantil')
- qqline(res12, col = "red")
- # Teste Shapiro e Jarque Bera
- shapiro.test(res12)
- jarque.bera.test(res12)
- # Nota: ambos rejeitam a hipótese de normalidade dos erros
- # Análise visual mod9
- par(mfrow=c(2,2))
- hist(res9, freq=F, ylab='Densidade', xlab='Resíduos', main='Resíduos')
- plot(density(res9, kernel = c("gaussian")), main="Resíduos") #Função de densidade estimada
- qqnorm(res9, ylab='Quantis amostrais', xlab='Quantis teóricos', main='Quantil-Quantil')
- qqline(res9, col = "red")
- # Teste Shapiro e Jarque Bera
- shapiro.test(res9)
- jarque.bera.test(res9)
- # Nota: ambos rejeitam a hipótese de normalidade dos erros
- # Análise visual mod15
- par(mfrow=c(2,2))
- hist(res15, freq=F, ylab='Densidade', xlab='Resíduos', main='Resíduos')
- plot(density(res15, kernel = c("gaussian")), main="Resíduos") #Função de densidade estimada
- qqnorm(res15, ylab='Quantis amostrais', xlab='Quantis teóricos', main='Quantil-Quantil')
- qqline(res15, col = "red")
- # Teste Shapiro e Jarque Bera
- shapiro.test(res15)
- jarque.bera.test(res15)
- # Nota: ambos rejeitam a hipótese de normalidade dos erros
- # 3.2.3 Teste de heteroscedasticidade Teste ARCH| H0: os residuos nao possuem efeitos auto-regressivos de heteroscedasticidade condicional
- ArchTest(mod16$residuals,lags = 36)
- ArchTest(mod12$residuals,lags = 36)
- ArchTest(mod9$residuals,lags = 36)
- ArchTest(mod15$residuals,lags = 36)
- ### ETAPA 4. PREVISÃO ###
- ## 4.1 Testes de acurária
- # 4.1.1 Teste de acurácia: dentro da amostra (amostra inteira como treino - desvios do modelo ajustaoo em relação aos dados observados - média dos desvios ao quadrado)
- # Nota: vamos comparar o RMSE (root mean square error)
- accuracy(mod16)
- accuracy(mod12)
- accuracy(mod9)
- accuracy(mod15)
- ## modelo 12 e 16 erraram menos
- # 4.1.2 Teste de acurácia: fora da amostra (usando o ano de 2019 como teste - cortar um pedaço da série, ajustar na parte restante e gerar previsões para a parte descartada)
- export.test <- tail(export,12) # definindo a série "teste"
- export.test
- export.train <- head(export, length(export)-12) # definindo a série "treino"
- export.train
- # Modelo 16
- mod16.train=auto.arima(export.train); mod16.train
- fc_mod16.train <- forecast(mod16.train, h = 12) # projeção para 12 períodos para frente
- fc_mod16.train
- par(mfrow=c(1,1))
- accuracy(fc_mod16.train$mean,export.test)
- df_test16 <- ts(data.frame(cbind(fcst=fc_mod16.train$mean,obs=export.test)))
- df_test16
- autoplot(df_test16[,2], series = "Observado") +
- autolayer(df_test16[,1], series = "Previsão") +
- labs(title = "Valor das Exportações (Período: Jan/2019 - Dez/2019)",
- x = "Períodos",
- y = "",
- color = "Previsão")
- # Nota: modelo 16 conseguiu captar razoalvelmente bem as variações e a tendência dos valores observados
- # Modelo 12
- mod12.train=Arima(export.train, order=c(1,1,1), seasonal=list(order=c(0,1,1), period=12)); mod12.train
- fc_mod12.train <- forecast(mod12.train, h = 12)
- fc_mod12.train
- accuracy(fc_mod12.train$mean,export.test)
- df_test12 <- ts(data.frame(cbind(fcst=fc_mod12.train$mean,obs=export.test)))
- autoplot(df_test12[,2], series = "Observado") +
- autolayer(df_test12[,1], series = "Previsão") +
- labs(title = "Valor das exportações (Período: Jan/2019 - Dez/2019)",
- x = "Períodos",
- y = "",
- color = "Previsão")
- # Modelo 15
- mod15.train=Arima(export.train, order=c(3,0,0), seasonal=list(order=c(0,1,1), period=12)); mod15.train
- fc_mod15.train <- forecast(mod15.train, h = 12)
- fc_mod15.train
- accuracy(fc_mod15.train$mean,export.test)
- df_test15 <- ts(data.frame(cbind(fcst=fc_mod15.train$mean,obs=export.test)))
- autoplot(df_test15[,2], series = "Observado") +
- autolayer(df_test15[,1], series = "Previsão") +
- labs(title = "Valor das exportações (Período: Jan/2019 - Dez/2019)",
- x = "Períodos",
- y = "",
- color = "Previsão")
- # Comparando acurácias
- accuracy(fc_mod16.train$mean,export.test)
- accuracy(fc_mod12.train$mean,export.test)
- accuracy(fc_mod15.train$mean,export.test)
- # Nota: pelos critérios de acurácia, escolheremos o modelo 16
- # 4.2 Gráficos
- # Modelo 16
- # 4.2.1 Gráfico "manual"
- fc_mod16 <- forecast(mod16, h = 12)
- se16 <- sqrt(mod16$sigma2)
- par(mfrow=c(1,1))
- ts.plot(window(export, start=c(2018,1)),
- fc_mod16$mean,
- fc_mod16$mean+1.96*se16,
- fc_mod16$mean-1.96*se16,col=c(1,2,2,2), lty=c(1,1,2,2))
- # 4.2.2 Gráfico da função 'forecast'
- plot(fc_mod16)
- plot(fc_mod16,
- main = "Previsão das Exportações - MG para 2021",
- xlab = "Período",
- include = 24,
- showgap = F,
- fcol = "darkgreen",
- flty = "dashed")
- ### FIM ###
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement