Introdução à Penn World Table em R

 

 


1 Introdução


Este trabalho tem como objetivo introduzir a Penn World Table para alunos de graduação dos cursos de ciências econômicas. Esse material consiste em aplicações simples sobre tópicos em macroeconomia e crescimento econômico. Como exemplos: visualizações de variáveis importantes como o PIB per capita, capital físico por trabalhador, taxa de poupança e comparações entre países por meio de tabelas com estatísticas interessantes para a análise macroeconômica. Também trazemos uma seção sobre estimações da produtividade, tecnologia e eficiência relativas, entre outras coisas. Desta forma, este material também serve como complemento à cursos de macroeconomia e crescimento econômico. O livro-texto que fundamenta as aplicações é o Weil (2013).


1.1 A Penn World Table


A Penn World Table (PWT) é um conjunto de dados nacionais desenvolvidos e mantidos por acadêmicos da Universidade da Califórnia, de Davis e do Gröningen Growth Development Centre da Universidade de Gröningen. A finalidade da Tabela é fornecer dados para a mensuração do PIB real entre os países ao longo do tempo.


1.1.1 Acessando a PWT


Para baixar a PWT, acesse: https://www.rug.nl/ggdc/productivity/pwt/. No site temos a opção de baixar a versão 10.01 da PWT nos formatos Excel e Stata, ou acessá-la online.

Iremos utilizar a versão em excel que pode ser baixa diretamente clicando aqui.


1.1.2 Entendendo a PWT


Nesta seção, vamos entender os principais elementos da PWT. Para uma análise mais detalhada, sugere-se uma consulta a Feenstra et al. (2015).

A variável central da Tabela é o PIB real. Como você já deve ter estudado em cursos anteriores, o PIB real é medido como PIB nominal avaliado a preços constantes. Para o caso de comparação entre países, importa que os preços sejam constantes em cada país de análise.

A PWT traz o PIB real em duas diferentes óticas: o PIB real pela ótica do dispêndio e o PIB real pela ótica da produção. O primeiro é calculado como o PIB nominal deflacionado pelo nível de preço relativo à absorção doméstica. O segundo é calculado como o PIB nominal deflacionado por um nível de preços que reflete a qualidade dos bens transacionados entre os países.

Na tabela abaixo, estão resumidas as variáveis utilizadas neste material. A tabela foi baseada nas tabelas de Feenstra et al. (2015). O PIB real sob a ótica do dispêndio e do produto são muito úteis para a comparação do padrão de vida e capacidade produtiva entre países no tempo e no espaço. O estoque de capitais \(RN^{NA}\) e a formação bruta de capital físico como proporção do PIB serão muito úteis no modelo de Solow para mensurar produtividade e eficiência. A medida \(HC\) de capital humano pode ser utilizada como medida do estoque de capital humano. Por fim, as variáveis \(EMP\) e \(POP\) serão muito importantes para cálculo das variáveis em termos per capita e por trabalhador.

Sigla Variável Unidade Útil para comparar
\(RGDP^e\) PIB real sob a ótica do produto usando preços para bens finais que são constantes entre os países e ao longo do tempo Milhões de US$ (2017) Padrão de vida entre países e anos
\(RGDP^o\) PIB real sob a ótica do produto usando preços para bens finais exportados e importados que são constantes entre os países e ao longo do tempo Milhões de US$ (2017) Capacidade produtiva entre países e entre anos
\(RN^{NA}\) Estoque de capital sob preços constantes, baseado em investimento e preços de estrutura e equipamento Milhões de US$ (2017) Crescimento do estoque de capital no tempo e entre os países
\(CSH\_i\) Parcela da formação bruta de capital físico sob preços em paridade de poder de compra correntes Porcentagem % Pode ser usado para representar a taxa de poupança de um país
\(HC\) Índice de capital humano baseado nos anos médios de escolaridade calculadas em Barro and Lee (2012) Número puro Medir estoque de capital humano
\(EMP\) Nível de emprego Milhões de pessoas Medir força de trabalho
\(POP\) Tamanho da população Milhões de pessoas Mensuração da população


1.2 A linguagem de programação R


A análise dos dados e suas aplicações serão feitas na linguagem de programação R. R é uma linguagem versátil amplamente utilizada para análise estatística dentre outras coisas e possui uma grande comunidade de colaboradores mundo a fora. Para instalação do R e de sua IDE mais famosa RStudio, esta página pode ser consultada. Há numerosos materiais introdutórios ao R na internet, esta página é uma opção em português.

O material utilizará o pacote tidyverse para análise de dados. Tidyverse é na verdade uma reunião de importantes pacotes para ciência de dados. Pode ser entendido como um dialeto do R. Este material oferece noções básicas das principais ferramentais da ciência de dados como visualização, importação de dados (wrangle), transformação, programação e modelagem. Para se aprofundar em ciência de dados em R, recomendo fortemente este excelente material.

Como o objetivo é introduzir a Penn World Table, não é objetivo deste material fazer uma introdução abrangente à linguagem de programação R. Se você não possui algum conhecimento prévio na linguagem, recomendo fortemente que estude um material específico para esse fim. Contudo, todos os códigos utilizados neste trabalho serão explicados, de forma que seja perfeitamente compreensível para pessoas sem experiência com programação.


