Skip to content

dankkom/PIB-SP-Ciclo-de-Negocios

Repository files navigation

Ciclo de Negócios - PIB SP

Binder

Para a execução do código são necessários os pacotes instalados com o seguinte comando: install.packages(c("mFilter", "BCDating", "ggplot2", "ggfortify", "gridExtra", "zoo"))

1. Carregamento de pacotes necessários

library(mFilter)
library(BCDating)
library(ggplot2)
library(ggfortify)
library(gridExtra)
library(zoo)

O pacote zoo é necessário para a conversão de datas de objetos ts.

2. Carregamento os dados

Dados do PIB mensal paulista da Fundação SEADE.

O código abaixo carrega os dados do PIB mensal no arquivo PIBSPDESMENSAL.txt e transforma num objeto ts do R.

PIBSPDESMENSAL <- read.table("PIBSPDESMENSAL.txt", header = 1)
pibspdes.ts <- ts(PIBSPDESMENSAL[,1], start = c(2002, 1), freq = 12)
pibspdes.ts
A Time Series: 18 × 12
JanFebMarAprMayJunJulAugSepOctNovDec
2002 73.33478 73.06779 73.64706 71.76099 70.93057 70.97745 69.59280 69.97219 71.06672 71.05543 68.92039 70.46595
2003 70.25221 69.91517 70.06311 70.19920 70.42013 70.38047 71.24865 71.89990 73.40967 72.77346 72.00712 72.95622
2004 72.99799 74.67012 74.62521 74.61258 75.67317 75.66943 75.87418 76.60303 75.89974 76.03392 77.05789 76.92885
2005 77.58925 77.85808 77.65135 78.17482 78.46795 78.62313 78.94936 78.86570 78.64828 80.32922 80.18617 80.88479
2006 80.74956 80.28435 80.90182 81.09761 80.63397 81.48458 81.74595 81.56003 82.69094 83.25254 83.89853 84.22039
2007 84.80598 83.96821 86.27099 87.28801 87.49391 87.84886 89.03589 89.68530 90.02649 89.50613 90.84226 90.72636
2008 88.66001 92.33906 92.11330 93.19064 94.07928 95.24395 94.17783 96.54803 94.11640 93.53354 88.83879 88.33278
2009 90.14950 88.96092 91.34150 91.45888 92.15164 93.11597 93.56399 94.96909 96.08541 97.84143 96.93722 99.22027
2010 98.66773 99.52808 99.44595 98.74035100.17127 98.90729101.86711100.11137100.89978101.18079101.65303102.72070
2011103.69311103.49000101.83190104.99832103.64968105.39131103.80004104.68971103.27766104.76684104.62375103.97065
2012102.62789104.61862103.81797104.43381104.47445106.18359107.49942105.41123106.18121105.63915106.69299106.12409
2013106.50347107.00528108.48911108.01314108.95287108.50516110.26984110.09879109.66959109.34650106.88631108.79727
2014108.66700111.18375107.20996107.18646105.36554105.26512105.98165105.31337106.57447106.50425105.27362106.09808
2015105.90576104.82888103.57051103.12076102.77488101.02893100.96674100.63923101.15105 99.52379100.43213 99.93101
2016 98.32905100.09144100.13205 99.67750 99.66865 99.79342 98.27034 98.67453 98.07267 98.28473 97.74856 99.34015
2017100.39278 97.88011 99.43144100.00270101.19828101.58511101.61454102.10672101.66481102.44880102.51445101.71462
2018101.36487101.89256102.37728 99.18121103.60518102.47171102.84375102.33969101.81237102.74005103.65017102.84418
2019103.84362102.08969103.76201

3. Aplicação da função de datação de ciclos de negócios

Para obter a datação de ciclo de negócios é aplicada a função BBQ. A função BBQ, do pacote BCDating recebe o objeto de série temporal com valores transformados em logaritmo e multiplicado por 100, retornando um objeto com as datas de início e fim dos ciclos. O objeto retornado é atribuído à variável dc.

Para plotar os dados com o ggplot2 é conveniente que estejam no formato de dataframe. Por isso constrói-se um dataframe atribuindo-o à variável business.cycle.

