class: center, middle, inverse, title-slide # Introducción a Stata II ## Programación para el análisis de datos ### Departamento de Ciencias Sociales, UCU - Martín Opertti --- class: inverse, center, middle # Limpiar datos --- ## Sort - A veces queremos ordenar los datos según una variable, para eso utilizamos el comando `sort` que ordena las observaciones en orden ascendente (de menor a mayor). - Los casos perdidos son tratados como infinitos por lo que quedan al final. - La sintáxis es `sort varlist` - El argumentos `stable` sirve para mantener el orden anterior dentro de cada subgrupo nuevo - Con `gsort` podemos ordenar de forma descendente ```r sort country_name sort region, stable sort region country_name gsort - country_name ``` --- ## Orden de variables - El comando `order` sirve para cambiar el orden las columnas en la base de datos. - La sintaxis es `order varlist [, options]`. Algunas de las opciones o argumentos son `first`, `last`, `before(varname)`, `after(varname)`. ```r order country_name region, first order country_code, after(country_name) ``` --- ## Filtrar observaciones Para filtrar observaciones podemos utilizar dos comandos: `drop` y `keep`. Estos comandos van seguidos de un condicional, `drop if *exp*`. ```r keep if edad == 20 drop if edad > 80 ``` `drop` y `keep` también nos sirven para seleccionar o quitar variables (columnas). Su uso para este caso es: `drop *varlist*` ```r keep edad educacion drop ingreso genero ``` --- ## Operadores y expresiones <table class="table table-striped table-hover table-condensed" style="font-size: 16px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Operadores aritméticos </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Operadores relacionales </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Operadores lógicos </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> + sumar </td> <td style="text-align:left;"> & y </td> <td style="text-align:left;"> == igual a </td> </tr> <tr> <td style="text-align:left;"> - restar </td> <td style="text-align:left;"> | o </td> <td style="text-align:left;"> != no igual a </td> </tr> <tr> <td style="text-align:left;"> * multplicar </td> <td style="text-align:left;"> ! no </td> <td style="text-align:left;"> < menor a </td> </tr> <tr> <td style="text-align:left;"> / dividir </td> <td style="text-align:left;"> </td> <td style="text-align:left;"> > mayor a </td> </tr> <tr> <td style="text-align:left;"> ^ elevar a una potencia </td> <td style="text-align:left;"> </td> <td style="text-align:left;"> <= menor o igual a </td> </tr> <tr> <td style="text-align:left;"> </td> <td style="text-align:left;"> </td> <td style="text-align:left;"> >= mayor o igual a </td> </tr> </tbody> </table> --- ## Operadores y expresiones ```r keep if tasa_desempleo > 5 & tasa_desempleo <= 11 keep if country_name == "Uruguay" | country_name == "Argentina" keep if region != "North America" drop if tasa_desempleo <= 10 ``` --- ## Ejercicio .content-box-red[ *Filtrar la base para quedarse solamente con las observaciones que corresponden a países de América del Norte y Uruguay* ] --- class: inverse, center, middle # Variables --- ## Crear nueva variable (expresiones genéricas) Para crear una nueva variable en Stata se puede utilizar el comando `generate` o su abreviación `gen`. `generate` crea una nueva variable a partir de una expresión, y tiene la siguiente sintáxis: `generate newvar = exp`. ```r gen poblacion_total_m = pob_total/1000000 gen area_no_selvatica = area_total - area_selvatica gen area_selvatica_per = (area_selvatica * 100) / area_total gen co2 = co2_pc * pob_total ``` --- ## Funciones <table class="table table-striped table-hover table-condensed" style="font-size: 16px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Función </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Definición </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> abs(x) </td> <td style="text-align:left;"> valor absoluto de x </td> </tr> <tr> <td style="text-align:left;"> exp(x) </td> <td style="text-align:left;"> función exponencial de x </td> </tr> <tr> <td style="text-align:left;"> log(x) </td> <td style="text-align:left;"> logaritmo natural de x </td> </tr> <tr> <td style="text-align:left;"> round(x) </td> <td style="text-align:left;"> redondea al entero más cercano de x </td> </tr> <tr> <td style="text-align:left;"> sqrt(x) </td> <td style="text-align:left;"> raíz cuadrada de x </td> </tr> </tbody> </table> --- ## Ejercicio .content-box-red[ *1. Crear una nueva variable de `pib_pc` llamada `pib_pc_2` a partir de otras variables en la base. Chequear que coincidan los valores de `pib_pc` y `pib_pc_2`* *2. Redondear al número entero más cercano la variable co2_pc* ] --- ## Crear nueva variable (expresiones específicas) Para crear una variable a partir de expresiones específicas sobre valores de otra variable (ej. una variable que indique si el país es miembro del Mercosur o no), utilizamos nuevamente `gen` pero en conjunto con `replace`. De esta forma, la creación de la nueva variable se divide en al menos dos líneas. `replace` cambia el contenido de una variable ya existente (que en estos casos generamos previamente utilizando `gen`). La sintáxis abreviada de `replace` es: `replace varname = exp`. ```r gen mercosur = 0 // Primero creo variable con el valor 0 para todos replace mercosur = 1 if country_name == "Argentina" replace mercosur = 1 if country_name == "Brasil" replace mercosur = 1 if country_name == "Paraguay" replace mercosur = 1 if country_name == "Uruguay" ``` --- ## Crear nueva variable (expresiones específicas) .codefont[ ```r gen pob_m3 = 0 replace pob_m3 = 1 if pob_total >= 3000000 replace pob_m3 = . if missing(pob_total) gen td_rec = 0 replace td_rec = 1 if tasa_desempleo < 10 replace td_rec = 2 if tasa_desempleo >= 10 & tasa_desempleo < 15 replace td_rec = 3 if tasa_desempleo >= 15 replace td_rec = . if missing(tasa_desempleo) gen crec_ele = 0 replace crec_ele = 1 if pob_crecimiento > 2 & acceso_electricidad < 90 replace crec_ele = . if missing(pob_crecimiento) | missing(acceso_electricidad) ``` ] --- ## Ejercicio .content-box-red[ *Crear una variable que:* *- tome el valor 2 si el gasto en educación y en salud es mayor a 6%* *- tome el valor 1 si el gasto en una de estas dos variables es mayor al 6% pero no en la otra* *- tome el valor 0 si el gasto en ambas variables es menor a 6%* *- sea missing si tenemos valores perdidos en alguna de estas dos variables.* ] --- ## Crear nueva variable (expresiones específicas) En recodificaciones complejas tener cuidado con el **orden**. Estas líneas de código producen resultados muy diferentes! Vamos de general a particular, es decir, si tenemos dos condiciones y una incluye a la otra, debemos ir por la más general primero (tener más de 6% de gasto en educación o salud) y luego por la particular (tener más de 6% de gasto en ambas). Para nuestro ejercicio este código es el correcto: .codefont[ ```r gen var_ej = 0 replace var_ej = 1 if gasto_salud > 6 | gasto_educacion > 6 # general replace var_ej = 2 if gasto_salud > 6 & gasto_educacion > 6 # particular replace var_ej = . if missing(gasto_salud) | missing(gasto_educacion) ``` ] Este es incorrecto: .codefont[ ```r gen var_ej = 0 replace var_ej = 2 if gasto_salud > 6 & gasto_educacion > 6 # particular replace var_ej = 1 if gasto_salud > 6 | gasto_educacion > 6 # general replace var_ej = . if missing(gasto_salud) | missing(gasto_educacion) ``` ] --- ## Crear nueva variable con egen - `egen` sirve para crear nuevas variables con funciones propias. - Algunas de las funciones de egen son: - `rowmean` crea la media de las variables especificadas - `cut` recodifica la variable con los intervalos especificados con `at` - `rank` ranking de valores - La sintaxis de `egen` es: `egen newvar = funcion(argumentos)` .codefont[ ```r egen promedio_gasto = rowmean(gasto_salud gasto_educacion gasto_militar) egen td_rec_2 = cut(tasa_desempleo), at(0, 10, 15) label egen indice_de_gini_rec = rank(indice_de_gini) ``` ] --- ## Ejercicio .content-box-red[ *Explicar las operaciones realizadas en las siguientes dos líneas de código* ] ```r gen country_rec = word(country_name, 1) replace country_rec = usubinstr(country_rec , ",", "", .) ``` --- ## Ejercicio .content-box-red[ *Encontrar y utilizar una función del comando egen que nos indique la suma de un grupo de variables para cada observación. Aplicar obteniendo el total de las variables que comienzan con gasto_ * ] --- ## Recodificar variables - Con `recode` es posible recodificar los valores numéricos de una variable categórica. - La sintaxis es: `recode varlist (rule)` - Con `/` podemos establecer intervalos, ej `0/5 = 1` implica que todos los valores de 0 a 5 corresponderán a 1. .codefont[ ```r recode region (5 = 3) (6 = 1) recode region (5 = 3) (6 = 1), gen(region_rec) recode tasa_desempleo (0/5 = 1) (5/10 = 2) (10/15 = 3) (15/max = 4), gen(td_rec) recode tasa_desempleo (0/5 = 1 Baja) (5/10 = 2 Media) (10/15 = 3 Alta) (15/max = 4 Muy_alta), gen(td_rec_2) ``` ] --- class: inverse, center, middle # Gráficos --- ## Gráficos - Stata tiene comandos para realizar distintas [visualizaciones de datos](https://www.stata.com/support/faqs/graphics/gph/stata-graphs/). - Stata [cheat sheet](https://www.stata.com/links/resources-for-learning-stata/cheat-sheets/StataCheatSheet_visualization_2016_June-REV.pdf) de visualizaciones - El comando `graph` es la base de las visualizaciones en Stata. Alguno de los tipos que permite son: <table class="table table-striped table-hover table-condensed" style="font-size: 16px; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Comando </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> Visualización </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> graph twoway </td> <td style="text-align:left;"> Gráficos de dispersión, de línea, etc </td> </tr> <tr> <td style="text-align:left;"> graph bar </td> <td style="text-align:left;"> Gráficos de barras </td> </tr> <tr> <td style="text-align:left;"> graph box </td> <td style="text-align:left;"> Gráficos de cajas </td> </tr> <tr> <td style="text-align:left;"> graph pie </td> <td style="text-align:left;"> Gráficos de tortas </td> </tr> </tbody> </table> - El comando `hist` sirve para crear histogramas, muy útiles para explorar una base de datos. --- ## Histogramas ```r # Histograma simple hist tasa_desempleo ``` .center[ <img src="ima/plot_1.png" width="500px" /> ] --- ## Histogramas ```r # Graficar porcentajes en lugar de densidad hist tasa_desempleo, percent ``` .center[ <img src="ima/plot1_b.png" width="500px" /> ] --- ## Histogramas ```r # Frecuencia hist tasa_desempleo, frequency ``` .center[ <img src="ima/plot1_c.png" width="500px" /> ] --- ## Histogramas ```r # Agregar título hist tasa_desempleo, percent title("Tasa de desempleo en 2018") ``` .center[ <img src="ima/plot_2.png" width="500px" /> ] --- ## Histogramas ```r hist tasa_desempleo, percent by(region) ``` .center[ <img src="ima/plot_3.png" width="500px" /> ] --- ## Gráfico de dispersión Gráfico de dispersión simple: ```r graph twoway scatter pib_pc co2_pc ``` .center[ <img src="ima/plot_4.png" width="500px" /> ] --- ## Gráfico de dispersión No es necesario incluir `graph twoway` ```r scatter pib_pc co2_pc ``` .center[ <img src="ima/plot_4.png" width="500px" /> ] --- ## Gráfico de dispersión Agregar etiquetas de variables para los ejes y título: ```r label variable pib_pc "PIB per cápita" label variable co2_pc "Emisiones de CO2 per cápita" scatter pib_pc co2_pc, /// title("Relación entre PIB per cápita y CO2 per cápita") ``` .center[ <img src="ima/plot_5.png" width="400px" /> ] --- ## Gráfico de dispersión Agregar etiqueta para puntos: ```r scatter pib_pc co2_pc, /// title("Relación entre PIB per cápita y CO2 per cápita") /// mlabel(country_code) ``` .center[ <img src="ima/plot_6.png" width="500px" /> ] --- ## Gráfico de barras Media de variable númerica según categoría de otra variable: ```r graph bar pib_pc, over(region) /// title("Media de PIB per cápita según región") ``` .center[ <img src="ima/plot_7.png" width="500px" /> ] --- ## Gráfico de barras Barras horizontales para mejorar la visualización: ```r graph hbar pib_pc, over(region) /// title("Media de PIB per cápita según región") ``` .center[ <img src="ima/plot_8.png" width="500px" /> ] --- ## Gráfico de barras Agregar medias, medianas y máxima: ```r graph hbar (mean) pib_pc (median) pib_pc (max) pib_pc, over(region) /// title("Media de PIB per cápita según región") ``` .center[ <img src="ima/plot_9.png" width="500px" /> ] --- ## Temas - Con `scheme` (dentro de las opciones de `graph`) o `set scheme` por cada sesión es posible establecer temas. ```r graph hbar (mean) pib_pc (median) pib_pc (max) pib_pc, over(region) /// title("Media de PIB per cápita según región") scheme(economist) ``` .center[ <img src="ima/plot_10.png" width="400px" /> ] --- ## Guardar gráficos Para guardar un gráfico generado en Stata se puede utilizar tanto `graph save` como `graph export`. La sintaxis es: `graph export newfilename.suffix`. Ver otros formatos con `help graph export` ```r # Exportar como gph (formato Stata) graph save ejemplo # Exportar como png graph export ejemplo.png # Exportar como pdf graph export ejemplo.pdf ``` --- ## Ejercicio .content-box-red[ *Graficar la relación entre gasto en salud y gasto en educación de la forma que te parezca más conveniente y con la mayor cantidad de información posible* ] --- class: inverse, center, middle # Estadística inferencial --- ## t-test - Las pruebas t (t-test) independientes están diseñadas para comparar medias de la misma variable entre dos grupos. - Recodifiquemos la variable de ingreso para que tenga dos categorías, bajos y altos. ```r recode income_group (1/2=1 Bajos) (3/4=2 Altos), gen(income_group_2) ttest co2_pc, by(income_group_2) ``` .center[ <img src="ima/ttest.png" width="500px" /> ] --- ## Modelos de regresión - Con el comando `regress` o `reg` se pueden estimar regresiones lineales. - La sintaxis del comando es: `regress depvar [indepvars] [if] [in] [weight] [, options]` - Para las variables categóricas se debe incluir `i.` antes del nombre de la variable ```r reg co2_pc pib_pc i.region ``` .center[ <img src="ima/reg.png" width="600px" /> ]