********************************************** * Material prático: PSM, DD e ES ************* * Elaboração: Paula Pereda e Bruno Palialol ** * Última atualização: 17/11/2020 ************* ********************************************** cd "C:\Users\paula\Dropbox\FEA - aulas\Posgraduacao\Politicas Públicas\Curso 2020\Aula Pratica" ***************************************************************************************************************** * 1) Exercício usando PS: * Fonte: "Fundação Itaú Social. Avaliação Econômica de Projetos Sociais. Exercícios Práticos: 1." * Descrição: O programa “Brasil Melhor” –fictício – visa melhorar o desempenho escolar dos alunos do ensino fundamental. Esse programa foi desenvolvido com 245 alunos da Escola Estadual João dos Santos. A escola possui ao todo 745 alunos. O desenho do programa não abrangia a sua avaliação de impacto que foi implementada após um ano de seu funcionamento. Dessa forma, só foi possível obter informações em um momento no tempo – depois do programa implementado. O banco de dados “PSM1” apresenta informações sobre a nota no exame de proficiência realizado em toda a escola fundamental, a participação no programa, o sexo, a cor e os anos de estudos da mãe do aluno. clear use "PSM1.dta" * a) Calcule o impacto do programa supondo que o experimento foi aleatório. Analise os resultados. reg nota tratado ttest nota, by(tratado) * b) Faça o teste de diferença de médias para as variáveis: sexo; cor; anos de estudos da mãe. O grupo tratado e controle apresentam diferenças estatisticamente significativas nas características médias? O que podemos concluir com este teste? foreach j in mulher cor estudo_mae { ttest `j', by(tratado) } . pstest mulher cor estudo_mae, treated(tratado) raw graph * c) Calcule o impacto do programa supondo que o experimento foi não aleatório pelo método de regressão MQO, usando todos os não tratados como controle. Analise os resultados. reg nota tratado mulher cor estudo_mae * d) Calcule o impacto do programa supondo que o experimento foi não aleatório das seguintes formas: * i. Pareamento por escore de propensão (um para um). Considere apenas o vizinho mais próximo e com reposição; set seed 1234 gen random = uniform() sort random psmatch2 tratado mulher cor estudo_mae, out(nota) common logit pstest mulher cor estudo_mae, t(tratado) graph both psmatch2 tratado mulher cor estudo_mae, out(nota) common trim(10) psgraph /* Observações: common: opção para garantir suporte comum (Informação no help: "imposes a common support by dropping treatment observations whose pscore is higher than the maximum or less than the minimum pscore of the controls") logit: usa logit ao invés de probit (default) para estimar o propensity score. trim: corta observações no limite inferior esquerdo */ * ii. Pareamento por escore de propensão (um para um). Considere os 3 vizinhos mais próximos e com reposição; psmatch2 tratado mulher cor estudo_mae, out(nota) common neighbor(3) pstest * iii. Pareamento por escore de propensão (um para um). Considere apenas o vizinho mais próximo e sem reposição; psmatch2 tratado mulher cor estudo_mae, out(nota) common noreplacement pstest * iv. Pareamento por escore de propensão (um para um). Considere apenas o vizinho mais próximo e com reposição, incluindo um critério de proximidade do escore de propensão dos indivíduos tratados em relação ao escore de propensão dos indivíduos não-tratados (|diferença|<=0.05); psmatch2 tratado mulher cor estudo_mae, out(nota) common caliper(0.05) pstest mulher cor estudo_mae, t(tratado) graph both * v. Reponderação; reg nota tratado mulher cor estudo_mae if _support==1 [aw=_weight] * e) Faça o teste de diferença de médias para as variáveis: sexo; cor; anos de estudos da mãe. Utilize apenas o grupo de controle selecionado pelo pareamento. Compare o resultado deste teste de médias com o realizado na letra b. O que podemos concluir com esta comparação? psmatch2 tratado mulher cor estudo_mae, out(nota) common logit pstest mulher cor estudo_mae, t(tratado) graph both * f) Verifique através de um gráfico se temos indícios de que há suporte comum. Faça o gráfico do escore de propensão para os tratados e controles selecionados pelo método de pareamento. O que podemos concluir com este gráfico? psgraph tw Kdensity _pscore if _treated==1 [aw=_weight], lc(blue) /// || Kdensity _pscore if _treated==0 [aw=_weight], lc(red) /// ,xtitle("Valor do PS") ytitle("") /// legend(label(1 "Tratado") /// label(2 "Controle")) /// title("Função de Densidade do Propensity Score") /// subtitle("") * Queremos verificar se as distribuições de propensity score são parecidas entre os grupos de tratamento e controle. Elas não precisam ser exatamente iguais, mas também não podem ser muito diferentes. Temos indícios de que temos problemas quando não há observações em algum trecho de alguma delas (estamos comparando grupos muito distintos). * g) Repita os procedimentos de “e” a “g” utilizando as metodologias de pareamento por escore de propensão – raio e método de Kernel. * Raio: psmatch2 tratado mulher cor estudo_mae, out(nota) common radius caliper(0.05) pstest mulher cor estudo_mae, t(tratado) graph both psgraph * Kernel: psmatch2 tratado mulher cor estudo_mae, out(nota) common kernel kerneltype(normal) * Bandwidth default = 0,06. pstest mulher cor estudo_mae, t(tratado) graph both psgraph **Alternativa de comando para realização do PSM global xlist mulher cor estudo_mae /*controles*/ teffects psmatch (nota) (tratado $xlist, logit), atet teffects psmatch (nota) (tratado $xlist, logit), nn(10) atet teffects psmatch (nota) (tratado $xlist, logit), nn(10) caliper(0.2) atet ***************************************************************************************************************** * 2) Exercício de DD: * Fonte: "Fundação Itaú Social. Avaliação Econômica de Projetos Sociais. Exercícios Práticos: 1." * Descrição: O programa “Mulher do Futuro” – fictício – objetiva aumentar a renda de famílias chefiadas por mulheres. Para isso, oferece cursos profissionalizantes em diversas áreas e ajuda na inserção das participantes no mercado de trabalho, por meio de convênios com empresas. Os cursos duram em média seis meses. A avaliação de impacto do programa foi pensada desde sua concepção. Assim, realizou-se uma pesquisa com as participantes e não participantes antes da implementação. Dois anos após o início do programa, o grupo de avaliação voltou a campo e novamente coletou informações sobre as mulheres. O banco de dados “DDM” contém as informações em dois momentos no tempo – escolaridade, idade, se o domicílio possui luz elétrica, se a mulher vive com cônjuge e a renda familiar per capita. clear use "DDM.dta" * a) Na base de dados em questão, quantas mulheres participaram do programa? Quantas não participaram? tab tratado if tempo==1 * b) Qual é a média da renda familiar per capita antes e depois do tratamento para cada grupo? bysort tempo tratado: sum renda_pc * c) Suponha que o experimento foi aleatório e que possuímos dados do programa em um momento do tempo - após o programa. Calcule o impacto na renda per capita. ttest renda_pc if tempo==1, by(tratado) reg renda_pc tratado if tempo==1 * d) Faça o teste de diferença de médias entre os grupos de tratamento e controle para as variáveis: escolaridade, idade, luz e cônjuge no período após o programa. Interprete os resultados. ttest escolaridade if tempo==1, by(tratado) ttest idade if tempo==1, by(tratado) ttest conjuge if tempo==1, by(tratado) ttest luz if tempo==1, by(tratado) * e) Calcule o impacto do programa controlando para as variáveis observáveis, ainda supondo os dados em um momento do tempo - após o programa. Esse resultado mostrou alguma diferença para o obtido na letra d? Se sim, explique. reg renda_pc tratado escolaridade idade luz conjuge if tempo==1 * f) Calcule o impacto do programa pelo método de diferenças em diferenças. Analise os resultados. * Sem controles reg renda_pc 1.tratado#1.tempo tratado tempo * Com controles reg renda_pc 1.tratado#1.tempo tratado tempo escolaridade idade luz conjuge * g) Faça uma análise descritiva e o teste de diferença de médias das características dos participantes e não participantes antes do início do programa. O que podemos concluir dos resultados dos testes? tabstat renda_pc escolaridade idade luz conjuge if tempo==0, c(s) s(mean, sd, min, max, n) tabstat renda_pc escolaridade idade luz conjuge if tempo==0 & tratado==0, c(s) s(mean, sd, min, max, n) tabstat renda_pc escolaridade idade luz conjuge if tempo==0 & tratado==1, c(s) s(mean, sd, min, max, n) ttest renda_pc if tempo==0, by(tratado) ttest escolaridade if tempo==0, by(tratado) ttest idade if tempo==0, by(tratado) ttest luz if tempo==0, by(tratado) ttest conjuge if tempo==0, by(tratado) * h) Calcule o impacto do programa combinando o método de pareamento com o de diferenças em diferenças. * Convertendo o formato da base keep ID renda_pc escolaridade idade luz conjuge tempo tratado reshape wide renda_pc escolaridade idade luz conjuge tratado, i(ID) j(tempo) * Pareando no tempo zero PSM por vizinho mais próximo set seed 1234 gen aleatorio=uniform() sort aleatorio psmatch2 tratado0 escolaridade0 idade0 luz0 conjuge0 , out(renda_pc0) common logit * Convertendo novamente o formato da base reshape long renda_pc escolaridade idade luz conjuge tratado , i(ID) j(tempo) * Estimando DD, com amostra pareada reg renda_pc 1.tratado#1.tempo tratado tempo escolaridade idade luz conjuge if _support==1 [aw=_weight] * Alternativa: Estimando DD, com prop score weighting: * Criar pesos: gen ate_w=1/(1-_pscore) if tratado==0 replace ate_w=1/_pscore if tratado==1 //PSW com DD reg renda_pc 1.tratado#1.tempo tratado tempo escolaridade idade luz conjuge [pweight=ate_w], robust ***************************************************************************************************************** * 3) Exercício de outros métodos usando PS e dados do livro Guo e Fraser (2015): * Exemplo 1 (treatreg): Data from National Survey of Child and Adolescent Well-being (NSCAW) *** * A National Survey of Child and Adolescent Well-Being (NSCAW) é uma pesquisa longitudinal de âmbito nacional a respeito de crianças e famílias que foram investigadas pelos órgãos encarregados de proteger as crianças. A pesquisa é dividida em duas coortes de crianças envolvidas na pesquisa. Os dados provêm de formulários respondidos por crianças, por pais e outros cuidadores, por funcionários do Serviço Social e por professores e também de registros administrativos. O objetivo da NSCAW é examinar o bem-estar infantil e o familiar em detalhes e busca relacioná-los com as experiências da criança com o serviço de proteção e com as características da família e da comunidade de entorno (dentre outros fatores). (http://www.acf.hhs.gov/programs/opre/research/project/national-survey-of-child-and-adolescent-well-being-nscaw). *A NSCAW 2004 versa sobre 5.501 crianças de 0 a 14 anos (na data da pesquisa) que foram investigadas por serviços de proteção infantil após uma denúncia de maus-tratos (abuso ou neglicência, por exemplo) entre Outubro de 1999 e Dezembro de 2000 (p. 112). *A análise do exemplo de Guo e Fraser se baseia nos dados da NSCAW Wave 2 (seguimento após 18 meses) e busca responder o seguinte: *1. Como estavam as crianças cujos cuidadores receberam tratamento por abuso de substâncias após 18 meses de envolvimento com o serviço de proteção? *2. Como se comparavam as crianças cujos cuidadores receberam tratamento com as crianças cujos cuidadores não receberam esse tipo de tratamento? *A medida do desempenho Psicológico é pelo Children’s Behaviour Checklist (CBCL) de Achenbach (1991) . Nesta medida, quanto maior o score, maior é a extensão dos problemas comportamentais da criança. * Variáveis: * aodserve Cuidadores receberam tratamento por abuso de substâncias * arrest Cuidador já foi preso * bahigh Cuidador tem ES completo * black Criança negra * cgneed Cuidador reporta necessidade de tratamento para álcool ou outras drogas * cgrage1 Cuidador tem menos que 35 anos * cgrage2 Cuidador tem entre 35 e 44 anos * cgrage3 Cuidador tem entre 45 e 54 anos * chdage2 Criança tem 4 ou 5 anos * chdage3 Criança tem entre 6 e 10 anos * cidi Cuidador tem necessidade de tratamento para álcool ou outras drogas de acordo com questionário CIDI-SF da OMS * cra47a Cuidador para pagar as necessidades básicas * employ Cuidador estava empregado * extern Child-Behavior Checklist Externalizing score * high Cuidador tem EM completo * hispanic Criança hispânica * intern Child-Behavior Checklist Internalizing score * married Cuidador casado * mental Cuidador com problemas mentais * natam Crianca indigena * open Caso ainda aberto no Child Protection Service * other Cuidador falhou/abusou da criança de uma forma não listada (sem ser fisicamente) * provide 1, se o cuidador falhou em prover 0, cc. * pbc_ept Externalizing score segundo o questionário preenchido pelo parent * pbc_ipt Internalizing score segundo o questionário preenchido pelo parent * pbc_tpt Internalizing + Externalizing score segundo o questionário preenchido pelo parent * provide Cuidador falhou em prover materialmente * psh17a Cuidador tem histórico de tratamento para álcool ou outras drogas * ra Avaliação indica presença de risco * sexual Cuidador abusou sexualmente da criança * supervis Cuidador falhou em supervisionar clear use treatreg_NSCAW.dta, replace global X black hispanic natam chdage2 chdage3 ra global Z cgrage1 cgrage2 cgrage3 high bahigh employ open sexual provide supervis other cra47a mental arrest psh17a cidi cgneed ** Propensity Score Matching ** * Dois modelos para o propensity score com diferentes covariadas: //logistic 1 logistic aodserv married high bahigh poverty2 poverty3 /// poverty4 poverty5 employ open black hispanic natam chdage1 chdage2 /// chdage3 cgrage1 cgrage2 cgrage3 cra47a mental arrest psh17a /// sexual provide supervis other, coef predict p1 //logistic 2 logistic aodserv married high bahigh poverty2 poverty3 /// poverty4 poverty5 employ open black hispanic natam chdage1 chdage2 /// chdage3 cgrage1 cgrage2 cgrage3 cra47a mental arrest psh17a /// sexual provide supervis other ra cidi cgneed, coef predict p2 // Teste Bivariado antes do test before matching: Teste de Balanceamento foreach j in married high bahigh poverty2 poverty3 poverty4 poverty5 employ open black hispanic natam chdage1 chdage2 chdage3 cra47a mental arrest psh17a employ sexual other supervis { tab `j' aodserv if p1 !=., chi2 row } //PSM baseado na reg Logistica 1 //- Nearest neighbor com caliper .25*SD drop if p1==. gen logit1=log((1-p1)/p1) sum logit1 display .25*1.358782 generate x=uniform() sort x // Nearest neighbor com caliper .1 sort x psmatch2 aodserv, pscore(logit1) caliper(.1) noreplacement out(extern) // Mahalanobis 1 com mesmas covariadas da logistica 1 sort x // Mahalanobis sem propensity score psmatch2 aodserv, mahal(married high bahigh poverty2 poverty3 /// poverty4 poverty5 employ open black hispanic natam chdage1 chdage2 /// chdage3 cgrage1 cgrage2 cgrage3 cra47a mental arrest psh17a /// sexual provide supervis other) out(extern) // Mahalanobis com covariadas e propensity score sort x // Mahalanobis com propensity score psmatch2 aodserv, mahal(married high bahigh poverty2 poverty3 poverty4 /// poverty5 employ open black hispanic natam chdage1 chdage2 chdage3 /// cgrage1 cgrage2 cgrage3 mental arrest sexual provide /// supervis other) pscore(logit1) out(extern) *** Para estimar ATT bootstrap r(att), reps(1000): psmatch2 aodserv, pscore(logit1) caliper(.3396955) noreplacement out(extern) ** Propensity Score Weighting ** // Usar dados com p-score criado //Criar weights gen ate_w=1/(1-p1) if aodserv==0 replace ate_w=1/p1 if aodserv==1 //PSW regress extern $X aodserv [pweight=ate_w], robust regress intern $X aodserv [pweight=ate_w], robust //Checando desbalanceamento logistic hispanic aodserv [pweight=ate_w], coef robust logistic ra aodserv [pweight=ate_w], coef robust logistic black aodserv [pweight=ate_w], coef robust regress natam aodserv [pweight=ate_w], robust regress chdage2 aodserv [pweight=ate_w], robust regress chdage3 aodserv [pweight=ate_w], robust ** Estimador não paramétrico** * kernel-based matching sort x * Local linear reg: psmatch2 aodserv, outcome(extern) pscore(logit1) llr bs "psmatch2 aodserv, outcome(extern) pscore(logit1) llr" "r(att)" * Kernel: psmatch2 aodserv, outcome(extern) pscore(logit1) kernel kerneltype(tricube) ** Outros Testes de Balanceamento ** //Test Sample Balance on Covariates using Wilcoxon Rank-Sum(Mann-Whitney) test ranksum black, by(aodserv) ttest black, by(aodserv) ksmirnov black, by(aodserv) clear **************************************************************************************************** ** 4) Exemplo de ES * Dados de Stevenson e Wolfers (2006): reforma da lei de divórcios (tirando a culpa das partes) nos EUA e seus efeitos sobre suicidio feminino. * Painel balanceado de 49 estados americanos entre 1964-1996 com diferentes timings da reforma entre os estados. webuse set www.damianclarke.net/stata/ webuse bacon_example.dta, clear * asmrs: female suicide rate for all women in state s at time t, * year: ano dos dados * stfips: identificador dos estados * post=1 after the implementation of a no-fault divorce reform * Xst = vector of covariates Per-Capita Income (pcinc), Homicide Mortality (asmrh) and the Aid to Families with * Dependent Children (AFDC) rate for a family of four (cases). * Event: _nfd (no-fault reform) xtset stfips year gen timeToTreat = year - _nfd * Usando o default método (regress): eventdd asmrs pcinc asmrh cases i.year i.stfips, timevar(timeToTreat) ci(rcap) cluster(stfips) graph_op(ytitle("Suicides per 1m Women") xlabel(-20(5)25)) test lag21 lag20 lag19 lag18 lag17 lag16 lag15 lag14 lag13 lag12 lag11 lag10 lag9 lag8 lag7 lag6 lag5 lag4 lag3 lag2 * amostra desbalanceada nos lags mais antigos (problemas de composição): Pode-se usar o "inrange" ou "balanced" * inrange: eventdd asmrs pcinc asmrh cases i.year, fe timevar(timeToTreat) ci(rcap) inrange lags(10) leads(10) cluster(stfips) graph_op(ytitle("Suicides per 1m Women")) test lag10 lag9 lag8 lag7 lag6 lag5 lag4 lag3 lag2 * balanced: eventdd asmrs pcinc asmrh cases i.year, fe timevar(timeToTreat) ci(rcap) balanced cluster(stfips) graph_op(ytitle("Suicides per 1m Women")) * Usando o reghdfe (high-dimension FEs): eventdd asmrs pcinc asmrh cases, hdfe absorb(i.stfips i.year) timevar(timeToTreat) ci(rcap) cluster(stfips) graph_op(ytitle("Suicides per 1m Women") xlabel(-20(5)25)) * Usando o wild-bootstrap (para menos de 40-50 tratados): eventdd asmrs pcinc asmrh cases i.year, fe timevar(timeToTreat) ci(rcap) cluster(stfips) accum lags(10) leads(10) wboot wboot_op(seed(1234)) graph_op(ytitle( "Suicides per 1m Women"))