Professional Documents
Culture Documents
Básico
Aplicado a la Investigación Económica
2 de marzo de 2016
2
Índice general 3
1. Introducción al Stata 5
1.1. Iniciando Stata . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2. Tipos de Archivos en Stata . . . . . . . . . . . . . . . . . . . . . 6
1.3. Estructura Básica de Stata . . . . . . . . . . . . . . . . . . . . . 6
1.4. Principales Comandos de Trabajo y Análisis . . . . . . . . . . . 7
1.4.1. Las Bitácoras . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.2. La Base de Datos . . . . . . . . . . . . . . . . . . . . . . 7
1.4.3. Append, Merge, Collapse . . . . . . . . . . . . . . . . . . 9
2. Manejo de Datos 15
2.1. Cargando los Datos en Stata . . . . . . . . . . . . . . . . . . . . 15
2.2. Etiquetas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3. Comando IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4. Comando SUMMARIZE . . . . . . . . . . . . . . . . . . . . . . 18
2.5. Comando SPLIT . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.6. Creando Variables . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.7. KEEP y DROP . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.8. Reestructurando los Datos . . . . . . . . . . . . . . . . . . . . . 24
2.9. Muestreos Probabilı́sticos . . . . . . . . . . . . . . . . . . . . . . 26
2.10. Generación de Números Aleatorios . . . . . . . . . . . . . . . . 26
2.11. Percentiles, Cuartiles, Deciles . . . . . . . . . . . . . . . . . . . 27
3
4 ÍNDICE GENERAL
3.6.1. Esquemas . . . . . . . . . . . . . . . . . . . . . . . . . . 47
3.6.2. Gráficos de Barras Verticales . . . . . . . . . . . . . . . . 49
3.6.3. Gráficos de Barras Horizontales . . . . . . . . . . . . . . 49
3.6.4. Gráficos de Cajas . . . . . . . . . . . . . . . . . . . . . . 50
3.6.5. Gráficos de Pastel . . . . . . . . . . . . . . . . . . . . . . 51
5. Variables Categóricas 69
5.1. Estimación con Variables Categóricas . . . . . . . . . . . . . . . 69
5.2. El Comando Xi . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
5.3. Pruebas de Hipótesis . . . . . . . . . . . . . . . . . . . . . . . . 72
5.4. Creación de Variables Dummys . . . . . . . . . . . . . . . . . . 75
5.5. Bucles y Programas . . . . . . . . . . . . . . . . . . . . . . . . . 75
Bibliografı́a 79
5
6 1. Introducción al Stata
use auto.dta
use auto01.dta
browse
list make
list make price
describe
codebook
tabulate mpg
table mpg
table rep78, contents(n mpg)
table rep78, contents(n mpg mean mpg sd mpg median mpg)
table rep78, c(n mpg mean mpg sd mpg median mpg) format(%9.2f)
sort mpg
gsort mpg
gsort -mpg
sort foreign
by foreign: summarize price
count
count if foreign==0
count if foreign==1
by foreign: count
generate orden=_n
rename orden num_obs
by foreign: egen prom_mill=mean(mpg)
drop num_obs
keep make price mpg prom_mill
clear
use base1, clear
list
use base2, clear
list
use base3, clear
list
use base4, clear
list
Vamos a empezar observando cada una de las bases de datos que tenemos,
veamos la figura1.4 Empecemos nuestra tarea en Stata, podemos observar que
la base de datos Base1 tiene los mismos campos (columnas) que la base de
datos Base2, pero diferentes filas, seria útil, unir ambas bases.
Abramos entonces, la base de datos Base1 y peguemosla con la base de
datos Base2, una unión vertical.
use base1.dta, clear
list
append using base2
list
save base12.dta, replace
list
Hagamos lo mismo con las bases de datos Base3 y Base4 y observemos los
resultados:
use base3.dta, clear
list
append using base4
list
save base34.dta, replace
list
¿Por qué la variable la variable sexo se añadió 2 veces como columna?¿por
qué no se unió en una sola columna?
use base3.dta, clear
list
rename Sexo sexo
list
save base03.dta, replace
use base03.dta, clear
list
append using base4
list
save base034.dta, replace
Ahora si resulto bien la unión vertical. Veamos la base12 que tenı́amos
antes.
Ahora mi interés es fusionar ambas bases de datos, para ello, primero de-
bemos ordenar ambas bases según la variable con la que vamos a fusionar (la
variable común).
use base034.dta, clear
list
sort nombre
list
clear
use base12s.dta, clear
list
merge nombre using base034s.dta
list
save basetotal.dta, replace
tab _merge
Analicemos los resultados. Hay tres posibles valores que puede tomar esta
variable según lo muestra la figura1.6. Si toma el valor de 1 nos indicara que
es una observación que solo se encuentra en la base matriz, si toma el valor
de 2 nos indicara que es una observación que proviene de la base esclava, y si
toma el valor de 3, nos indicara que la observación proviene de ambas bases.
El comando collapse sirve para convertir una base de datos que contiene va-
riables para diversas unidades de estudio, en una base de datos que contiene
estadı́sticos de dichas variables (medias, medianas, sumas etc). Permite obte-
ner estadı́sticos para unidades más grandes (en un sentido jerárquico), como
por ejemplo, pasar de datos por individuo a datos por hogar, de datos por
distritos a datos por provincia (agregación)
En el comando se especifican aquellas variables que se ”colapsan” y las con-
diciones que se imponen para dicha transformación. Algunas variables pueden
ser colapsadas según su suma, otras según su media, etc. (ver figura1.7)
Aquellas variables que no se especifican desaparecen automáticamente de
la base de datos. Este comando crea una nueva base de datos y cierra la base
de partida. Si deseamos quedarnos con esta base debemos grabarla.
Basado en los WDI, genere una base de datos con los totales de CO2 emi-
tidos por región, para el año 2002. Genere también una base con la población
mundial a lo largo del tiempo.
collapse age
list
Basado en los WDI, genere una base de datos con los totales de CO2 emi-
tidos por región, para el año 2002. Genere también una base con la población
mundial a lo largo del tiempo.
use wdi,clear
collapse (sum) co2 if year==2002, by(region)
graph hbar (asis) co2, over(region)
RETO 1
use auto.dta
describe
summarize
generate price2=2*price
describe
save auto2.dta
generate price3=3*price
save auto2.dta
save auto2.dta, replace
generate price4=4*price
use auto.dta
use auto.dta, clear
clear
2.2. Etiquetas
Aprendamos a etiquetar a nuestras bases de datos o variables para poder
identificarlas en un futuro y ası́ poder trabajar de forma mas ordenada.
use auto.dta
describe
label data "Este archivo contiene datos de autos para el a~
no 1978"
describe
label variable rep78 "Record de reparación en 1978"
label variable price "Precio del carro en 1958"
label variable mpg "Millas por galon para el carro"
15
16 2. Manejo de Datos
clear
use iraninos.dta
set more off
label define sexow 0 "mujer"
label define sexow 1 "hombre", add
describe
browse
label values sexo sexow
describe
browse
label drop sexow
2.3. Comando IF
La estructura del comando IF es fácil de recordar, la figura2.1 nos muestra
el esquema base.
clear
use auto.dta
keep make rep78 foreign mpg price
tabulate rep78 foreign
tabulate rep78 foreign if (rep78 >=4)
tabulate rep78 foreign if (rep78 >=4), column nofreq
use auto
summarize
summarize price mpg
summarize mpg price if (foreign == 1)
summarize mpg price if (foreign == 1) & (mpg <30)
summarize mpg price if (foreign == 1) & (mpg <30) , detail
summarize in 1/10
by foreign: summarize
tabulate mpg
generate mpg3 = .
replace mpg3 = 1 if (mpg <= 18)
replace mpg3 = 2 if (mpg >= 19) & (mpg <=23)
replace mpg3 = 3 if (mpg >= 24) & (mpg <.)
tabulate mpg mpg3
Veamos un ejemplo con categorı́as, ahora deseamos crear una variable que
nos muestre el millaje de los carros respecto a su origen, esta tomara el valor
de “0” para valores por debajo de la media de mpg en el grupo domestico y
extranjero y “1” para valores por encima de la media de mpg en los grupos
domestico y extranjero.
sort foreign
by foreign: summarize mpg, detail
¿Qué observamos?
clear
use auto.dta
decode A, generate(B)
describe make A B
use auto
describe
keep make mpg price
describe
use auto, clear
drop displacement gear_ratio
describe
Ya hemos visto como el uso de keep, drop, keep if y drop if, puede sernos
útil si queremos eliminar variables innecesarias y ası́ tener mas memoria de
trabajo. Ahora veamos en la figura2.7 la estructura del comando use y los
criterios de selección.
clear
clear
use ingfam.dta
list
reshape wide
list
reshape long
list
Veamos una base de datos que nos brinda información sobre los las alturas
de un conjunto de niños de 1 y 2 años de edad
use ni~
noaltpes, clear
list codfam nacimiento alt1 alt2
Veamos como podemos transformar esta base de datos a una forma “long”.
¿Cuál es la raı́z de la variable que será convertida de la forma wide a la forma
long? ¿Qué variables identifican a los individuos en la estructura wide? ¿Cómo
llamaremos a la variable que contendrá a los sufijos de la variable raı́z?
reshape long alt, i( codfam nacimiento) j(edad)
list codfam nacimiento edad alt
use ni~
noaltpes,clear
list codfam nacimiento alt1 alt2 pes1 pes2
gen y = invnorm(uniform())
Para generar una variable con distribución uniforme U(a,b)
generate y = a + (b-a) * uniform()
Para generar una variable con distribución normal N(u,ô)
generate z = u + o
^ * invnorm(uniform())
Generemos una variable notas, igual a U(0,20) + N(0,1)
gen notas = 20*uniform() + invnorm(uniform())
Trunquemosla en el rango de 0 a 20
replace notas = clip(notas, 0, 20)
format notas %3.1f
Generemos una variable sexo que sea 1 si es hombre y 0 si es mujer
gen sexo = uniform() > 0.5
Generemos una variable ingreso que valla del 2000 al 2007
gen ingreso = 2000 + floor(8*uniform())
XTILE
PCTILE
El comando pctile genera una variable con los puntos de corte entre cada
cuantil.
Por ejemplo, generemos una variable décimo que sea 1 si es décimo superior,
y 0 caso contrario. Hágalo de 2 formas distintas
RETO 2
. Con una sola instrucción (un solo comando) muestre las siguientes estadı́sti-
cas descriptivas para el gasto per capita en todos los departamentos del paı́s
(percentil 99, media, desviación estándar, rango).
. El INEI calcula las estadı́sticas de pobreza bajo el método del gasto, pa-
ra lo cual utilizará la variable “gasto total” y la dividirá entre el total de
personas en el hogar para calcular el gasto per capita. Luego generará una
variable que valga uno en caso el hogar supere la lı́nea de pobreza per capita
(linea06) y cero en caso contrario. Finalmente, se le pide estimar para cada
departamento cual es el nivel de pobreza considerando que un individuo es
pobre si pertenece a un hogar pobre.
. Con el módulo de educación construya una tabla que muestre para cada do-
minio geográfico el porcentaje de personas según nivel educativo alcanzado,
para lo cual considerará solo tres niveles: 1, al menos primaria incompleta,
2, Al menos secundaria completa y 3, superior.
31
32 3. Análisis Grafico con Stata
3.2. TWOWAY
El S&P 500 es el ı́ndice más seguido para tener una idea del desempeño
general de las acciones estadounidenses. Este ı́ndice consiste de las acciones de
500 empresas que fueron seleccionadas por su tamaño, liquidez (qué tan fácil
es comprar o vender sus tı́tulos) y representatividad por actividad económi-
ca, incluyendo 400 industriales, 20 del sector transporte, 40 de servicios y 40
financieras. Sólo se toman en cuenta empresas estadounidenses. Vale la pena
destacar que el peso de cada acción dentro del ı́ndice corresponde a la propor-
ción que representa el valor de mercado de la empresa dentro del total de las
500 empresas que conforman el ı́ndice. El valor de mercado del capital es igual
al precio por acción multiplicado por el número total de acciones.
Usemos la base de datos S&P 500.(ver figura3.5
clear
use s&p.dta
describe
clear
use highschool.dta
describe
twoway (scatter read write) (scatter math write) (lfit read ///
write) (lfit math write)
twoway (scatter read write) (scatter math write) (lfit read ///
write) (lfit math write), legend(label(3 "Ajuste Lineal") ///
label(4 "Ajuste Lineal")) legend(order(1 3 2 4))
twoway (scatter read write) (scatter math write) (lfit read ///
write, pstyle(p1) range(25 80) ) (lfit math write, ///
pstyle(p2) range(25 80) ), legend(label(3 "Ajuste Lineal") ///
label(4 "Ajuste Lineal")) legend(order(1 3 2 4))
position(5))
caption(Grupo IDDEA.SAC, size(vsmall) position(5))
use encuesta.dta
use s&p.dta
use highshool.dta
graph bar write, over( race) over( female) over( ses) ///
legend(rows(1) stack) blabel(bar, format(%4.1f) size(vsmall)) ///
bargap(10) percent scheme(vg_blue)
asyvars
graph box wage, over(grade4) nooutsides over(union) ///
asyvars over(urban2)
graph hbox tenure, nooutsides over(occ7)
graph hbox tenure, nooutsides over(occ7, sort(1))
graph hbox prev_exp tenure, nooutsides over(occ7, ///
sort(1))
graph hbox prev_exp tenure, nooutsides over(occ7, ///
sort(1)) over(collgrade)
graph hbox prev_exp tenure, nooutsides over(occ7, ///
sort(1)) over(collgrad)
graph hbox ttl_exp tenure, nooutsides over(urban2) ///
over(married) by(union)
graph hbox ttl_exp tenure, nooutsides over(urban2) ///
over(married) by(union, total)
graph hbox ttl_exp tenure, nooutsides over(urban2) ///
over(married) by(union, total row(1))
graph hbox ttl_exp tenure, nooutsides over(urban2) ///
over(married) by(union, total cols(1))
RETO 3
CLASIFICACIÓN DE RIESGOS
La base de datos “deudores”, tiene información acerca de la edad, sexo,
distrito, ingresos, deuda, y calificación de la deuda, para 19,000 deudores.
. ¿Qué AFP tiene más clientes? Realice una grafica sustentando su respuesta.
. Genere una dummy mal pagador, que sea 1 si el deudor está atrasado con
sus deudas
. ¿A qué edad las personas se atrasan menos? Realice una grafica sustentando
su respuesta.
. Genere una nueva base de datos a nivel de distrito, con el número de perso-
nas, el salario promedio, y el % de deudores atrasados.
. ¿Qué distritos son los más ricos? ¿En cuáles la gente es peor pagadora?
Realice una grafica sustentando sus resultados.
use elemapi.dta
regress api00 acs_k3 meals full
55
56 4. Análisis de Regresión Lineal
list in 1/5
tabulate acs_k3
histogram acs_k3
stem acs_k3
stem full
tabulate full
count if dnum==401
Hemos encontrado 3 problemas en la data, valores perdidos, valores nega-
tivos insertados de manera incorrecta y proporciones introducidos como por-
centajes.
use elemapi2.dta
regress api00 acs_k3 meals full
Digamos que estamos interesados en saber cual es la relación entre el nu-
mero de estudiantes y el rendimiento académico.
regress api00 enroll
Primero debemos fijarnos en el test F, y ver si es significativo, lo cual nos
mostrara la significancia del modelo. El R2 nos dirá que tanto de la varianza
de nuestra variable endógena, es explicado por los regresores. Luego debemos
observar la significancia de los parámetros, ver si sus signos son acorde con la
teorı́a. La constante es el valor predecido para cuando nuestra explicativa sea
cero.
Podemos observar también que Stata nos presenta la descomposición de la
varianza. La varianza total esta particionada en la varianza explicada por las
variables independientes (model) y la varianza que no es explicada por dichas
variables(residual). Sabemos que existe una suma de cuadrados asociada a las
tres partes de la varianza. Conceptualmente estas son:
X
SST = (y − ȳ)2
X
SSR = (y − ŷ)2
X
SSM = (ŷ − ȳ)2
predict fv
pwcorr api00 ell meals yr_rnd mobility acs_k3 acs_46 full ///
emer enroll, obs sig
histogram enroll
histogram enroll, normal bin(20)
histogram enroll, normal bin(20) xlabel(0(100)1600)
kdensity enroll, normal
graph box enroll
symplot enroll
qnorm enroll
pnorm enroll
ladder enroll
gladder enroll
use crimen.dta
describe
sum crimenes asesinatos pcturb pctblanco pctnivedu pobreza soltero
graph matrix crimenes pcturb pobreza soltero
predict r, rstudent
stem r
sort r
list estadoid estado r in 1/10
list estadoid estado r in -10/l
findit hilo
hilo r estado
regress
regress crimenes pcturb pobreza soltero if estado !="dc"
use elemapi2,clear
regress api00 meals ell emer
predict r, resid
kdensity r, normal
pnorm r
qnorm r
Test de Normalidad
Test de Lawrence C. Hamilton
findit iqr
iqr r
Test de Shapiro-Wilk W (Ho: Normalidad)
swilk r
Test de White
estat imtest
Test de Breusch y Pagan
estat hettest
4.5. Multicolinealidad
Cuando dos variables explicativas están altamente relacionadas, podemos
hablar de multicolinealidad. Para detectar la multicolinealidad nosotros usa-
remos el factor de inflación de varianza (VIF) Aquella variable cuyo vif sea
mayor a 10 deberá ser investigada.
findit collin
collin acs_k3 avg_ed grad_sch col_grad some_col
collin acs_k3 grad_sch col_grad some_col
4.6. Linealidad
Uno de los supuestos del Modelo Lineal General es la linealidad de pará-
metros especificada en mi regresión. Si estamos frente a un ajuste no lineal,
entonces nosotros tendremos problemas dado que estamos forzando una lı́nea
como ajuste de nuestra relación no lineal.
Analicemos solo a una variable.
use nations.dta
describe
regress birth gnpcap urban
acprplot gnpcap, lowess
acprplot urban, lowess
graph matrix birth gnpcap urban, half
Transformemos un dato
generate lggnp=log(gnpcap)
label variable lggnp "log-10 of gnpcap"
kdensity lggnp, normal
que sean significativas. El comando crea 2 variables nuevas, una variable es-
timada, y el cuadrado de dicha estimación. Se evalúa el modelo con ambas
variables, la estimación y hat deberı́a ser significativa pues es el valor esti-
mado, pero su cuadrado no deberı́a serlo, pues de estar bien especificado el
modelo, la estimación al cuadrado no deberı́a tener mucho poder explicativo.
Linktest
Ovtest
4.8. Independencia
Los errores asociados a una observación no deberı́an estar asociados a los
errores de alguna otra observación. En nuestro caso, al haber recolectado da-
tos de 8 tipos de escuela es probable que estudiantes dentro de sus escuelas
tiendan a ser mas parecidos que estudiantes de otra escuela, esto producirı́a
errores no independientes. El problema de autocorrelacion es muy común en
series de tiempo, en la cual nosotros evaluamos el test DW para ver la auto-
correlación de primer orden. Si quisiéramos especificar este análisis en nuestra
data, podrı́amos considerar a la variable snum como el tiempo
¿Qué observamos?
RETO 4
Marco teórico mı́nimo. Existen varias teorı́as respecto del impacto de los
factores polı́ticos y económicos sobre la polı́tica tributaria en cada estado:
Pruebas de hipótesis
Interpretando regresiones:
¿Cuál es la bondad de ajuste de un modelo sin variables polı́ticas? ¿Cuánto
poder explicativo adicional se consigue al incluir las variables polı́ticas?
¿Qué variables polı́ticas importan más, las partidistas o las no partidistas?
(ojo, esta pregunta requiere cierta interpretación de la R2 ajustada de varios
modelos, ası́ como la magnitud y significancia de tus coeficientes).
Predicciones:
¿Cuánto cambian los impuestos per cápita si el ingreso per cápita aumenta en
una desviación estándar? Calcula este cambio en dólares y como proporción
de los impuestos promedio de la muestra.
¿Cuánto cambian los impuestos cuando la mayorı́a demócrata en el congreso
local pasa de 10 a 30 %? Calcula este cambio en dólares y como proporción
de los impuestos promedio de la muestra.
codebook mealcat
regress api00 mealcat
69
70 5. Variables Categóricas
Pero esta variable mealcat es una variable intervalo, podrı́amos generar tres
variables a partir de esta, de tal forma que podamos definir a cada sub variable
como un valor cada vez que mealcat pertenezca a cierto intervalo.
5.2. El Comando Xi
Lo mismo podemos hacer con el comando “xi”,
char mealcat[omit] 3
xi : regress api00 i.mealcat
¿Qué pasa con la regresión si solo tomamos las primeras 2000 observaciones
de la muestra?
summ sat
summ sat if female ==1
summ sat if female ==1 & white==1
generate edex=educ*exper
generate edumarr= educ*married
summ educ exper marr edex edumarr
Modelo Base:
reg wage educ exper IQ married , robust
Modelo con EDEX:
reg wage educ exper IQ married edex, robust
Modelo con EDUC*MARRIED y EDUC*EXPER:
reg wage educ exper IQ married edex edumarr, robust
corr educ exper edex
Modelo sin interacción EDEX y dejando EDUMARR:
reg wage educ exper IQ married edumarr, robust
xi: reg wage educ exper i.black*i.married IQ, robust
reg wage educ exper IQ, robust
Pruebas F
test educ
test educ = 70
test educ = 80
reg wage educ exper IQ married tenure urban black meduc feduc, robust
test feduc meduc
test meduc
test tenure meduc
test tenure meduc black
Ejemplo:
local i=1
while ‘i’ <=10 {
display ‘i’
local i=‘i’+1
}
Si deseamos crear otro programa con el mismo nombre, Stata nos mostrara
un mensaje de error diciéndonos que existe un programa con ese nombre por
lo que debemos eliminarlo primero:
79