2 Estatísticas descritivas


A Penn World Table possui informações ricas sobre diferentes aspectos do desenvolvimento dos países. Neste capítulo, vamos aprender a manipular e visualizar algumas informações interessantes. Parte da motivação são gráficos do Weil (2013), o livro-texto referência deste material. O objetivo das estatísticas não é a reprodução exata dos gráficos e tabelas do livro-texto, até porque estamos utilizando dados mais recentes.


2.1 Rankings


Rankings são uma excelente forma de visualização de dados, pois nos permite visualizar quais observações são mais importantes relativas à determinadas características.

A tabela 1.1 do Weil (2013) traz um ranking dos países de acordo com três medidas distintas: os mais populosos, as maiores economias e os países de alto nível de renda per capita.

Vamos reproduzir essa tabela utilizando o ano mais recente da base (2019) como referência. O primeiro passo é identificar o país mais populoso. Para determinar o pais mais populoso precisamos de estimativas populacionais. Essa variável tem o nome de pop na PWT e está expressa em milhões de habitantes. Queremos identificar os 10 mais populosos em 2019, então vamos ao código:


library(tidyverse)
library(readxl)
theme_set(theme_bw())

pwt <- read_xlsx('Data/pwt1001.xlsx', sheet = 3)

pop_ranking <- pwt %>%
  filter(year == 2019) %>%
  select(country, pop) %>%
  arrange(desc(pop))

pop_ranking$pop <- round(pop_ranking$pop, digits = 1)

pop_ranking
## # A tibble: 183 × 2
##    country              pop
##    <chr>              <dbl>
##  1 China              1434.
##  2 India              1366.
##  3 United States       329.
##  4 Indonesia           271.
##  5 Pakistan            217.
##  6 Brazil              211 
##  7 Nigeria             201 
##  8 Bangladesh          163 
##  9 Russian Federation  146.
## 10 Mexico              128.
## # ℹ 173 more rows


Como você vê acima há duas caixas, a de cima, estarão expressos os códigos e na de baixo estarão os resultados do código. Esse padrão será igual em todos os códigos adiante. Então vou me referir a partir de agora à caixa de código ou à caixa de resultado.


Caixa de código


Nas primeiras linhas, carregamos os pacotes utilizados. Pacotes no R são um compêndio de funções com um determinado objetivo. O pacote tidyverse reune várias ferramentas para análise de dados, sendo considerado um dialeto dentro do R. O pacote readxl será utilizado para ler arquivos no formato excel. theme_set(theme_bw()) estabelece como tema padrão para os gráficos o tema branco.

Na sequência, os dados da PWT são lidos pela função read_xlsx e atribuídos ao objeto pwt. O primeiro campo é o caminho dos dados e o segundo qual a aba da planilha que deve ser lida, no caso a terceira. (Em R para criarmos um objeto, o atribuímos à um nome de escolha utilizando o operador <- ou o operador =).

Então seguimos para o primeiro objetivo: calcular os países mais populosos. Para isso, criamos um objeto pop_ranking com toda a pwt. E, nas linhas seguintes, vamos fazendo alterações nesse objeto usando o operador pipe %>% (ou |>). As operações são

  • filtrar a pwt para o ano de 2019 utiilzando a função filter;

  • selecionar apenas as informações de países e de população utilizando a função select e;

  • rearranjar os dados na ordem decrescente utilizando as funções arrange e opção desc.

As funções filter, select e arrange são funções básicas da manipulação de dados do pacote dplyr que compõe o tidyverse.

Nas últimas linhas arredondamos a população para 1 dígito e “printamos” o resultado.


Caixa de resultado


Vemos que o país mais populoso é a China com uma população de 1433.8 milhões de habitantes, seguido por India e United States.

Note que essa é uma saída padrão do R. Ela está informando que os dados tem formato tibble e com 183 linhas por 2 colunas. As colunas são “country” e “pop”. Logo abaixo tem <chr> e <dbl>, indicando o formato das observações da tabela. Ela diz que “country” é um carater/texto (character) e “pop” é um númerico de ponto flutuante (double). No final da caixa, é informado que há 173 linhas a mais que estão omitidas por espaço.




A próxima medida do ranking é sobre o tamanho da economia, isto é, os países com os maiores PIB totais. Para medir PIB utilizaremos a medida de PIB pela ótica do produto rgdpo. Os passos para obter o ranking são análogos ao anterior. O único passo adicional foi dividir por 1 milhão e arredondar para dois dígitos:


rgdpo_ranking <-  pwt %>%
  filter(year == 2019) %>%
  select(country, rgdpo) %>%
  arrange(desc(rgdpo))

rgdpo_ranking$rgdpo <- round(rgdpo_ranking$rgdpo/1e+06, digits = 2)

rgdpo_ranking
## # A tibble: 183 × 2
##    country            rgdpo
##    <chr>              <dbl>
##  1 United States      20.6 
##  2 China              20.3 
##  3 India               9.17
##  4 Japan               5.04
##  5 Germany             4.28
##  6 Russian Federation  4.16
##  7 Indonesia           3.14
##  8 Brazil              3.08
##  9 United Kingdom      2.99
## 10 France              2.95
## # ℹ 173 more rows