dc <- BBQ(
    log(pibspdes.ts)*100,
    name="Dating Business Cycles of LOG PIBSP DESSAZONALIZADO")

a <- c(as.Date(dc@y)[1], as.Date(dc@y)[dc@peaks])
b <- as.Date(dc@y)[dc@troughs]
business.cycle <- data.frame(Topo=a, Vale=b)
business.cycle
A data.frame: 16 × 2
TopoVale
<date><date>
2002-01-012002-11-01
2003-09-012003-11-01
2004-02-012004-04-01
2005-07-012005-09-01
2005-12-012006-02-01
2007-11-012008-01-01
2008-08-012008-12-01
2010-02-012010-04-01
2011-01-012011-03-01
2011-06-012012-01-01
2013-07-012013-11-01
2014-02-012014-06-01
2014-09-012014-11-01
2015-09-012016-01-01
2016-03-012016-11-01
2017-11-012018-04-01

4. Aplicação o Filtro HP

Para obter os componentes Trend e Cycle do PIB paulista utiliza-se a função hpfilter, que recebe como argumento a série temporal do PIB.

Semelhante ao caso anterior, é conveniente que os dados estejam na forma de dataframe, nesse caso atribuído à variável pibspdes.ts.

pibsphp <- hpfilter(pibspdes.ts, freq = 14400, type = c("lambda"), drift = FALSE)
a <- cbind(pibsphp$x, pibsphp$trend, pibsphp$cycle)
pibspdes.ts <- data.frame(as.matrix(a), as.Date(as.yearmon(time(a))))
colnames(pibspdes.ts) <- c("PIB", "Trend", "Cycle", "Date")
pibspdes.ts
A data.frame: 207 × 4
PIBTrendCycleDate
<dbl><dbl><dbl><date>
73.3347870.05551 3.279265542002-01-01
73.0677970.15481 2.912973732002-02-01
73.6470670.25435 3.392709432002-03-01
71.7609970.35454 1.406458482002-04-01
70.9305770.45605 0.474517342002-05-01
70.9774570.55965 0.417802252002-06-01
69.5928070.66613-1.073335312002-07-01
69.9721970.77632-0.804131852002-08-01
71.0667270.89097 0.175744402002-09-01
71.0554371.01078 0.044654332002-10-01
68.9203971.13644-2.216053462002-11-01
70.4659571.26868-0.802723062002-12-01
70.2522171.40804-1.155829812003-01-01
69.9151771.55503-1.639861642003-02-01
70.0631171.71007-1.646960142003-03-01
70.1992071.87346-1.674261842003-04-01
70.4201372.04540-1.625270562003-05-01
70.3804772.22596-1.845491412003-06-01
71.2486572.41511-1.166455222003-07-01
71.8999072.61268-0.712773782003-08-01
73.4096772.81842 0.591254082003-09-01
72.7734673.03204-0.258576092003-10-01
72.0071273.25328-1.246160432003-11-01
72.9562273.48187-0.525652862003-12-01
72.9979973.71746-0.719463592004-01-01
74.6701273.95964 0.710482862004-02-01
74.6252174.20797 0.417244152004-03-01
74.6125874.46205 0.150525862004-04-01
75.6731774.72152 0.951647622004-05-01
75.6694374.98602 0.683412862004-06-01
............
98.28473100.4987-2.213947792016-10-01
97.74856100.4694-2.720829942016-11-01
99.34015100.4547-1.114584492016-12-01
100.39278100.4541-0.061274852017-01-01
97.88011100.4666-2.586506472017-02-01
99.43144100.4917-1.060218542017-03-01
100.00270100.5283-0.525581452017-04-01
101.19828100.5755 0.622810802017-05-01
101.58511100.6322 0.952908192017-06-01
101.61454100.6975 0.917065322017-07-01
102.10672100.7704 1.336331922017-08-01
101.66481100.8501 0.814752222017-09-01
102.44880100.9357 1.513078662017-10-01
102.51445101.0267 1.487770302017-11-01
101.71462101.1223 0.592303732017-12-01
101.36487101.2221 0.142730222018-01-01
101.89256101.3257 0.566886692018-02-01
102.37728101.4325 0.944796782018-03-01
99.18121101.5421-2.360937152018-04-01
103.60518101.6543 1.950861392018-05-01
102.47171101.7685 0.703223062018-06-01
102.84375101.8843 0.959468762018-07-01
102.33969102.0014 0.338321282018-08-01
101.81237102.1195-0.307133222018-09-01
102.74005102.2384 0.501605622018-10-01
103.65017102.3579 1.292247802018-11-01
102.84418102.4777 0.366449262018-12-01
103.84362102.5977 1.245891732019-01-01
102.08969102.7178-0.628126022019-02-01
103.76201102.8380 0.924052462019-03-01

