Séries Temporais - Exercícios

Author

Paulo Manoel da Silva Junior

Séries Temporais - Exercícios

Realizaremos alguns exercícios sobre sazonalidade e tendência e o plot de algumas séries para melhor averiguação e entendimento da disciplina.

rm(list=ls(all=T))

Questão 1

  • Gere no R um passeio aleatório gaussiano considerando 1000 observações.
e <- rnorm(1000,mean = 0, sd = 1)
x <- cumsum(e)
plot.ts(x, xlab = "Tempo", ylab = "Observações")

Questão 2

  • Considere o processo \(Y_t = 0.8Y_{t−1} + e_t , \quad t = 1,...,30\) suponha que o valor de Yt vinha sendo zero, até que em 1990 que corresponde a terceira observação da série, houve um choque positivo, i.e., \(e_t\) = 20, o que ocorrerá nos anos seguintes admitindo que \(e_t\) = 0 para os demais anos?
y=rep(0,30)
y[3]=20
for(t in 4:30){ y[t]=y[t-1]*0.8}
round(y,4)
 [1]  0.0000  0.0000 20.0000 16.0000 12.8000 10.2400  8.1920  6.5536  5.2429
[10]  4.1943  3.3554  2.6844  2.1475  1.7180  1.3744  1.0995  0.8796  0.7037
[19]  0.5629  0.4504  0.3603  0.2882  0.2306  0.1845  0.1476  0.1181  0.0944
[28]  0.0756  0.0604  0.0484

Questão 3

  • Gere 60 observações do seguinte passeio aleatório \(Y_t = 1+Y_{t−1}+e_t\), em que \(e_t \sim N (0,1).\) Use a função ts do R para transformar os dados em uma série temporal mensal iniciando em janeiro de 2000
rm(list=ls(all=T))
set.seed(2023)
e <- rnorm(60, mean = 0, sd = 1)
x <- cumsum(1+e)
y <- ts(x, start = c(2000,1), frequency = 12)
plot(y, ylab = "Observações", xlab = "Tempo")

Testando se a série é estacionária

forecast::ndiffs(y)
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
[1] 1

Precisamos de tomar uma diferença para que a série seja estacionária

z <- diff(y)
plot.ts(z, xlab = "Tempo", ylab = "Observações")

Questão 4

  • Gere 100 observações não correlacionadas a partir da distribuição N (0,1). Apresente o gráfico da série temporal.
rm(list=ls(all=T))
set.seed(2023)
y <- rnorm(100, mean = 0, sd = 1)
plot.ts(y, xlab = "Tempo", ylab = "Observações")

acf(y, xlab = "Defasagem", ylab = "Autocorrelações")

Questão 5

  • Gere 100 observações \(Y_t\) de acordo com o processo: $ Y_t = Y_{t−1}+e_t , e_t N (0,(0.1)^2) $. Apresente o gráfico da série temporal.
rm(list=ls(all=T))
e <- rnorm(100, mean  = 0, sd = 0.1)
y <- cumsum(e)
plot.ts(y, xlab = "Tempo", ylab = "Observações")

acf(y, main = "", xlab = "Defasagem", ylab = "Autocorrelação")

Questão 6

  • Gere 100 observações \(Y_t\) de acordo com o processo: $ Y_t = 0.7Y_{t−1} +e_t, e_t N (0,1).$
rm(list=ls(all=T))
y <- arima.sim(n = 100, list(ar=0.7))
plot.ts(y, xlab = "Tempo", ylab = "Observações")

Gráfico de correlação

acf(y, main = "", xlab = "Defasagem", ylab = "Autoccorelações")

Questão 7

  • Obter a série taxa de desemprego no pacote BETS, apresentar o plot e descrever a série e verificar se a série apresenta sazonalidade.
rm(list=ls(all=T))
BETS::BETSsearch(description = 'rate')

BETS-package: Found 3 out of 3 time series.
# A tibble: 3 × 7
  code  description                           unit  perio…¹ start last_…² source
  <chr> <chr>                                 <chr> <chr>   <chr> <chr>   <chr> 
1 24369 Unemployment rate - PNADC             %     M       01/0… mar/20… IBGE  
2 4189  Interest rate - Selic accumulated in… % p.… M       31/0… may/20… BCB-D…
3 432   Interest rate - Selic target          % p.… D       05/0… 16/05/… Copom 
# … with abbreviated variable names ¹​periodicity, ²​last_value
taxaDesemprego = BETS::BETSget(24369, data.frame = FALSE)
forecast::autoplot(taxaDesemprego) + ggplot2::labs(x = "Tempo", title = "Série da Taxa de Desemprego", y = "Taxa")

Testando a sazonalidade

seastests::isSeasonal(taxaDesemprego)
[1] TRUE

A série é Sazonal