A última variável do ranking é o PIB per capita. Neste caso, precisamos dividir o PIB total pelo número de habitantes do país. Então teremos um passo adicional ao anterior, que é criar essa variável.


rgdpo_pc_ranking <- pwt %>%
  filter(year == 2019) %>%
  mutate(
    rgdpo_pc = rgdpo/pop
  ) %>%
  select(country, rgdpo_pc) %>%
  arrange(desc(rgdpo_pc))
  

rgdpo_pc_ranking$rgdpo_pc <- round(rgdpo_pc_ranking$rgdpo_pc/1000, 2)

rgdpo_pc_ranking
## # A tibble: 183 × 2
##    country              rgdpo_pc
##    <chr>                   <dbl>
##  1 Qatar                   114. 
##  2 Ireland                 103. 
##  3 China, Macao SAR         93.5
##  4 Luxembourg               90.5
##  5 Singapore                82.3
##  6 Switzerland              75.3
##  7 Norway                   73.7
##  8 Brunei Darussalam        73.2
##  9 United Arab Emirates     66.1
## 10 United States            62.6
## # ℹ 173 more rows


Caixa de código


A função mutate é importante função utilizada para criar ou alterar variáveis dentro de um banco de dados. A variável PIB per capita rgdpo_pc é criada como a razão entre “rgdpo” e “pop”. Novamente foi feita uma normalização nos valores, dividindo por 1000 e arredondando para duas casas decimais.


Podemos deixar as informações em uma mesma tabela, semelhante à tabela do Weil.


ranking <- cbind(pop_ranking, rgdpo_ranking, rgdpo_pc_ranking)

names(ranking) <- c('Country', 'Population', 'Country', 'Real GDP', 'Country', 'Real per capita GDP')

knitr::kable(cbind(ranking[1:11,]))
Country Population Country Real GDP Country Real per capita GDP
China 1433.8 United States 20.60 Qatar 114.10
India 1366.4 China 20.26 Ireland 102.62
United States 329.1 India 9.17 China, Macao SAR 93.49
Indonesia 270.6 Japan 5.04 Luxembourg 90.48
Pakistan 216.6 Germany 4.28 Singapore 82.34
Brazil 211.0 Russian Federation 4.16 Switzerland 75.30
Nigeria 201.0 Indonesia 3.14 Norway 73.67
Bangladesh 163.0 Brazil 3.08 Brunei Darussalam 73.25
Russian Federation 145.9 United Kingdom 2.99 United Arab Emirates 66.11
Mexico 127.6 France 2.95 United States 62.59
Japan 126.9 Italy 2.47 Kuwait 62.05


2.2 Séries históricas


A PWT possui dados desde 1950 para boa parte dos países. Isto nos permite observar a evolução histórica de variáveis importantes como o PIB, a população e o emprego. Nesta seção vamos gerar gráficos de algumas dessas séries históricas utilizando a Tabela.


2.2.1 PIB per capita


Inicialmente, precisamos calcular o PIB per capita visto que esta não é uma variável pronta na Tabela. Mas já fizemos isso na seção anterior dividindo o PIB pela população. Para gerar a série histórica, podemos então filtrar os dados para o país desejado e gerar um gráfico de linha:


pwt %>%
  filter(country == 'Brazil') %>%
  ggplot(aes(y = rgdpo/pop, x = year))+
  geom_line() + 
  labs(
    title = 'PIB per capita do Brasil',
    x = 'Ano',
    y = 'PIBpc'
    )


Caixa de código


Em filter, filtramos os dados para o Brasil. As linhas seguintes são responsáveis por gerar o gráfico e terão uma estrutura parecida em todos os gráficos que geraremos daqui em diante.

A função ggplot é a função geradora de gráficos do pacote ggplot2. Ela indica o início do gráfico e recebe como argumento o aes. Neste são indicadas as variáveis que estarão nos elementos do gráfico como os eixos, no caso. Em seguida é preciso adicionar uma camada indicando o que fazer com esses elementos de aes. A função geom_line cria um gráfico de linha com os elementos. Por fim, em labs, estão sendo adicionados ou alterados alguns elementos textuais (labels), como o título e nome dos eixos. Note que cada camada adicionada ao gráfico utiliza o operador +.


Caixa de resultado


Vemos na caixa de resultado o gráfico do PIB per capita do Brasil de 1950 à 2019 como desejado. Vemos que há uma clara tendência de crescimento com ciclos econômicos mais ou menos intensos.




Quando estudamos séries históricas e, em especial o PIB, é interessante pensarmos na escala do gráfico. No gráfico acima, dizemos que o gráfico está em nível ou em escala linear. Ele representa o nível da variável em cada período do tempo.

Uma outra escala é a ratio scale em que a variável é expressa em logarítmo natural. O gráfico representa o logarítmo do nível da variável em cada período do tempo. Essa representação tem a vantagem de que a taxa de crescimento entre dois períodos é facilmente aproximada pela diferença entre os valores de cada período. Além disso, a inclinação do gráfico é aproximadamente a taxa de crescimento naquele período.

Para alterarmos a escala para a ratio scale, podemos simplesmente “tirar o log” do eixo y acima:


