Intro Forskningsassistent Stata Guide

User Manual:

Open the PDF directly: View PDF PDF.
Page Count: 32

DownloadIntro - Forskningsassistent Stata Guide
Open PDF In BrowserView PDF
Intro - Forskningsassistent
Jakob Jul Elben
22/02/2017

Contents
1 SAS
2 Stata
2.1 Batchfil . . . . . . . . . . . . . .
2.2 Grundlæggende . . . . . . . . . .
2.3 Databehandling . . . . . . . . . .
2.3.1 Variable . . . . . . . . . .
2.3.2 Sortering og gruppering af
2.3.3 Labels . . . . . . . . . . .
2.4 Analyse . . . . . . . . . . . . . .
2.4.1 Dataoverblik . . . . . . .
2.4.2 Export af tabstat . . . . .
2.4.3 Regressioner . . . . . . .
2.5 Smart tricks . . . . . . . . . . . .
2.6 Figurer . . . . . . . . . . . . . .
2.7 Locals, globals og loops . . . . .
2.8 Postfile . . . . . . . . . . . . . .
2.9 Esttab . . . . . . . . . . . . . . .
2.10 Frmtable . . . . . . . . . . . . . .
2.11 Programmering . . . . . . . . . .
2.12 Dato, tid og formattering . . . .
2.12.1 Dato og tid . . . . . . . .
2.12.2 Formattering . . . . . . .
2.13 Merge . . . . . . . . . . . . . . .

1

1
. . .
. . .
. . .
. . .
data
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .
. . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

2
2
2
3
3
5
5
6
6
8
8
9
10
11
13
14
15
19
20
20
22
23

SAS

Min erfaring er, at i de fleste tilfælde kan det bedst betale sig at udføre databehandlingen i SAS, og selve
analysen og datamipulationen i Stata. Grundet at 99 % af arbejdet foregår i Stata, så er der ikke vedlagt
andet end et cheat sheet til SAS. Dette kan bruges til at merge data i SAS, hvorefte Stattransfer kan benyttes
til at omdanne SAS-filen til Stata-format.
Der er lavet et SAS-program til at trække og merge data for personer, som ikke kan finde ud af SAS.

1

2

Stata

Stata er formentligt den mest udbredte software på ØI.
Denne guide bygger på Benjamin Ly Serena1 do-files til Stata.
Husk altid at arbejde med DO-files, og aldrig i kommandolinjen.

2.1

Batchfil

Det er vigtigt, at man lader Stata opbevare sine midlertidige filer på et drev med forholdsvis meget plads,
når der arbejdes med registerdata. Dette skyldes, at når der f.eks. skal køres regressioner, så Stata pladsen
til at opbevare sine midlertidige filer. Hvis dette ikke er tilfældet, så vil Stata stoppe med at køre. Dette
løses ved den guide der er vedlagt bagerst i dette dokument.

2.2

Grundlæggende

set more off, cd, clear all
Den sti Stata skal benytte defineres vha. cd. Herved vil Stata benytte den sti til at gemme figurerer og
tabeller, samt indlæse datasæt, hvis en sti ikke er defineret, når disse gemmes eller indlæses. Stier skal altid
være omgivet af “” i Stata. clear all fjerner alt der gemt i Stata. Vi begynder med clear all for at sikre, at
der ikke er gamle globals mv. gemt i Stata. Herefter defineres stien og datasættet. Kommandoen set more
off sikrer, at Stata udskriver altid udskriver hele output umiddelbart. set autotabgraphs medfører, at grafer
vil blive åbnet i samme vindue som tabs.
clear all
set more off, perm
set autotabgraphs off, perm
cd "C:\Users\vzx151\Dropbox\Research Assistant\IntroForskningsassistent"
use
I Stata indlæses datasæt vha. af kommandoen use hvis man har specificeret en sti, kan der blot skrives
navnet på det datasæt der ønskes loaded i den respektive sti. I dette tilfælde ligger auto8 i vores hovedsti.
Derfor kan vi enten loade datasættet ved blot at skrive navnet på dette, eller specificere hele stien. Begge
fremgangsmåder er vist herunder.
// Dataset from main directory
use auto8.dta
// Dataset by defining directory
use "C:\Users\vzx151\Dropbox\Research Assistant\IntroForskningsassistent\auto8.dta"
browse, if
1 Tidligere

forskningsassistent, og nuværende på ph.d. på ØI. Benjamin.Ly.Serena@econ.ku.dk

2

For at vise datasættet, så benyttes kommandoen browse i Stata. Det er også muligt, at betinge på hvilke
observationer der skal vises. Dette gøres ved if, og det er ligeledes muligt at vælge bestemte variable der skal
vises.
// Browse is used to view the dataset
br
// Browse if the car length exceed 180 inches.
br if length>180
// Browse price and miles per gallon
br price mpg
Af koden fremgår det, at jeg benytter kommandoen br i stedet for browse. Dette skyldes, at Stata tillader at
forkorte alle variable og kommandoer mv. til det kortest mulige, hvor Stata stadig entydigt kan bestemme
objektet. Det vil sige, at vi ikke ville kunne skrive br, hvis vi havde en variabel bro, da Stata ikke kan skelne
mellem om vi henviser til variablen eller kommandoen.
Den logiske syntaks i Stata følger nedenstående tabel. Den logiske syntaks benyttes, når der skal skrives
betingelser.
Betydning

Stata

A
A
A
A
A
A
A
A

A
A
A
A
A
A
A
A

lig B
ikke lig B
større end B
mindre end B
større end eller lig B
større end eller lig B
større end B og B større end C
større end B eller B større end C

== B
!= B
>B
>B
>= B
>= B
>B&B>C
>B|B>C

help
Endeligt, så er det muligt at tilgå hjælp til alle kommandoer og funktioner i Stata ved at skrive helpkommandoen f.eks.
// help with the use command
help use

2.3

Databehandling

Stata har sin styrke i sin nemme syntaks, og effektive databehandlingen. Der findes en del andre programmer,
der er væsentligt bedre til at fremstille analysedatasæt. Altså det datasæt man udfører sin analyse på
baggrund. Af software kan f.eks. SAS og R nævnes selvom der selvsagt findes flere.
2.3.1

Variable

generate, drop, drop if, replace, replace if, keep, keep if
3

En variabel konstrueres i Stata ved kommandoen generate. Det er muligt, at benytte de simple matematiske
operatorer, samt at benytte disse på andre variable. F.eks. finder vi bilernes vægt på længde i nedenstående
stykke kode.
// Generate variable, which contains the weight/inch ratio
gen weight_inch = weight / length
En dummy variabel er et andet ord for indikator variabel. En dummy kan konstrueres i Stata på nedenstående
måde. Hvis betingelse omringet af parenteserne er opfyldt, så vil variable antage værdien 1, hvis betingelsen
ikke er opfyldt vil variablen antage værdien 0. Det vil sige, hvis vi ønsker at vide, hvorvidt miles per gallon
er større eller mindre end 20 kan dette gøres ved nedenstående stykke kode.
// Generate a dummy for whether mpg exceeds 20.
gen mpg20_dummy = (mpg > 20)
Hvis vi ønsker at erstatte værdier i en variabel benyttes kommandoen replace. I nedenstående eksempel
erstatter vi vores dummy’s 0-værdier med skalaren 2. Hvis en variabel ønskes slettet kan vi benytte
kommandoen drop. Herunder fjerne vi vores dummy. Det er naturligvis muligt som i langt de fleste tilfælde
i Stata, at betinge på hvilke værdier der skal erstattes eller hvilke værdier skal slettes. For at gøre dette
benyttes if blot. Dette er vist for replace-kommandoen, men ikke for drop-kommandoen.
// Replaces all values, which equals zero with the value 2
replace mpg20_dummy = 2 if mpg20_dummy == 0
// we drop variable weight_inch
drop weight_inch
I visse tilfælde, så er vi ikke interesserede i at droppe variable (observationer), men derimod beholde nogle
bestemte variabel (observationer). Til dette findes der en kommando, som kan ses som den inverse til drop
(drop if ). Nemlig kommandoen keep (keep if ). Denne kommando har samme fremgangsmåde som drop
(drop if ), men istedet for at slette de specificerede variable (observationer) beholder Stata udelukkende de
specificerede observationer.
(COND1 & COND2 | COND3)
I nogle situationer kan det være meget smart at opdele betingelser. Forestil dig et scenarie, hvor vi ønsker at
finde alle biler, der har en bestemt miles per gallon statistik, men vi ønsker at differentiere intervallet for
dem. F.eks. kunne det være, at vi ønsker at markere alle biler der har en salgspris på 4000 og 10,000 dollars
og som kører mere end 15 miles per gallon, og så ønsker vi at alle biler der har en salgspris større end 10,000
dollars som kører mere end 20 miles. Dette ville tage flere linjer kode, hvis ikke vi opdelte vores betingelser.
//Find specific cars
gen MpgPricedummy = ( (4000 < price & price < 10000 & 15 < mpg) | (10000 < price & 20 < mpg) )
egen
Generate tillader kun forholdsvis enkle dannelser af variable, men kommandoen egen fungerer i stor grad på
samme måde som gen, men tillader mange flere funktioner. Så som gennemsnit, max, min osv. For at se alle
egens funktioner så skriv help egen.
// generates max, mean, and min price
egen pricemean = mean(price)
4

egen pricemin = min(price)
egen pricemax = max(price)

2.3.2

Sortering og gruppering af data

sort, by, bysort
Det er sjældent særligt overskueligt, at arbejde med registerdata, da der er så ufatteligt mange observationer.
Det er dog muligt, at gørre det lidt mere overskueligt. Det er muligt at sortere data vha. sort-kommandoen.
Dette er også vigtigt, når man sikrer sig, at de variable man har dannet rent faktisk gør, hvad de bør gøre.
Kommandoen sort sorterer data efter opadgående rækkefølge for de valgte variable. F.eks. hvis vi ønsker at
sortere bilerne efter om de kommer fra ind- eller udland kan sort-kommandoen benyttes.
// sorting cars after price and miles per gallon
sort foreign
Det er også muligt, at danne variable efter grupperinger. Dette gøres ved, at danne en variabel, der
angiver det respektive tilhørsforhold, hvorefter kommandoen by returnerer et resultat for hvert outcome
af tilhørsforholdsvariablen. Hvis vi ønsker, at finde gennemsnitsprisen for henholdsvis indenlandske og
udenlandske biler kan by-kommandoen benyttes.
// generates mean price by foreign
by foreign: egen pricemean2 = mean(price)
Disse kommandoer kan også samles i en, hvilket kommandoen bysort gør. Hvis vi ønsker gennemsnitsprisen
givet x miles per gallon kan vi benyttes bysort-kommandoen. Det er en god vane at benytte bysort
kommandoen altid, da dette sikrer at Stata ikke går i stå. Dette skyldes, at når visse kommandoer benyttes,
så skal data være sorteret, hvilket sker, når bysort benyttes frem for by.
// generates and sorts price by miles per gallon
bysort mpg: egen pricemean3 = mean(price)

2.3.3

Labels

label data, variables, value
En virkelig nyttig funktion ved Stata er dens label-kommandoer. Labels bliver benyttet til at beskrive
datasæt, variable og variablers værdier. Dette har den smarte funktion, at når der dannes grafer, så vil Stata
automatisk benytte disse labels til grafernes akser, og danne overskrifter, når grafer laves på baggrund af
gruppering.
I mange tilfælde er det væsentligt, at have nogle centrale informationer om et datasæt. Det er muligt at
vedhæfte op til 80 tegn til et datasæt i Stata. Når et datasæt har vedhæftet en data label, så vil denne label
blive vist, når datasættet indlæses. F.eks. fremgik “(1978 Automobile Data)”, da vi indlæste datasættet
auto8.dta. Dette skyldes, at denne label var vedhæftet datasættet.
Det er ligeledes muligt, at vedhæfte labels til variable. Det smarte ved at gøre dette er, at når der dannes
grafer og benyttes kommandoer i Stata, så vil stata benytte labelnavnet i stedet for variabelnavnet. Dette
gør det væsentligt hurtigere og mere sikkert at arbejde i Stata.
5

Endeligt er der en sidste type af labels, value labels. Value labels benyttes til at vedhæfte en label til forskellige
udfald i en variabel. Dette betyder f.eks. at man kan vedhæfte om det er mand eller kvinde der har værdien
1 eller 0, og der lignende fordele i forbindelse med grafer som beskrevet herover.
I nedenstående kode er der eksempler på alle tre typer labels.
// Data and variable labels
label data "This is my first data label"
label variable price "This is my first variable label"
// Defining value labels and attaching those
label define firstlabel 1 "Miles per gallon exceeds 20" 2 "Miles per gallon does not exceed 20"
label values mpg20_dummy firstlabel