forecast::ggseasonplot(taxaDesemprego)+
  ggplot2::labs(x = "Meses", y = "Taxa", title = "Gráfico anual da taxa de desemprego 2012 - 2022", legend = "Ano")

De acordo com a análise gráfica, podemos ver que existe sazonalidade na série temporal.

Testando a estacionariedade

Para o teste da estacionariedade vamos utilizar um teste

tseries::adf.test(taxaDesemprego)

    Augmented Dickey-Fuller Test

data:  taxaDesemprego
Dickey-Fuller = -1.578, Lag order = 5, p-value = 0.752
alternative hypothesis: stationary

De acordo com o resultado do teste, em que o p-valor foi de 0.752, não rejeitamos a hipótese nula de que a série é não estacionária, sendo assim precisaremos tomar alguma diferença para tornar a série estacionária.

forecast::ndiffs(taxaDesemprego)
[1] 1
forecast::nsdiffs(taxaDesemprego)
[1] 0

De acordo com o resultado para tornar a série estacionária precisamos de tomar uma diferença. Não precisamos tomar diferença na componente sazonal.

dygraphs::dygraph(taxaDesemprego)

Questão 8

  • O que você pode observar nas séries a seguir?
gridExtra::grid.arrange(plot(expsmooth::bonds, xlab = "Ano", ylab = "Porcentagem por Ano", 
           main = "US 10-year bonds yield"),plot(fma::uselec, xlab = "Ano", ylab = "Billion kwh", 
           main = "US net electricity generation"), plot(expsmooth::ukcars, xlab = "Ano", ylab = "Thousands of cars", 
           main = "UK passenger vehicle production"), plot(expsmooth::visitors, xlab = "Ano", ylab = "Thousands of people", 
           main = "Overseas visitors to Australia"), nrow = 2, ncol = 2)

De acordo com a análise das séries, podemos ver que todas apresentam um certo tipo de tendência.

Questão 9

  • Considere os cinco valores a seguir: 1, 2, 3, 2, 1, os coloque em um objeto do tipo ts e considere como sendo:
  1. Série anual; b) Série quadrimestrais.
rm(list=ls(all=T))
dados <- c(1,2,3,2,1)

Testando se já são dados temporais

is.ts(dados)
[1] FALSE
dados <- as.ts(dados)
dados
Time Series:
Start = 1 
End = 5 
Frequency = 1 
[1] 1 2 3 2 1

Dados anuais - iniciando em 1997

serie <- ts(dados, start = 1997, frequency = 1)
serie
Time Series:
Start = 1997 
End = 2001 
Frequency = 1 
[1] 1 2 3 2 1

Dados quadrimestrais - iniciando no segundo quadrimestre de 1997

serie_quad <- ts(dados, start = c(1997,2), frequency = 4)
serie_quad
     Qtr1 Qtr2 Qtr3 Qtr4
1997         1    2    3
1998    2    1          

Teste de Estacionariedade

  • Simulando algumas séries
rm(list=ls(all=T))
set.seed(2023)
yAR1 <- arima.sim(list(order = c(1,0,0), ar = 0.9), n = 200) # AR(1)
plot.ts(yAR1, ylab = "Observações", xlab = "Tempo")

yAR2 <- arima.sim(list(order = c(2,0,0), ar  = c(1,-0.9)), n = 200) # AR(2)
plot.ts(yAR2, xlab = "Tempo", ylab = "Observações" )

yARIMA <- arima.sim(list(order = c(1,1,1), ar = 0.9, ma = -0.5), n = 200) # arima (1,1,1)
plot.ts(yARIMA, xlab = "Tempo", ylab = "Observação")

forecast::ndiffs(yAR1)
[1] 1

A série de AR(1) é uma série não estacionária, o que também pode ser verificado com o teste de dickson-fuller.

tseries::adf.test(yAR1)

    Augmented Dickey-Fuller Test

data:  yAR1
Dickey-Fuller = -2.3507, Lag order = 5, p-value = 0.4292
alternative hypothesis: stationary

Conforme o resultado do p-valor, que foi de 0.4292 que é maior do que 5%, não rejeitamos \(H_0\), ou seja a série é não estacionária.

forecast::ndiffs(yAR2)
[1] 0

A série de AR(1) é uma série estacionária, o que também pode ser verificado com o teste de dickson-fuller.

tseries::adf.test(yAR2)
Warning in tseries::adf.test(yAR2): p-value smaller than printed p-value

    Augmented Dickey-Fuller Test

data:  yAR2
Dickey-Fuller = -7.5727, Lag order = 5, p-value = 0.01
alternative hypothesis: stationary

Conforme o resultado do p-valor, que foi de 0.01 que é menor do que 5%, rejeitamos \(H_0\), ou seja a série é estacionária.

forecast::ndiffs(yARIMA)
[1] 2