pwt %>%
  filter(country == 'Brazil') %>%
  ggplot(aes(y = log(rgdpo/pop), x = year))+
  geom_line() + 
  labs(
    title = 'PIB per capita do Brasil em ratio scale',
    x = 'Ano',
    y = 'log(PIBpc)'
    )


Caixa de resultado


Em comparação ao gráfico anterior, vemos que este é mais suave – os picos e vales são menos acentuados. Como ilustração do cálculo da taxa de crescimento, vamos pegar dois períodos visualmente fáceis de enxergar no gráfico. Considere o ano de 1970 com valor aproximado de 8.25 e o ano de 1990, com valor aproximado de 8.75. A taxa de crescimento entre esses dois anos é simplesmente 8.75-8.25 = 0.5, isto é, de 50%. Essa comparação pode ser feita para quaisquer dois pontos no gráfico.




Para encerrar com o PIB per capita, vamos utilizar os mesmos gráficos e adicionar um elemento comparativo. Considerando que o Brasil pertence ao BRICS, pode ser interessante observar essa mesma evolução para todos os países participantes. (Naturalmente, o mesmo poderia ser feito para qualquer bloco econômico ou conjunto de países de interesse).


brics <- c('Brazil', 'Russian Federation', 'India', 'China', 'South Africa')

pwt %>%
  filter(country %in% brics) %>%
  ggplot(aes(y = log(rgdpo/pop), x = year, color = country))+
  geom_line() + 
  labs(
    title = 'PIB per capita do Brasil',
    x = 'Ano',
    y = 'PIBpc',
    color = 'País'
    )
## Warning: Removed 42 rows containing missing values (`geom_line()`).


Caixa de código


Note que para gerarmos o gráfico, modificamos duas coisas. Primeiramente, modificamos filter para filtrar os dados para os países dos BRICS, definidos na primeira linha. No R, utilizamos o operador %in% para indicar pertencimento de conjuntos.

A segunda modificação foi adicionar um outro elemento em aes, o color. Este elemento indica que as cores do gráfico serão definidas por country, no caso, os países participantes dos BRICS.


Caixa de resultado


Note que é gerado um warning alertando que 42 linhas foram removidas. Trata-se dos dados da Rússia que começam a estar disponíveis apenas em 1990, com o fim da URSS.

Modificando o eixo y do gráfico, podemos gerar qualquer série histórica da PWT.


2.3 Dispersão e correlação


Uma importante estatística no estudo das relações econômicas é a correlação. A correlação é uma medida linear do quão relacionada duas variáveis estão entre si. Uma forma de visualizar a correlação é por meio de um gráfico de dispersão.


2.3.1 Capital por trabalhador e produto por trabalhador


No modelo de Solow, conforme estudado no capítulo 3 do Weil, é usual supor uma função de produção da seguinte forma \[Y = F(K,L)\] em que \(Y\) é a produção, \(K\) é o estoque de capital físico e \(L\) a força de trabalho.

Sob a hipótese de retornos constantes de escala, podemos escrever a função de produção em termos por trabalhador: \[\begin{eqnarray} \frac{Y}{L} &=& F\left(\frac{K}{L},\frac{L}{L}\right) \\ &=& F\left(\frac{K}{L}, 1\right) \\ &=& f\left(\frac{K}{L}\right) \end{eqnarray}\]

E, sob as hipóteses de produtividades marginais positivas em \(K\) e \(L\), temos que \(y = f(k)\) é crescente em \(k\). Em que as letras minúsculas representam as variáveis em termos por trabalhador. Em outras palavras, espera-se uma relação positiva entre o produto por trabalhador e o capital por trabalhador.

Vamos checar se esse é o caso, criando um gráfico de dispersão em que o produto por trabalhador \(y\) esteja no eixo horizontal e o estoque de capital por trabalhador \(k\) esteja no eixo vertical.

Para calcular as variáveis em termos por trabalhador iremos dividir as variáveis de capital e produto por emp, a força de trabalho. A variável que mede o produto é a já conhecida rgdpo e a variável que mede o estoque de capital é a rnna.


pwt %>%
  filter(year == 2005) %>%
  mutate(
    y = rgdpo/emp,
    k = rnna/emp
  ) %>%
  ggplot(aes(y = k, x = y)) +
  geom_point() + 
  geom_smooth(method = 'lm') +
  labs(
    title = 'Relação entre capital por trabalhador e produto por trabalhador',
    y = 'k',
    x = 'y'
  )
## `geom_smooth()` using formula = 'y ~ x'


Caixa de código


Os elementos novos no gráfico acima são as funções geom_point e geom_smooth. A primeira adiciona uma camada ao gráfico com os pontos das variáveis definidas nos eixos. A segunda adiciona uma camada com uma reta cuja inclinação é a correlação entre as variáveis.


Caixa de resultado


Vemos que a relação é, como hipotetizada, positiva. Países com maior nível de capital por trabalhador são em geral os países com o maior nível de produto per capita.


2.3.2 Produto real e produto predito


Considerando o modelo de Solow sem crescimento populacional e sem crescimento tecnológico, o produto por trabalhador de estado estacionário (steady-state) no país \(i\) pode ser calculado como (Weil capítulo 3): \[y_i^{ss} = A^{1/(1-\alpha)}\left(\frac{\gamma_i}{\delta}\right)^{\alpha/(1-\alpha)}\] em que \(A\) é o nível da tecnologia, \(\alpha\) é o share do capital, \(\gamma\) é a proporção da renda que é poupada e \(\delta\) o nível de depreciação.

