Questão 1
phi <- 0.6
theta <- 0.9
set.seed(123)
# ARMA(1,0)
arma10 <- arima.sim(n = 100, list(order = c(1, 0, 0), ar = phi))
# ARMA(0,1)
arma01 <- arima.sim(n = 100, list(order = c(0, 0, 1), ma = theta))
# ARMA(1,1)
arma11 <- arima.sim(n = 100, list(order = c(1, 0, 1), ar = phi, ma = theta))
acf_arma10 <- acf(arma10, plot = FALSE)
acf_arma01 <- acf(arma01, plot = FALSE)
acf_arma11 <- acf(arma11, plot = FALSE)
plot(acf_arma10$acf ~ acf_arma10$lag, type = 'l', col = 'steelblue', lwd = 2, xlab = 'lag', ylab = 'acf')
lines(acf_arma01$acf ~ acf_arma10$lag, type = 'l', col = '#ff5454', lwd = 2)
lines(acf_arma11$acf ~ acf_arma10$lag, type = 'l', col = 'darkgreen', lwd = 2)
legend("topright",
legend = c("ARMA(1,0)", "ARMA(0,1)", "ARMA(1,1)"),
col = c("steelblue", "#ff5454", "darkgreen"),
lwd = 2,
bty = "n")
A ACF do ARMA(1,0) mostra uma queda contínua, a do ARMA(0,1) uma queda mais forte depois do primeiro lag, e a do ARMA(1,1) combina características dos dois modelos.
Questão 2
a)
Podemos ajustar da seguinte maneira:
require(astsa)
require(forecast)
data(cmort)
ajuste <- ar.ols(cmort, order=2,demean = F, intercept = T)
ajuste
##
## Call:
## ar.ols(x = cmort, order.max = 2, demean = F, intercept = T)
##
## Coefficients:
## 1 2
## 0.4286 0.4418
##
## Intercept: 11.45 (2.394)
##
## Order selected 2 sigma^2 estimated as 32.32
b)
# 4 predições
predicoes <- predict(ajuste,n.ahead = 4)
#Média das predições
pred_med <- predicoes$pred
#EP das predições
pred_ep <- predicoes$se
# IC
IC_inf <- pred_med - 1.96 * pred_ep; IC_sup <- pred_med + 1.96 * pred_ep
# Resultados
knitr::kable(
round(data.frame(Semana = 1:4,
Pred = pred_med,
'IC Inferior' = IC_inf,
'IC Superior' = IC_sup
),2))
| Semana | Pred | IC.Inferior | IC.Superior |
|---|---|---|---|
| 1 | 87.60 | 76.46 | 98.74 |
| 2 | 86.76 | 74.64 | 98.89 |
| 3 | 87.34 | 73.35 | 101.32 |
| 4 | 87.21 | 72.33 | 102.10 |
Questão 3
set.seed(123)
# 500 observações em 3 simulações
amostra <- list()
for (i in 1:3) {
amostra[[i]] <- arima.sim(list(ar = 0.9, ma = -0.9), 500)
}
# Plot das séries simuladas
par(mfrow = c(3, 1))
plot(amostra[[1]], main = 'Primeira Simulação')
plot(amostra[[2]], main = 'Segunda Simulação')
plot(amostra[[3]], main = 'Terceira Simulação')
# ACF e PACF das séries
par(mfrow = c(3, 2))
acf(amostra[[1]], main = 'ACF Primeira Amostra'); pacf(amostra[[1]], main = 'PACF Primeira Amostra')
acf(amostra[[2]], main = 'ACF Segunda Amostra'); pacf(amostra[[2]], main = 'PACF Segunda Amostra')
acf(amostra[[3]], main = 'ACF Terceira Amostra'); pacf(amostra[[3]], main = 'PACF Terceira Amostra')
Podemos observar um comportamento muito próximo tanto entre as séries quanto entre as suas respectivas autocorrelações.
# Ajuste ARMA(1,1) aos dados simulados
ajuste1 <- arima(amostra[[1]], order =c(1,0,1))
ajuste1
##
## Call:
## arima(x = amostra[[1]], order = c(1, 0, 1))
##
## Coefficients:
## ar1 ma1 intercept
## 0.6698 -0.7393 0.0319
## s.e. 0.1870 0.1685 0.0341
##
## sigma^2 estimated as 0.9322: log likelihood = -691.94, aic = 1391.88
ajuste2 <- arima(amostra[[2]], order =c(1,0,1))
ajuste2
##
## Call:
## arima(x = amostra[[2]], order = c(1, 0, 1))
##
## Coefficients:
## ar1 ma1 intercept
## -0.8053 0.7881 0.0425
## s.e. 0.2691 0.2780 0.0455
##
## sigma^2 estimated as 1.054: log likelihood = -722.66, aic = 1453.32
ajuste3 <- arima(amostra[[3]], order =c(1,0,1))
ajuste3
##
## Call:
## arima(x = amostra[[3]], order = c(1, 0, 1))
##
## Coefficients:
## ar1 ma1 intercept
## 0.067 -0.0024 0.0373
## s.e. 0.656 0.6574 0.0470
##
## sigma^2 estimated as 0.9669: log likelihood = -701.04, aic = 1410.09
Podemos observar que os coeficientes que o segundo e do primeiro ajuste são os que mais se aproximam dos valores do modelo amostrado.
Questão 4
a)
Podemos começar observando o comportamento da série e vemos que há um padrão de crescimento constante, muito semelhante ao que vemos no Exemplo III.39 do material, mas com alguma sazonalidade.
plot(sales, main = "Vendas (Sales)")
Podemos trabalhar com o trabalhar com o log dos dados e uma diferencaição para observarmos a taxa de crescimento das vendas. Ao fazermos isso vemso que a série apresenta ser um processo bem mais estável.
log_sales <- log(sales)
diff_sales <- diff(log_sales)
plot(diff_sales,xlab="Tempo", ylab=expression(paste(nabla,log,"(",Y[t],")")),
main = 'Taxa de crescimento das vendas (sales)')
Por fim, antes de ajustar o modelo vamos olhar para as funções ACF e PACF amostrais. Ainda não apresenta um padrão satisfatório, onde no PACF podemos observar um lag significativo apenas no primrito valor.
par(mfrow=c(1,2))
acf(diff_sales, main = 'ACF'); pacf(diff_sales, main = 'PACF')
Por fim, como nosso modelo inicial vamos ajustar um modelo \(ARIMA(1,0,1)\).
ajuste1 <- arima(diff_sales, order = c(1,0,1))
ajuste1
##
## Call:
## arima(x = diff_sales, order = c(1, 0, 1))
##
## Coefficients:
## ar1 ma1 intercept
## 0.8400 -0.6149 0.0017
## s.e. 0.0834 0.1182 0.0011
##
## sigma^2 estimated as 3.473e-05: log likelihood = 553.41, aic = -1098.81
Analisando os resíduos do modelo podemos observar que i modelo tem um ajuste ben razóavel aos dados.
sarima(diff_sales, 1,0,1)
## initial value -5.050724
## iter 2 value -5.080469
## iter 3 value -5.094406
## iter 4 value -5.096106
## iter 5 value -5.097662
## iter 6 value -5.106879
## iter 7 value -5.107101
## iter 8 value -5.111293
## iter 9 value -5.116769
## iter 10 value -5.122205
## iter 11 value -5.127630
## iter 12 value -5.131855
## iter 13 value -5.132116
## iter 14 value -5.132296
## iter 15 value -5.132315
## iter 16 value -5.132333
## iter 17 value -5.132334
## iter 18 value -5.132336
## iter 19 value -5.132336
## iter 19 value -5.132336
## iter 19 value -5.132336
## final value -5.132336
## converged
## initial value -5.132904
## iter 2 value -5.132951
## iter 3 value -5.133070
## iter 4 value -5.133076
## iter 5 value -5.133077
## iter 6 value -5.133078
## iter 7 value -5.133079
## iter 7 value -5.133079
## iter 7 value -5.133079
## final value -5.133079
## converged
## <><><><><><><><><><><><><><>
##
## Coefficients:
## Estimate SE t.value p.value
## ar1 0.8400 0.0834 10.0728 0.0000
## ma1 -0.6149 0.1182 -5.2003 0.0000
## xmean 0.0017 0.0011 1.5210 0.1304
##
## sigma^2 estimated as 3.473379e-05 on 146 degrees of freedom
##
## AIC = -7.374589 AICc = -7.373478 BIC = -7.293946
##
b)
Podemos exibir o gráfico CCF da seguinte forma:
diff_lead <- diff(log(lead))
ccf(diff_sales, diff_lead, main = 'CCF de diff_sales e diff_lead')
Utilizando lag2.plot() para as séries diferenciadas,
podemos observar que não parece ter uma relação clara entre as duas
séries sem atribuir um lag.
lag2.plot(diff_sales, diff_lead)
c)
diff_lead_lag3 <- lag(diff_lead, -3) # Defasagem de 3
ajuste_arima <- Arima(diff_sales, xreg = diff_lead_lag3, order = c(1, 0, 1))
summary(ajuste_arima)
## Series: diff_sales
## Regression with ARIMA(1,0,1) errors
##
## Coefficients:
## ar1 ma1 intercept xreg
## 0.8441 -0.6198 0.0017 -0.0075
## s.e. 0.0815 0.1160 0.0012 0.0161
##
## sigma^2 = 3.564e-05: log likelihood = 553.51
## AIC=-1097.03 AICc=-1096.61 BIC=-1082.01
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 4.235582e-05 0.005889205 0.004580906 NaN Inf 0.760782 -0.01055152
Questão 5
a)
Podemos observar que o valor médio apresenta um comportamento de queda ao longo dos anos, com um início de estabilização a partir de 1990.
plot(cpg, main = 'Grafico de Ct')
b)
Transfotmando nossa variável em \(log(C_t)\), podemos observar que o modelo linear se ajusta bem aos dados, indicando claramente que a nossa variável original apresenta um comportamento exponencial no período.
log_cpg <- log(cpg)
tempo <- 1980:2008
ajuste <- lm(log_cpg ~ tempo)
plot(tempo, log_cpg, main = "Grafico de Log(Ct) com Regressao Linear",
xlab = "Tempo", ylab = "log(Ct)", pch = 16, col = "blue")
abline(ajuste, col = "red", lwd = 2)
legend("topright", legend = c("Dados log(Ct)", "Regressao Linear"),
col = c("blue", "red"), pch = c(16, NA), lty = c(NA, 1), lwd = c(NA, 2))
c)
Embora no gráfico da alternativa anterior o modelo aparente se ajustar bem aos dados, podemos ver nos gráficos abaixo uma ligeira fuga de normalidade e um padrão claro nos gráficos de resíduos.
par(mfrow = c(2,2))
plot(ajuste)
d)
Podemos ajustar um modelo arima para os dados, utilizando a função
auto.arima().
ajuste_arima <- auto.arima(log_cpg, xreg = tempo)
summary(ajuste_arima)
## Series: log_cpg
## Regression with ARIMA(1,0,0) errors
##
## Coefficients:
## ar1 intercept xreg
## 0.8297 1113.0105 -0.5554
## s.e. 0.1190 73.5665 0.0368
##
## sigma^2 = 0.181: log likelihood = -15.37
## AIC=38.73 AICc=40.4 BIC=44.2
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.04793293 0.4028656 0.3336757 0.8235877 14.53447 0.5859718
## ACF1
## Training set -0.2191326
Também podemos observar o ajuste sobre os dados reais. Dessa vez vemos que o modelo tem um ajuste bem superior ao linear.
previsoes <- fitted(ajuste_arima) # fitted() obtém os valores ajustados
# Plot dos dados reais e do ajuste ARIMA
plot(tempo, log_cpg, main = "Grafico de Log(Ct) com Ajuste ARIMA",
xlab = "Tempo", ylab = "log(Ct)", pch = 16, col = "steelblue")
lines(previsoes, col = 'red4', lwd = 2) # Adiciona o modelo ajustado ao gráfico
legend("topright", legend = c("Dados Reais", "Ajuste ARIMA"),
col = c("steelblue", "red4"), lty = 1, lwd = 2)