Programação Stata - Henrique Dantas Neder
Transcrição
Programação Stata - Henrique Dantas Neder
Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Programação Stata Henrique Neder1 1 Instituto de Economia Universidade Federal de Uberlândia Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Sumário 1 Introdução 2 Vericações em arquivos: o comando assert 3 Indexação 4 Macros 5 Ramicações e loopings Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Introdução Esta apresentação é baseada no material do NetCourse151 An Introduction do Stata Programming da Stata Corp LP Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Introdução Inicialmente vamos criar um diretório chamado lecture1 e salvar neste diretório alguns arquivos através dos seguintes comandos: cd "/home/hdneder/Dropbox/DISCIPLINA OPTATIVA POSGRADUACAO/CURSO PROGRAMACAO STATA" mkdir lecture1 cd lecture1 run http://www.stata.com/courses/nc151-10/lec1.do display "Hello, world" do crcars1 Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Primeiro método: o dole DO-FILE: hello.do display "Hello, world" exit ============== Digite na linha de comandos: do hello ============== O Stata executa o seguinte comando: display "Hello, world" ============== Aparece na janela de resultados: Hello, world end of do-le Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Segundo método: o comando program interativo Digite, interativamente, os seguintes comandos na linha de comando: program hello 1. display "Hello, world" 2. end O Stata armazena na memória de programas o programa denominado hello. Digite na linha de comandos: hello Aparece na janela de resultados: Hello, world Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Terceiro método: programa em um dole DO-FILE: hello.do program hello display "Hello, world" end exit ============== Digite na linha de comandos: program drop hello do hello ============== O Stata não executa nada. Apenas armazena o programa hello na memória de programas. Para executar o programa: hello Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como fazer vericações em arquivos - comando assert Construa a seguinte sequência de comandos em um dole chamado ver1.do: capture log close log using ver1, replace set more o * The documentation says make and model * is a string and implies it is always dened: assert mandm != "" * documentation implies price is always dened. assert price<. & price>0 * Normally, I would not include all these comments. * Continuing ... assert mpg<. & mpg>0 assert foreign==0 | foreign==1 assert weight<. & weight>0 assert displacement<. & displacement>0 log close exit ============================= Execute agora o comando: do ver1 Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Indexação Quando executamos o comando: generate age2 = age*age É como se o Stata executasse o seguinte loop: for each observação nos dados { generate age2 = age*age na observação corrente } Quando executamos o comando: generate y = x[1] É como se o Stata executasse o seguinte loop: for each observation in the data { generate y = a primeira observação em x } Os dois seguintes comandos são equivalentes: generate y = x[_n] generate y = x O comando: generate y = x[_n-1] Gera observações defasadas de x com y[1] igual a missing Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Indexação generate y = x[_n+1] Produz em y valores avançados de x sendo y[_N} missing. generate y = x[_N] Produz em cada observação de y o último valor de x. generate y = x[_N-_n+1] Produz em y os valores em ordem inversa de x. Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Macros Um exemplo de uso de macros local list = "age weight sex" regress outcome `list' é o mesmo que: regress outcome age weight sex Como macros podem ser usadas? local cntrl = long list of variables regress ln_earn `cntrl' regress ln_earn `cntrl' if female regress ln_earn `cntrl' if !female regress ln_earn `cntrl' female Isto não apenas reduz a quantidade de caracteres a serem digitados em meu dole como o torna mais legível assim como reduz a probabilidade de cometer erros. Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Macros O uso de macros não é limitado a denição de lista de variáveis. Elas podem conter qualquer coisa. Por exemplo: em um dole preciso executar diversos comandos em uma sub-amostra complicada dos meus dados. local if "if (hours>0 | hours>=.) & weeks>0 & earn>0 & earn/weeks>100" summarize ... `if' tabulate ... `if' regress ... `if' Macros também podem conter valores numéricos: . local a = -4.57213 . local b = 2.12394 . local c = .72195 . di ( -`b' + sqrt((`b')^2 - 4*`a'*`c') ) / (2*`a') -.22800334 Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Macros Note que acima usamos (`b')^2. Porque não usamos simplesmente `b'^2? Porque quando o Stata está executando linhas, faz o seguinte: 1 Substitui todas as macros por seus valores 2 Executa a linha Se o valor contido na mabro `b' for negativo, a precedência de operação teria aplicado o operador potência primeiro e depois colocado o sinal negativo. Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Macros As vezes necessito utilizar um resultado previo e introduzir este resultado em um comando posterior. Suponha que sejam obtidos os percentis 5 e 95 para a variável income. Utilizando a sub-amostra dentro do intervalo entre estes dois percentis aplicamos o comando summarize para outras variáveis e executamos uma regressão. Somos tentados a escrever no dole: summarize income, detail summarize varlist if r(p5)<income & income<r(p95), detail regress ... if r(p5)<income & income<r(p95) Mas isto não funciona porque executando o segundo comando summarize os valores de r(p5) e r(p95) são resetados. Uma solução mais adequada, usando macros, seria: summarize income, detail local lo = r(p5) local hi = r(p95) summarize varlist if `lo'<income & income<`hi', detail regress ... if `lo'<income & income<`hi' Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Ramicações e loopings Um looping simples pode ser: program ten forvalues i = 1(1)10 { display "`i'" } end ten Outra forma de executar a mesma coisa é: program ten_w local i = 1 /* local i 1 would be okay, too */ while `i' <= 10 { display `i' local i = `i' + 1 } end ten_w Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Looping ao longo das observações cd "/home/hdneder/Dropbox/DISCIPLINA OPTATIVA POSGRADUACAO/CURSO PROGRAMACAO STATA/lecture2/" inle using "patient.dct", clear program lister local N = _N forvalues i = 1(1)`N' { display /* a blank line */ display name[`i'] display _column(10) "sex " sex[`i'] _skip(5) /* */ "age " age[`i'] _skip(5) /* */ "length of stay " los[`i'] } end lister Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento Uma das formas muito úteis em programação no Stata é o uso da dupla de comandos postle e post. No exemplo a seguir abriremos uma arquivo de microdados da PNAD, iremos fazer uma sequência de cálculos de elasticidades da pobreza-Gini e elasticidades da pobreza-crescimento para cada unidade da Federação e armazenaremos cada resultado em uma linha do arquivo denido pelo comando postle. Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento Programa de cálculo da elasticidade-crescimento e elasticidade-Gini da pobreza. Método desenvolvido por Datt (1998). Computational Tools for Poverty Measurement and Analysis. FCND DISCUSSION PAPER NO. 50. cd "/home/hdneder/Dropbox/DISCIPLINA OPTATIVA POSGRADUACAO/PNAD1995/DADOS/" set more o postutil clear postle saidaelast uf neta1 neta2 neta3 neta4 neta5 neta6 p0 p1 p2 gini using saidaelast, replace O comando postutil clear limpa a memória de post. O comando postle dene um arquivo de post (um arquivo exerno) onde serão salvos os resultados de um processamento de uma rotina. Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento ************************************************ * rotina de calculo de elasticidades da pobreza ************************************************ capture program drop elast program dene elast summarize rendapc [fw=v4729] scalar mu = r(mean) summarize lp O comando capture program drop deleta qualquer programa com nome elast que estiver na memória do Stata. O comando program dene inicia a rotina chamada elast que será nalizada com o comando end mais adiante. Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento Todos os procedimentos computacionais desta rotina são descritos em Datt(1998) e foram aqui aplicados na linguagem computacional do Stata scalar z = r(mean) glcurve rendapc [fw=v4729], gl(L1) p(p) nograph generate L = L1/mu * Especicação da Curva de Lorenz: Quadrática Geral generate y1 = L*(1-L) generate x1 = p^2 - L generate x2 = L*(p-1) generate x3 = p - L regress y x1 x2 x3 Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento * vericar se o intercepto é não signicativo regress y x1 x2 x3, noconstant matrix b1 = e(b) scalar a = b1[1,1] scalar b = b1[1,2] scalar c = b1[1,3] scalar e = -(a + b + c + 1) scalar m = b^2 - 4*a scalar n = 2*b*e - 4*c Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento scalar r1 = (n^2 - 4*m*(e^2))^(1/2) scalar s1 = (r1 - n)/(2*m) scalar s2 = -(r1 + n)/(2*m) scalar H = -(1 / (2*m))*(n + r1*(b+2*z/mu)*((b+2*z/mu)^2-m)^(-1/2)) scalar LH = -(1/2)*(b*H + e + (m*H^2 + n*H + e^2)^(1/2)) scalar PG = H - (mu/z)*LH scalar P2 = 2*PG - H - ((mu/z)^2)*(a*H + b*LH (r1/16)*ln((1-H/s1)/(1-H/s2))) Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento * calculo da segunda derivada da curva de Lorenz scalar L2H = (r1^2*(m*H^2 + n*H + e^2)^(-3/2))/8 * calculo do indice de Gini if m < 0 { scalar gini = e/2 - n*(b + 2)/(4*m) + r1^2 / (8*m*sqrt(-m))*(asin((2*m + n)/r1) - asin(n/r1)) } else { scalar gini = e/2 - n*(b + 2)/(4*m) + r1^2 / (8*m*sqrt(m))*ln(abs((2*m + n + 2*sqrt(m)*(a + c - 1))/(n - 2* e * sqrt(m)))) } Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento * calculo das elasticidades da pobreza com relação à média µ (designada pelo escalar mu) scalar neta1 = - z/(mu*H*L2H) scalar neta2 = 1 - H/PG scalar neta3 = 2*(1-PG / P2) scalar neta4 = (1 - z / mu) / (H*L2H) scalar neta5 = 1 + (mu/z - 1)*H/PG scalar neta6 = 2*(1 + (mu/z - 1)*PG /P2) post saidaelast (uf) (neta1) (neta2) (neta3) (neta4) (neta5) (neta6) (H) (PG) (P2) (gini) end Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento O comando post grava um registro no arquivo denido pelo comando postile de acordo com a mesma sequência de variáveis que foram denidas anteriormente. cd "/home/hdneder/Dropbox/DISCIPLINA OPTATIVA POSGRADUACAO/PNAD1995/DADOS/" foreach uf of numlist 17 21(1)29 31 32 33 35 41(1)43 50(1)53 { use pnad95.dta, clear keep if uf == `uf' keep rendapc v4729 lp scalar uf = `uf' elast } postclose saidaelast use saidaelast, clear Henrique Neder Programação Stata edit Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Como alimentar arquivos externos com resultados de processamento O comando foreach executa um looping apenas para os valores listados da macro local `uf' Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Exemplo de administração de dados cd "/home/hdneder/Dropbox/DISCIPLINA OPTATIVA POSGRADUACAO/CURSO PROGRAMACAO STATA/" mkdir lecture3 cd lecture3 run http://www.stata.com/courses/nc151-10/lec3.do Henrique Neder Programação Stata Introdução Vericações em arquivos: o comando assert Indexação Macros Ramicações e loopings Exemplo de administração de dados cd "/home/hdneder/Dropbox/DISCIPLINA OPTATIVA POSGRADUACAO/CURSO PROGRAMACAO STATA/lecture3" capture log close set more o log using crone, replace clear inle using pat save pat1, replace clear inle using hlog save hlog1, replace log close exit Henrique Neder Programação Stata