Supondo que \(A\), \(\alpha\) e \(\delta\) são iguais para todos os países, podemos escrever a mesma relação para um país \(j\): \[y_j^{ss} = A^{1/(1-\alpha)}\left(\frac{\gamma_j}{\delta}\right)^{\alpha/(1-\alpha)}\]

Note que a única variável que diferencia o produto em \(i\) e em \(j\) é a taxa de poupança \(\gamma\).

Divindo uma equação pela outra, podemos comparar o produto de steady-state entre os dois países da seguinte forma: \[\frac{y_i^{ss}}{y_j^{ss}} = \left(\frac{\gamma_i}{\gamma_j}\right)^{\alpha/(1-\alpha)}\]

Deste modo, podemos calcular a razão entre o produto por trabalhador de dois países previsto pelo modelo de Solow e comparar com a razão real entre o produto por trabalhador desses dois países segundos os dados da PWT, testando assim se o modelo tem um bom poder de explicação dos dados.

Para fins de comparação, vamos fixar os Estados Unidos como país \(j\). Desta forma todos os demais serão relativos aos EUA.

O código abaixo calcula as razões preditas e reais e gerar o gráfico de dispersão. As primeiras linhas faz operações que já sabemos: filtra os dados para o ano mais recente da base e cria a variável produto por trabalhador.


Caixa de código


As três linhas seguintes, cria os elementos fixos do cálculo que são a taxa de poupança americana medida pela variável csh_i da PWT e o PIB por trabalhador dos EUA. Conforme o capítulo 3 do Weil, consideraremos o share do capital como 1/3.

Por fim geramos o gráfico de dispersão da mesma forma que geramos anteriormente. Apenas é feito um passo adicional que é de fato calcular as razões predita e real em mutate.


# Preparando os dados
pwt2019 <- pwt %>%
  filter(year == 2019) %>%
  mutate(
    y = rgdpo/emp
  )

# Identificando os elementos fixos
csh_eua <- pwt2019$csh_i[which(pwt2019$country=='United States')]
y_eua <- pwt2019$y[which(pwt2019$country=='United States')]
alpha <- 1/3

# Gerando o gráfico
pwt2019 %>%
  mutate(
    y_ratio_predic = (csh_i/csh_eua)^(alpha/(1-alpha)),
    y_ratio_real = y/y_eua
  ) %>% 
  ggplot(aes(y = y_ratio_real, x = y_ratio_predic)) +
  geom_point() +
  labs(
    title = 'PIB por trabalhador real x Predito',
    x = 'PIB por trabalhador relativo aos EUA predito',
    y = 'PIB por trabalhador relativo aos EUA real'
  )


Caixa de resultado


Como vemos pela figura, a previsão pelo modelo de Solow não é boa. Para ser uma boa previsão, era esperada uma relação próxima de uma reta de 45º graus partindo da origem. Pois nesta situação o previsto e o real estariam aproximadamente iguais. O que claramente não é o caso.

Foge do escopo deste trabalho explicar o motivo da previsão falhar. Contudo, algumas pista podem ser

  • as hipóteses de \(A\), \(\alpha\) e/ou \(\delta\) iguais para todos os países serem pouco realistas.

  • a hipótese de ausência de crescimento populacional e tecnológico ser ruim.

  • entre outras coisas


2.4 Distribuição


Muitas vezes queremos avaliar como uma variável se distribui. Isto é, qual o padrão que as observações dessa variável possui. Uma importante ferramenta para isso são os percentis. Os percentis dividem as observações em partes iguais, e nos permitem dizer qual o valor de corte de cada parte. Por exemplo, se utilizarmos os quartis, estamos dividindo em quatro percentis, em teremos os valores de corte de 25%, 50% e 75% da distribuição.


2.4.1 Taxa de poupança


No modelo de Solow, a taxa de poupança é muito importante para determinar o nível de investimento, e consequentemente, o nível do capital e do produto no estado estacionário. Vamos confirmar se os países com maiores rendas per capita são os de maiores taxa de poupanças.


# Calculamos os decis
decis <- quantile(pwt2019$y, na.rm=T, probs = seq(0, 1, by = 0.1))

poup_table <- pwt2019 %>%
  mutate(
    y_decil = case_when(
      y <= decis[2] ~ 1,
      y > decis[2] & y <= decis[3] ~ 2,
      y > decis[3] & y <= decis[4] ~ 3,
      y > decis[4] & y <= decis[5] ~ 4,
      y > decis[5] & y <= decis[6] ~ 5,
      y > decis[6] & y <= decis[7] ~ 6,
      y > decis[7] & y <= decis[8] ~ 7,
      y > decis[8] & y <= decis[9] ~ 8,
      y > decis[9] & y <= decis[10] ~ 9,
      y > decis[10] ~ 10
    )
  ) %>%
  group_by(y_decil)%>%
  summarise(
    gamma = mean(csh_i)
  )
  

poup_table %>%
  ggplot(aes(x = y_decil, y = gamma)) +
  geom_bar(stat = 'identity') + 
  labs(
    title = 'Taxa de poupança por decis de renda per capita',
    y = 'taxa de poupança',
    x = 'decis da renda per capita'
  )