5. Plotando os dados

Para plotar os dados utiliza-se o pacote ggplot2. Abaixo são salvas algumas variáveis que serão usadas nas configurações dos gráficos.

plot.limits <- as.Date(c("2010-12-31", "2019-03-02"))
plot.date_breaks <- "3 month"
plot.date_minor_breaks <- "1 month"
xscale.date.size <- 6

Para plotar o gráfico usa-se a função ggplot com a série temporal pibspdes.ts e a coluna Date como o eixo x.

Para que os dados apareçam no gráfico adiciona-se (+) à saída da função ggplot os chamados 'geomas', dizendo como devem ser apresentados os dados.

g1 <- ggplot(pibspdes.ts, aes(x = Date)) +
    geom_line(aes(y = PIB), color = "black") +
    geom_line(aes(y = Trend), color = "red") + 
    ylim(95, 115) +
    geom_rect(
        data = business.cycle,
        inherit.aes = FALSE,
        aes(xmin = Topo, xmax = Vale, ymin = -Inf, ymax = Inf),
        alpha = 0.2) +
    theme_bw() +
    scale_x_date(
        date_labels = "%Y-%m",
        date_breaks = plot.date_breaks,
        date_minor_breaks = plot.date_minor_breaks,
        limits = plot.limits) +
    ylab("PIB SP dessazonalizado") +
    ggtitle("PIB SP e Ciclo de Negocios") +
    theme(
        axis.title.x = element_blank(),
        axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        plot.title = element_text(lineheight = .8, face = "bold"))
g1
Warning message:
"Removed 108 rows containing missing values (geom_path)."Warning message:
"Removed 108 rows containing missing values (geom_path)."Warning message:
"Removed 8 rows containing missing values (geom_rect)."

png

g2 <- ggplot(pibspdes.ts, aes(x = Date, y = Cycle)) +
    geom_col() +
    geom_rect(
        data = business.cycle,
        inherit.aes=FALSE,
        aes(xmin = Topo, xmax = Vale, ymin = -Inf, ymax = Inf),
        alpha = 0.2) +
    theme_bw() +
    scale_x_date(
        date_labels = "%Y-%m",
        date_breaks = plot.date_breaks,
        date_minor_breaks = plot.date_minor_breaks,
        limits = plot.limits) +
    ylab("Filtro HP - Ciclo") +
    theme(
        axis.text.x = element_text(
            angle = 90, 
            vjust = 0.25, 
            size = xscale.date.size))
g2
Warning message:
"Removed 108 rows containing missing values (position_stack)."Warning message:
"Removed 2 rows containing missing values (geom_col)."Warning message:
"Removed 8 rows containing missing values (geom_rect)."

png

Para que os gráficos fiquem numa única figura usa-se a função grid.arrange.

g <- grid.arrange(g1, g2, ncol = 1, heights = c(2, 1))
g
Warning message:
"Removed 108 rows containing missing values (geom_path)."Warning message:
"Removed 108 rows containing missing values (geom_path)."Warning message:
"Removed 8 rows containing missing values (geom_rect)."Warning message:
"Removed 108 rows containing missing values (position_stack)."Warning message:
"Removed 2 rows containing missing values (geom_col)."Warning message:
"Removed 8 rows containing missing values (geom_rect)."


TableGrob (2 x 1) "arrange": 2 grobs
  z     cells    name           grob
1 1 (1-1,1-1) arrange gtable[layout]
2 2 (2-2,1-1) arrange gtable[layout]

png

ggsave(file = "plot.png", plot = g, width = 18, height = 9, dpi = 300)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published