class: center, middle, inverse, title-slide # Introducción a Stata ## Programación para el análisis de datos ### Departamento de Ciencias Sociales, UCU - Martín Opertti --- class: inverse, center, middle # Sobre Stata --- ## Introducción a Stata - Stata es un paquete estadístico poderoso con muchas técnicas estadísticas disponibles. -- - Es simple de usar y rápido. -- - Es un software pago -- - Tiene una importate comunidad de usuarios --- ## Interfaz .center[ <img src="ima/interfaz.png" width="700px" /> ] --- ## Editor de datos .center[ <img src="ima/editor.jpg" width="700px" /> ] --- ## Do file - Un do file es un archivo de texto standard que Stata ejecuta si se escribe do *filename* - Todo lo que hagamos en Stata para el curso debe ser hecho desde un do file. - El uso de do files tiene varias ventajas: - Permite que el análisis sea reproducible - Permite hacer anotaciones - Permite encontrar errores en el código de forma más eficiente --- ## Comandos básicos - Las funciones o comandos en Stata son case sensitive, tener ciudado con las mayúsculas. -- - Si escribimos `help mean` obtendremos información sobre el comando -- - `clear` sirve para eliminar los datos cargados de la memoria de Stata -- - `summarize` o `sum` sirve para obtener una descripción de los datos (particularmente útil para variables numéricas) -- - `tabulate` o `tab` sirve para imprimir una tabla de una o dos variables -- - `mean` sirve para estimar la media de una o más variables. --- ## Comentarios - Cuando escribimos código siempre es importante hacer comentarios y anotaciones tanto para que otros puedan entender y reutilizar el código así como para nosotros mismos. - Stata no correrá las lineas de código que comienzen con `*`, `//` o `/*`. - También se puede utilizar al final de una línea de código - Se puede quebrar una línea utilizando `///` --- ## Ayuda y recursos - Para obtener ayuda sobre un comando se puede escribir `help nombre_del_comando`. - La página de [Stata](https://www.stata.com/) tiene muchos tutoriales y videos. - [Statalist](https://www.statalist.org) es un foro donde se puede hacer preguntas pero sobretodo consultas preguntas ya hechas sobre código en Stata - UCLA tiene un [portal de Stata](https://stats.idre.ucla.edu/stata/,) donde usualmente hay muy buenos tutoriales - [Stata Cheat Sheets](https://www.stata.com/bookstore/stata-cheat-sheets/) - [Stata Journal](https://www.stata-journal.com/) es una revista que publica articulos sobre estadística y análisis de datos y el uso efectivo de Stata. --- class: inverse, center, middle # Importar datos en Stata --- ## Importar datos en Stata - Nuestros do files siempre comenzarán diciéndole a Stata en qué carpeta queremos trabajar. Debemos definir la carpeta en la que se encuentran los datos que queremos utilizar y donde irán las tablas, gráficos o datos transformados que exportaremos más adelante. - Para fijar el directorio utilizamos el comando `cd` - Para importar los datos (si ya se encuentran en formato `.dta`), utilziamos la función `use` - Supongamos que yo tengo una base de datos en formato stata llamada "mis_datos" dentro de una carpeta llamada "mi_carpeta". Para importarla correctamente a Stata debo correr: ```r cd "C:Usuarios/carpeta_general/mi_carpeta" // Fijo directorio use "mis_datos.dta" // Importo base ``` --- ## Archivos en formato Stata (.dta) - Los archivos de datos en formato Stata tienen la extensión .dta - Pueden tener hasta 2000 variables (aproximadamente) y millones de observaciones. --- ## Importar datos desde otros formatos Podemos también importar en Stata archivos de datos en otros formatos: ```r import delimited "wb_paises.csv" // Archivos .csv import excel "wb_paises.xlsx", firstrow // Archivos .xlsx ``` --- ## Ejercicio .content-box-red[ *Importar a Stata la base de datos wb_paises desde formato Stata (.dta) y excel (.xlsx)* ] --- class: inverse, center, middle # Explorar datos --- ## Summarize Con summarize obtenemos un resumen a través de distintas estadísticas descriptivas sobre una o más variables. Ver [documentación](https://www.stata.com/manuals/rsummarize.pdf) ```r summarize pob_mujeres pob_hombres pob_total ``` .center[ <img src="ima/summarize.png" width="700px" /> ] --- ## List Con `list` podemos listar los valores de una o más variables. Se usa frecuentemente para chequeos específicos o en bases de datos con pocas observaciones. Ver [documentación](https://www.stata.com/manuals/dlist.pdf) ```r list country_name pob_total pob_mujeres pob_hombres if region == 5 ``` .center[ <img src="ima/list.png" width="700px" /> ] --- ## Tablas con tabulate o tab Como vimos anteriormente podemos utilizar `tabulate` o `tab` para crear tablas de una o dos variables. ```r tabulate region ``` .center[ <img src="ima/tabulate.png" width="600px" /> ] --- ## Tablas con table - Con `table` podemos agregar estadísticos como la media a una tabla. - Con la opción `contents` o su abreviación `c` podemos usar estadísticos. Por más detalles ver [documentación](https://www.stata.com/manuals13/rtable.pdf). ```r table region, c(n tasa_desempleo mean tasa_desempleo sd tasa_desempleo min tasa_desempleo max tasa_desempleo) ``` .center[ <img src="ima/table_1.png" width="700px" /> ] --- ## Tablas con table `table` permite también agregar estadísticos a tablas bivariadas. A su vez, `table` tiene otras opciones como row y column ```r table region income_group, c(mean tasa_desempleo) row ``` .center[ <img src="ima/table_2.png" width="700px" /> ] --- ## Ejercicio .content-box-red[ *Crear una tabla con la media de acceso a electrcididad y emisiones de co_2 según grupos de ingresos* ] --- class: inverse, center, middle # Variables --- ## Variables - Los nombres de las variables pueden tener hasta 32 caracteres pero dentro de lo posible restringirlas a menos de 12 y no utilizar mayúsculas - Cuando nombramos variables es mejor tratar de relacionarlas a su contenido. Por ejemplo supongamos que tenemos dos variables de edad una numérica con la edad en años y otra con cuatro categorías de edad (18 a 29; 30 a 49; 50 a 64 y 65 o más). Es mejor nombrarlas con algo que refiera a su contenido como `edad_num` y `edad_cat` que como `edad_1` y `edad_2` o aun peor `var_2` y `var_3`. - Es una buena práctica asignar una etiqueta a la variable con una descripción. Por ejemplo nuestra variable `edad` puede tener una etiqueta "Edad de los encuestados (númerica, en años)" "Edad de los encuestados (en 4 categorías)" --- ## Tipos de variables - Los softwares estadísticos tienen distintos tipos de almacenamiento de datos para determinar cómo y qué datos guardar sobre una variable o valor. -- - A grandes rasgos existen dos grandes tipos de almacenamiento: numérico y strings (cadenas o texto). -- - El formato de texto lo usamos para variables que contienen texto no estructurado o identificadores. -- - En general, las variables ordinales o categóricas en Stata las almacenamos como numéricas con su correspondientes etiquetas para cada valor, debido a que para realizar varios análisis estadísticos (como regresiones) Stata necesita que estén en ese formato en lugar de en formato texto. Es importate asignar etiquetas cuando almacenamos estas variables como numéricas. -- - A su vez, dentro de cada tipo (*data type*) existen distintos formatos de almacenamiento (*storage type*), que determinar por ejemplo cuántos valores luego de la coma se almacenan ej. (byte, int, etc.) -- - Por más información utilizar: `help datatype` --- ## Cambiar el tipo de una variable Un error frecuente al crear una variable es ingresar una letra por error en una variable que iba a ser numérica. En ese caso Stata transformará toda la variable a string (porque las strings pueden contener números pero las numéricas no pueden contener texto). Para resolver este tipo de situaciones Stata tiene comandos que transforman las variables de un tipo a otro. De carácteres (string) a numérica: ```r destring varlist, replace ``` De numérica a string: ```r decode varlist, replace ``` --- ## Consultar tipos de datos, almacenamiento y etiquetas - Con el comando `describe` obtenemos para cada variable (o las variables seleccionadas) el nombre, el tipo de almacenamiento y en caso de existir el nombre de las etiquetas (value label) y la etiqueta de la variable (variable label) - Con el comando `codebook` obtenemos una descripción de cada variable que incluye el tipo de variable, cantidad de valores únicos, valores perdidos, ejemplos, advertencias y frecuencias con sus etiquetas o percentiles en caso de aplicar. - Con el comando `labelbook` obtenemos un libro de códigos solo para las variables que tienen etiquetas en sus valores (value label) con sus correspondencias y datos adicionales. --- ## Manipular etiquetas Para etiquetar una variable: ```r label variable pob_total "Población total del país" ``` Se necesitan dos pasos en Stata para definir etiquetas. primero se crea la etiqueta que asocia codigos numéricos con etiquetas con el comando `label define` para luego asignar esa etiqueta creada (que lleva un nombre) a una variable ya existente, con el comando `label values`. Se puede aplicar la misma etiqueta a muchas variables cuando utilizamos las variables tienen la misma escala. .codefont[ ```r ## Crear nueva variable (si el país tiene al menos 10 millones de habitantes) generate pais_10m = 0 replace pais_10m = 1 if pob_total >= 10000000 ta pais_10m ## Primero creo las etiquetas de los valores con el nombre "pais_10m" label define pais_10m 0 "Menos de 10M habitantes" 1 "Más de 10M habitantes", replace ## Luego pego las etiquetas de los valores a la variable label values pais_10m pais_10m ## Asigno también etiqueta a la variable (descripción) label variable pais_10m "Si el país tiene una población mayor o menor a 10 millones de habitantes" ``` ] --- class: inverse, center, middle # Valores perdidos --- ## Valores perdidos - La mayoría de los softwares estatdísticos prevee y distingue a los casos perdidos (valores para los que no tenemos información), en Stata los valores perdidos son representados por un punto `.` - En general Stata omite los casos perdidos al aplicar un comando pero es recomendable ver la documentación de cada comando si tenemos casos perdidos para estar seguros. - Por ejemplo, si queremos crear una variable vacía, es decir, solo con valores perdidos: ```r generate newvar = . ``` - Los datos de encuestas muchas veces utilizan códigos como 88 o 99 para señalar los datos perdidos (ej. cuando los enceustados no quieren responder una pregunta). Tener cuidado de que definir en Stata que esos son casos perdidos. ```r replace varname = . if varname == 88 replace varname = . if varname == 99 ``` --- ## Consultar valores perdidos A la hora de consultar si nuestros datos tienen casos perdidos tenemos varias opciones. - Usando `misstable` podemos chequear las observaciones perdidas por variable. - Con `list` podemos chequear que observaciones tienen datos perdidos - Con `tabulate`, podemos poner la opción missing para ver los datos perdidos ```r misstable summarize list country_name if missing(income_group) tabulate income_group tabulate income_group, missing ``` --- ## Recodificar con valores perdidos Tenemos que tener especial cuidado cuando recodificamos variables que tienen casos perdidos. Por ejemplo, si queremos recodificar la variable de `tasa_desempleo` en mayor o menor a 10 y que los casos perdidos por supuesto se mantengan como casos perdidos, este código no funcionará: ```r generate tasa_desempleo_rec = . replace tasa_desempleo_rec = 1 if tasa_desempleo >= 10 replace tasa_desempleo_rec = 0 if tasa_desempleo < 10 ``` Debemos agregar: ```r replace tasa_desempleo_rec = . if tasa_desempleo == . ``` --- ## Ejercicio .content-box-red[ *Con la base de datos de wb_paises identificar cuántos valores perdidos hay para la variable area_selvatica y cuáles son esos países* ] --- class: inverse, center, middle # Guardar datos --- --- ## Guardar datos - Muchas veces cuando escribimos código en un do-file, exportamos lo que necesitamos (si es que queremos exportar algo) y es suficiente con tener la base de datos original y el do-file. - Sin embargo, a veces queremos guardar una nueva base de datos con los cambios que le realizamos. En estos casos lo mejor suele ser no reemplazar la base de datos original, sino que guardar una nueva con otro nombre. - Para guardar los datos modificamos usamos: ```r save "carpeta_ejemplo/data_nueva", replace ``` --- class: inverse, center, middle # Sintáxis básica --- ## Sintáxis básica .codefont[ ```r [by varlist:] command [varlist] [=exp] [if exp] [weight] [,options] ``` ] - **command** es usualmente un verbo y el único elemento imprescindible, generalmente viene acompañado del nombre de una o más variables. Muchas veces se pueden abreviar ej. `summarize` puede usarse como `sum` - **varlist** esto refiere a la variable o las variables a las que se le aplica el comando/función. También se pueden abreviar. También cuando se quiere aplicar a un conjunto de variables por ejemplo que empiezen con determinados caracteres. Ej: `summarize pob_*` nos devolverá un resumen de todas las variables que comiencen con "pob_" ```r summarize pob_hombres pob_mujeres ``` --- ## Sintáxis básica .codefont[ ```r [by varlist:] command [varlist] [=exp] [if exp] [weight] [,options] ``` ] - **=exp** es para cuando nuestro comando genera una nueva variable y debemos definir que valor tendrá. En este caso generamos una variable nueva llamada `log_pob_total` que es el logaritmo de la variable ya existente `pob_total`, y otra donde no necesitamos usar un comando en la expresión simplemente dividimos la población por 1.000.000 para obtener esa variable en millones. ```r generate log_pob_total = log(pob_total) generate pob_total_m = pob_total/1000000 ``` --- ## Sintáxis básica .codefont[ ```r [by varlist:] command [varlist] [=exp] [if exp] [weight] [,options] ``` ] - **if exp** la acción de un comando puede aplicarse a una parte específica de nuestros datos. Por ejemplo, supongamos que quiero un resumen de la variable pob_total pero solo para los países de América Latina. Entonces debo fijarme el valor de América Latina en la variable región (3), y establecer el condicional luego del uso estandar del comando. ```r summarize pob_total if region == 3 ``` .center[ <img src="ima/sum_if.png" width="700px" /> ] --- ## Sintáxis básica .codefont[ ```r [by varlist:] command [varlist] [=exp] [if exp] [weight] [,options] ``` ] - **options** la mayoría de los comandos tienen opciones que se definen al final, luego de una coma. Por ejemplo, la variable summarize tiene una opción "detail" para que se agreguen más estadísticos al resumen ```r summarize pob_total, detail ``` .center[ <img src="ima/sum_detail.png" width="500px" /> ] --- ## Sintáxis básica .codefont[ ```r [by varlist:] command [varlist] [=exp] [if exp] [weight] [,options] ``` ] - **weight** sirve para ponderar los datos, simplemente se define el tipo de ponderador y el nombre del mismo entre [] ej. ```r mean [aweight = ponderador] ``` --- ## Sintáxis básica .codefont[ ```r [by varlist:] command [varlist] [=exp] [if exp] [weight] [,options] ``` ] - **by** un comando muy importante es by, y sirve para decirle a Stata que repita un comando para distintos grupos de observaciones (definidos por los valores de la variable especificada luego del by). Para utilizar el comando by es necesario utilizar el comando sort anteriormente. Por ejemplo, si queremos calcular la media de `pob_total` según región podemos hacer: ```r sort income_group by income_group: summarize pob_total ``` --- ## Sintáxis básica .center[ <img src="ima/sum_by.png" width="750px" /> ] --- ## Sintáxis básica Para no tener que usar sort primero y by después, se puede utilizar bysort directamente y ahorrarse un paso: ```r bysort income_group: summarize pob_total ```