## Warning: Removed 1 rows containing missing values (`position_stack()`).


Caixa de código


Na primeira linha do código acima, utilizamos a função quantile pra criar um vetor de decis para a renda por trabalhador y. Em seguida, criamos uma nova variável y_decil para indicar em qual decil da renda por trabalhador o país se enquadra, indo, portanto, de 1 a 10. Na sequência, agrupamos os dados por essa variável criada, utilizando a importante função group_by. Então utilizamos summarise para “resumir” os dados fazendo a média da taxa de poupança dos países csh_i. Note que isso funciona porque os dados estão agrupados, por isso a média calculada só inclui países dentro de cada grupo.

O último bloco gera o gráfico de barras com a função geom_bar. A única observação adicional é o argumento stat='identity'. Isso é necessário porque por padrão o ggplot faz gráficos de barras com frequências e não pontos. Um detalhe menos importante por agora.


Caixa de resultado


Notamos que, na média, países com maior renda por trabalhador possuem maiores taxas de poupança. Contudo, isso não é uma regra, visto que há oscilações e que outros fatores além da taxa de poupança explicam renda por trabalhador.


3 Estimações


3.1 Contabilidade do desenvolvimento


Contabilidade do desenvolvimento consiste em explicar diferenças no nível de renda dos países decompondo-as em uma parte explicada por diferenças na produtividade e uma parte explicada por diferenças nos fatores de produção.

Supondo funções Cobb-Douglas, conforme Weil (2013) capítulo 7, podemos encontrar a produtividade relativa entre dois países pela fórmula: \[\frac{A_1}{A_2} = \frac{\left(\frac{y_1}{y_2}\right)}{\left(\frac{k^\alpha_1h^{1-\alpha}_1}{k^\alpha_2h^{1-\alpha}_2}\right)}\] em que \(A_i\) é a produtividade do pais \(i\), \(y_i\) é o produto por trabalhador do país \(i\), \(k_i\) é o capital físico por trabalhador do país \(i\), \(h_i\) é o capital humano por trabalhador do país \(i\) e \(\alpha\) é o share do capital físico.

Mantendo um país fixo no denominador, podemos calcular diferenças na produtividade dos demais relativos à ele. Considerando o papel de liderança econômica dos EUA no cenário internacional, vamos calcular a produtividade relativa à ele.


pwt2019 <- pwt %>%
  filter(year == 2019) %>%
  mutate(
    y = rgdpo/emp,
    k = rnna/emp
  )

y_eua <- pwt2019$y[which(pwt2019$country=='United States')]
k_eua <- pwt2019$k[which(pwt2019$country=='United States')]
h_eua <- pwt2019$hc[which(pwt2019$country=='United States')]

alpha <- 1/3

prod_ranking <- pwt2019 %>%
  mutate(
    y_rel = y/y_eua,
    k_rel = k/k_eua,
    h_rel = hc/h_eua,
    A_rel = y_rel/(k_rel^alpha*h_rel^(1-alpha))
  ) %>%
  select(country, y_rel:A_rel) %>%
  arrange(desc(A_rel))
  

names(prod_ranking) <- c('País', 'Produto por trabalhador', 'Capital por trabalhador', 'Capital humano por trabalhador', 'Produtividade')

knitr::kable(prod_ranking[1:11, ], caption = 'Contabilidade do desenvolvimento')
Contabilidade do desenvolvimento
País Produto por trabalhador Capital por trabalhador Capital humano por trabalhador Produtividade
Ireland 1.7036874 1.8249223 0.8496204 1.5541461
China, Macao SAR 1.1866752 1.2283895 0.7901169 1.2964594
Kuwait 0.8457483 0.8832801 0.6061024 1.2307721
Saudi Arabia 0.9931199 1.1062101 0.7238157 1.1911610
Qatar 1.1918042 1.7608234 0.8693410 1.0835265
Brunei Darussalam 1.0970435 1.9518876 0.7463199 1.0668963
Bahrain 0.7966213 1.2606068 0.5946396 1.0428523
United States 1.0000000 1.0000000 1.0000000 1.0000000
Norway 1.0672624 1.3131564 0.9769297 0.9898974
Switzerland 0.9922209 1.2868623 0.9875543 0.9198641
Luxembourg 0.9295149 1.1882127 0.9654077 0.8984305


Caixa de código


No código, alteramos o objeto pwt2019 calculando também o capital por trabalhador. Nas linhas seguintes, fizemos um passo já feito antes que é fixar os valores para os EUA. A variável nova é o capital humano utilizando o índice hc da PWT. Novamente fixamos \(\alpha\) em 1/3. Os passos na sequência são também já conhecidos. Criamos algumas variáveis, selecionamos as de interesse e arranjamos os dados em ordem decrescente na produtividade relativa calculada. As últimas linhas modificam os nomes das colunas na tabela e geram a figura para as 11 primeiras linhas.


Caixa de resultado


Vemos na tabela gerada que alguns países se destacam com produtividade superiores aos EUA, entre eles Irlanda, China e países do oriente médio.


3.2 Contabilidade do crescimento


Contabilidade do Crescimento consiste em derivar a taxa de crescimento da produtividade usando as taxas de crescimento do produto, do capital físico e do capital humano.

