#==============================================================================#
# IESP/UERJ, 2025.I
# LEGO 3 - LISTA 01
# Nome: Felipe Marques Esteves Lamarca
# Email: felipelamarca@iesp.uerj.br
# Data: 11/05/2026
#==============================================================================#
# +++ INSTRUCOES +++ ===========================================================
# 1. Preencha seu nome, email e data no cabecalho acima
# 2. Edite a secao ``pasta de trabalho`` para indicar a pasta no seu computador
# onde estao os arquivos necessarios para a lista (este script e os dois arquivos
# em csv)
# 3. Edite a secao ``pacotes`` para instalar (se necessario) e carregar os scripts
# necessarios para a execucao de TODA a lista
# 4. Acrescente sua resposta aos itens
# 5. Salve o script com o nome ``SEUNOME-lego3-lista01.r`` e envie para:
# - pedrosouza@iesp.uerj.br
# - rogerio.barbosa@iesp.uerj.br
# - carloscr@iesp.uerj.br
# Somente serao aceitas respostas que usem este script como modelo.
# +++ PASTA DE TRABALHO +++ ====================================================
# Altere o objeto ``pasta_local`` para indicar a pasta contendo os arquivos csv e
# este script. Use barras, e nao contra-barras (por ex: 'c:/iesp/lego3/')
# Pasta local
pasta_local <- here::here('trabalhos/lista-01')
# Comando para o R usar como referencia a pasta local
setwd(pasta_local)
# +++ PACOTES +++ ==============================================================
# Inclua nesta secao os comandos para carregar todos os pacotes desejados.
# Por ex: library(tidyverse); library(feols) etc.
library(tidyverse)
library(fixest)
library(MatchIt)
options(scipen = 999)
# +++ 4. VARIAVEIS ALEATORIAS CONTINUAS +++ ====================================
# 4.1. Valor esperado de variavel uniforme -------------------------------------
n = 10000
u = runif(n, min = 4, max=10)
mean(u)
# 4.2. Probabilidade acumulada de variavel uniforme ----------------------------
punif(6, min=4, max=10)
# 4.3. Probabilidade acumulada de variavel normal ------------------------------
1-pnorm(38, mean=34, sd=2)
# 4.4. Probabilidade acumulada de variavel logistica padrao --------------------
1 - (1 / (1 + exp(-3)))
# ou ainda...
1 - plogis(3)
# 4.5. Funcao logit ------------------------------------------------------------
qlogis(0.99)
# ou ainda...
log(0.99 / (1-0.99))
# +++ 6. CASOS EXTRACONJUGAIS +++ ==============================================
affairs = read.csv("affairs.csv")
# 6.2. Implicacoes testaveis do DAG --------------------------------------------
cor(affairs$homem, affairs$tempo_casamento)
# 6.3. Estimando o modelo de probabilidade linear ------------------------------
affairs <- affairs %>%
mutate(
tem_filhos = factor(tem_filhos),
ensino_superior = factor(ensino_superior)
)
m1 <- feols(
fml = affair ~ ensino_superior + idade + religiosidade + tempo_casamento + tem_filhos,
data = affairs,
vcov = "HC1"
)
summary(m1)
# 6.5. Calculo de valores preditos no LPM --------------------------------------
novo <- data.frame(
ensino_superior = factor(0, levels = c("0", "1")),
idade = 50,
religiosidade = 5,
tempo_casamento = 1,
tem_filhos = factor(0, levels = c("0", "1"))
)
# Probabilidade predita
predict(m1, newdata = novo)
# 6.6. Estimando o modelo logit ------------------------------------------------
m2 <- glm(
formula = affair ~ ensino_superior + idade + religiosidade + tempo_casamento + tem_filhos,
data = affairs,
family = binomial(link = "logit")
)
summary(m2)
# 6.8. Calculo de valores preditos no logit ------------------------------------
# Probabilidade predita
plogis(predict(m2, newdata = novo))
# +++ 7. SELECAO EM OBSERVAVEIS +++ ============================================
lalonde_experimento = read.csv("lalonde_experimento.csv")
lalonde_cps = read.csv("lalonde_cps.csv")
# 7.1. Analise descritiva ------------------------------------------------------
lalonde_experimento %>%
group_by(treat) %>%
summarise(
mean_age = mean(age),
mean_education = mean(education),
mean_black = mean(black),
mean_re74 = mean(re74),
mean_re75 = mean(re75)
)
lalonde_cps %>%
group_by(treat) %>%
summarise(
mean_age = mean(age),
mean_education = mean(education),
mean_black = mean(black),
mean_re74 = mean(re74),
mean_re75 = mean(re75)
)
# 7.2. ATT no experimento ------------------------------------------------------
att_tbl_experimento = lalonde_experimento %>%
group_by(treat) %>%
summarise(mean_re78 = mean(re78))
att_experimento = att_tbl_experimento$mean_re78[att_tbl_experimento$treat == 1] -
att_tbl_experimento$mean_re78[att_tbl_experimento$treat == 0]
print(att_experimento)
# 7.3. ATT ingenuo nos dados nao experimentais ---------------------------------
att_tbl_cps = lalonde_cps %>%
group_by(treat) %>%
summarise(mean_re78 = mean(re78))
att_cps = att_tbl_cps$mean_re78[att_tbl_cps$treat == 1] -
att_tbl_cps$mean_re78[att_tbl_cps$treat == 0]
print(att_cps)
# 7.4. Estimacao do propensity score -------------------------------------------
m3_ps = glm(
formula = treat ~ age + agesq + agecube +
education + educationsq +
black + hispanic +
married +
re74 + re74sq + re75 + re75sq +
u74 + u75,
data = lalonde_cps,
family = binomial(link = "logit")
)
summary(m3_ps)
lalonde_cps = lalonde_cps %>%
mutate(
ps = m3_ps$fitted.values
)
lalonde_cps %>%
group_by(treat) %>%
summarise(
mean_ps = mean(ps)
)
# 7.5. Propensity score matching com vizinho mais proximo ----------------------
# Propensity score matching com o matchit
M <-
matchit(formula = treat ~ age + agesq + agecube +
education + educationsq +
black + hispanic +
married +
re74 + re74sq + re75 + re75sq +
u74 + u75, # formula que usamos para o logit
data = lalonde_cps, # data frame com os dados (edite caso necessario)
distance = lalonde_cps$ps, # propensity scores estimados (idem)
estimand = 'ATT', # estimando vai ser o ATT
method = 'nearest', # pareamento por proximidade
ratio = 1, # com apenas 1 vizinho
discard = 'treated', # restricao de suporte comum
replace = FALSE) # sem reposicao
# Equilibrio das covariadas antes e depois do pareamento
summary(M)
# data frame so com casos pareados
M_df <- match_data(M)
# Calculo do ATT para re78
lm(re78 ~ treat, data = M_df)
# 7.6. Inverse probability weighting -------------------------------------------
lalonde_cps = lalonde_cps %>%
mutate(
ipw = if_else(treat == 1, 1, ps / (1 - ps))
)
lm(re78 ~ treat, data = lalonde_cps, weights = ipw)
# 7.7. Regressao ---------------------------------------------------------------
m4_ols <- lm(re78 ~ treat +
age + agesq + agecube +
education + educationsq +
black + hispanic + married +
re74 + re74sq + re75 + re75sq +
u74 + u75,
data = lalonde_cps)
m5_wls <- lm(re78 ~ treat +
age + agesq + agecube +
education + educationsq +
black + hispanic + married +
re74 + re74sq + re75 + re75sq +
u74 + u75,
data = lalonde_cps,
weights = ipw)
summary(m4_ols)
summary(m5_wls)