2.4

Analyse

Inden man går igang med sin analyse er det vigtigt, at gøre sig nogle tanker om, hvilket data man har med
at gøre.
2.4.1

Dataoverblik

describe
Stata har flere funktioner til at beskrive data. f.eks. kommer vi ikek til at gennemgå codebook og inspect, men
derimod describe og summarize. describe benyttes til at beskrive formatteringen af data. Kommandoen siger
intet om outcomes, fordelingen mv., men angiver hvordan disse observationer er opbevaret i Stata. En anden
smart funktion ved describe er, at det angiver data og variable labels, samt angiver navnet på value labels
der eventuelt er vedhæftet variable. For at se de respektive value labels kan nedenstående kode benyttes.
//describes data
desc
// Shows value labels
label list firstlabel
Det er endvidere muligt, at benytte kommandoen for udelukkende et udpluk af variable, og ligeledes for andre
datasæt, hvilke ikke er indlæst i Stata. Dette gøres ved nedenstående stykke kode.
// describes the specified variables in the loaded dataset
desc price mpg
// describes the specified dataset
desc using "C:\Users\vzx151\Dropbox\Research Assistant\IntroForskningsassistent\auto8.dta"
// describes the specified variables in the specified dataset
desc price mpg using "C:\Users\vzx151\Dropbox\Research Assistant\IntroForskningsassistent\auto8.dta"
summarize
Efter at have fået et overblik over, hvordan datasættet og dets variable er bygget op, så vil det næste naturlige
skridt være, at få et overblik over den grundlæggende fordeling af variablene i datasættet. Til dette benyttes
kommandoen summarize. Summarize returnerer five-number summary for alle variable i det respektive
datasæt. Det er dog også muligt, at specificere hvilke variable der ønskes en five-number summary.
6

// five−number summary for all variables
sum
// five−number summary for price and mpg
summ price mpg
Det er også muligt, at få Stata til at returnere et mere detaljeret overblik over fordelingen af data. Dette
gøres ved, at benytte nedenstående kommando. Hvis detail betingelse benyttes, så vil Stata også returnere
skewness og kurtosis, samt en del percentiler. Det er endvidere også muligt, at benytte bysort-kommandoen.
Hvis dette gøres, så vil Stata returnere et styk output for hvert unikt outcome i identifikationsvariablen
(foreign i nedenstående tilfælde).
// detailed summary for price and mpg
summ price mpg, detail
// summary for price and mpg by foreign
bysort foreign: summ price mpg
Efter summarize-kommandoen er udført, så vil Stata lagre nogle resultater internt. Disse kan bruges til
at danne variable med. Det er muligt at tilgå en liste med hvilke resultater Stata lagrer ved nedenstående
kommando, dog skal summarize-kommandoen først være kørt.
return list
Disse resultater kan nemt gemmes i variable, hvilket kan gøres ved:
gen num=r(N)
gen sum=r(sum)
tabulate, tabstat
Den sidste vigtige kommando til at danne sig et overblik over data er tab, hvilken danner en frekvenstabel
over de specificerede variable. Det er naturligvis også muligt at kombinere tab med if og bysort. Desuden er
det muligt, at få tab-kommandoen til at danne en dummy for hvert niveau tabellen. Det vil sige, at hvis vi
danner en dummy for hvert niveau af trunk, så vil der blive dannet 18 dummy-variable for hvert niveau.
// tabulate trunk
tab trunk
// tabulate trunk by foreign
bysort foreign: tab trunk
//tabulate trunk, and create dummies
tab trunk , gen(var9)
tabstat er en af de vigtigste kommandoer, der er i Stata. Kommandoen danner en tabel over de specificerede
variable og de specificerede statistikker. F.eks. hvis vi ønsker en tabel, hvor vi finder standardafvigelsen,
variance, middelværdi og skævhed, så kan tabstat benyttes.
tabstat price mpg weight, stat(mean variance sd skew)
Det er også muligt, at få variablene vist som rækker, og statistikkerne vist som søjler, samt at danne
statistikken på baggrund af tilhørsforhold.
7

tabstat price mpg weight, by(foreign) stat(mean variance sd skew) columns(stat)

2.4.2

Export af tabstat

Der er nogle forholdsvis gode pakker til at eksportere tabstat i forskellige formater. latabstat eksporterer
tabstat-outputtet til LATEX-format. Syntaksen er fuldstændig den samme som for tabstat. Herefter bliver
outputtet vist i evalueringsområdet i Stata. Hvis man blot skal bruge et hurtigt output kan man blot benytte
log-filen. mht. logfilen, så gøres det på følgende måde
cap log close
log using logfil, replace text
tabstat price
log close
Endeligt, hvis outputtet ønskes i Stata, så anbefales det, at man enten benytter collapse eller laver en postfile
(bliver gennemgået længere fremme), hvorefter kommandoen xmlsave benyttes.
2.4.2.1

dubletter

dublicates
I forbindelse med registerdata kan der opstå dubletter. Det vil sige, at der er fejl i enten kodningen eller
fremstillingen af data. Dubletter kan have betydning for estimering med videre. Stata har forskellige
kommandoer til dette. Kommandoen duplicates giver blandt andet mulighed for at slette dubletter, rapportere
dubletter og generere en variabel, der angiver antallet af dubletter for den respektive observation. Hvis der
ikke er nogle dubletter vil denne variabel naturligvis udelukkende antage værdien 1.
// drop duplicates
duplicates drop
// report on duplicates
duplicates report
// generates a varible, which tells how many duplicates
duplicates tag, gen(indikationsvar)

2.4.3

Regressioner

regress
OLS-regressionen udføres i Stata ved regress-kommandoen. Først angives afhængige variabel, hvorefter de
uafhængige variable angives. Når en regression i Stata er udført gemmes relevante resultater fra regressionen
internt i Stata (på samme måde som ved summarize). Disse kan naturligvis benyttes på samme måde som i
summarize. De internt gemte resultater kan ses ved nedenstående stykke kode.
// Regress price on trunk
reg price trunk
// return results
ereturn list
8

Nedenstående kode er nyttig at forstå. Det vil sige, at vi danner en tabstat på baggrund af de observationer,
der er blevet brugt i den regression, der blev kørt sidst.
tab price if e(sample)==1
Det er også muligt at gemme regressionerne permanent i Stata, således at disse kan tilgås ved et senere
tidspunkt. Dette gøres ved kommandoen eststo2 .
eststo, esttab
// Stores the following linear regressions
eststo reg1: reg price trunk
eststo reg2: reg price mpg
// returns the most important results from regression reg1 and reg2
esttab reg1 reg2

2.5

Smart tricks

Stata har nogle smarte kommandoer, der gør arbejdsprocesserne væsentligt nemmere. Disse kommandoer vil
blive gennemgået nærværende afsnit.
**quietly, capture, inrange, missing, _n, _N**
I situationer, hvor man f.eks. kun benytter en enkelt statistik fra summarize-kommandoen kan det være
fordelagtigt, at tilgå informationen, men undertrykke outputtet. Dette kan gøres ved kommandoen quietly.
Denne kommando gør, at Stata kører koden internt, hvilket gør, at man kan tilgå resultaterne. Resultaterne
bliver dog ikke outputtet. F.eks. kunne vi ønske os, at vide, hvor mange biler kører mere end 20 miles per
gallon. Dette er den eneste information vi er ude efter. Dette kan gøres ved nedenstående kode.
// summarize quietly
qui: sum price if mpg > 20
// display number of observations
disp r(N)
Kommandoen capture kan benyttes til at sikre at koden bliver kørt. Denne kommando skal man være forsigtig
med, da den kan ødelægge analysen, hvis kommandoen bliver misbrugt. Det kommandoen gør er, at den
undertrykker alt output, herunder fejlmeddelelser. Det vil sige, at hvis f.eks. en variabel ønskes genereret,
men denne allerede eksisterer, så vil Stata blot køre over denne linje kode.
gen j = 1
//supresses error
cap gen j = 2
Kommandoen inrange sikrer blot, at en given variabel ligger i det specificerede interval. Dette kan lette
læsningen af betingelser, og gør kodningen mere sikker.
2 The package estout has to be installed. To install estout write the following in Stata command terminal ssc install estout,
replace

9

// The following to lines of code do the same
sum price if trunk<=21 & trunk>=10
sum price if inrange(trunk,10,21)
I forbindelse med registerdata oplever man ofte, at der er missing values. Dette skal man huske at tage højde
for, da missing values opfører sig som uendelig store væredier. Dette vil sige, at hvis man f.eks. ønsker sig alle
personer, der ældre en 50 år, og der eksisterer personer med en missing values i alders variablen vil disse også
blive talt med. Kommandoen missing er en logisk kommando, hvilken angiver 1, hvis missing, og 0 ellers.
// summarize if mpg is missing
sum price if mi(mpg)
// summarize if mpg is not missing
sum price if !mi(mpg)
Udtrykket *_N* angiver det samlede antal observationer, og udtrykket [_n+1] angiver observation nummer
n+1. Dette kan vi f.eks. bruge i nedenstående stykke kode, hvor vi beholder den første observationer af hver
værdi af trunk.
// keep only the first observations by trunk
bysort trunk: keep if _n == 1

2.6

Figurer

I dette afsnit vil der udelukkende blive gennemgået tre forskellige typer figurer, histograms, bar plots og
scatter plots. For mere avancerede figurer og formatteringen af figurerne anbefales det, at benyttes sig af det
vedlagte cheat sheet for data visualisering bagerst i nærværende dokument.
histograms
Histogrammer dannes blot ved nedenstående kode. Bin-option angiver antallet af søjler.
// histogram over price
hist price, bin(10)
barplot
Barplot er et søjlediagram. Dette er også forholdsvis enkelt at danne. Dette gøres normalt over grupperinger,
da outputter ellers blot bliver en enkelt søjle.
// barplot over price
graph bar (median) price, over(trunk)
scatter plot Et scatter plot dannes ved twoway scatter-kommandoen. Først angives den afhængige variabel
og derefter den uafhængige variabel. Det vil sige, at ved nedenstående kode plotter vi price mod mpg.
// we plot price against miles per gallon
twoway scatter price mpg

10

Hvis vi benytter kommandoen describe, så kan vi se, at både price og mpg har tilknyttet labels. Havde dette
ikke været tilfældet, så ville akserne blot have de respektive variable som navne. Lad os illustrere dette med
et tilfælde. Vi danner en dummy for, hvorvidt trunk er større end 15. Vi benytter by kommandoen i twoway,
hvilket resulterer i to seperate grafer placeret ved siden af hinanden.
// dummy. Is trunk larger than 15
gen trunk_dummy = (trunk > 15)
// we plot price against miles per gallon by trunk_dummy
twoway scatter price mpg, by(trunk_dummy)
Hvis vi giver trunk_dummy en label, og dens værdier en label, så bliver grafen meget mere forståelig.
// variable label
label variable trunk_dummy "Turn cicle larger than 15"
// value label
label define label_trunk_dummy 0 "Turn cicle is not larger than 15 feet" 1 "Turn cicle is larger than 15
feet"
label values trunk_dummy label_trunk_dummy
// new plot
twoway scatter price mpg, by(trunk_dummy)
graph save, graph combine, graph export
Det er muligt at gemme grafer internt i Stata, således at disse kan tilgås på et senere tidspunkt. Dette gøres
ved at benytte graph save ligesom i nedenstående kode. Herved vil Stata vide, at dette navn henviser til
følgende graf. Replace-option tilføres for at overskrive eventuelle gemte grafer.
// the plot from before
twoway scatter price mpg, by(trunk_dummy)
// The plot is saved
graph save "plot1.gph", replace
// a histogram
hist price, bin(5)
// The plot is saved
graph save "plot2.gph", replace
Vi har nu gemt de to plots i Stata. Det er muligt at kombinere de to plots med graph combine, og ligeledes er
det muligt at eksportere grafer til en sti eller til den definerede sti. Begge dele er vist i nedenstående stykke
kode.
// We combine the two graphs
graph combine plot1.gph plot2.gph
// we export the graph to our specified directory
graph export Plot.pdf, replace

2.7

Locals, globals og loops

use auto8.dta, clear
11