Partindo de funções de produção Cobb-Douglas em termos por trabalhador temos:

\[y = Ak^\alpha h^{1-\alpha}\]

Aplicando o logarítmo em ambos os lados da equação, obtemos:

\[\log(y) = \log(A) + \alpha\log(k) + (1-\alpha)\log(h)\]

Diferenciando no tempo, obtemos a expressão que relaciona as taxas de crescimento das variáveis:

\[\hat y = \hat A + \alpha\hat k + (1-\alpha)\hat h\]

Assim, para encontrarmos a taxa de crescimento da produtividade utilizaremos:

\[\hat A = \hat y - \alpha\hat k - (1-\alpha)\hat h\]

Nosso primeiro exercício é encontrar a taxa de crescimento médio anual da produtividade do Brasil e outros países utilizando o período máximo disponível na PWT (1950 à 2019).

Para calcular a taxa de crescimento médio anual, podemos utilizar a seguinte expressão:

\[\hat x = \left(\frac{x_{t+j}}{x_t}\right)^{1/j}-1\]

# Escolha países de interesse
paises <- c('Brazil', 'United States', 'United Kingdom', 'India', 'South Korea')

# Defina o período
periodo <- c(1950, 2019)

pwt_A <- pwt %>%
  filter(year %in% periodo, country %in% paises) %>%
  group_by(country) %>%
  mutate(
    y = rgdpo/emp,
    k = rnna/emp
  ) %>%
  summarise(
    y_hat = (last(y)/first(y))^(1/(periodo[2]-periodo[1]))-1,
    k_hat = (last(k)/first(k))^(1/(periodo[2]-periodo[1]))-1,
    h_hat = (last(hc)/first(hc))^(1/(periodo[2]-periodo[1]))-1,
    A_hat = y_hat - alpha*k_hat - (1-alpha)*h_hat,
  ) 


knitr::kable(pwt_A, digits = 3, caption = 'Contabilidade do crescimento')
Contabilidade do crescimento
country y_hat k_hat h_hat A_hat
Brazil 0.027 0.023 0.013 0.011
India 0.031 0.043 0.010 0.010
United Kingdom 0.020 0.027 0.006 0.007
United States 0.017 0.014 0.005 0.009


Caixa de código

Todos os elementos aí presente já apareceram anteriormente. Apenas as funções first e last são novas. Basicamente elas retornam a primeira e a última posição de um vetor respectivamente.


Caixa de resultado


Vemos que considerando todo o período de 1950 à 2019 a produtividade no Brasil cresceu 1.1% ao ano em média. Os outros países da tabela cresceram um pouco menos. Você pode alterar os países e o período para brincar com o código. Alguns períodos interessantes para o Brasil podem ser o período JK “cinquenta anos em cinco” (1956-1961), o “milagre econômico” (1969-1973) e a “década perdida” (1980-1990).




Um outro exercício interessante a ser feito é calcular o crescimento da produtividade ano a ano, observando assim a evolução desta ao invés de uma média:


pwt_prod <- pwt %>%
  group_by(country) %>%
  mutate(
    y = rgdpo/emp,
    k = rnna/emp,
    y_hat = log(lead(y))-log(y),
    k_hat = log(lead(k))-log(k),
    h_hat = log(lead(hc))-log(hc),
    A_hat = y_hat - alpha*k_hat - (1-alpha)*h_hat,
  ) %>%
  ungroup()

pwt_prod %>%
  filter(country == 'Brazil') %>%
  ggplot(aes(y = 100*A_hat, x = year)) + 
  geom_line() +
  labs(
    title = 'Crescimento da produtividade',
    x = 'Ano',
    y = 'Taxa (em %)'
  )
## Warning: Removed 1 row containing missing values (`geom_line()`).


Caixa de código

Novamente todos os passos utilizados já aparecerem antes. As únicas exceções são a função lead, que basicamente retorna a próxima observação de um vetor; e a função ungroup, utilizada para remover o efeito de group_by. Note que neste caso estou utilizando a diferença em log para aproximar a taxa de crescimento, como já vimos anteriormente.


3.3 Eficiência relativa


Neste exercício, avaliaremos a eficiência do Brasil relativa à dos Estados Unidos, semelhante ao que Weil (2013) faz para a Índia no capítulo 10, seção 1. Naquela seção, Weil (2013) supõe que no período 1975-2009 todo crescimento da produtividade dos EUA foi explicado por crescimento tecnológico. A partir disso, é possível calcular o crescimento anual da tecnologia simplesmente calculando o crescimento anual da produtividade conforme o exercício 7 para os EUA no período 1950-2019.

Deste modo podemos utilizar, para calcular a tecnologia relativa entre Brasil e EUA, a fórmula (10.2) de Weil (2013):

\[\frac{T_{2019, Brasil}}{T_{2019, EUA}} = (1+g)^{-G} \hspace{5cm} (3.3.1)\]

em que \(G\) é o gap tecnológico entre os países e \(g\) é o crescimento da tecnologia (que é o crescimento da produtividade).

E finalmente, podemos usar, para calcular a eficiência relativa, a expressão (10.3): \[\frac{A_{Brasil}}{A_{EUA}} = \frac{T_{Brasil}}{T_{EUA}}\times\frac{E_{Brasil}}{E_{EUA}}\hspace{5cm} (3.3.2)\]

