{ advanced stata programming andrew hicks ccpr statistics and methods core

24
{ Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Upload: milton-lillie

Post on 01-Apr-2015

236 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

{

Advanced Stata Programming

Andrew HicksCCPR Statistics and Methods Core

Page 2: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Automating your work

1.Macros2.Saved Results3.Loops4.Egen commands5.Writing programs6.Ado files

Page 3: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

MacrosAssigns a string of text or a number to an abbreviation.

( a box you put text in)

local name content

local x 1

(italics indication something you provide)

display `x’

Page 4: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

MacrosAssigns a string of text or a number to an abbreviation.

local nobs = 198

display “The number of observations equals: `nobs’”

display `nobs’ – 90

Local macros can be used only within the do-file in which the are defined. • When the program ends, the macro disappear.

Global macros persist until you delete it or exit Stata.

local x 1

global x 1

Page 5: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

MacrosAssigns a string of text or a number to an abbreviation.

regress price headroom trunk weight length

local size “headroom trunk weight length”

`size’

regress price `size’

regress mpg `size’

regress gear_ratio `size’ foreign turn

( a box you put text in)

Page 6: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Results saved by StataStata provides the number so you don’t have to enterby hand.

summarize price

return list

generate price_centered2 = price – r(mean)

generate price_centered = price – 6165.257

Page 7: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Loops

summarize pricegenerate price_centered = price – r(mean)summarize mpggenerate mpg_centered = mpg – r(mean)summarize weightgenerate weight_centered = weight – r(mean)summarize lengthgenerate length_centered = weight – r(mean)summarize turngenerate turn_centered = turn – r(mean)summarize displacementgenerate displacement = displacement – r(mean)

Center 5 variables from Auto dataset: price, mpg, weight, length, turn, displacement

Manually:

Page 8: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Foreach Loops

foreach var in price mpg weight length turn displacement {summarize `var’generate `var’_centered2 = `var’ – r(mean)

}

Center 6 variables from Auto dataset: price, mpg, weight, length, turn, displacement

Loop (foreach):

1. summarize pricegenerate price_centered2 = price – r(mean)

2. summarize mpggenerate mpg_centered2 = mpg – r(mean)

.

.

6. summarize displacementgenerate displacement_centered2 = displacement – r(mean)

Page 9: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Foreach Loops

foreach depvar in weight length turn displacement {regress `depvar’ price mpg headroom trunk

}

Loop (foreach):

foreach item in quest1 qeust2 qeust3 quest4 {replace `item’=. if `item’ == 99

}

foreach item of varlist quest* {replace `item’=. if `item’ == 99

}

foreach depvar of varlist weight-displacement {regress `depvar’ price mpg headroom trunk

}

Page 10: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Foreach Loops

generate taxinc1 = inc1 * .10generate taxinc2 = inc2 * .10generate taxinc3 = inc3 * .10generate taxinc4 = inc4 * .10generate taxinc5 = inc5 * .10generate taxinc6 = inc6 * .10generate taxinc7 = inc7 * .10generate taxinc8 = inc8 * .10generate taxinc9 = inc9 * .10generate taxinc10 = inc10 * .10generate taxinc11 = inc11 * .10generate taxinc12 = inc12 * .10

Create your own foreach loop:

foreach lname in list { commands referring to lname}

Page 11: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Forvalues Loops

gen hadInc1990 = (inc1990>0) if inc1990<.gen hadInc1991 = (inc1991>0) if inc1991<...gen hadInc2009 = (inc2009>0) if inc2009<.gen hadInc2010 = (inc2010>0) if inc2010<.

Page 12: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Forvalues Loops

forvalues year=1990/2010 {gen hadInc`year’=(inc`year’>0) if inc`year’<.

}

Loop (forvalues):

Page 13: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Forvalues LoopsLoop (forvalues):

forvalues year=1990/2010 {gen hadInc`year’=(inc`year’>0) if inc`year’<.

}

forvalues year=1990(2)2010 {gen hadInc`year’=(inc`year’>0) if inc`year’<.

}

foreach year of numlist 1980 1983 1990{gen hadInc`year’=(inc`year’>0) if inc`year’<.

}

forvalues race=1/3 { svy, subpop(if race==`race’): regress income age i.education}

levelsof race, local(races)foreach race in races { svy, subpop(if race==`race’): regress income age i.education}

Page 14: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Forvalues Loops

generate taxinc1 = inc1 * .10generate taxinc2 = inc2 * .10generate taxinc3 = inc3 * .10generate taxinc4 = inc4 * .10generate taxinc5 = inc5 * .10generate taxinc6 = inc6 * .10generate taxinc7 = inc7 * .10generate taxinc8 = inc8 * .10generate taxinc9 = inc9 * .10generate taxinc10 = inc10 * .10generate taxinc11 = inc11 * .10generate taxinc12 = inc12 * .10

Create your own forval loop:

forvalues lname = range { commands referring to lname}

Page 15: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Nested Loopsforval i=1/3 { forval j=1/3 {

display “`i’, `j’” }}

Page 16: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Nested Loops

forval year = 1990/2010 { foreach month in Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec { gen hadInc`month’`year’ = (inc`month’`year’>0) if inc`month’`year’<. }}

Page 17: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Loops with counterlocal counter = 0foreach var in price mpg weight length turn displacement {

local counter = `counter’ + 1display “`counter’ - `var’”

}

local counter = `counter’ + 1local ++counter

local ++counter

Page 18: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

While Loops

foreach and forvalues loops repeat a command a set number of times:

forval i=1/5 { display `i’}

while loops repeat until a condition is no longer true:

local i 1while `i’<=5 { display `i++’}

Page 19: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Egen commands

Take the average:

generate mean_score = (read + write + math + science)/4

But if any single score is missing, the total score will be missingSolution:

egen mean_score = rowmean(read write math science)

egen mean_score = rowmean(score1 score2 score3 score4)

egen mean_score = rowmean(score*)

= rowtotal(score*)

= rowmax(score*)

= rowmin(score*)

Page 20: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Egen commandsrowmean( ) averages across variables

mean( ) averages across observations

egen mean_read = mean(read)

egen schooltype_mean_read = mean(read), by(schtyp)

Page 21: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Writing programsA simple program:

program define hellodi “Hello World”end

A more complicated program:

capture program drop helloprogram define hellodi “Hello `1’”end

An even more complicated program:

capture program drop helloprogram define hellodi “Hello `0’”end

Page 22: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Writing programsA program to center variables:

program define demeanforeach var of local 0 {quietly: sum `var'replace `var'=`var'-r(mean)}end

Page 23: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Writing programsA program to center variables:

program define demean foreach var of local 0 { capture confirm numeric variable `var' if _rc==0 { sum `var',meanonly replace `var'=`var'-r(mean) } else di "`var' is not a numeric variable and cannot be demeaned." } end

Page 24: { Advanced Stata Programming Andrew Hicks CCPR Statistics and Methods Core

Ado filesHow to make an ado file:

1. Write a program in a do-file

2. Save the do-file with .ado extension demean.ado

3. Put the .ado file in your personal ado directorysysdir

PERSONAL: c:\ado\personal\

4. Use your ado program just like any other Stata command