local, global
Locals kan betragtes som en slags midlertidige variable, der slettes, når koden er kørt. Det er normalt at
locals indeholder skalarer og strenge, tekstykker. Vi kan f.eks. lade nedenstående local indeholde skalaren 1.
Locals og globals kan vises ved kommandoen display. For at Stata kan forstå, at der er tale om en local skal
denne omgives af ‘local’.
local tal = 1
disp `tal'
Vi kunne også have ladet ovenstående local indeholde en tekststring.
local string = "Dette er en local"
disp "`string'"
Globals bliver modsat locals ikke slettet, når et stykke kode er kørt, men slettes når programmet bliver
lukket. Globals kan indeholde mere information end locals, men de har nogenlunde samme funktion på nær,
at globals som sagt ikke bliver slettet. For at Stata kan forstå, at der er tale om en global skal denne omgives
af ${globalnavn}
global tal = 1
disp ${tal}
global string = "Dette er en global"
disp "${string}"
loops
Locals og globals er særdeles nyttige, når man bruger loops. Loops er meget nemme at lave i STATA, og der
findes mange forskellige slags. For at lave et simpelt loop, kan ‘forvalues’ bruges.
forvalues 'iterationsvariabel'=1/10 {
'kommando'
}
Hvor ‘iterationsvariabel’ er en local, der skiftevis er lig 1,2,3,4,5,6,7,8,9 og 10. Imellem de to ‘tuborgklammer’
{}, skrives den kommando man ønsker at udføre for hver iteration. Hvis jeg for eksempel gerne vil lave en
‘summarize’ af variablen ‘mpg’ (miles per gallon) for hver niveau af ‘rep78’ (Repair record 1978), der antager
værdierne 1-5, kan dette udføres ved at skrive:
forvalues rep=1/5 {
sum mpg if rep78==`rep'
}
Alternativt kan ‘rep=1/5’ skrives som ‘rep=1(1)5’, hvor ‘(1)’ angiver at rep skal stige med 1 for hver iteration.
Loops kan også laves med funktionen ‘foreach’. ‘foreach’ tillader blandt andet at bruge en strengvariabel,
som iterationsvariabel. For eksempel, hvis jeg ønsker at lave en ‘summarize’ for hver af variablene ‘trunk’,
‘mpg’, ‘length’ og ‘weight’. Her skrives:
foreach var in trunk mpg length weight {
sum `var'
12

}
En meget smart funktion som kan bruges i forbindelse med ‘foreach’ er ‘levelsof’. ‘levelsof’ tæller antallet
af unikke værdier i en given variabel, og gemmer denne information i en local. Dette gøres ved at skrive:
levelsof ‘variabel’ , local(‘localnavn’).
Derefter kan man bruge ‘foreach’ til at lave et loop for alle disse værdier ved at skrive:
forvalues 'iterationsvariabel' of local 'localnavn' {
'kommando'
}
Hvis man ønsker at lave ovenstående loop med ‘summarize’ af ‘mpg’ for hver niveau af ‘rep78’, kan der f.eks.
skrives:
l e v e l s o f rep78 , l o c a l ( r e p n i v e a u e r )
fo reac h rep of l o c a l repniveauer {
sum mpg i f r e p 7 8==`rep '
}
Globals kan bruges på samme vis som locals blev brugt i eksemplet foroven. Derudover findes der et hav af
forskellige muligheder med ‘foreach’. Tjek STATA’s hjælpeside for mere info.

2.8

Postfile

Postfile er meget brugbar når der skal laves figurer i STATA. Det giver mulighed for hurtigt at lave nogle
forholdsvis advancerede figurer, samt resultatdatasæt, hvis man skulle have behov det. Ideen er at gemme
resultater fra for eksempel regressioner i et nyt datasæt. Derefter åbnes dette datasæt og resultaterne kan
nemt tegnes som en figur.
Syntaksen er som følger:
postfile 'postfilenavn' 'var1' var2' 'var3' ... using 'datasetnavn' , replace
'kommando'
post 'postfilenavn' ('input til var1') ('input til var2') ('input til var3') ...
postclose 'postfilenavn'
Her kunne jeg for eksempel være interesseret i at plotte OLS-koefficienten og konfidensbånd fra en regression
af ‘mpg’ på ‘trunk’ - for hver niveau af ‘rep78’. I dette tilfælde ønsker jeg derfor at gemme fire variable;
rep78-niveauet, koefficienten, nedre konfidensbånd og øvre konfidensbånd. For at udføre selve estimationen
kan jeg bruge et loop. Koden ser ud som følger:
postfile fedfigur rep koef nedre oevre using "C:\Users\vzx151\Dropbox\Research Assistant\
IntroForskningsassistent\figurdata", replace

13

forvalues rep=1/5 {
reg mpg trunk if rep78==`rep'
post fedfigur (`rep') (_b[trunk]) (_b[trunk]−_se[trunk]∗1.96) (_b[trunk]+_se[trunk]∗1.96)
}
postclose fedfigur
For at tegne figuren åbnes det nye datasæt
clear all
use "C:\Users\vzx151\Dropbox\Research Assistant\IntroForskningsassistent\figurdata", clear
twoway (line nedre oevre rep, lpattern(dash dash)) (line koef rep), ///
scheme(s2mono) graphregion(color(white)) title("Postfile figur") ///
legend(order(3 1) label(1 "Konfidensbaand") label(3 "Koefficient: Milage paa trunk size")) xtitle("Repair
record 1978, hvad end det betyder") ytitle("Miles per gallon")
graph export fedpostfilefigur.pdf, replace
Hovedfordelen ved postfile er helt klart fleksibiliteten. Derudover er det markant hurtigere, hvis man arbejder
med store datasæt. I så fald ville jeg benytte et STATA-program til at generere figurdataen og et til at tegne
figurerne, så data ikke skal indlæses på ny.

2.9

Esttab

Vi indlæseser data igen.
use auto8.dta, clear
Esttab er en nem og overskuelig måde at lave flotte regressionstabeller i STATA. Ideen er at man gemmer
resultaterne af en række regressioner og derefter input’er dem i en tabel. Hvis jeg for eksempel ønsker at at
smide resultaterne af ovenstående regressioner af ‘mpg’ på ‘trunk’ for niveau af rep78 i en tabel, kan det
gøres på følgende måde:
eststo
eststo
eststo
eststo
eststo

reg1:
reg2:
reg3:
reg4:
reg5:

reg
reg
reg
reg
reg

mpg
mpg
mpg
mpg
mpg

trunk
trunk
trunk
trunk
trunk

if
if
if
if
if

rep78==1
rep78==2
rep78==3
rep78==4
rep78==5

Resultaterne gemmes som vist ved at skrive: eststo ‘regnavn’: ‘regressionskommando’. I dette tilfælde er det
oplagt at bruge et loop.
forvalues i=1/5 {
eststo reg`i': reg mpg trunk if rep78==`i'
14

}
Herefter omdannes regressionsoutputtet til en tabel ved at bruge esttab
esttab reg1 reg2 reg3 reg4 reg5 using "C:\Users\vzx151\Dropbox\Research Assistant\
IntroForskningsassistent\flotesttabtabel1.rtf", replace ///
title("Awesome Esttab Tabel")
Hvis man ønsker at teste om trunk size har selvstændig betydning for milage kunne man for eksempel lave
følgende tabel:
eststo
eststo
eststo
eststo

reg1:
reg2:
reg3:
reg4:

reg
reg
reg
reg

mpg
mpg
mpg
mpg

trunk
trunk weight
trunk length
trunk weight length

esttab reg1 reg2 reg3 reg4 using "C:\Users\vzx151\Dropbox\Research Assistant\IntroForskningsassistent\
flotesttabtabel2.rtf", replace ///
title("Awesome Esttab Tabel: Har bagagerumsstoerrelse betydning for hvor langt en bil koerer paa literen?
") label ///
scalars("r2 R−squared" "r2_a Adjusted R−squared" )
Estout muliggør også output i LATEX. Ovenstående regressionsoutput ville i LATEX-format blive dannet ved
nedenstående kode.
eststo
eststo
eststo
eststo

reg1:
reg2:
reg3:
reg4:

reg
reg
reg
reg

mpg
mpg
mpg
mpg

trunk
trunk weight
trunk length
trunk weight length

esttab reg1 reg2 reg3 reg4 using "C:\Users\vzx151\Dropbox\Research Assistant\IntroForskningsassistent\
flotesttabtabel2.tex", replace ///
title("Awesome Esttab Tabel: Har bagagerumsstoerrelse betydning for hvor langt en bil koerer paa literen?
") label ///
scalars("r2 R−squared" "r2_a Adjusted R−squared" )
Dette danner følgende tabel
Det er utroligt nyttigt at kigge nærmere ind i denne pakke.

2.10

Frmtable

Frmttable er en til tider upraktisk, men utrolig fleksibel måde at tabeller i STATA. Ideen er at gemme
resultater fra diverse funktioner i STATA i en matrix. Derefter konverterer frmttable denne til en flot
regressionstabel. Fremgangsmåden er som følger. Først genereres en matrix med det ønskede antal rækker og
kolonner. Hvis man ønsker standardfejl eller andre under-resultater, er det en god ide at fordoble (tredoble,
hvis man har to under-resultater) antallet af kolonner, og lade være med at tælle disse med i antallet af rækker.
Ved at inputte disse resultater i kolonnen ved siden af hovedresultatet, kan man ved hjælp af ‘sub’-funktionen
15

Table 2: Awesome Esttab Tabel: Har bagagerumsstoerrelse betydning for hvor langt en bil koerer paa literen?
(1)
(2)
(3)
(4)
Mileage (mpg) Mileage (mpg) Mileage (mpg) Mileage (mpg)
Trunk space (cu. ft.)
-0.787∗∗∗
-0.0962
-0.00967
-0.0323
(-6.07)
(-0.75)
(-0.07)
(-0.24)
Weight (lbs.)

-0.00565∗∗∗
(-8.06)

Length (in.)
Constant
Observations
R-squared
Adjusted R-squared

32.12∗∗∗
(17.20)
74
0.338
0.329

39.69∗∗∗
(24.02)
74
0.654
0.645

-0.00388∗
(-2.42)
-0.205∗∗∗
(-7.56)

-0.0742
(-1.23)

60.04∗∗∗
(15.20)
74
0.633
0.623

47.40∗∗∗
(7.33)
74
0.662
0.647

t statistics in parentheses
∗ p < 0.05, ∗∗ p < 0.01, ∗∗∗ p < 0.001

i frmttable få STATA til at smide standardfejlene under resultaterne og pakke dem ind i parenteser eller
andre ‘brackets’. Når man har kørt de regressioner, summary statistics osv. som man ønsker, og gemt de
resultater som man skal bruge, kan man benytte frmttable til at konstruere en flot tabel med aksetitler, noter
og meget mere. For at illustrere fremgangsmåden, vil jeg nu genskabe ovenstående tabel.
Jeg skal bruge 7 rækker (for trunk, weight, length, konstantleddet, observationer, R-i-anden og justeret
R-i-anden) og 4*2=8 kolonner (da jeg gerne vil inkludere standardfejl). Resultatmatricen ‘X’ laves således:
Koden er lidt rodet i dette dokument. Det anbefales, at kigge i do-filen for dette eksempel.
mat X=J(7,8,.) /∗ Laver en tom matrix med 7 raekker og 8 kolonner. ∗/
∗ Herefter laver jeg hver af regressionerne og inputter resultaterne loebende i matricen∗
∗ Reg 1 ∗
reg mpg trunk
mat
mat
mat
mat

X[1,1]=_b[trunk] // Smider regressionskoefficienten for 'trunk' i cellen i raekke 1, kolonne 1.
X[1,2]=_se[trunk] // Smider standardfejlen for 'trunk' i cellen i raekke 1, kolonne 2.
X[4,1]=_b[_cons] // Smider regressionskoefficienten for konstantleddet i cellen i raekke 4, kolonne 1.
X[4,2]=_se[_cons] // Smider standardfejlen for konstantleddet i cellen i raekke 4, kolonne 2.

mat X[5,1]=e(N) // Smider antal observationer i cellen i raekke 5, kolonne 1.
mat X[6,1]=e(r2) // Smider r−i−anden i cellen i raekke 6, kolonne 1.
mat X[7,1]=e(r2_a) // Smider justeret r−i−anden i cellen i raekke 7, kolonne 1.
∗ Reg 2 ∗
reg mpg trunk weight
mat X[1,3]=_b[trunk] // Smider regressionskoefficienten for 'trunk' i cellen i raekke 1, kolonne 3.
16

mat
mat
mat
mat
mat

X[1,4]=_se[trunk] // Smider standardfejlen for 'trunk' i cellen i raekke 1, kolonne 4.
X[2,3]=_b[weight] // Smider regressionskoefficienten for 'weight' i cellen i raekke 2, kolonne 3.
X[2,4]=_se[weight] // Smider standardfejlen for 'weight' i cellen i raekke 2, kolonne 4.
X[4,3]=_b[_cons] // Smider regressionskoefficienten for konstantleddet i cellen i raekke 4, kolonne 3.
X[4,4]=_se[_cons] // Smider standardfejlen for konstantleddet i cellen i raekke 4, kolonne 4.

mat X[5,3]=e(N) // Smider antal observationer i cellen i raekke 5, kolonne 3.
mat X[6,3]=e(r2) // Smider r−i−anden i cellen i raekke 6, kolonne 3.
mat X[7,3]=e(r2_a) // Smider justeret r−i−anden i cellen i raekke 7, kolonne 3.

∗ Reg 3 ∗
reg mpg trunk length
mat
mat
mat
mat
mat
mat

X[1,5]=_b[trunk] // Smider regressionskoefficienten for 'trunk' i cellen i raekke 1, kolonne 5.
X[1,6]=_se[trunk] // Smider standardfejlen for 'trunk' i cellen i raekke 1, kolonne 6.
X[3,5]=_b[length] // Smider regressionskoefficienten for 'length' i cellen i raekke 3, kolonne 5.
X[3,6]=_se[length] // Smider standardfejlen for 'length' i cellen i raekke 3, kolonne 6.
X[4,5]=_b[_cons] // Smider regressionskoefficienten for konstantleddet i cellen i raee 4, kolonne 5.
X[4,6]=_se[_cons] // Smider standardfejlen for konstantleddet i cellen i raekke 4, kolonne 6.

mat X[5,5]=e(N) // Smider antal observationer i cellen i raekke 5, kolonne 5.
mat X[6,5]=e(r2) // Smider r−i−anden i cellen i raekke 6, kolonne 5.
mat X[7,5]=e(r2_a) // Smider justeret r−i−anden i cellen i raekke 7, kolonne 5.
∗ Reg 4 ∗
reg mpg trunk weight length
mat
mat
mat
mat
mat
mat
mat
mat

X[1,7]=_b[trunk] // Smider regressionskoefficienten for 'trunk' i cellen i raekke 1, kolonne 7.
X[1,8]=_se[trunk] // Smider standardfejlen for 'trunk' i cellen i raekke 1, kolonne 8.
X[2,7]=_b[weight] // Smider regressionskoefficienten for 'weight' i cellen i raekke 2, kolonne 7.
X[2,8]=_se[weight] // Smider standardfejlen for 'weight' i cellen i raekke 2, kolonne 8.
X[3,7]=_b[length] // Smider regressionskoefficienten for 'length' i cellen i raekke 3, kolonne 7.
X[3,8]=_se[length] // Smider standardfejlen for 'length' i cellen i raekke 3, kolonne 8.
X[4,7]=_b[_cons] // Smider regressionskoefficienten for konstantleddet i cellen i raekke 4, kolonne 7.
X[4,8]=_se[_cons] // Smider standardfejlen for konstantleddet i cellen i raekke 4, kolonne 8.

mat X[5,7]=e(N) // Smider antal observationer i cellen i raekke 5, kolonne 7.
mat X[6,7]=e(r2) // Smider r−i−anden i cellen i raekke 6, kolonne 7.
mat X[7,7]=e(r2_a) // Smider justeret r−i−anden i cellen i rae 7, kolonne 7.
∗ Tabel ∗
frmttable using "C:\Users\vzx151\Dropbox\Research Assistant\IntroForskningsassistent\flotesttabtabel1.
rtf", replace ///
title("Awesome Frmttable Tabel: Har bagagerumsstoerrelse betydning for hvor langt en bil koerer paa
literen?") ///
17

/∗
/∗
/∗
/∗

Vigtige options ∗/ ///
1 ∗/ statmat(X) /// /∗ Siger hvilken matrix resultaterne skal komme fra. ∗/
2 ∗/ sub(1) /// /∗ Angiver antallet af underresultater − her 1 fordi jeg oensker standardfejl. ∗/
3 ∗/ ctitle("", "(1)", "(2)", "(3)" , "(4)" \ "", "Milage(mpg)", "Milage(mpg)", "Milage(mpg)", "Milage(mpg)
") /// /∗ Specificerer kolonnetitler, bemaerk at det er muligt at lave flere linjer/raekker med tekst ved
brug af '\'.∗/
/∗ 4 ∗/ rtitle("Trunk space (cu ft.)" \ " " \ "Weight (lbs.)" \ " " \ "Length (in.)" \ " " \ "Constant" \ " " \ "
Observations" \ "" \ "R−squared" \ "" \ "Adjusted R−Squared" \ "" ) /// /∗ Specificerer raekketitler
∗/
/∗ 6 ∗/ sdec(5 \ 5 \ 5 \ 5 \ 5 \ 5 \ 5 \ 5 \ 0 \ 2 \ 2) /// /∗ Specificerer antal decimaler − kan specificeres
for hver enkel celle ved at bruge ',' som kolonne−adskiller og '\' som raekke−adskiller." ∗/
/∗ 7 ∗/ hlines( 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1) /∗ Specificerer hvor der skal vaere horisontale linjer.
Default er bund og top. Der findes en tilsvarende funktion til vertikale linjer kaldet 'vlines'. ∗/
Givet de mange linjer kode og de besværlige options er det selvfølgelig fuldstændig tåbeligt at bruge frmttable
til denne tabel. Den kan som vist laves noget nemmere i Esttab. Der er dog tabeller, der ikke kan laves
i Esttab, hvor kendskab til frmttable derfor er en nødvendighed. En sådan tabel er præsenteret nedenfor.
Denne viser summary statistics for en række variable for hver niveau af rep78. Her kan der også bruges loops,
hvilket gør arbejdet med matricen nemmere.
global varliste "mpg trunk weight length price" /∗ Vaelg variable ∗/
mat Y=J(5,20,.) /∗ Jeg oensker at lave en tabel med 5 raekker og 5 kolonner, men med tre under−
resultater − standard afvigelsen, minimum og maksimum. ∗/
local i=1 /∗ Angiver raekkenummer, startende paa 1. ∗/
foreach var of global varliste {
local j=1 /∗ Angiver kolonnenummer, startende paa 1. ∗/
forvalues rep=1/5 {
sum `var' if rep78==`rep'
mat
mat
mat
mat

Y[`i',`j']=r(mean)
Y[`i',`j'+1]=r(sd)
Y[`i',`j'+2]=r(min)
Y[`i',`j'+3]=r(max)

local j=`j'+4 /∗ Spring fire kolonner over i naeste iteration ∗/
}
local i= `i'+1 /∗ Gaa til naeste raekke i naeste iteration ∗/
}
18

frmttable using "C:\Users\okoBS\Documents\Intro Forskningsassistenter\flotfrmttableTabel2_ny.rtf",
replace ///
title("Table: Summary statistics") statmat(Y) sub(3) brackets("" \ (,) \ [,] \ [,]) nocenter a4 ///
coljust(l c) addfont(Times New Roman) basefont(fnew1 fs12) statfont(fs12) sdec(2 \ 2 \ 2 \ 2 \ 2 \ 2 \ 2 \
2 \ 0 \ 0 \ 0 \ 0 \ 2 \ 2 \ 2 \ 2 \ 0 \ 0 \ 0 \ 0 ) ///
ctitle("", "Repair Record 1978" "" "" "" "" \ "", "1", "2", "3" , "4" , "5") multicol(1,2,5) ///
rtitle("Milage(mpg)" \ " " \ " " \ " " \ "Trunk space (cu ft.)" \ " " \ " " \ " " \ "Weight (lbs.)" \ " " \ " " \ "
" \ "Length (in.)" \ " " \ " " \ " " \ "Price" \ " " \ " " \ " " ) ///

2.11

Programmering

Det kan være super smart at lave sine egne funktioner i STATA. Især hvis man skal udføre den samme
kommando mange gange. Som med så mange andre ting i STATA, er der rigtig mange muligheder. Jeg viser
kun hvad jeg ved om programmering i STATA.
Først og fremmest er det smart at sikre, at der ikke allerede er defineret et program med det navn ønsker
at kalde sit. Det kan gøre ved simpelthen at skrive navnet i browseren og se om STATA kan genkende
det. Man starter definitionen af et program ved at skrive: program ‘programnavn’. For definere et program
skal man vælge syntaxen af det man ønsker at inputte. Hvis det f.eks. er en variabelliste skrives: syntax
varlist. Herunder kan der specificeres hvor mange variable der højest må angives ved at skrive: syntax
varlist(max=‘maxtal’).
Herefter kan der skrives: [if]. på denne måde understøtter dit program STATA’s ‘if’-funktion. Når der skrives
‘if’ gemmes en local med betingelsen, hvor denne afhænger af hvad brugeren skriver. Alle kommando’er indeni
programmet skal derfor slutte med ‘if’.
Hvis også ønsker at definere en række options for programmet kan dette gøres ved at skrive [, ‘optionnavn1’(‘option1’) ‘optionnavn2’(‘option2’) ]. ‘option’ er et tal, navn eller en variabel som brugeren skriver.
Resultatet heraf gemmes i en local ‘optionnavn’, som man kan referere til i programmet. I programmet skrives
om ‘option’ er et navn (name), et tal (numlist(max=‘maxnum’)) eller en variabel (varlist(max=‘maxnum’))
Nedenfor gives et simpelt eksempel:
Programmet laver for hver angivet variabel, en variabel indeholdende gennemsnittet.
cap program drop ben1
program ben1
syntax varlist(max=20) [if] [, prefix(name) replace] /∗ Definerer syntax. Tillad tyve inputvariable, tillad at
brugeren selv kan definere navnet og tillad at erstatte eksisterende variable med samme navn. ∗/
foreach var of local varlist {
qui sum `var' `if' /∗ Lav 'summarize' for hver variabel i variabellisten ∗/
if "`prefix'" =="" { /∗ Lav default navn, hvis 'prefix' ikke er specificeret ∗/
local prefix "mean"
19

di as txt "Default prefix 'mean' chosen."
}
if "`replace'" !="" {
cap drop `prefix'`var' /∗ Drop den eksisterende variabel, hvis der er skrevet 'replace' som option. ∗/
}

qui gen `prefix'`var'=r(mean) `if' /∗ Gem resultat i nyvariabel ∗/
la var `prefix'`var' "Mean of `:variable label `var''" /∗ Giv ny variabel label'en 'Mean of 'variablens label''
∗/
}
end
Benyt programmet
ben1 price mpg trunk weight length, replace
Normalt ville jeg gemme koden, der definerer programmet i en særskilt do-fil, så jeg kan køre denne i
programmet, men et simpelt kodestykke. For eksempel har jeg et program kaldet program1, som jeg ofte
bruger. Når jeg starter STATA skriver jeg derfor altid følgende:
qui do "C:\Users\vzx151\Dropbox\Research Assistant\IntroForskningsassistent\program.do"
program1 price mpg trunk weight length, replace

2.12
2.12.1

Dato, tid og formattering
Dato og tid

En ting man lige så godt kan venne sig til, er at statistikprogrammer generelt er utrolig ufleksible, når det
kommer til datoer. Generelt, så er kommandoen describe ens ven, når man har med datoer at gøre. Her er
det muligt, at se hvilket datoformat en variable er kodet. Dette gøre behandlingen lidt nemmere. Der er 8
datoformater i Stata.
stata

almindelig

stata format

datetime/c
dato
uge
måned
kvartal
halvår
år

millisekunder siden 01jan1960 00:00:00:000
dage siden 01jan1960 (01jan1960=0)
uger siden 1960w1
måneder siden 1960m1
kvartaler siden 1960q1
halvår siden 1960h1
pr siden 0000

%tc
%td
%tw
%tm
%tq
%th
%ty

20

Fordi Stata betragter datoer som numeriske, så bliver man også nødt til at betragte dem som numeriske.
Imidlertid, så kan det være svært at holde styr på, hvor mange dage er det siden, at det var 25. november
1972. For at løse dette problem er der følgende funktioner.
stata

funktion

stata format

datetime/c
datetime/c
datetime/c
dato
uge
måned
kvartal
halvår

tc = ndyhms(M,D,Y,h,m,s)
tc = dhms(td, h,m,s)
tc = hms(h,m,s)
td = mdy(M,D,Y)
tw = yw(Y,W)
tm = ym(Y,M)
tq = yq(Y,Q)
th = yh(Y,H)

%tc
%tc
%tc
%td
%tw
%tm
%tq
%th

Endeligt er der også følgende måde, at konvertere datoer på. Det er utroligt vigtigt, at dette bliver gjort
rigtigt. Hvis ikke dette gøres rigtigt, så får man helt forkerte datoer. F.eks. hvis man benytter en funktion der
konverterer datoer om til måneder, men variablen er kodet som måneder, så bliver det selvsagt helt forkert.
From

datetime

datetime/c
date
week
month
quarter
half-year
year

date

tc = cofd(td)

td = dofc(tc)
td
td
td
td
td

=
=
=
=
=

dofw(tw)
dofm(tm)
dofq(tq)
dofh(th)
dofy(ty)

From

week

month

quarter

date

tw = wofd(td)

tm = mofd(td)

tq = qofd(td)

From

half-year

year

date

th = hofd(td)

ty = yofd(td)

Endeligt er det nyttigt3 at kende til, hvordan man udtrækker år, måned og dag fra en datovariabel (dvs. et
format hvor man har år, måned og dato). Her findes følgende kommandoer, som er nyttige at kende til
Komponent

function

eksempel

år
måned

year(td)
month(td)

2013
5

3 Det er naturligvis også nyttigt at kunne danne datoer fra stringe, men dette bliver ikke gennemgået i denne note, da alle
register er kodet som dato-variable.

21

2.12.2

Komponent

function

eksempel

dag
dage i året
uger i året
kvartaler i året
halfår i året

day(td)
doy(td)
weel(td)
quarter(td)
halfyear(td)

37
187
43
3
2

Formattering

For at formattere en variabel i Stata er det første man skal vide, hvilken type variabel man har at gøre med.
I stata findes der 6 typer af variable. De 5 af typerne er til at håndtere tal med, og den sidste type er til at
håndtere strenge(tekstvariable). Det eneste man bør vide er, at byte, int og long kun kan opbevare heltal,
hvorimod float og double kan opbevare decimaltal ligeledes. Strenge opbevares i den type variabel der kaldes
str“længde”. Det vil sige, at variabel der indeholder udtrykket “jeg” som den længste string vil have formatet
str3, og en variabel der har “hvis” som længste string vil have variabeltypen str4 osv. Stata kan håndtere
string-observationer op til ufatteligt mange tegn. Det vil sige op til et par milliarder. Stata kalder dog stringe
på mere end 2045 tegn strL
I stata formatteres variable ved at angive variabel navn, og hvilken formattering der ønskes. Det er ligemeget,
hvilken rækkefølge format og variabel kommer i koden. Nedenstående er altså evaluerer altså det samme.
format varlist %fmt
format %fmt varlist
Standard indstillingerne i Stata er som følger
variabel-type

format

byte
int
long
float
double
str#
strL

%8.0g
%8.0g
%12.0g
%9.0g
%10.0g
%#s
%9s

De vigtigste formater er følgende
numerisk
variabel-type

format

%#.#g
%#.#f
%#.#gc
%#.#fc
double
str#

generel
fixed
generel, med komma
fixed med komma
%10.0g
%#s
22

variabel-type

format

strL

%9s

strenge

2.13

variabel-type

format

%#s
%-#s
%~#s

højrejusteret
center
venstrejusteret

Merge

Selvom, at Stata ikke er særligt godt at forberede datasæt i, så kan det være nødvendigt, at kunne udføre
simple merging-procedurer i Stata. Der er grundlæggende fire typer af merging i Stata, men det er kun de tre
af dem, som er brugbare i forbindelse med registerdata. Grundlæggende er merging, at man samler to datasæt
på baggrund af en identifikationsvariabel der er unik, eller en kombination af variable. Dette medfører, at vi
er sikre på, at det er de rigtige observationer, der bliver sat sammen. F.eks. i en situation, hvor vi har to
datasæt på årsniveau, så vil PNR alene ikke være nok til at kunne identificere de rigtige observationer. Det
vil dog være muligt, at merge de to datasæt sammen, hvis vi både har PNR og år (der må altså kun være en
observation pr pnr pr år). I stata merger man 1:1 på følgende måde.
Til følgende eksempel danner jeg to relevante datasæt. Til at begynde med, så danner vi et identifikationsnummer til hver observation, hvilket vi skal bruge til at merge. Det vil sige, at vi har to forskellige datasæt, hvor
identifikationsnummeret er unikt for hver observation. Altså, det er udelukkende den respektive observation,
der har dette identifikationsnummer.
use auto8.dta, clear
gen iden = [_n]
keep make price mpg rep78 iden
save merge1.dta, replace
use auto8.dta, clear
gen iden = [_n]
drop make price mpg rep78
save merge2.dta, replace
Efter vi har forberedt datasættet, så vil vi gerne danne datasættet auto8.dta. Dette kan vi gøre ved følgende
kode. Vi merger datasæt merge2 på datasættet vi har loaded merge1 på baggrund af variablen iden.
use merge1.dta, clear
merge 1:1 iden using merge2.dta
Udover 1:1 merge findes der også 1:m og m:1 merge. m:1 merge vil vi gennemgå til at begynde med. Her vil
identifikationsvariablen unikt identificere observationer i using-datasættet. Det vil sige, at det er det datasæt
der IKKE er loaded. Det vil sige, at for hver observation, i master-datasættet (altså det datasæt vi har
23

Figure 1: 1:1 merge
loaded) vil der blive merget oplysninger fra den unikke observation i using-datasættet. Et godt eksempel på,
hvornår dette bliver brugt er f.eks. hvis vi ønsker at merge noget regionalt data på individ observationer.

Figure 2: m:1 merge

Figure 3: 1:m merge
24

1:m er det modsatte. Det vil sige, at i master-datasættet vil der være en unik observation, som bliver merget
på hver observation i using datasættet, når der er et match.

25

Version June 28, 2016
Simon Halphen Boserup

How to move the location of Stata temporary data files
At startup, Stata creates a temporary file on the hard drive, which it uses for some of its procedures,
e.g., merging datasets. This may fill up the C-drive, the default location of the temporary file. To
avoid this, you have to tell Stata to place it somewhere more suitable. This guide instructs you
how to do this.
• Open Explorer and navigate to X:\StataWork (CAM1 doesn’t have an X-drive, use F: here
instead)
• Create a subfolder using you DST ident and 4-digit project number, e.g., YYXX9999

• In that folder, right-click and create a new text document – rename it (and thereby change
file type) to runstata.bat
• Right-click the file and choose ‘Edit’

• The content of the file should be the following lines
set STATATMP="X:\StataWork\YYXX999"
cd "X:\StataWork\YYXX999"
X:
"C:\Program Files (x86)\Stata14\StataMP-64.exe"
• Save the file and exit the editor

• Double-click the bat-file. Stata 14 should open. To check that your hard labor panned out,
do the following two checks
1. In Stata’s command line, type ‘‘pwd’’. You should get an answer saying that the new
folder on the X-drive is your present working directory
2. Also in Stata’s command line, first execute the line ‘‘tempfile f’’, and then the line
‘‘di "‘f’"’’. Again, you should see the new folder on the X-drive as a result.
You have now succeeded in moving the location of the temp file. Each time you run Stata, you
should do it by clicking the runstata.bat file. To make it easier on you, do the following.
• Right-click and drag runstata.bat to the start menu in the lower left corner of your screen
and release.
• Open the start menu – you should see a shortcut to the runstata.bat file at the top of the
list somewhere.
NOTE! If you want to open an existing do-file, you’ll need to click runstata.bat first and
open that file via the do-file editor. If you just click the do-file directly in Explorer/Stifinder, you’ll
open Stata with a temporary file on the C-drive.
1

scroll through previous commands

Set up

clear the console (where results are displayed)

autocompletes variable name after typing part

PgDn

Ctrl + 9
open a new .do file
Ctrl + D
highlight text in .do file,
then ctrl + d executes it
in the command line

[=exp]

[if exp]
[in range]

Basic Syntax

if foreign == 0 & price <= 9000, detail

apply
weights

[weight]

price
3,984
10,372
4,499
11,995

histogram mpg, frequency
plot a histogram of the
distribution of a variable

codebook make price
overview of variable type, stats,
number of missing/unique values
summarize make price mpg
print summary statistics
(mean, stdev, min, max)
for variables
inspect mpg
show histogram of data,
number of missing or zero
observations

inspired by RStudio’s awesome Cheat Sheets (rstudio.com/resources/cheatsheets)

browse or
Ctrl + 8 positive number. To exclude missing
values, use the !missing(varname) syntax
open the data editor
list make price if price > 10000 & !missing(price)
clist ... (compact form)
list the make and price for observations with price > $10,000
display price[4]
display the 4th observation in price; only works on single values
gsort price mpg (ascending)
gsort –price –mpg (descending)
sort in order, first by price then miles per gallon
duplicates report
assert price!=.
finds all duplicate values in each variable
verify truth of claim
levelsof rep78
display the unique values for rep78

Missing values are treated as the largest

BROWSE OBSERVATIONS WITHIN THE DATA

describe make price
display variable type, format,
and any value/variable labels
count
count if price > 5000
number of rows (observations)
Can be combined with logic
ds, has(type string)
lookfor "in."
search for variable types,
variable name, or variable label
isid mpg
check if mpg uniquely
identifies the data

foreign
0
0
1
1

SEE DATA DISTRIBUTION

Explore Data

foreign
0
0
1
1

make
Chevy Colt
Buick Riviera
Honda Civic
Volvo 260

if foreign != 1 | price >= 10000

make
Chevy Colt
Buick Riviera
Honda Civic
Volvo 260

price
3,984
10,372
4,499
11,995

if foreign != 1 & price >= 10000

and
! or ~ not
| or

&

< less than
<= less than or equal to
> greater than
>= greater or equal to

== tests if something is equal
= assigns a value to a variable

== equal
!= not
or
~= equal

Logic

Basic Data Operations

words

numbers

include missing values create binary variable for every rep78
value in a new variable, repairRecord

Summarize Data

recast double mpg
generic way to convert between types

gen foreignNumeric = real(foreignString)
"1"
"1"
destring foreignString, gen(foreignNumeric)
encode foreignString, gen(foreignNumeric) "foreign"

Disclaimer: we are not affiliated with Stata. But we like it.

geocenter.github.io/StataTraining

CC BY 4.0

updated January 2016

generate mpgSq = mpg^2 gen byte lowPr = price < 4000
create a new variable. Useful also for creating binary
variables based on a condition (generate byte)
generate id = _n
bysort rep78: gen repairIdx = _n
_n creates a running index of observations in a group
generate totRows = _N
bysort rep78: gen repairTot = _N
_N creates a running count of the total observations per group
pctile mpgQuartile = mpg, nq = 4
create quartiles of the mpg data
see help egen
egen meanPrice = mean(price), by(foreign)
calculate mean price for each group in foreign for more options

Create New Variables

table foreign, contents(mean price sd price) f(%9.2fc) row
create a flexible table of summary statistics
collapse (mean) price (max) mpg, by(foreign) replaces data
calculate mean price & max mpg by car type (foreign)

formats numbers for all data

tabulate rep78, mi gen(repairRecord)
one-way table: number of rows with each value of rep78
tabulate rep78 foreign, mi
two-way table: cross-tabulate number of observations
for each combination of rep78 and foreign
bysort rep78: tabulate foreign
for each value of rep78, apply the command tabulate foreign
tabstat price weight mpg, by(foreign) stat(mean sd n)
create compact table of summary statistics
displays stats

1

missing
string int long float double
byte
To convert between numbers & strings:
gen foreignString = string(foreign)
"1"
1 tostring foreign, gen(foreignString)
"1"
decode foreign , gen(foreignString)
"foreign"

true/false

Change Data Types

Stata has 6 data types, and data can also be missing:
no data

[,options]
special options
for command

In this example, we want a detailed summary
with stats like kurtosis, plus mean and median

pull data from a file
(if not loaded)

[using filename]

To find out more about any command – like what options it takes – type help command

price

column to save output as condition: only apply to
apply
a new variable apply the function specific rows
command to
if something is true

bysort rep78 : summarize

function: what are
you going to do
to varlists?

VIEW DATA ORGANIZATION

^ raise to a power

/ divide

* multiply

− subtract

+ combine (strings)

add (numbers)

Arithmetic

apply the
command across
each unique
combination of
variables in
varlist1

All Stata functions have the same format (syntax):
[by varlist1:]
command
[varlist2]

Tim Essam (tessam@usaid.gov) • Laura Hughes (lhughes@usaid.gov)
follow us @StataRGIS and @flaneuseks

sysuse auto, clear
for many examples, we
load system data (Auto data) use the auto dataset.
use "yourStataFile.dta", clear
load a dataset from the current directory frequently used
commands are
import excel "yourSpreadsheet.xlsx", /*
highlighted in yellow
*/ sheet("Sheet1") cellrange(A2:H11) firstrow
import an Excel spreadsheet
import delimited"yourFile.csv", /*
*/ rowrange(2:11) colrange(1:8) varnames(2)
import a .csv file
webuse set "https://github.com/GeoCenter/StataTraining/raw/master/Day2/Data"
webuse "wb_indicators_long"
set web-based directory and load data from the web

Import Data

pwd
print current (working) directory
cd "C:\Program Files (x86)\Stata13"
change working directory
dir
display filenames in working directory
fs *.dta
List all Stata data in working directory underlined parts
are shortcuts –
capture log close
use "capture"
close the log on any existing do files or "cap"
log using "myDoFile.txt", replace
create a new log file to record your work and results
search mdesc
packages contain
find the package mdesc to install extra commands that
expand Stata’s toolkit
ssc install mdesc
install the package mdesc; needs to be done once

cls

Tab

PgUp

AT COMMAND PROMPT

keyboard buttons
F2
describe data
Ctrl + 8
open the data editor
clear
delete data in memory

Useful Shortcuts

For more info see Stata’s reference manual (stata.com)

with Stata 14.1 Cheat Sheet

Data Processing

note: data note here
place note in dataset

Tim Essam (tessam@usaid.gov) • Laura Hughes (lhughes@usaid.gov)
follow us @StataRGIS and @flaneuseks

label list
list all labels within the dataset

Value labels map string descriptions to numbers. They allow the
underlying data to be numeric (making logical tests simpler)
while also connecting the values to human-understandable text.
label define myLabel 0 "US" 1 "Not US"
label values foreign myLabel
define a label and apply it the values in foreign

Label Data

useful for cleaning survey datasets
mvdecode _all, mv(9999)
replace the number 9999 with missing value in all variables
mvencode _all, mv(9999)
useful for exporting data
replace missing values with the number 9999 for all variables

REPLACE MISSING VALUES

replace price = 5000 if price < 5000
replace all values of price that are less than $5,000 with 5000
recode price (0 / 5000 = 5000)
change all prices less than 5000 to be $5,000
recode foreign (0 = 2 "US")(1 = 1 "Not US"), gen(foreign2)
change the values and value labels then store in a new
variable, foreign2

CHANGE ROW VALUES

rename (rep78 foreign) (repairRecord carType)
rename one or multiple variables

CHANGE COLUMN NAMES

Replace Parts of Data

drop if mpg < 20
drop in 1/4
drop observations based on a condition (left)
or rows 1-4 (right)
keep in 1/30
opposite of drop; keep only rows 1-30
keep if inrange(price, 5000, 10000)
keep values of price between $5,000 – $10,000 (inclusive)
keep if inlist(make, "Honda Accord", "Honda Civic", "Subaru")
keep the specified values of make
sample 25
sample 25% of the observations in the dataset
(use set seed # command for reproducible sampling)

FILTER SPECIFIC ROWS

drop make
remove the 'make' variable
keep make price
opposite of drop; keep only variables 'make' and 'price'

SELECT SPECIFIC COLUMNS

Select Parts of Data (Subsetting)

For more info see Stata’s reference manual (stata.com)

with Stata 14.1 Cheat Sheet

Data Transformation

Uganda

unique id create new variable which captures
variable (key) the info in the column names

2012
2011
2012

Combine Data

+

blue

pink

pink

should
contain
the same
variables
(columns)

id

blue

pink

blue

pink

=
_merge code
1 row only
(master) in ind2
2 row only
(using) in hh2
3 row in
(match) both

+

id brown

=
id

.

blue

.

.

.

2

1

3

3

1

3

3

pink brown _merge

3

3

3

pink brown _merge

MANY-TO-ONE

blue

ONE-TO-ONE
id

merge m:1 hid using "hh2.dta"
many-to-one merge of "hh2.dta"
into the loaded dataset and create
variable "_merge" to track the origin

webuse hh2.dta, clear
save hh2.dta, replace
webuse ind2.dta, clear

inspired by RStudio’s awesome Cheat Sheets (rstudio.com/resources/cheatsheets)

Disclaimer: we are not affiliated with Stata. But we like it.

CC BY 4.0

updated March 2016

Save & Export Data

compress
compress data in memory
Stata 12-compatible file
save "myData.dta", replace
saveold "myData.dta", replace version(12)
save data in Stata format, replacing the data if
a file with same name exists
export excel "myData.xls", /*
*/ firstrow(variables) replace
export data as an Excel file (.xls) with the
variable names as the first row
export delimited "myData.csv", delimiter(",") replace
export data as a comma-delimited file (.csv)

display regexr("My string", "My", "Your")
replace string1 ("My") with string2 ("Your")
replace make = subinstr(make, "Cad.", "Cadillac", 1)
replace first occurrence of "Cad." with Cadillac
in the make variable
display stritrim(" Too much Space")
replace consecutive spaces with a single space
display trim(" leading / trailing spaces ")
remove extra spaces before and after a string
display strlower("STATA should not be ALL-CAPS")
change string case; see also strupper, strproper
display strtoname("1Var name")
convert string to Stata-compatible variable name
display real("100")
convert string to a numeric or missing value

TRANSFORM STRINGS

list if inlist(word(make, 1), "Cad.", "Chev.", "Datsun")
return all observations where the first word of the
make variable contains the listed words

compare the given list against the first word in make

display strmatch("123.89", "1??.?9")
return true (1) or false (0) if string matches pattern
display substr("Stata", 3, 5)
return the string located between characters 3-5
list make if regexm(make, "[0-9]")
list observations where make matches the regular
expression (here, records that contain a number)
list if regexm(make, "(Cad.|Chev.|Datsun)")
return all observations where make contains
"Cad.", "Chev." or "Datsun"

FIND MATCHING STRINGS

display length("This string has 29 characters")
return the length of the string
* user-defined package
charlist make
display the set of unique characters within a string
display strpos("Stata", "a")
return the position in Stata where a is first found

GET STRING PROPERTIES

Manipulate Strings

geocenter.github.io/StataTraining

reclink match records from different data sets using probabilistic matching ssc install reclink
jarowinkler create distance measure for similarity between two strings ssc install jarowinkler

FUZZY MATCHING: COMBINING TWO DATASETS WITHOUT A COMMON ID

id

+

must contain a
common variable
id blue pink (id) id brown

webuse ind_age.dta, clear
save ind_age.dta, replace
webuse ind_ag.dta, clear
merge 1:1 id using "ind_age.dta"
one-to-one merge of "ind_age.dta"
into the loaded dataset and create
variable "_merge" to track the origin

append using "coffeeMaize2.dta", gen(filenum)
add observations from "coffeeMaize2.dta" to
current data and create variable "filenum" to
track the origin of each observation

webuse coffeeMaize2.dta, clear
save coffeeMaize2.dta, replace load demo data
webuse coffeeMaize.dta, clear

MERGING TWO DATASETS TOGETHER

id

blue

ADDING (APPENDING) NEW DATA
id

When datasets are
tidy, they have a
consistent,
standard format
that is easier to
manipulate and
analyze.

xpose, clear varname
transpose rows and columns of data, clearing the data and saving
old column names as a new variable called "_varname"

reshape wide coffee maize, i(country) j(year)
convert a long dataset to wide

create new variables named
coffee2011, maize2012...

Rwanda
Uganda
Uganda

what will be create new variables
unique id with the year added
variable (key) to the column name

CAST DATA (LONG → WIDE)

cast

reshape long coffee@ maize@, i(country) j(year)
new variable
convert a wide dataset to long
TIDY DATASETS have
WIDE
LONG (TIDY) each observation
country
year coffee maize
melt
coffee coffee maize maize
in its own row and
country 2011
2012
2011 2012
Malawi
2011
each variable in its
Malawi
2012
Malawi
Rwanda
2011
own column.
Rwanda

reshape variables starting
with coffee and maize

MELT DATA (WIDE → LONG)

webuse set https://github.com/GeoCenter/StataTraining/raw/master/Day2/Data
webuse "coffeeMaize.dta"
load demo dataset

Reshape Data

b

c

graph hbar ...

ssc install vioplot

Laura Hughes (lhughes@usaid.gov) • Tim Essam (tessam@usaid.gov)
follow us @flaneuseks and @StataRGIS

combine twoway plots using ||

[in]

plot-specific options

[if], 

2

y1
y3

20

23
17
10

y2

line

vertical • horizontal • barwidth(#) • mwidth
msize()

range plot (y1 ÷ y2) with bars

twoway rbar length headroom price

vertical • horizontal • sort
cmissing(yes | no)

range plot (y1 ÷ y2) with area shading

see also rcap
twoway rarea length headroom price, sort

vertical • horizontal

range plot (y1 ÷ y2) with capped lines

twoway rcapsym length headroom price

vertical, • horizontal • base(#)

twoway dropline mpg price in 1/5

dropped line plot

vertical, • horizontal • base(#) • ndots(#)
dcolor() • dfcolor() • dlcolor()
dsize() • dsymbol()
dlwidth() • dotextend(yes | no)

twoway dot mpg rep78

dot plot

vertical, • horizontal • base(#) • barwidth(#)

twoway bar price rep78

bar plot

sort • cmissing(yes | no) • vertical, • horizontal
base(#)

line plot with area shading

twoway area mpg price, sort(price)

jitter(#) • jitterseed(#) • sort
see also
connect() • cmissing(yes | no)

scatter plot with connected lines and symbols

twoway connected mpg price, sort(price)

jitter(#) • jitterseed(#) • sort • cmissing(yes | no)
connect() • [aweight()]

scatter plot with labelled values

twoway scatter mpg weight, mlabel(mpg)

jitter(#) • jitterseed(#) • sort • cmissing(yes | no)
connect() • [aweight()]

scatter plot

twoway scatter mpg weight, jitter(7)

half • jitter(#) • jitterseed(#)
diagonal • [aweights()]

scatter plot of each combination of variables

graph matrix mpg price weight, half

TWO+ CONTINUOUS VARIABLES

custom appearance

facet

by(var)
axes

annotations

xline(xint) yline(yint) text(y x "annotation")

vertical • horizontal • headlabel

twoway pccapsym wage68 ttl_exp68 wage88 ttl_exp88
Slope/bump plot
(sysuse nlswide1)

vertical, • horizontal

save

twoway pcspike wage68 ttl_exp68 wage88 ttl_exp88
(sysuse nlswide1)

plot size

Parallel coordinates plot

mat() • color() • freq

ssc install binscatter

CC BY 4.0

updated February 2016
Disclaimer: we are not affiliated with Stata. But we like it.

geocenter.github.io/StataTraining

horizontal • noci

Plot marginal effects of regression

regress mpg weight length turn
margins, eyex(weight) at(weight = (1800(200)4800))
marginsplot, noci

baselevels • b() • at() • noci • levels(#)
keep() • drop() • rename()
horizontal • vertical • generate()

Plot regression coefficients

regress price mpg headroom trunk length turn
ssc install coefplot
coefplot, drop(_cons) xline(0)

REGRESSION RESULTS

level(#) • stdp • stdf • nofit • fitplot() • ciplot() •
range(# #) • n(#) • atobs • estopts() • predopts()

calculate and plot quadriatic fit to data with confidence intervals

twoway qfitci mpg weight, alwidth(none) || scatter mpg weight

bwidth(#) • mean • noweight • logit • adjust

calculate and plot lowess smoothing

twoway lowess mpg weight || scatter mpg weight

level(#) • stdp • stdf • nofit • fitplot() • ciplot() •
range(# #) • n(#) • atobs • estopts() • predopts()

calculate and plot linear fit to data with confidence intervals

twoway lfitci mpg weight || scatter mpg weight

FITTING RESULTS

medians • nquantiles(#) • discrete • controls() •
linetype(lfit | qfit | connect | none) • aweight[]

binscatter weight mpg, line(none)

plot a single value (mean or median) for each x value

bands(#)

plot median of the y values

twoway mband mpg weight || scatter mpg weight

SUMMARY PLOTS

heatmap

regress price mpg trunk weight length turn, nocons
matrix regmat = e(V)
ssc install plotmatrix
plotmatrix, mat(regmat) color(green)

ccuts(#s) • levels(#) • minmax • crule(hue | chue| intensity) •
scolor() • ecolor () • ccolors() • heatmap
interp(thinplatespline | shepard | none)

3D contour plot

twoway contour mpg price weight, level(20) crule(intensity)

THREE VARIABLES

inspired by RStudio’s awesome Cheat Sheets (rstudio.com/resources/cheatsheets)

graph twoway scatter mpg price in 27/74 || scatter mpg price /*
*/ if mpg < 15 & price > 12000 in 27/74, mlabel(make) m(i)

plot several y values for a single x value

scatter y3 y2 y1 x, marker(i o i) mlabel(var3 var2 var1)

combine 2+ saved graphs into a single plot

graph combine plot1.gph plot2.gph...

SUPERIMPOSE

total • missing • colfirst • rows(#) • cols(#) • holes()
compact • [no]edgelabel • [no]rescale • [no]yrescal • [no]xrescale
[no]iyaxes • [no]ixaxes • [no]iytick • [no]ixtick [no]iylabel
[no]ixlabel • [no]iytitle • [no]ixtitle • imargin()

twoway scatter mpg price, by(foreign, norescale)

JUXTAPOSE (FACET)

Plot Placement

vertical • horizontal • obs • kernel() • bwidth(#) •
barwidth(#) • dscale(#) • ygap(#) • ogap(#) • density()
bar() • median() • obsopts()

violin plot over(, )>) • nofill •

vioplot price, over(foreign)

over(, )>) • missing • allcategories • intensity(*#) • boxgap(#)
medtype(line | line | marker) • medline() • medmarker()

graph hbox mpg, over(rep78, descending) by(foreign) missing
graph box draws vertical boxplots
box plot

over(, )>) • cw • missing • nofill • allcategories • percentages
linegap(#) • marker(#, ) • linetype(dot | line | rectangle)
dots() • lines() • rectangles() • rwidth

dot plot (asis) • (percent) • (count) • (stat: mean median sum min max ...)

graph dot (mean) length headroom, over(foreign) m(1, ms(S))

over(, )>) • cw • missing • nofill • allcategories • percentages
stack • bargap(#) • intensity(*#) • yalternate • xalternate

bar plot (asis) • (percent) • (count) • (stat: mean median sum min max ...)

graph bar (median) price, over(foreign)

graph hbar ...

(asis) • (percent) • (count) • over(, ) • cw •missing • nofill • allcategories •
percentages • stack • bargap(#) • intensity(*#) • yalternate • xalternate

grouped bar plot

graph bar (percent), over(rep78) over(foreign)

(asis) • (percent) • (count) • over(, ) • cw •missing • nofill • allcategories •
percentages • stack • bargap(#) • intensity(*#) • yalternate • xalternate

main plot-specific options;
see help for complete set

graph bar (count), over(foreign, gap(*0.5)) intensity(*0.5)
graph hbar draws horizontal bar charts

bar plot

bwidth • kernel(
normal • normopts()

smoothed histogram

kdensity mpg, bwidth(3)

y1 y2 … yn x

variables: y first

 scheme(s1mono) play(customTheme) xsize(5) ysize(4) saving("myPlot.gph", replace)

bin(#) • width(#) • density • fraction • frequency • percent • addlabels
addlabopts() • normal • normopts() • kdensity
kdenopts()

histogram

DISCRETE X, CONTINUOUS Y

a

DISCRETE

sysuse auto, clear

titles

graph 

title("title") subtitle("subtitle") xtitle("x-axis title") ytitle("y axis title") xscale(range(low high) log reverse off noline) yscale()

BASIC PLOT SYNTAX:

histogram mpg, width(5) freq kdensity kdenopts(bwidth(5))

ONE VARIABLE
CONTINUOUS

For more info see Stata’s reference manual (stata.com)

with Stata 14.1 Cheat Sheet

Data Visualization

y-line

y-axis labels

y-axis title

y-axis

arguments for the plot
objects (in green) go in the
options portion of these
commands (in orange)

mcolor(none)

mfcolor(none)

mfcolor("145 168 208")

medsmall
small
vsmall
tiny
vtiny

X

+

p

th

none i

sh

jitterseed(#)

dh

oh

Sh

Th

set seed

Dh

Oh

s

t

jitter(#)

d

o

S

T

randomly displace the markers

D

specify the marker symbol:

O

msymbol(Dh)

large

vlarge

huge

vhuge

medium

medlarge

specify the marker size:

ehuge

msize(medium)

specify the fill of the marker

specify the fill and stroke of the marker
in RGB or with a Stata color

mcolor("145 168 208")

for example:
scatter price mpg, xline(20, lwidth(vthick))



marker

SYMBOLS
axes

x-axis

2
3

tick marks

20

dash_dot

blank

shortdash_dot

longdash_dot

60

1

100

5

color(none)

legend(...)

legend

axis labels

xlabel(...)
ylabel(...)

tick marks

grid lines

marker

line

marker label

change legend label text

label(# "label")

turn off legend

off

change the format of the axis labels

marker label mlabposition(5)
label location relative to marker (clock position: 0 – 12)

legend

legend

format(%12.2f )
axis labels

no axis labels

nolabels
axis labels

marker label mlabel(foreign)
label the points with the values
of the foreign variable

11 pt.

12 pt.

14 pt.

16 pt.

20 pt.

10 pt. medsmall
8 pt. small
huge
6 pt.
vsmall
4 pt.
tiny
vlarge
2 pt.
half_tiny
large
1.3 pt. third_tiny
medlarge 1 pt. quarter_tiny
medium 1 pt minuscule

28 pt. vhuge

labcolor("145 168 208")

specify the size of the text:
size(medsmall)
marker label mlabsize(medsmall)
axis labels labsize(medsmall)

axis labels

marker label mlabcolor("145 168 208")

specify the color of the text

titles

title(...)
subtitle(...)
xtitle(...)
ytitle(...)

y2
Fitted values

80

8

color("145 168 208")

text(...)

annotation

marker label



TEXT

legend

x-axis title

4

10

titles

inspired by RStudio’s awesome Cheat Sheets (rstudio.com/resources/cheatsheets)

tick marks xlabel(#10, tposition(crossing))
number of tick marks, position (outside | crossing | inside)

axes off no axis/labels
noline
tick marks noticks
tick marks tlength(2)
grid lines nogrid nogmin nogmax

dot

shortdash

longdash

dash

solid

specify the
line pattern

medthin
thin
vthin
vvthin
vvvthin
none

lpattern(dash)
glpattern(dash)

axes

40

7

mlwidth(thin)
tlwidth(thin)
glwidth(thin)

grid lines

axes

line

vvvthick
vvthick
vthick
thick
medthick
medium

grid lines

marker
tick marks

specify the thickness
(stroke) of a line:

tlcolor("145 168 208")
glcolor("145 168 208")

lwidth(medthick)

grid lines

tick marks

marker mlcolor("145 168 208")

lcolor(none)

specify the stroke color of the line or border

marker

lcolor("145 168 208")

line

0

6

9

title

subtitle

plots contain many features

annotation

  yscale(...)
xline(...)
xlabel(...)
yline(...)
legend
ylabel(...)
legend(region(...))

LINES / BORDERS

specify the fill of the plot background in RGB or with a Stata color

Laura Hughes (lhughes@usaid.gov) • Tim Essam (tessam@usaid.gov)
follow us @flaneuseks and @StataRGIS

POSITION

APPEARANCE

SIZE / THICKNESSS

COLOR

SYNTAX

scatter price mpg, plotregion(fcolor("224 224 224") ifcolor("240 240 240"))

specify the fill of the background in RGB or with a Stata color

outer region
inner region
scatter price mpg, graphregion(fcolor("192 192 192") ifcolor("208 208 208"))

plot region

inner plot region

inner graph region

graph region

For more info see Stata’s reference manual (stata.com)

Customizing Appearance

ANATOMY OF A PLOT

150

100

Plotting in Stata 14.1
200

y-axis title
50
0

Disclaimer: we are not affiliated with Stata. But we like it.

geocenter.github.io/StataTraining

CC BY 4.0

updated June 2016

graph twoway scatter y x, saving("myPlot.gph") replace
save the graph when drawing
graph save "myPlot.gph", replace
save current graph to disk
graph combine plot1.gph plot2.gph...
combine 2+ saved graphs into a single plot
graph export "myPlot.pdf", as(.pdf)
see options to set
export the current graph as an image file size and resolution

Save Plots

Save theme
as a .grec file

Unclick
Record

Double click on
symbols and areas
on plot, or regions
on sidebar to
customize

Click
Record

Select the
Graph Editor

twoway scatter mpg price, play(graphEditorTheme)

USING THE GRAPH EDITOR

install William Buchanan’s package to generate custom
schemes and color palettes (including ColorBrewer)

net inst brewscheme, from("https://wbuchanan.github.io/brewscheme/") replace

set scheme customTheme, permanently
change the theme

set as default scheme

Create custom themes by

help scheme entries saving options in a .scheme file
see all options for setting scheme properties
adopath ++ "~//StataThemes"
set path of the folder (StataThemes) where custom
.scheme files are saved

twoway scatter mpg price, scheme(customTheme)

USING A SAVED THEME

Schemes are sets of graphical parameters, so you don’t
have to specify the look of the graphs every time.

Apply Themes

Examples use auto.dta (sysuse auto, clear)
unless otherwise noted

DESCRIPTION
specify indicators
specify base indicator
command to change base
treat variable as continuous
omit a variable or indicator
specify interactions
specify factorial interactions

OPERATOR
i.
ib.
fvset
c.

o.
#

##

Tim Essam (tessam@usaid.gov) • Laura Hughes (lhughes@usaid.gov)
follow us @StataRGIS and @flaneuseks

INDICATOR VARIABLES
denote whether
T F
something is true or false

identify a group to which
an observations belongs

CATEGORICAL VARIABLES

measure something

CONTINUOUS VARIABLES

webuse sunspot, clear

lag x t-1
lead x t+1
difference x t-x t-1
seasonal difference x t-xt-1

L2.
F2.
D2.
S2.

1900

1950

2-period lag x t-2
2-period lead x t+2
difference of difference xt-xt−1-(xt−1-xt−2)
lag-2 (seasonal difference) xt−xt−2

1850

webuse drugtr, clear

create all possible interactions with mpg (mpg and mpg2)

inspired by RStudio’s awesome Cheat Sheets (rstudio.com/resources/cheatsheets)

regress price c.mpg##c.mpg

regress price io(2).rep78
regress price mpg c.mpg#c.mpg

specify rep78 variable to be an indicator variable
set the third category of rep78 to be the base category
set the base to most frequently occurring category for rep78
treat mpg as a continuous variable and
specify an interaction between foreign and mpg
set rep78 as an indicator; omit observations with rep78 == 2
create a squared mpg term to be used in regression

more details at http://www.stata.com/manuals14/u25.pdf

EXAMPLE
regress price i.rep78
regress price ib(3).rep78
fvset base frequent rep78
regress price i.foreign#c.mpg i.foreign

id 3

id 1

1980

1990

not appropriate after robust cluster( )

estat hettest test for heteroskedasticity
r
ovtest test for omitted variable bias
vif
report variance inflation factor
dfbeta(length)
Type help regress postestimation plots
calculate measure of influence for additional diagnostic plots
rvfplot, yline(0)
avplots
plot residuals
plot all partialmpg
rep78
against fitted
regression leverage
values
plots in one graph
Fitted values
weight
headroom

2 Diagnostics

1970

id 4

id 2

webuse nhanes2b, clear

0

2

4

0

2

4

svyset psuid [pweight = finalwgt], strata(stratid)
declare survey design for a dataset
r
svydescribe
report survey data details
svy: mean age, over(sex)
estimate a population mean for each subpopulation
svy, subpop(rural): mean age
estimate a population mean for rural areas
e
svy: tabulate sex heartatk
report two-way table with tests of independence
svy: reg zinc c.age##c.age female weight rural
estimate a regression using survey weights

SURVEY DATA

stores results as e -class

webuse nlswork, clear

xtset id year
declare national longitudinal data to be a panel
xtdescribe
xtline plot
report panel aspects of a dataset
wage relative to inflation
r
xtsum hours
summarize hours worked, decomposing
standard deviation into between and
within components
xtline ln_wage if id <= 22, tlabel(#3)
plot panel data as a line plot
xtreg
ln_w c.age##c.age ttl_exp, fe vce(robust)
e
estimate a fixed-effects model with robust standard errors

PANEL / LONGITUDINAL

regress price mpg weight, robust
estimate ordinary least squares (OLS) model
on mpg weight and foreign, apply robust standard errors
regress price mpg weight if foreign == 0, cluster(rep78)
regress price only on domestic cars, cluster standard errors
rreg price mpg weight, genwt(reg_wt)
estimate robust regression to eliminate outliers
probit foreign turn price, vce(robust)
ADDITIONAL MODELS
estimate probit regression with
built-in Stata principal components analysis
pca
command
robust standard errors
factor analysis
factor
poisson • nbreg
count outcomes
logit foreign headroom mpg, or
censored data
tobit
estimate logistic regression and
instrumental variables
ivregress ivreg2
report odds ratios
difference-in-difference
bootstrap, reps(100): regress mpg /* rddiff sscuser-written
install ivreg2 regression discontinuity
*/ weight gear foreign
xtabond xtabond2 dynamic panel estimator
estimate regression with bootstrapping psmatch2
propensity score matching
jackknife r(mean), double: sum mpg synth
synthetic control analysis
Blinder-Oaxaca decomposition
jackknife standard error of sample mean oaxaca

1 Estimate Models

stset studytime, failure(died)
r declare survey design for a dataset
stsum
summarize survival-time data
stcox drug age
e
estimate a cox proportional hazard model

SURVIVAL ANALYSIS

compact time series into means, sums and end-of-period values
tscollap
carryforward carry non-missing values forward from one obs. to the next
identify spells or runs in time series
tsspell

USEFUL ADD-INS

L.
F.
D.
S.

TIME SERIES OPERATORS

0

100

200

tsset time, yearly
declare sunspot data to be yearly time series
tsreport
r
report time series aspects of a dataset
generate lag_spot = L1.spot
create a new variable of annual lags of sun spots tsline plot
Number of sunspots
tsline spot
plot time series of sunspots
e
arima spot, ar(1/2)
estimate an auto-regressive model with 2 lags

TIME SERIES

Estimation with Categorical & Factor Variables

tabulate foreign rep78, chi2 exact expected
tabulate foreign and repair record and return chi2
and Fisher’s exact statistic alongside the expected values
ttest mpg, by(foreign)
estimate t test on equality of means for mpg by foreign
r prtest foreign == 0.5
one-sample test of proportions
ksmirnov mpg, by(foreign) exact
Kolmogorov-Smirnov equality-of-distributions test
ranksum mpg, by(foreign) exact
equality tests on unmatched data (independent samples)
anova systolic drug webuse systolic, clear
analysis of variance and covariance
e pwmean mpg, over(rep78) pveffects mcompare(tukey)
estimate pairwise comparisons of means with equal
variances include multiple comparison adjustment

Statistical Tests

univar price mpg, boxplot
ssc install univar
calculate univariate summary, with box-and-whiskers plot
stem mpg
return stem-and-leaf display of mpg
frequently used commands are
summarize price mpg, detail
highlighted in yellow
calculate a variety of univariate summary statistics
for Stata 13: ci mpg price, level (99)
ci mean mpg price, level(99)
r compute standard errors and confidence intervals
correlate mpg price
return correlation or covariance matrix
pwcorr price mpg weight, star(0.05)
return all pairwise correlation coefficients with sig. levels
mean price mpg
estimates of means, including standard errors
proportion rep78 foreign
estimates of proportions, including standard errors for
e
categories identified in varlist
ratio
estimates of ratio, including standard errors
total price
estimates of totals, including standard errors

Summarize Data

Results are stored as either r -class or e -class. See Programming Cheat Sheet

For more info see Stata’s reference manual (stata.com)

with Stata 14.1 Cheat Sheet

By declaring data type, you enable Stata to apply data munging and analysis functions specific to certain data types

commands that use a fitted model

Disclaimer: we are not affiliated with Stata. But we like it.

geocenter.github.io/StataTraining

CC BY 4.0

updated June 2016

regress price headroom length Used in all postestimation examples
display _b[length]
display _se[length]
return coefficient estimate or standard error for mpg
from most recent regression model
margins, dydx(length) returns e-class information when post option is used
return the estimated marginal effect for mpg
r
margins, eyex(length)
return the estimated elasticity for price
predict yhat if e(sample)
create predictions for sample on which model was fit
predict double resid, residuals
calculate residuals based on last fit model
test mpg = 0
r test linear hypotheses that mpg estimate equals zero
lincom headroom - length
test linear combination of estimates (headroom = length)

3 Postestimation

Residuals

Declare Data

price

price

Data Analysis

price

price

Cheat Sheet

e-class results are stored as matrices

available only in programs, loops, or .do files PRIVATE

e

return results from estimation
commands such as regress or mean

=
=
=
=

74
6165.25...
86995225.97...
2949.49...
...

Results are replaced
each time an r-class
/ e-class command
is called

scalars:

e(df_r)
e(N_over)
e(N)
e(k_eq)
e(rank)

=
=
=
=
=

73
1
73
1
1

mean price
e ereturn list
returns list of scalars, macros,
matrices and functions

The estout and outreg2 packages provide numerous, flexible options for making tables
after estimation commands. See also putexcel command.

EXPORTING RESULTS

regress price weight
Use estimates store
estimates store est1
to compile results
store previous estimation results est1 in memory for later use
ssc install estout
eststo est2: regress price weight mpg
eststo est3: regress price weight mpg foreign
estimate two regression models and store estimation results
estimates table est1 est2 est3
print a table of the two estimation results est1 and est2

After you run any estimation command, the results of the estimates are
stored in a structure that you can save, view, compare, and export

ACCESSING ESTIMATION RESULTS

generate p_mean = r(mean)
create a new variable equal to
average of price

generate meanN = e(N)
create a new variable equal to
obs. in estimation command
preserve create a temporary copy of active dataframe
restore points to test
restore restore temporary copy to original point set
code that changes data

scalars:
r(N)
r(mean)
r(Var)
r(sd)

summarize price, detail
r return list
returns a list of scalars

Many Stata commands store results in types of lists. To access these, use return or
ereturn commands. Stored results can be scalars, macros, matrices or functions.

4 Access & Save Stored r- and e-class Objects

* there’s also s- and n-class

To assign values to individual variables use:
r individual numbers or strings
e rectangular array of quantities or expressions
e pointers that store text (global or local)

1 SCALARS
2 MATRICES
3 MACROS

r

return results from general commands
such as summary or tabulate

basic components of programming

R- AND E-CLASS: Stata stores calculation results in two* main classes:

Building Blocks
see also while

close brace must appear
on final line by itself

command(s) you want to repeat
can be one line or many

open brace must
appear on first line

• foreach in takes any list
as an argument with
elements separated by
spaces
• foreach of requires you
to state the list type,
which makes it faster

summarize mpg
summarize weight

DEBUGGING CODE

forvalues i = 10(10)50 {
display `i'
numeric values over
which loop will run
}

iterator

i = 10/50
10, 11, 12, ...
i = 10(10)50
10, 20, 30, ...
i = 10 20 to 50 10, 20, 30, ...

ITERATORS

Use display command to
show the iterator value at
each step in the loop

display 10
display 20
...

FORVALUES: REPEAT COMMANDS OVER LISTS OF NUMBERS

foreach x of varlist mpg weight {
summarize `x'
}

must define list type

VARIABLES
foreach x in mpg weight {
summarize `x'
}

When calling a command that takes a string,
surround the macro name with quotes.

foreach x in|of [ local, global, varlist, newlist, numlist ] {
list types: objects over which the
Stata commands referring to `x'
commands will be repeated
}
loops repeat the same command
STRINGS
over different arguments:
sysuse "auto.dta", clear
foreach x in auto.dta auto2.dta {
same as...
tab rep78, missing
sysuse "`x'", clear
tab rep78, missing
sysuse "auto2.dta", clear
}
tab rep78, missing
LISTS
foreach x in "Dr. Nick" "Dr. Hibbert" {
display length("Dr. Nick")
display length ( "` x '" )
display length("Dr. Hibbert")
}

FOREACH: REPEAT COMMANDS OVER STRINGS, LISTS, OR VARIABLES

}

command `x', option
...

temporary variable used
only within the loop
requires local macro notation

foreach x of varlist var1 var2 var3 {

objects to repeat over

Stata has three options for repeating commands over lists or values:
foreach, forvalues, and while. Though each has a different first line,
the syntax is consistent:

Loops: Automate Repetitive Tasks

ANATOMY OF A LOOP

Tim Essam (tessam@usaid.gov) • Laura Hughes (lhughes@usaid.gov)
follow us @StataRGIS and @flaneuseks

inspired by RStudio’s awesome Cheat Sheets (rstudio.com/resources/cheatsheets)

Disclaimer: we are not affiliated with Stata. But we like it.

geocenter.github.io/StataTraining

CC BY 4.0

updated June 2016

local myLocal price mpg length
esttab est1 est2, se star(* 0.10 ** 0.05 *** 0.01) label
see also capture and scalar _rc
set trace on (off )
create local variable called myLocal with the
create summary table with standard errors and labels
trace
the
execution
of
programs
for
error
checking
strings price mpg and length
esttab using “auto_reg.txt”, replace plain se
sysuse auto, clear
PUTTING
IT
ALL
TOGETHER
summarize ` myLocal ' add a ` before and a ' after local macro name to call
export summary table to a text file, include standard errors
pull out the first word
summarize contents of local myLocal
generate
car_make
=
word(make,
1)
from the make variable
outreg2 [est1 est2] using “auto_reg2.txt”, see replace
levelsof rep78, local(levels)
calculate unique groups of
export summary table to a text file using outreg2 syntax
levelsof car_make, local(cmake)
define the
create a sorted list of distinct values of rep78,
car_make and store in local cmake
local i to be
local i = 1
store results in a local macro called levels
an iterator
Additional Programming Resources
store the length of local
local cmake_len : word count `cmake'
local varLab: variable label foreign can also do with value labels
cmake in local cmake_len
store the variable label for foreign in the local varLab
 bit.ly/statacode
foreach x of local cmake {
download all examples from this cheat sheet in a .do file
display in yellow "Make group `i' is `x'"
TEMPVARS & TEMPFILES special locals for loops/programs
ssc install adolist
adoupdate
adolist
if `i' == `cmake_len' {
initialize
a
new
temporary
variable
called
temp1
tempvar temp1
Update user-written .ado files
List/copy user-written .ado files
tests the position of the
display "The total number of groups is `i'"
save squared mpg values in temp1
generate `temp1' = mpg^2
iterator,
executes
contents
 net install package, from (https://raw.githubusercontent.com/username/repo/master) in brackets when the
summarize the temporary variable temp1
}
summarize `temp1'
install a package from a Github repository
condition is true
local i = `++i'
increment iterator by one
tempfile myAuto create a temporary file to see also
https://github.com/andrewheiss/SublimeStataEnhanced
}
save `myAuto'
be used within a program tempname
configure Sublime text for Stata 11-14

PUBLIC

LOCALS

global pathdata "C:/Users/SantasLittleHelper/Stata"
define a global variable called pathdata
cd $pathdata add a $ before calling a global macro
change working directory by calling global macro
global myGlobal price mpg length
summarize $myGlobal
summarize price mpg length using global

available through Stata sessions

public or private variables storing text

GLOBALS

3 Macros

[scalar | matrix | macro | estimates] [list | drop] b
list contents of object b or drop (delete) object b
[scalar | matrix | macro | estimates] dir
list all defined objects for that class
matrix list b
matrix dir
scalar drop x1
list contents of matrix b list all matrices delete scalar x1

DISPLAYING & DELETING BUILDING BLOCKS

matrix ad2 = a , d
matrix ad1 = a \ d
row bind matrices
column bind matrices
matselrc b x, c(1 3) findit matselrc
select columns 1 & 3 of matrix b & store in new matrix x
mat2txt, matrix(ad1) saving(textfile.txt) replace
export a matrix to a text file
ssc install mat2txt

matrix a = (4\ 5\ 6)
matrix b = (7, 8, 9)
create a 3 x 1 matrix
create a 1 x 3 matrix
matrix d = b' transpose matrix b; store in d

2 Matrices

Scalars can hold
numeric values or
arbitrarily long strings

both r- and e-class results contain scalars

scalar x1 = 3
create a scalar x1 storing the number 3
scalar a1 = “I am a string scalar”
create a scalar a1 storing a string

1 Scalars

For more info see Stata’s reference manual (stata.com)

with Stata 14.1

Programming



Source Exif Data:
File Type                       : PDF
File Type Extension             : pdf
MIME Type                       : application/pdf
PDF Version                     : 1.5
Linearized                      : No
Page Count                      : 32
Page Mode                       : UseOutlines
Author                          : Jakob Jul Elben
Title                           : Intro - Forskningsassistent
Subject                         : 
Creator                         : LaTeX with hyperref package
Producer                        : pdfTeX-1.40.17
Create Date                     : 2017:02:28 19:16:10+01:00
Modify Date                     : 2017:02:28 19:16:10+01:00
Trapped                         : False
PTEX Fullbanner                 : This is MiKTeX-pdfTeX 2.9.6211 (1.40.17)
EXIF Metadata provided by EXIF.tools

Navigation menu