Visto que somos capazes de calcular a produtividade relativa (contabilidade do desenvolvimento) e a tecnologia relativa (contabilidade do crescimento e formula 10.2), podemos calcular a eficiência relativa, \(E_{Brasil}/E_{EUA}\).

Como não sabemos exatamente qual é o gap tecnológico, faremos diferentes cenários conforme Weil (2013) constrói em sua tabela 10.1.

Os passo são

  1. Calcular a taxa de crescimento média da produtividade dos EUA \(g\).
  2. O segundo passo é fazer a contabilidade do desenvolvimento e pegar a produtividade do Brasil relativa à dos EUA.
  3. Utilizar as expressões (3.3.1) e (3.3.2) para calcular a eficiência relativa.


Na tabela da seção anterior já calculamos a taxa de crescimento da produtivida dos EUA sendo igual à 0.009.

Quanto ao item 2., podemos aproveitar o objeto prod_ranking já calculado na seção 3.1.

Assim, temos

  1. Calcular a taxa de crescimento média da produtividade dos EUA \(g\).

  2. O segundo passo é fazer a contabilidade do desenvolvimento e pegar a produtividade do Brasil relativa à dos EUA.

  3. Utilizar as expressões (3.3.1) e (3.3.2) para calcular a eficiência relativa.

Resta calcular o tópico 3:

# Obtendo a informação de produtividade relativa do objeto prod_ranking para o Brasil
A_rel <- prod_ranking$Produtividade[prod_ranking$País=='Brazil']

# Obtendo a taxa de crescimento média dos EUA:
g <- pwt_A$A_hat[pwt_A$country=='United States']

# Calculando a eficiência relativa
G <- 10
tec_rel <- (1+g)^(-G)      # usando a expressão (3.3.1)
ef_rel <- A_rel/tec_rel    # usando a expressão (3.3.2)

# "Pritando" na tela
print(paste0('Para um gap de 10 anos: tecnologia relativa: ', tec_rel,' e eficiência relativa:', ef_rel))
## [1] "Para um gap de 10 anos: tecnologia relativa: 0.912372989632643 e eficiência relativa:0.463588863943947"


Caixa de código


As duas primeiras expressões do código utilizam uma sintaxe ainda não vista. O operador \$ é utilizado no R para selecionar uma coluna de um data.frame (ou uma entrada de uma lista em geral). Ao colocar uma expressão entre colchetes, estamos selecionando apenas a(s) observação(ões) da coluna (ou de um vetor em geral) que satisfazem àquela expressão. Então A_rel recebe o valor da coluna Produtividade de prod_rankingtal que a coluna País seja igual à Brazil. Algo similar ocorre com o objeto g.

Em seguida os objetos tec_rel e ef_rel são construídos utilizando cálculos simples com os objetos g e G já definidos.

Por fim, a função print e paste0 são utilizadas para “printar” um texto combinando com objetos definidos.




Agora podemos utilizar diferentes gaps tecnológicos, e construir uma tabela:

gaps <- c(10, 15, 20, 30, 40, 50, 75, 100, 125)

tec_rel <- map_dbl(gaps, function(x) (1+g)^(-x))
ef_rel <- map_dbl(tec_rel, function(x) A_rel/x)

ef_rel_tab <- data.frame(gaps, tec_rel, ef_rel)

names(ef_rel_tab) <- c('G', 'Tecnologia relativa', 'Eficiência relativa')

knitr::kable(ef_rel_tab, digits = 3)
G Tecnologia relativa Eficiência relativa
10 0.912 0.464
15 0.871 0.485
20 0.832 0.508
30 0.759 0.557
40 0.693 0.610
50 0.632 0.669
75 0.503 0.841
100 0.400 1.058
125 0.318 1.331


Caixa de código


Em gaps criamos um vetor numérico do R, utilizando a função combine c. Como agora temos um vetor de gaps ao invés de um único gap, precisamos de um vetor com a tecnologia relativa e eficiência relativa, um para cada gap. Uma forma de fazer isso, é utilizando as funções map_ do pacote purrr componente do tidyverse. A variação map_dbl mapeia um vetor de numérico (doubles) aplicando a cada elemento uma função e retorna um vetor numérico com o resultado da operação. Assim, por exemplo, tec_rel recebe um vetor em que cada entrada desse vetor é uma entrada do vetor gaps aplicada a função (1+g)^(-x).

Por fim, criamos um data.frame, uma tabela, cujas colunas serão o gaps, tec_rel e ef_rel. A linha seguinte modifica os nomes das colunas. E a última linha gera uma tabela bonita para o formato HTML utilizado aqui arredondando os números para a terceira casa decimal.


Caixa de resultado


Assim como no caso da Índia estudado no livro, a menos que o gap tecnológico seja muito grande, a maior parte da diferença na produtividade entre Brasil e Estados Unidos é resultado de diferenças na eficiência. Note porém que, para os dados que utilizamos, a eficiência brasileira está um pouco melhor que a indiana, pois se o gap for de 10 anos, o Brasil tem 46% da eficiência estadunidense. Essa marca só é alcançada pela Índia se o gap for em torno de 50 anos!