Skip to content

Instantly share code, notes, and snippets.

@jrhumberto
Created November 27, 2024 15:45
Show Gist options
  • Save jrhumberto/75b164713ed897767a283ff944577143 to your computer and use it in GitHub Desktop.
Save jrhumberto/75b164713ed897767a283ff944577143 to your computer and use it in GitHub Desktop.
# MPE UFC 2024/2
# Autor: Humberto Bezerra de Meneses Júnior
# Data: 27/11/2024
# --------------------------------------------------------------------
# Definir o diretório de trabalho - no R é assim
# setwd("C:/Users/<CAMINHO DO ARQUIVO>/dados_ceara.xlsx")
# getwd() # Verificar o diretório atual
# Carregar as bibliotecas necessárias
library(readxl) # Para importar arquivos Excel
library(plm) # Para métodos de dados em painel
library(lmtest) # Para testes de modelos (ex.: teste de Hausman)
library(dplyr) # Para manipulação de dados
# Importar o arquivo Excel
dados <- read_excel("dados_ceara.xlsx", sheet = "Painel_Stata")
# Definir a estrutura dos dados em painel
# `id` e `t` são os identificadores do painel; substitua pelos nomes reais das suas variáveis.
pdata <- pdata.frame(dados, index = c("id", "t"))
# Regressão Pooled
pooled_model <- lm(lnpibpc ~ lag(lnpibpc, 1) + lncfpc_mwh + lnch_fpc + lnpartcomer + partcomer_dmetrop, data = pdata)
summary(pooled_model)
# LSDV (Least Squares Dummy Variable)
lsdv_model <- lm(lnpibpc ~ lag(lnpibpc, 1) + lncfpc_mwh + lnch_fpc + lnpartcomer + partcomer_dmetrop + factor(id), data = pdata)
summary(lsdv_model)
# Modelo de Efeitos Fixos (FE)
fe_model <- plm(lnpibpc ~ lag(lnpibpc, 1) + lncfpc_mwh + lnch_fpc + lnpartcomer + partcomer_dmetrop,
data = pdata, model = "within")
summary(fe_model)
# Modelo de Primeira Diferença (FD)
# Usar o `dplyr` para criar variáveis em primeira diferença
# Calcular as primeiras diferenças e preencher com NA no início de cada grupo para manter tamanho do vetor
pdata <- pdata %>%
group_by(id) %>%
mutate(
d_lnpibpc = c(NA, diff(lnpibpc)),
d_L1_lnpibpc = c(NA, diff(lag(lnpibpc, 1))),
d_lncfpc_mwh = c(NA, diff(lncfpc_mwh)),
d_lnch_fpc = c(NA, diff(lnch_fpc)),
d_lnpartcomer = c(NA, diff(lnpartcomer)),
d_partcomer_dmetrop = c(NA, diff(partcomer_dmetrop))
) %>%
ungroup()
fd_model <- lm(d_lnpibpc ~ d_L1_lnpibpc + d_lncfpc_mwh + d_lnch_fpc + d_lnpartcomer + d_partcomer_dmetrop,
data = pdata)
summary(fd_model)
# Identificar possíveis problemas com os índices
any_duplicated_rows <- dados %>%
group_by(id, t) %>%
filter(n() > 1) %>%
nrow() > 0
if (!any_duplicated_rows) {
print("Nenhum dado duplicado foi encontrado no índice do painel.")
} else {
duplicated_rows <- dados %>% group_by(id, t) %>% filter(n() > 1)
print(duplicated_rows)
}
# Redefinir o painel de dados com indices em (id e t) e verifica as dimensões de resultado.
# Este e IF anterior são passos apenas de verificação e não necessários. Serve comop auto estudo.
pdata <- pdata.frame(dados, index = c("id", "t"), drop.index = TRUE, row.names = FALSE)
pdim(pdata)
# Modelo de Efeitos Aleatórios (RE)
re_model <- plm(lnpibpc ~ lag(lnpibpc, 1) + lncfpc_mwh + lnch_fpc + lnpartcomer + partcomer_dmetrop,
data = pdata, model = "random")
summary(re_model)
# Teste de Hausman
# Comparação entre os modelos de efeitos fixos e aleatórios
phtest(fe_model, re_model)
# ERRO! Modelo de Efeitos Fixos de Dois Fatores (TWFE)
# método de estimação de efeitos fixos já subtrai automaticamente as médias dentro dos grupos,
# tornando desnecessária (e conflitante) a adição manual de fatores temporais ou individuais na fórmula.
# twfe_model <- plm(lnpibpc ~ lag(lnpibpc, 1) + lncfpc_mwh + lnch_fpc + lnpartcomer + partcomer_dmetrop + factor(t),
# data = pdata, model = "within")
# summary(twfe_model)
# VALIDO 1! Modelo de Efeitos Fixos de Dois Fatores (TWFE)
# 'Twoways' indica ao pacote que deve considerar efeitos fixos tanto para unidades (id) quanto para períodos (t)
twfe_model <- plm(lnpibpc ~ lag(lnpibpc, 1) + lncfpc_mwh + lnch_fpc + lnpartcomer + partcomer_dmetrop,
data = pdata, model = "within", effect = "twoways")
summary(twfe_model)
# VALIDO 2! Modelo de Efeitos Fixos de Dois Fatores (TWFE)
# Alternativamente, tranforma e adiciona manualmente as dummies temporais(t) ao modelo!
# pdata$t <- as.factor(pdata$t) # Transformar 't' em um fator, assim poderá ser usado na regressão
# twfe_model_manual <- plm(lnpibpc ~ lag(lnpibpc, 1) + lncfpc_mwh + lnch_fpc + lnpartcomer +
# partcomer_dmetrop + t,
# data = pdata, model = "within")
# summary(twfe_model_manual)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment