* Introduction to Stata
* prepared for Development Economics at LMU
* by Vojtech Bartos
* Examine Stata interface: review, results, command, variables, do-file, menu
* Use .do files
* Store log files; this just created womenswage.smcl on your computer
* (the file is not of much help on its own; we'll get to reading the log file to stata at the end)
* use replace if you need to run the do file multiple times
* you can also use a "text" option to display the log as a text readable in Notepad/TextEdit
log using womenswage, replace
* running a long code does not get interrupted
set more off
* Typing commands
display "Hello world!"
* Use Stata as a calculator
display 2+2
* Stata case sensitive!
Display 2+2
* Now show the review window - we can go back to the command history.
/*
Commonly used functions
abs(x) the absolute value of x
exp(x) the exponential function of x
int(x) the integer obtained by truncating x towards zero
ln(x) or log(x) the natural logarithm of x if x>0
log10(x) the log base 10 of x (for x>0)
logit(x) the log of the odds for probability x: logit(x) = ln(x/(1-x))
max(x1,x2,...,xn) the maximum of x1, x2, ..., xn, ignoring missing values
min(x1,x2,...,xn) the minimum of x1, x2, ..., xn, ignoring missing values
round(x) x rounded to the nearest whole number
sqrt(x) the square root of x if x >= 0
*/
* Search: can be done in the internet (google, stata has a full pdf documentation)
* or if you know the command but are not sure about syntax: (Viewer opens)
help regress
* use a working directory for every project you start, keep your files well organized
* seems that Stata doesn't care if you use \ or / to separate directories
cd "/Users/vojtabartos/Documents/4 Teaching/2021 Development Economics/Tutorials/Exercise 0 - Stata Intro"
/* we have data on labor market outcomes of several hundreds of women, separately in
rural and urban areas; we want to connect these two datasets; we also want to merge the dataset
with another variable stating their marital status
*/
/*
Stata has other commands for interacting with the operating system, including:
- mkdir to create a directory
- dir to list the names of the files in a directory
- type to list their contents
- copy to copy files
- erase to delete a file
*/
* loading data
use womenwage_rural.dta, clear
* append using the urban data
append using womenwage_nonrural.dta
*********************
* want to keep your existing data for later and work on some other dataset inbetween? ->
* "restore" needs to follow to get back to the pre-preserve data
preserve
* we only have access to a .csv version of the marital status data
* let's convert it to Stata .dta
clear
insheet using womenwage_nev_mar.csv, delimiter(";") names
* use save for your preferred version of Stata, I use saveold command as some of you may have older licences
* differences across versions are mainly in encoding of string variables from what I understand
saveold womenwage_nev_mar, replace
restore
*********************
* merge with the marital status data; id is the identifying variable we use
merge 1:1 id using womenwage_nev_mar
* first check of what is in the data
describe
* alternatively, look at Data/Variables Manager
* summary statistics
summarize age nev_mar rural school tenure wage wagecat
sum school, detail
sum wage, d
bysort rural: sum wage
* generate new variable
generate log_wage=log(wage*1000)
generate age2=age^2
* generate dummies
generate some_experience=(tenure>0 & tenure!=.)
/*
More operators and expressions
Arithmetic Logical Relational
+ add ! not (also ~) == equal
- subtract | or != not equal (also ~=)
* multiply & and < less than
/ divide <= less than or equal
^ raise to power > greater than
+ string concatenation >= greater than or equal
*/
* plotting data
histogram wage
* help function
/* for online help see either Stata manual (available in PDF online)
or look at the online forums:
- http://www.statalist.org
- http://www.stata.com/support/faqs/
*/
help histogram
histogram wage, by(rural, total) percent
* scatterplots
graph twoway scatter tenure wage
graph twoway (scatter tenure wage) (lfit tenure wage)
* use continuation lines for longer graphs (well, it can get much more complicated than that)
graph twoway (scatter tenure wage) ///
(lfit tenure wage), ///
by(rural)
* save and export the graph
graph save wagetenure, replace
graph export wagetenure.png, replace
* regression
reg wage tenure
* but if we want to run more regressions, we want to save results in a nice form
* uncomment the following to install a package not native for Stata
* ssc install outreg2
outreg2 using "table1.xls" , replace dec(2) se
* how to read this regression?
reg log_wage tenure
* see, you can just leave this without any additional specifications and
* it takes specifications from the previously used outreg2 command
outreg2
* let's add more covariates
reg wage school tenure
outreg2
reg wage age age2 school tenure
outreg2
* see, now sample is smaller (there are some missing observations in rural)
reg wage rural age age2 school tenure
outreg2
* so let's make the results comparable
reg wage tenure if rural!=.
outreg2
* let's create a variable that we can use to define our working sample
gen subsample=rural!=.
* see that you can only write subsample, which is equivalent to subsample==1
* the results are equivalent to the previous regression, so we don't have to save it using outreg2
reg wage tenure if subsample
* remember, the returns to tenure might differ for rural and urban areas, let's see if trends differ
xi: reg wage i.rural*tenure if subsample
outreg2
* recall the graph split by rural, there was one point clearly standing out:
* there are two observations but one of them has a missing value for rural
graph use wagetenure
list if wage>70
xi: reg wage i.rural*tenure if subsample & wage<70
outreg2
* alternatively, we might want to place an upper limit on the wage variable
gen wage_lim=wage
replace wage_lim=70 if wage>70
xi: reg wage_lim i.rural*tenure if subsample
* now, run again the full specification (no need to save it, we already have it)
* for this reason we don't need to see it again, we run it "quietly"
qui: reg wage rural age age2 school tenure
* hypothesis testing
test age=0
test age=tenure
ttest wage, by(rural)
* non-linear hypothesis testing
* (makes no sense but good enough for illustrative purposes)
nlcom _b[school]/_b[age]
* post-estimation commands
* store predicted values
predict wage_pr
* generate residuals
gen residuals=wage-wage_pr
* alternatively
predict residuals2, residual
* (see, they are equivalent)
browse residuals residuals2
* testing for heteroskedasticity
twoway scatter wage_pr tenure
/* the alternative hypothesis states that the error variances increase (or decrease)
as the predicted values of Y increase, e.g. the bigger the predicted value of Y, the
bigger the error variance is. A large chi-square would indicate that heteroskedasticity was present. */
estat hettest
* use the Huber-White robust standard error that relax the assumption of homoskedasticity
reg wage rural age age2 school tenure, robust
test age=0
* save the dataset with the new variables, use new name!
saveold womenswage_new, replace // just see how I have been using comments throughout the file
* it is a good practice to use commands serving as a reference for future
/* as well as if you want someone else to work with the .do file */
log close
type womenswage.smcl
/*
For reference or further guides: http://data.princeton.edu/stata
+ Some comments on structure of commands in Stata by German Rodriguez
Having used a few Stata commands it may be time to comment briefly on their structure, which usually follows the following syntax, where bold indicates keywords and square brackets indicate optional elements:
[by varlist:] command [varlist] [=exp] [if exp] [in range] [weight] [using filename] [,options]
We now describe each syntax element:
command:
The only required element is the command itself, which is usually (but not always) an action
verb, and is often followed by the names of one or more variables. Stata commands are
case-sensitive. The commands describe and Describe are different, and only the former will
work. Commands can usually be abbreviated as noted earlier. When we introduce a command we
underline the letters that are required. For example regress indicates that the regress
command can be abbreviated to reg.
varlist:
The command is often followed by the names of one or more variables, for example describe
lexp or regress lexp loggnppc. Variable names are case sensitive. lexp and LEXP are different
variables. A variable name can be abbreviated to the minimum number of letters that makes it
unique in a dataset. For example in our quick tour we could refer to loggnppc as log because
it is the only variable that begins with those three letters, but this is a really bad idea.
Abbreviations that are unique may become ambiguous as you create new variables, so you have
to be very careful. You can also use wildcards such as v* or name ranges, such as v101-v105
to refer to several variables. Type help varlist to lear more about variable lists.
=exp:
Commands used to generate new variables, such as generate log_gnp = log(gnp), include an
arithmetic expression, basically a formula using the standard operators (+ - * and / for
the four basic operations and ^ for exponentiation, so 3^2 is three squared), functions,
and parentheses. We discuss expressions in Section 2.
if exp and in range:
As we have seen, a command's action can be restricted to a subset of the data by specifying a
logical condition that evaluates to true of false, such as lexp < 55. Relational operators
are <, <=, ==, >= and >, and logical negation is expressed using ! or ~, as we will see in
Section 2. Alternatively, you can specify a range of the data, for example in 1/10 will
restrict the command's action to the first 10 observations. Type help numlist to learn more
about lists of numbers.
weight:
Some commands allow the use of weights, type help weights to learn more.
using filename:
The keyword using introduces a file name; this can be a file in your computer, on the
network, or on the internet, as you will see when we discuss data input in Section 2.
options:
Most commands have options that are specified following a comma. To obtain a list of the
options available with a command type help command where command is the actual command name.
by varlist:
A very powerful feature, it instructs Stata to repeat the command for each group of
observations defined by distinct values of the variables in the list. For this to work
the command must be "byable" (as noted on the online help) and the data must be sorted
by the grouping variable(s) (or use bysort instead).