library(tidyverse) # Conjunto de pacotes e funções para realizar análise de dados no R
library(readxl) # Para fazer leitura e também exportar arquivos em formato Excel.
library(gt) # Para elaboração de tabela com qualidade publicação
library(here) # Para facilitar trabalhar com caminhos de pastas
library(fixest) # Pacote mais utilizado para dados em painelAula Prática - Dados em Painel
Replicação: Fatalidades de trânsito e álcool
Chamando pacotes e importando dados
Os pacotes que serão utilizados são:
Depois de chamar os pacotes importamos os dados para o R. Vamos salvar os dados no objeto Fatalities. Para isso, faça download da base Fatalities e leia o dicionário de variáveis.
# Carregar os dados
# Ajuste o caminho conforme a localização do arquivo na sua máquina
Fatalities <- read_excel(here::here("labs","SW_Datasets","fatality.xlsx"))Esse painel é balanceado?
Número de observações por ano:
n_obs_year <- Fatalities %>%
group_by(year) %>%
summarise(n_obs = n())Número de observações por estado:
n_obs_states <- Fatalities %>%
group_by(state) %>%
summarise(n_obs = n())Como você poderia checar que cada estado tem o mesmo número de observações usando o comando de filtro (filter)?
# Resultado: nenhum estado tem número de obs diferente de 7
n_obs_states %>% filter(n_obs != 7)# A tibble: 0 × 2
# ℹ 2 variables: state <dbl>, n_obs <int>
Apresente um conjunto de estatísticas descritivas para fatalidades e imposto sobre bebidas.
library(skimr)
Fatalities <- Fatalities %>%
mutate(fatal_rate = mrall)
Fatalities %>% select(fatal_rate,beertax) %>% skim()| Name | Piped data |
| Number of rows | 336 |
| Number of columns | 2 |
| _______________________ | |
| Column type frequency: | |
| numeric | 2 |
| ________________________ | |
| Group variables | None |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| fatal_rate | 0 | 1 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | 0.00 | ▃▇▅▁▁ |
| beertax | 0 | 1 | 0.51 | 0.48 | 0.04 | 0.21 | 0.35 | 0.65 | 2.72 | ▇▂▁▁▁ |
Fatalities %>%
summarise(mean_state = mean(beertax, na.rm = T))# A tibble: 1 × 1
mean_state
<dbl>
1 0.513
Após apresentar, diga qual é a taxa média entre estados do imposto sobre a cerveja e qual é a taxa média entre estados por ano.
Fatalities %>%
group_by(year) %>%
summarise(mean_state = mean(beertax, na.rm = T))# A tibble: 7 × 2
year mean_state
<dbl> <dbl>
1 1982 0.530
2 1983 0.532
3 1984 0.530
4 1985 0.517
5 1986 0.509
6 1987 0.495
7 1988 0.480
media_estados <- Fatalities %>%
group_by(state) %>%
summarise(mean_state = mean(beertax, na.rm = T))Modelo em Diferenças T=2 ou “Antes e Depois”
Como vimos em sala, uma forma de considerar o efeito fixo no modelo e “limpar” seu efeito é fazer uma regressão em diferença usando T = 2 ou comparações “antes e depois”.
Primeiro vamos construir uma base de dados que só possuem o ano de 1982 e 1988:
Fatalities_1982_1988 <- Fatalities %>%
filter(year %in% c(1982,1988))
Fatalities_1982_1988 <- Fatalities %>%
filter(year == 1982 | year == 1988) # condição
# Caso precise fazer um filtro com condição E o simbolo é &. Tente um exemplo.Agora vamos criar as variáveis em primeira diferença. Inicialmente, vamos trabalhar apenas com a taxa de fatalidade e a taxa de imposto sobre a cerveja.
Fatalities_1982_1988 <- Fatalities_1982_1988 %>%
group_by(state) %>% # agrupar por estado para evitar fazer diferença usando dados de diferentes estados
arrange(state, year) %>% # ordenar por estado e por ano
mutate(d_fatal_rate = fatal_rate - lag(fatal_rate), # utiliza função lag para calcular a 1ª defasagem
d_beer_tax = beertax - lag(beertax))
Fatalities_1982_1988 <- Fatalities_1982_1988 %>%
select(state, year, fatal_rate, beertax, d_fatal_rate, d_beer_tax)Agora vamos estimar o modelo de MQO em primeira diferença:
fatalities_mod_diff <- lm(d_fatal_rate ~ d_beer_tax, data = Fatalities_1982_1988)Visualizando os resultados:
summary(fatalities_mod_diff)
Call:
lm(formula = d_fatal_rate ~ d_beer_tax, data = Fatalities_1982_1988)
Residuals:
Min 1Q Median 3Q Max
-1.227e-04 -9.619e-06 9.212e-06 2.229e-05 6.774e-05
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -7.204e-06 6.064e-06 -1.188 0.2410
d_beer_tax -1.041e-04 4.172e-05 -2.495 0.0162 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 3.94e-05 on 46 degrees of freedom
(48 observations deleted due to missingness)
Multiple R-squared: 0.1192, Adjusted R-squared: 0.1
F-statistic: 6.225 on 1 and 46 DF, p-value: 0.01625
Interpretação:
A. É necessário controlar por alguma variável constante no tempo para evitar viés de seleção no modelo acima? Se sim, por que? Se não, por que?
B. Podemos fazer inferência estatística a partir dos resultados reportados acima? Se sim, por que? Se não, por que?
Modelo com efeito fixo de unidade
O pacote atualmente mais utilizado para dados em painel com efeitos fixos é o pacote fixest. A função que iremos utilizar para estimar os modelos é a função feols (Fixed-effects OLS Estimation). Antes de prosseguir, vejama documentação do pacote para entender como montar a especificação.
Fatalities_mod_fe <- feols(fatal_rate ~ beertax | state, vcov = "cluster", data = Fatalities)
Fatalities_mod_feOLS estimation, Dep. Var.: fatal_rate
Observations: 336
Fixed-effects: state: 48
Standard-errors: Clustered (state)
Estimate Std. Error t value Pr(>|t|)
beertax -6.6e-05 2.9e-05 -2.24725 0.029358 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
RMSE: 1.755e-5 Adj. R2: 0.889129
Within R2: 0.040745
Interpretação
A. Acima estimamos o modelo utilizando efeito fixo com a função feols. Como poderíamos estimar o mesmo modelo mas utilizando a função lm? Há dois caminhos. Quais são? Caso não consiga escrever o código, apenas descreva quais especificações utilizaria.
B. Por que utilizamos a opção vcov na estimação acima com feols? Se não utilizarmos essa opção, qual problema teremos em nossos resultados?
C. A partir do que vimos sobre a função feols, você consegue estimar um modelo que possui somente efeito fixo de tempo?
D. E efeito fixo duplo (two-way fixed effect)?
E. Reproduzir a tabela 10.1 do livro utilizando os pacotes feols e gt.
Exercício E10.2 Stock e Watson (4a Edição)
Os cidadãos demandam mais democracia e liberdade política à medida que sua renda cresce? Ou seja, a democracia é um bem normal? Faça download do arquivo de dados Income_Democracy, que contém um conjunto de dados em painel de 195 países para os anos 1960, 1965, …, 2000. Uma descrição detalhada está disponível em Income_Democracy_Description.1 O conjunto de dados contém um índice de liberdade política/democracia para cada país em cada ano, juntamente com dados sobre a renda de cada país e diversas variáveis de controle demográficas. (A renda e os controles demográficos estão defasados em cinco anos em relação ao índice de democracia, a fim de permitir que a democracia se ajuste a mudanças nessas variáveis.)
a. O conjunto de dados é um painel balanceado? Explique.
b. O índice de liberdade política/democracia é denominado Dem_ind.
Quais são os valores mínimo e máximo de
Dem_indno conjunto de dados? Quais são a média e o desvio padrão deDem_ind? Quais são os percentis 10, 25, 50, 75 e 90 de sua distribuição?Qual é o valor de
Dem_indpara os Estados Unidos no ano 2000? E sua média ao longo de todos os anos do conjunto de dados?Qual é o valor de
Dem_indpara a Líbia no ano 2000? E sua média ao longo de todos os anos do conjunto de dados?Liste cinco países com valor médio de
Dem_indsuperior a 0,95; inferior a 0,10; e entre 0,3 e 0,7.
c. O logaritmo da renda per capita é denominado Log_GDPPC. Regresse Dem_ind em Log_GDPPC. Utilize erros padrão clusterizados por país.
Qual é a magnitude do coeficiente estimado de
Log_GDPPC? O coeficiente é estatisticamente significativo?Se a renda per capita de um país aumentar 20%, em quanto se prevê que
Dem_indaumentará? Qual é o intervalo de confiança de 95% para essa previsão? O aumento previsto emDem_indé grande ou pequeno? (Explique o que você entende por grande ou pequeno.)Por que é importante utilizar erros padrão clusterizados nessa regressão? Os resultados mudam se você não utilizar erros padrão clusterizados?
d.
Sugira uma variável que varie entre países, mas que plausívelmente varie pouco — ou nada — ao longo do tempo e que possa causar viés de variável omitida na regressão de (c).
Estime a regressão de (c) permitindo efeitos fixos por país. Como suas respostas a (c-i) e (c-ii) se alteram?
Exclua os dados do Azerbaijão e reestime a regressão. Os resultados mudam? Por quê?
Sugira uma variável que varie ao longo do tempo, mas que plausívelmente varie pouco — ou nada — entre países e que possa causar viés de variável omitida na regressão de (c).
Estime a regressão de (c) permitindo efeitos fixos de tempo e de país. Como suas respostas a (c-i) e (c-ii) se alteram?
Existem controles demográficos adicionais no conjunto de dados. Essas variáveis devem ser incluídas na regressão? Se sim, como os resultados mudam quando são incluídas?
e. Com base em sua análise, quais conclusões você tira sobre os efeitos da renda sobre a democracia?
Notas de rodapé
Esses dados foram fornecidos por Daron Acemoglu do M.I.T. e foram utilizados no artigo com Simon Johnson, James Robinson e Pierre Yared, “Income and Democracy”, American Economic Review, 2008, 98:3, 808–842.↩︎