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

Documentos relacionados