class: center, middle, inverse, title-slide .title[ # Macroeconometría ] .subtitle[ ## Introducción al uso de R en Econometría ] .author[ ### Mauricio Tejada ] .institute[ ### Universidad Alberto Hurtado ] --- layout: true <div class="my-footer"><img src="img/logo2.png" style="height: 35px;"/></div> --- class: separator-blue, middle # Elementos básicos --- ## Instalar R y RStudio - **Instalar** R y Rstudio (Graphical User Interfase) - Bajar R de: [https://www.r-project.org/](https://www.r-project.org/) - Bajar RStudio (versión gratuíta) de: [https://rstudio.com/products/rstudio/](https://rstudio.com/products/rstudio/) - Entorno de escritorio de **RStudio**: 4 paneles - *Editor de texto*: Scripts con líneas de comandos de R (ctrl/command-enter para ejecutar bloques) - *Consola*: ejecuta comandos en R (via scripts o interactivamente) - *Ambiente de trabajo*: lista de todos los objetos creados en R (permite también abrir bases de datos en un formato hoja de cálculo) - *Archivos / Gráficos / Paquetes/ Ayuda*: Varias funciones. --- ## Interfáz de RStudio <img src="img/rstudio_gui.png" width="80%" style="display: block; margin: auto;" /> --- ## Directorio de trabajo y comentarios - **Directorio de trabajo** - Cada proyecto es un directorio y debemos indecarle a R donde buscar archivos relacionados con el proyecto - Menú: *Sesión -> Definir Directorio de Trabajo* - Línea de comando: `setwd(path_a_dir)`. - Agregar **comentarios** para recordar que operación realiza un grupo de comandos es un práctica muy recomendable. - Todo texto que sigue a `#` es ignorado por R. - Para comentar múltiples líneas se seleccionan líneas se usa `control/command + shift + c`. --- ## Paquetes - Los **paquetes** son programas que implementan ciertas rutinas y permiten incrementar las funcionalidades de R. - Instalar paquetes: `install.packages(nombre_paquete)` - Cargar paquetes para uso: `library(nombre_paquete)` --- ## Ayuda - El comando más importante es siempre el comando **Ayuda**. - Panel de ayuda de RStudio: *opción buscar* - Línea de comando con nombre de comando específico: `help(nombre_comando)` - Línea de comando con palabras clave: `??palabra_clave / idea_general` (busca todos los comandos relacionados con la palabra buscada). - Información que encontramos en la **documentación de R**. - Cómo usar el comando: Insumos requeridos y opcionales y resultados. - Comandos relacionados y ejemplos (*esta es la parte más importante*). - Si no concemos el nombre del comando usamos el **internet**. - La comunidad de R es enorme! --- ## Recursos para aprender R - **Introduction to Econometrics with R** replica las aplicaciones empíricas del libro de texto de Stock y Watson: [https://www.econometrics-with-r.org/](https://www.econometrics-with-r.org/) - **Using R for Introductory Econometrics** replica las aplicaciones empíricas del libro de texto de Wooldridge: [http://www.urfie.net/](http://www.urfie.net/) - **Principles of Econometrics with R** [https://bookdown.org/ccolonescu/RPoE4/](https://bookdown.org/ccolonescu/RPoE4/) - **Introduction to Econometrics with R** del Departamento de Economía del Instituto de Estudios Políticos de París: [https://scpoecon.github.io/ScPoEconometrics/](https://scpoecon.github.io/ScPoEconometrics/) --- class: separator-blue, middle # Estructuras de datos en R --- ## Variables - **Variables en R**: objetos a los cuales asignamos un valor/elemento. - Asignamos objetos a variables usando `<-` o `=` (representación de *asignamos* valor a objeto) - R maneja el concepto de objetos. - Todo es un objeto en R. - En R pasamos objetos por funciones/comandos y dependiendo de las características del objeto los comandos aplican métodos apropiados. - Reglas para nombrar variables. - Inician con letra y pueden contener números, puntos y _. - Nombres con mayúsculas y minúsculas son diferentes. --- ## Variables y tipos - Tipos básicos de datos: - **numeric**: Variables Numéricas. Ej: `nom_var <- 1` - **character**: Variables tipo texto. Ej: `nom_var <- "uno, dos y tres"` - **boolean**: Variable tipo lógicas. Ej: `nom_var <- TRUE/FALSE` - Vectores, factores y matrices - **vector**: Colección de objetos del mismo tipo. Ej: ```r nom_vec <- c(1, 3, 5, 7, 9, 11, 15) ``` - **factor**: Variables categóricas. Ej: ```r nom_cat <- factor(c(1, 2, 2, 1, 2), labels = c('uno', 'dos')) ``` --- ## Variables y tipos - Vectores, factores y matrices - **matrix**: Colección bi-dimensional de objetos del mismo tipo. Se crean usando las funciones `cbind()` y `rbind()` para concatenar vectores. Ej: ```r vec_a <- c(3,4,5) vec_b <- c(4,5,9) mat_a <- cbind(vec_a,vec_b) # concatenar en columnas mat_b <- rbind(vec_a,vec_b) # concatenar en finales ``` - Bases de datos (data.frames y tibbles): Objetos bi-dimencionales con cierta características especiales: - Las filas y las columnas tienen un significado particular: observaciones y variables. - Pueden contener diferentes tipos de datos en variables: numéricas, categóricas, tipo texto, etc. - Pueden contener datos perdidos `NA` (*missing*). --- ## Variables y tipos - Bases de datos (data.frames y tibbles): continuación ... - **data.frame**: es una colección bi-dimensional de *variables heterogéneas* y es el tipo de estructura de datos más importante en R. Se crean usando la función `data.frame()`. Ej: ```r x <- c(13,24,15,36,47) y <- factor(c(1, 1, 2, 2, 1), labels = c('uno', 'dos')) z <- c('Miguel','Gabriela','Carlos','Maria','Rosario') bd <- data.frame(x,y,z) ``` - **tibble**: estructura de datos muy similar a un `data.frame`, pero con una concepción más moderna. Está disponible y es utilizada por funciones del paquete `tidyverse`. Ej: ```r library(tidyverse) x <- c(13,24,15,36,47) y <- factor(c(1, 1, 2, 2, 1), labels = c('uno', 'dos')) z <- c('Miguel','Gabriela','Carlos','Maria','Rosario') bdt <- tibble(x,y,z) ``` --- class: separator-blue, middle # Leyendo bases de datos desde archivos externos --- ## Leyendo bases de datos desde archivos externos - Las bases de datos pueden venir en diferentes formatos, como archivos de texto (csv o txt), archivos de Excel, archivos de otros paquetes como Stata o Spss. - Usamos diferentes paquetes según el tipo de archivo que vamos a leer. Todos los paquetes que vamos a ver abren la base de datos en formato **tibble**. - Para leer un **archivo de texto** (con las columnas separadas por coma o tabulación) usamos el paquete `readr`. ```r library(readr) nombre_base_datos <- read_csv("nombre_archivo.csv") ``` - Para leer una **archivo de Excel** usamos el paquete `readxl`. ```r library(readxl) nombre_base_datos <- read_excel("nombre_archivo.xlsx", sheet = "nombre_hoja", range = "inicio:fin") ``` --- ## Leyendo bases de datos desde archivos externos - Para leer un **archivo de Stata** usamos el paquete `haven`. ```r library(haven) nombre_base_datos <- read_dta("nombre_archivo.dta") ``` - El paquete `haven` puede leer archivos de otros paquetes como por ejemplo spss (`read_spss`) y sas (`read_sas`). - Las bases de datos se almacenan en la memoria REM del computador y pueden ser eliminadas utilizando la función `rm`. ```r rm(nombre_base_datos1, nombre_base_datos2, ...) ``` - Como ejemplo vamos a trabajar con datos de casos COVID y Vacunación del Ministerio de Ciencia y Tecnología. Todos los datos están en el repositorio: [https://github.com/MinCiencia/Datos-COVID19](https://github.com/MinCiencia/Datos-COVID19) --- ## Características de las bases de datos - El primer paso en cualquier análisis es observar la bases de datos. Ver que variables tiene, cuantas observaciones tiene, que tipo de datos incluye, etc. - Para ver la base de datos completa como una **hoja de cálculo** usamos: ```r View(nombre_base_datos) ``` - Para tener una **resumen de las características** de los datos usamos: ```r str(nombre_base_datos) ``` - Para obtener un **vector con todos nombres de las variables** (columnas) de la base de datos usamos: ```r names(nombre_base_datos) ``` - Adicionalmente, las funciones `head(nombre_base_datos)` y `tail(nombre_base_datos)` sirven para mostrar en pantalla las primeras y las últimas observaciones. --- class: separator-blue, middle # Estadísticas descriptivas --- ## Estadísticas descriptivas - R tiene varias funciones para calcular **estadísticas descriptivas**. Todas las funciones operan sobre un vector (una columna de una base de datos). Para obtener una variables particular de una base de datos usamos: `nombre_base_datos$nombre_variable`. - La siguiente tabla algunas de las funciones más utilizadas: | Estadístico | Función | |-------------|---------| | Media | `mean(base_datos$variable, na.rm = TRUE)` | | Mediana | `median(base_datos$variable, na.rm = TRUE)` | | Varianza | `var(base_datos$variable, na.rm = TRUE)` | | Desviación Estándar | `sd(base_datos$variable, na.rm = TRUE)` | | Mínimo | `min(base_datos$variable, na.rm = TRUE)` | | Máximo | `max(base_datos$variable, na.rm = TRUE)` | | Total | `sum(base_datos$variable, na.rm = TRUE)` | | Tabla resumen | `summary(base_datos$variable)` | --- ## Estadísticas descriptivas - Para construir una **tabla resume con estadísticas descriptivas** para todas las variables en una base de datos usamos el paquete `stargazer`. ```r library(stargazer) stargazer(base_datos, type = "text", summary = TRUE) # Nota: base_datos debe ser dataframe y no tibble (convertir con data.frame()). ``` - Para variable cualitativas podemos construir una **tabla de frecuencias** y sus correspondientes proporciones. ```r table(base_datos$variable) # Tabla de frecuencias prop.table(table(base_datos$variable)) # Tabla de frecuencias en proporciones ``` - También se pueden calcular algunas **estadísticas descriptivas para dos variables**. | Estadístico | Función | |-------------|---------| | Covarianza | `cov(base_datos$var_x, base_datos$var_y)` | | Correlación | `corr(base_datos$var_x, base_datos$var_y)` | --- class: separator-blue, middle # Manipular bases de datos usando dplyr --- ## Manipular bases de datos usando dplyr - El **paquete dplyr** es parte del ecosistema tidyverse y se usa para manipular bases de datos. Consta de varias funciones (denominados verbos) que mantiene consistencia en la sintáxis. - `select`: **selecciona variables** (columnas) de una bases de datos. ```r select(base_datos, va1, var2, ...) ``` - Es posible usar buscadores como `contains("palabra_clave")`, `starts_with("")`, `ends_with("")`. - `filter`: **selecciona observaciones** (filas) de una base de datos de acuerdo a criterio lógico. ```r filter(base_datos, criterios_búsqueda_lógicos) ``` - Los criterios de búsqueda son vectores booleanos que se pueden obtener usando operadores lógicos. - Las observaciones que evalúen verdadero (`TRUE`) serán elegidas. --- ## Manipular bases de datos usando dplyr - Operadores lógicos: | Operador Lógico | Interpretación | | Operador Lógico | Interpretación | |-----------------|----------------|-|-----------------|----------------| | `==` | Igualdad | | `%in% vector` | Igual a valores en vector | | `>` | Mayor | | `!` | Negación | | `>=` | Mayor o igual | | `&` | Y | | `<` | Menor | | | O | | `<=` | Menor o igual | | | | - `mutate`: **crea variables** (columnas) en base a expresión. ```r mutate(datos, expresión1, expresión2, ...) ``` - Para crear variables se pueden utilizar operadores matemáticos como `+`, `-`, `*`, `/`, `^`. - También se pueden usar funciones matemáticas como `log()`, `exp()`, etc. --- ## Manipular bases de datos usando dplyr - `mutate`: **crea variables** (columnas) en base a expresión. - Para crear variables usando condicionales es posible usar: ```r nombre_variable = if_else(condicion, expresión_verdadero, expresión_falso) ``` - Pare crear variables con distintos casos (categoricas) se usa: ```r nombre_variable = case_when( expresión lógica 1 ~ Valor si evalúa TRUE, expresión lógica 2 ~ Valor si evalúa TRUE, ... ) ``` - `rename`: **cambia el nombre de las variables** (columnas). ```r rename(datos, nuevo_var1 = var1, ...) ``` --- ## Manipular bases de datos usando dplyr - `group_by`: **Agrupa por variables categóricas** (implícitamente crea muchas bases de datos de acuerdo a la agrupación según variables). Esta función se usa en conjunto con otros para calcular expresiones por grupos. ```r group_by(datos, var1, var2, ...) ``` - Despúes derealizar operaciones con las bases agrupadas se debe usar `ungroup(datos)` para volver a la base original. - `summarise`: se ocupara para **generar estadísticas descriptivas**. En general se usa en conjunto con `group_by()`y `mutate()` para generar estadísticas descriptivas por grupos. - En este caso es posible utilizar todas las funciones vistas antes para calcular estadísticas descriptivas. - Una función útil es `n()` que cuenta el número de observaciones. --- ## Manipular bases de datos usando dplyr - `arrange`: **Ordenar la base de dats de forma acendente por variables**. ```r arrange(datos, var1,var2, ...) ``` - Usar la opción `desc(var)` para cambiar el orden a decendente. - El **operador pipe** (`%>%`) permite transferir la base de datos resultante como primer argumento de la función siguiente. De esta forma se evita funciones anidadas. El siguiente diagrama ilustra la idea: <img src="http://ds4ps.org/dp4ss-textbook/figures/chaining_data_verbs.png" width="70%" style="display: block; margin: auto;" /> --- class: separator-blue, middle # Gráficos y regresión lineal --- ## Gráficos - R viene con varias opciones para **visualizar y analizar datos**. Algunos ejemplos son: | Gráfico | Sintaxis | Opciones | |---|---|---|---| | Histograma | `hist(base$vary, opciones...)` | `xlab`, `ylab`, `main`, `col`, `breaks` | | Barras | `barplot(table(base$variable), opciones...)` | `xlab`, `ylab`, `main`, `col`, `horiz` | | | `barplot(vary ~ varx, data = base, opciones...)` | `xlab`, `ylab`, `main`, `col`, `horiz` | | Cajas | `boxplot(vary ~ varx, data = base, opciones...)` | `xlab`, `ylab`, `main`, `col`, `horiz` | | Dispersión | `plot(vary ~ varx, data = base, opciones...)` | `xlab`, `ylab`, `main`, `col`, `cex`, `pch` | - *Opciones comunes*: `xlab`, `ylab`, `main`, `col` representan etiquetas de los ejes x e y, el título, y el color, respectivamente. - *Opciones particulares*: `breaks` es el número de grupos en un histograma; `horiz = TRUE` indica que el gráfico rotara 90 grados; `cex` y `pch` indican el tamaño y el relleno de los puntos en el diagrama de dispersión. --- ## Regresión lineal - Un modelo de regresión lineal se estima por el método MCO usando la función `lm` (linear models). ```r reg <- lm(vary ~ varx1 + varx2 + ... + varxk, data = base_datos) summary(reg) ``` - Comentarios: - En R `vary ~ varx1 + varx2 + ... + varxk` representa una fórmula (`vary` es función de `varxs` con `s=1,...,k`). La constante es incluida por defecto en la regresión. Para eliminar la constante agregar `-1` en la fórmula. - Es posible hacer operaciones simples directamente al lado izquierdo (como log, exp, ^, *, /). Para hacer operaciones al lado derecho se utiliza la notación `I(expresión)` para indicarle a R que es una operación sobre la variable y no es parte de la fórmula. - Para introducir variables dummy a partir de una variable categórica, ésta se debe incluir como variables tipo factor y R automáticamente calculará todas las variables dicotómicas para la regresión (si la variable no es tipo factor convertirla con `as.factor()`). --- ## Regresión lineal - Para obtener los errores de regresión y los valores predichos se usan las siguientes funciones: ```r errores <- resid(nombre_regresión) yhat <- predict(nombre_regresión) ``` - Para obtener un tabla de regresión formateada y que incluya en columnas más de una regresión usamos el paquete `stargazer`. ```r library(stargazer) stargazer(nombre_regresión1, nombre_regresión2, ..., type = "text") ```