Disciplina: EF00009 – ANÁLISE DE DADOS II
Professor: Dr. Edward Costa
Local: Universidade Federal do Ceará – UFC
Este exercício tem como objetivo aplicar técnicas de avaliação de impacto com base em modelos de regressão linear e diferenças em diferenças, utilizando dados observacionais.
school.csv)A base de dados school.csv contém informações de
escolas, incluindo uma variável de tratamento (visited) e
variáveis de resultado e controle. O objetivo é estimar o impacto de um
programa de visitas escolares sobre o desempenho dos
estudantes em testes padronizados.
| Variável | Descrição |
|---|---|
score |
Nota média dos alunos da escola em um exame padronizado (variável dependente) |
visited |
Indicador binário do tratamento: 1 se a escola foi visitada, 0 caso contrário |
income |
Renda média dos alunos da escola |
stratio |
Razão aluno-professor (indicador de tamanho da turma) |
english |
Percentual de alunos com proficiência mínima em inglês |
#Carregando área de trabalho
setwd("~/03-R/02-Arquivos/mba-ciencia-de-dados/analise-dados-ii")
Carregando pacotes
library(tidyverse)
library(readr)
Carregando base de dados school
school <- read_csv("school.csv")
head(school)
Questão 1. Estime um modelo de regressão linear
simples com score como variável dependente e
visited como explicativa. O coeficiente de
visited representa o efeito médio do tratamento sob
aleatorização. Interprete esse coeficiente.
modelo_q1 <- lm(score ~ visited, data = school)
summary(modelo_q1)
##
## Call:
## lm(formula = score ~ visited, data = school)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.45000 -0.16667 -0.03333 0.12500 0.55000
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 27.8167 0.1171 237.461 <2e-16 ***
## visited -0.1667 0.1657 -1.006 0.338
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2869 on 10 degrees of freedom
## Multiple R-squared: 0.09191, Adjusted R-squared: 0.001103
## F-statistic: 1.012 on 1 and 10 DF, p-value: 0.3381
O p-valor associado ao coeficiente de visited é 0.338.
Como esse valor é maior que 0.05, não podemos rejeitar a hipótese nula
de que o coeficiente é zero. Isso significa que a queda de 0.17 ponto
não é estatisticamente significativa. Ou seja, não há evidências
suficientes para afirmar que a visita teve um efeito real no score.
Questão 2. Inclua no modelo as covariadas
income, stratio e english. O que
mudou na estimativa do efeito de visited? O efeito
permanece estável?
modelo_q2 <- lm(score ~ visited + income + stratio + english, data = school)
summary(modelo_q2)
##
## Call:
## lm(formula = score ~ visited + income + stratio + english, data = school)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.34977 -0.08262 0.01201 0.13241 0.24550
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 19.223225 5.219439 3.683 0.00783 **
## visited -0.651979 0.216565 -3.011 0.01965 *
## income -0.001147 0.054272 -0.021 0.98373
## stratio -0.160476 0.112620 -1.425 0.19720
## english 0.174361 0.072887 2.392 0.04801 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.2263 on 7 degrees of freedom
## Multiple R-squared: 0.6047, Adjusted R-squared: 0.3789
## F-statistic: 2.678 on 4 and 7 DF, p-value: 0.121
O coeficiente mudou de -0.1667 para -0.6520. Isso significa que, após
controlarmos por income, stratio e english, o efeito estimado da visita
se tornou mais forte (mais negativo). Além disso, vemos que o p-valor
para visited é de 0.01965. Como esse valor é menor que 0.05, o efeito de
visited agora é estatisticamente significativo.
Assim observamos que o efeito de visited não permaneceu estável, pois
a mudança drástica no valor do coeficiente e a nova significância
estatística sugerem que as variáveis income,
stratio e english estavam confundindo a
relação entre visited e score. A inclusão
delas no modelo ajudou a isolar melhor o verdadeiro impacto da
visitação.
Questão 3. Discuta o papel das covariadas no controle de viés de seleção. Há indícios de comparabilidade entre as escolas tratadas e não tratadas?
school %>%
group_by(visited) %>%
summarise(across(c(income, stratio, english, score), mean, na.rm = TRUE))
A tabela de médias mostra que há diferenças significativas entre as
escolas que foram visitadas (visited = 1) e as que não
foram (visited = 0), o que aponta para um viés de seleção.
As variáveis income, stratio e
english são as nossas covariadas. Ao incluí-las no modelo
de regressão, nós controlamos por essas diferenças. O modelo tenta
isolar o efeito da visitação, removendo a influência dessas outras
variáveis. Por exemplo, se escolas com menor renda (income)
também têm scores mais baixos, e são essas escolas que foram visitadas,
o modelo de regressão corrige para isso, nos dando uma estimativa mais
pura do efeito da visita. Analisando as médias vemos que:
income é diferente entre os grupos, da mesma forma nota-se
uma diferença de média de stratio e de
english. Com isso as diferenças nas médias dessas
covariadas demonstram que as escolas visitadas e não visitadas não são
comparáveis antes do tratamento. As escolas que receberam a visita já
possuíam características diferentes das que não receberam, confirmando
um forte indício de viés de seleção.
Questão 4. O que seria o contrafactual neste contexto? Como o modelo o estimado?
Neste contexto, o contrafactual para uma escola que foi visitada é o que teria acontecido com o seu score se ela não tivesse sido visitada. Da mesma forma, o contrafactual para uma escola não visitada é o que teria acontecido com o seu score se ela tivesse sido visitada. A grande questão da inferência causal é que nunca podemos observar o contrafactual. Uma escola ou foi visitada ou não foi; não podemos voltar no tempo para ver o outro cenário. Por isso, precisamos de métodos para estimá-lo. Podemos estimar isso com o modelo de regressão, pois ele usa as informações das escolas que não foram visitadas para “prever” qual seria o score das escolas visitadas se elas não tivessem recebido a visita.
Assim, para as escolas NÃO visitadas (visited = 0), o
modelo usa o grupo de controle (as escolas não visitadas) como uma
estimativa do contrafactual para as escolas visitadas. Para as escolas
visitadas (visited = 1): O modelo usa as características
das escolas visitadas para estimar qual seria o score delas no cenário
em que não tivessem recebido a visita. A diferença entre o score
observado nas escolas visitadas e o score contrafactual estimado é o
efeito do tratamento (visited).
O modelo de regressão com as covariadas (income,
stratioe english) faz um trabalho melhor, pois
ele estima o contrafactual de uma forma mais sofisticada, levando em
conta que os grupos não eram idênticos no início. Dessa forma, ajustando
o score esperado de cada grupo com base nessas características,
produzindo uma estimativa do efeito do tratamento mais precisa e menos
enviesada.
Questão 6. Você considera que o modelo estimado
permite identificar um efeito causal do programa de visita escolar sobre
o desempenho (score)? Justifique sua resposta com base nos
pressupostos do modelo e nas características da base de dados.
O modelo_q2 permite identificar um efeito causal do programa de
visita escolar, mas sob uma forte suposição, pois nele efeito de
visited se tornou estatisticamente significativo e o
coeficiente mudou para um valor mais negativo. Isso sugere que as
covariadas incluidas estavam de fato mascarando o verdadeiro efeito.
Agora, o modelo ajustado está nos dando uma estimativa do efeito do
tratamento isolado da influência dessas outras variáveis. Porém, só
podemos confirmar isso sob a suposição de que income,
stratio e english são as únicas variáveis que
explicam tanto a decisão de visitar uma escola quanto o seu score for
verdadeira. Se houver alguma outra característica importante que não foi
incluída no modelo, como uma variável omitida, o viés de seleção ainda
pode existir, e a estimativa do efeito causal pode não ser
confiável.
O experimento natural conduzido por Ashraf et al. (2006) avalia os efeitos de um programa de microcrédito voltado especificamente para mulheres nas Filipinas. O estudo teve como base uma colaboração com o banco Green Bank of Caraga, que implementou um programa de empréstimos em determinadas regiões em 1998.
A base de dados utilizada (hh_9198.dta) contém
informações de dois momentos no tempo: - 1991 (antes da
intervenção), - 1998 (após a intervenção).
As unidades de observação são os domicílios,
identificados pela variável nh. A variável de resultado
primária é o gasto total per capita do domicílio
(exptot), usada como proxy de bem-estar econômico.
O tratamento é definido com base na participação das chefes
mulheres em programas de microcrédito em 1998. A variável de
tratamento dfmfd98 assume o valor 1 se o domicílio
participou em 1998 e 0 caso contrário. Esse indicador é atribuído a
ambos os períodos, permitindo a comparação entre grupos ao longo do
tempo.
Para estimar o efeito causal do microcrédito sobre o bem-estar econômico dos domicílios, é aplicado o método de Diferenças em Diferenças (DiD). O objetivo é isolar o impacto do programa ao comparar a evolução dos gastos per capita entre domicílios que participaram e não participaram do programa.
A ideia é que, se as tendências de evolução dos grupos fossem paralelas na ausência da intervenção, qualquer diferença adicional observada nos gastos dos domicílios tratados pode ser atribuída ao efeito do programa.
O modelo pode ser estimado com e sem variáveis de controle adicionais (como escolaridade, idade e sexo do chefe do domicílio, acesso à terra, bens alimentares, etc.) para melhorar a precisão da estimativa.
Além da estimativa manual com diferenças de médias, o estimador de Diferenças em Diferenças (DiD) também pode ser implementado via regressão linear com interação, conforme discutido em Ravallion (2008). O coeficiente da interação é o estimador de impacto causal.
Avaliar o efeito causal da participação em um programa de microcrédito sobre os gastos per capita do domicílio, utilizando o modelo de Diferenças em Diferenças (DiD) com dois períodos: 1991 (pré-intervenção) e 1998 (pós-intervenção).
| Variável | Tipo | Explicação |
|---|---|---|
exptot |
Contínua | Gasto total per capita do domicílio. |
lexptot |
Contínua | Log de (1 + exptot). Reduz assimetria e normaliza
distribuição. |
| Variável | Tipo | Papel no Modelo | Explicação |
|---|---|---|---|
year |
Binária | Tempo (t) |
0 = 1991; 1 = 1998. |
dfmfd98 |
Binária | Grupo (T) |
1 se o domicílio participou em 1998. Aplicada aos dois anos. |
dfmfdyr |
Binária | Interação (T × t) |
Produto dfmfd98 * year. Representa o efeito do
tratamento. |
| Variável | Tipo | Explicação |
|---|---|---|
sexhead |
Binária | 1 se o chefe do domicílio é mulher. |
agehead |
Contínua | Idade do chefe do domicílio. |
educhead |
Contínua | Anos de estudo do chefe. |
lnland |
Contínua | Log da área de terra disponível. |
vacess |
Binária | Acesso à vila ou mercado. |
pcirr |
Contínua | Indicador de bens duráveis per capita. |
rice |
Contínua | Consumo per capita de arroz. |
wheat |
Contínua | Consumo per capita de trigo. |
milk |
Contínua | Consumo per capita de leite. |
oil |
Contínua | Consumo per capita de óleo. |
egg |
Contínua | Consumo per capita de ovos. |
alpha: Média dos gastos dos domicílios
de controle em 1991.year (sigma): Mudança
média nos gastos dos controles entre 1991 e 1998.dfmfd98 (beta): Diferença
média entre tratados e controles em 1991.dfmfdyr (delta):
Efeito causal estimado do programa.Y): Controlam fatores que
afetam os gastos independentemente do tratamento.a) Gere a variável
lexptot = log(1 + exptot).
b) Crie a variável dfmfd98:
df <- read.csv("base_greenbank_sms.csv")
df <- df %>%
mutate(
lnland = log(1 + hhland / 100),
lexptot = log(1 + exptot),
dfmfd1 = ifelse(dfmfd == 1 & year == 1, 1, 0)
) %>%
group_by(nh) %>%
mutate(dfmfd98 = max(dfmfd1)) %>%
ungroup() %>%
mutate(dfmfdyr = dfmfd98 * year)
c) Estime o modelo:
model_did_reg <- lm(lexptot ~ year + dfmfd98 + dfmfdyr, data = df)
summary(model_did_reg)
##
## Call:
## lm(formula = lexptot ~ year + dfmfd98 + dfmfdyr, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.37246 -0.29923 -0.05341 0.23732 2.32397
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 8.31048 0.02315 358.989 < 2e-16 ***
## year 0.14732 0.03274 4.500 7.28e-06 ***
## dfmfd98 -0.11457 0.03190 -3.591 0.000338 ***
## dfmfdyr 0.11138 0.04511 2.469 0.013657 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4578 on 1648 degrees of freedom
## Multiple R-squared: 0.05533, Adjusted R-squared: 0.05361
## F-statistic: 32.18 on 3 and 1648 DF, p-value: < 2.2e-16
d) Interprete o coeficiente de dfmfdyr.
O programa teve efeito sobre os gastos?
O valor do coeficiente para dfmfdyr foi de 0.11138, isso
significa que a participação no programa de microcrédito aumentou os
gastos per capita em aproximadamente 11.1% nos domicílios tratados, em
comparação com a evolução dos gastos nos domicílios do grupo de
controle. O p-valor associado a esse coeficiente é 0.013657, que é menor
que 0.05. Portanto, podemos concluir que o programa de microcrédito teve
um efeito causal positivo e estatisticamente significativo sobre os
gastos per capita dos domicílios que participaram.
e) Estenda com controles:
model_did_controls <- lm(
lexptot ~ year + dfmfd98 + dfmfdyr + sexhead + agehead + educhead +
lnland + vaccess + pcirr + rice + wheat + milk + oil + egg,
data = df
)
summary(model_did_controls)
##
## Call:
## lm(formula = lexptot ~ year + dfmfd98 + dfmfdyr + sexhead + agehead +
## educhead + lnland + vaccess + pcirr + rice + wheat + milk +
## oil + egg, data = df)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.13760 -0.26360 -0.03747 0.22421 2.19400
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 7.4827033 0.1973802 37.910 < 2e-16 ***
## year 0.2492511 0.0544887 4.574 5.14e-06 ***
## dfmfd98 -0.0056525 0.0296586 -0.191 0.84888
## dfmfdyr 0.0902307 0.0411774 2.191 0.02857 *
## sexhead -0.0799608 0.0400484 -1.997 0.04603 *
## agehead 0.0014507 0.0008442 1.718 0.08592 .
## educhead 0.0375293 0.0032732 11.466 < 2e-16 ***
## lnland 0.2083184 0.0219265 9.501 < 2e-16 ***
## vaccess -0.0232830 0.0353470 -0.659 0.51018
## pcirr 0.1116618 0.0352672 3.166 0.00157 **
## rice -0.0025519 0.0080894 -0.315 0.75245
## wheat 0.0039830 0.0096078 0.415 0.67852
## milk 0.0164985 0.0040377 4.086 4.60e-05 ***
## oil 0.0018047 0.0025388 0.711 0.47729
## egg 0.1205600 0.0370374 3.255 0.00116 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4141 on 1637 degrees of freedom
## Multiple R-squared: 0.232, Adjusted R-squared: 0.2254
## F-statistic: 35.32 on 14 and 1637 DF, p-value: < 2.2e-16
f) O efeito permanece significativo? Como interpretá-lo?
Sim, visto que o valor do coeficiente de dfmfdyr mudou
de 0.11138 para 0.0902307, isso significa que a participação no programa
de microcrédito está associada a um aumento de aproximadamente 9% nos
gastos per capita. O p-valor é de 0.02857, que continua abaixo de 0.05.
A inclusão das covariadas ajustou a estimativa, reduzindo-a de 11.1%
para 9%. Isso sugere que parte do aumento inicial nos gastos per capita
estava, na verdade, correlacionada com outras características dos
domicílios (como escolaridade, posse de terra, etc.). O modelo com
controles consegue isolar melhor o efeito puro do programa de
microcrédito.
g) Com base nas evidências, qual sua conclusão sobre a eficácia do programa?
Com base nas evidências dos modelos DiD, o programa de microcrédito pode ser considerado eficaz. A análise mostrou que a participação no programa resultou em um aumento estatisticamente significativo nos gastos per capita dos domicílios tratados, mesmo após o controle por diversas características demográficas e de consumo. A redução da estimativa do efeito de 11.1% para 9% com a inclusão dos controles reforça a robustez da conclusão. O efeito de 9% é uma estimativa mais precisa do impacto real do programa.
h) O modelo permite inferência causal? Justifique com base nos pressupostos e nos dados.
Sim, o modelo de Diferenças em Diferenças (DiD) permite a inferência causal, mas a validade dessa conclusão está diretamente ligada ao cumprimento do pressuposto de tendências paralelas, que é a base de toda a metodologia DiD. Cuja ideia fundamental por trás é que, na ausência do programa de microcrédito, a trajetória de evolução dos gastos per capita nos domicílios que participaram do programa teria sido a mesma que a trajetória dos domicílios que não participaram. Em outras palavras, os grupos de tratamento e controle seguiriam tendências idênticas ao longo do tempo.
No nosso caso, o coeficiente de dfmfdyr atua como o
estimador de impacto, capturando o desvio dessa tendência paralela. Como
observamos que este coeficiente é estatisticamente significativo, isso
sugere que a tendência do grupo de tratamento foi significativamente
diferente da tendência do grupo de controle. Atribuímos essa diferença
ao programa de microcrédito, pois é a única intervenção distinta entre
os dois grupos.
Além disso, a inclusão de variáveis de controle no segundo modelo
fortalece essa justificativa. Ao controlar por características como
educhead, lnland e outras, nós ajustamos para
possíveis diferenças iniciais entre os grupos que poderiam ter afetado
suas tendências de gastos ao longo do tempo. Esse ajuste aumenta nossa
confiança de que a suposição de tendências paralelas é mais plausível,
tornando a inferência causal do modelo mais robusta.
Portanto, a inferência causal é possível porque o DiD, juntamente com os controles adicionais, oferece uma metodologia para isolar o efeito do programa, separando-o das tendências de evolução naturais e das diferenças iniciais entre os grupos.
extra: i) Gere um gráfico mostrtando as trajetórias do controle, do tratamento e o contrafactural
df2 <- df %>%
mutate(
lnland = log(1 + hhland / 100),
lexptot = log(1 + exptot),
dfmfd1 = ifelse(dfmfd == 1 & year == 1, 1, 0)
) %>%
group_by(nh) %>%
mutate(dfmfd98 = max(dfmfd1)) %>%
ungroup() %>%
mutate(dfmfdyr = dfmfd98 * year)
# 1. calculando a media de lexptot por grupo e ano para o grafico
did_data_summary <- df2 %>%
group_by(year, dfmfd98) %>%
summarise(
mean_lexptot = mean(lexptot, na.rm = TRUE),
.groups = 'drop'
)
# 2. calculando a diferenca de tendencia para o contrafactual
# Diferença no grupo de controle (tendencia natural)
control_diff <- did_data_summary %>%
filter(dfmfd98 == 0) %>%
summarise(diff = mean_lexptot[year == 1] - mean_lexptot[year == 0]) %>%
pull(diff)
# media do grupo tratado em 1991 (ponto de partida do contrafactual)
treated_1991_mean <- did_data_summary %>%
filter(dfmfd98 == 1, year == 0) %>%
pull(mean_lexptot)
# ponto final do contrafactual
counterfactual_end <- treated_1991_mean + control_diff
# 3. gerando o grafico DiD com o contrafactual
ggplot(did_data_summary, aes(x = year, y = mean_lexptot, color = factor(dfmfd98))) +
# Adicionar as linhas dos grupos de tratamento e controle
geom_line(aes(group = dfmfd98), size = 1.2) +
geom_point(size = 3) +
# Adicionar a linha do contrafactual (pontilhada)
annotate(
"segment",
x = 0,
y = treated_1991_mean,
xend = 1,
yend = counterfactual_end,
linetype = "dashed",
color = "black",
size = 1.2
) +
# rotulos e anotações para o gráfico
labs(
title = "Efeito do Microcrédito nos Gastos per Capita (DiD)",
subtitle = "Linha pontilhada mostra o contrafactual",
y = "Log dos Gastos Per Capita (lexptot)",
x = "Ano",
color = "Grupo"
) +
scale_color_manual(
values = c("darkblue", "red"),
labels = c("Controle (não participou)", "Tratamento (participou)")
) +
scale_x_continuous(
breaks = c(0, 1),
labels = c("1991", "1998")
) +
theme_minimal() +
theme(legend.position = "bottom")