A série de ARIMA(1,1,1) é uma série não estacionária, o que também pode ser verificado com o teste de dickson-fuller.

tseries::adf.test(yARIMA)

    Augmented Dickey-Fuller Test

data:  yARIMA
Dickey-Fuller = -0.63643, Lag order = 5, p-value = 0.9747
alternative hypothesis: stationary

Conforme o resultado do p-valor, que foi de 0.9747 que é maior do que 5%, não rejeitamos \(H_0\), ou seja a série é não estacionária.

Teste de sazonalidade

rm(list=ls(all=T))
set.seed(2023)

Gerando série sem sazonalidade

x1 = 1:96/20 + ts(rnorm(96, 100, 1), start=c(2015,1), frequency=12)
x1
           Jan       Feb       Mar       Apr       May       Jun       Jul
2015  99.96622  99.11706  98.27493 100.01386  99.61651 101.39080  99.43627
2016 101.21204 101.36336 100.14710 101.49838 101.44585 101.35209 101.84674
2017 100.80485  99.45220 100.72117 100.53892 102.96492 104.23524 101.27512
2018 102.35720 103.02922 102.92564 101.87540 102.47834 102.51873 102.58547
2019 102.78538 103.25343 103.21439 101.50912 102.22723 103.88340 104.33483
2020 104.03818 102.81594 101.22773 102.02628 104.29428 103.16707 104.19488
2021 103.56510 102.83349 104.42504 103.71930 103.72441 103.51167 103.96683
2022 104.39137 104.60797 105.34408 103.88219 103.64286 102.57682 103.16086
           Aug       Sep       Oct       Nov       Dec
2015 101.40164 100.05073 100.03188 100.87696 100.18725
2016 101.57222 100.63835 100.80567 102.36857 101.44411
2017 102.87665 100.83902 101.65508 101.11059 101.36164
2018 101.99574 102.55235 102.99436 104.72307 103.47597
2019 105.08086 100.78454 102.49189 103.25101 103.69661
2020 103.02841 104.49758 104.42542 102.07139 102.67737
2021 102.87369 104.26835 105.84304 104.03042 104.68618
2022 105.02867 104.35622 106.98000 103.58549 106.04087
plot.ts(x1)

forecast::ggseasonplot(x1)

seastests::isSeasonal(x1, test = "fried")
[1] FALSE

De acordo com o teste de friedman, tivemos o resultado de que a série não é sazonal

seastests::combined_test(x1, freq = 12)
Test used:  WO 
 
Test statistic:  0 
P-value:  0.1906586 0.6479791 0.8232746

Gerando série sazonal

x2 = 1:96/20 + ts(rnorm(96, 100, 1) + ts(sin((2*pi*rep(1:12, 8))/12),
frequency=12), start=c(2015,1), frequency=12)
x2
           Jan       Feb       Mar       Apr       May       Jun       Jul
2015  99.05492 100.73439 100.32513  99.74185 100.82901 100.19076 100.75552
2016 100.24688 102.95372 102.41989 101.67217 101.61517  98.83890 101.20298
2017 101.27494 102.53411 102.45354 102.61237 101.18164 102.59914 100.35551
2018 102.70305 103.71763 102.63423 104.18156 100.71120 102.73491 101.46951
2019 102.95004 103.92593 103.91618 103.61772 103.03668 102.18614 102.70796
2020 103.93299 103.96768 104.90670 105.65913 105.47326 103.62643 103.36493
2021 104.42924 104.55856 105.22447 104.95997 103.49722 102.06311 102.34346
2022 104.80119 105.17155 106.30582 105.50850 103.93037 105.44675 103.69228
           Aug       Sep       Oct       Nov       Dec
2015 100.50935 100.39308  99.61700  99.32840 100.90054
2016 100.14340  99.04516 102.81322 101.35131 103.07924
2017 100.53003 100.32023 102.08469 101.12930 104.19812
2018 101.71451 101.01986 101.28147 102.53548 100.66163
2019 104.63865 100.67948 102.95854 101.82872 103.92698
2020 103.33398 101.50912 102.98158 102.93323 103.51998
2021 102.64424 105.03736 101.92199 103.11599 105.37238
2022 104.48860 103.77973 103.08248 104.51740 104.47858
plot.ts(x2)

forecast::ggseasonplot(x2)

Visualmente parece não haver sazonalidade, vamos usar o teste para ver o resultado

seastests::isSeasonal(x2, test = "fried")
[1] TRUE

De acordo com o teste de friedman, tivemos o resultado de que a série é sazonal

seastests::combined_test(x2, freq = 12)
Test used:  WO 
 
Test statistic:  1 
P-value:  1 0.01270618 0.000658031

De acordo com o mínimo p-valor, rejeitamos a hipótese nula de que a série não apresenta sazonalidade, chegando assim a conclusão de que a série é sazonal.