1.3 Una breve introducción a R y RStudio
Primeros pasos en R
El sistema de computación estadístico y gráfico R (R Development Core Team 2021b, http://www.R-project.org/) es un proyecto de software de código abierto, publicado bajo los términos de la GNU General Public License (GPL), Versión 2.2
El código fuente, así como varias versiones binarias de R se pueden obtener, sin costo, mediante el Comprehensive R Archive Network (CRAN;ver http://CRAN.R-project.org/mirrors.html para encontrar su espejo más cercano). Se proporcionan versiones binarias para versiones de 64 bits de Microsoft Windows, varias plataformas de Linux (incluidos Debian, Red Hat, SUSE y Ubuntu) y Mac OS X.
Instalación
La instalación de versiones binarias es bastante sencilla:
- Simplemente vaya a CRAN.
- Elija la versión correspondiente a su sistema operativo.
- Siga las instrucciones provistas en el archivo readme correspondiente.
Para Microsoft Windows, esto equivale a descargar y ejecutar el archivo ejecutable de instalación (archivo .exe), que lleva al usuario a través de un administrador de configuración estándar. Para Mac OS X, imagen de disco separada o los archivos .dmg están disponibles para el sistema base, así como para una GUI desarrollada para esta plataforma. Para varios plataformas de Linux, existen binarios preempaquetados (como los archivos .rpm o .deb) que se pueden instalar con las herramientas de empaquetado habituales en las respectivas plataformas. Además, las versiones de R también se distribuyen en muchos de los repositorios estándar de Linux, aunque no necesariamente se actualizan de forma rápida las nuevas versiones de R como CRAN.
Para todos los sistemas, en particular aquellos para los que no existe un paquete binario, también existe, por supuesto, la opción de compilar R a partir de la fuente. En algunas plataformas, en particular Microsoft Windows, esto puede resultar un poco engorroso porque los compiladores necesarios normalmente no forman parte de una instalación estándar. En otras plataformas, como Unix o Linux, esto a menudo equivale a los pasos habituales de configure/make/install. Finalmente, se recomienda visitar R Development Core Team (2021d) para obtener información detallada sobre la instalación y administración del software y paquetería de R.
Paquetes
Como se discutirá con mayor detalle a continuación, la base del software R puede ampliarse mediante paquetes, algunos de los cuales forman parte de la instalación predeterminada. Los paquetes se almacenan en una o más bibliotecas (esto es, colecciones de paquetes) en el sistema y pueden cargarse usando el comando library(). Mecanografiar library() sin argumentos devuelve una lista de todos los paquetes instalados actualmente en todas las bibliotecas. En el mundo de R, los paquetes que se encuentran instalados de forma predeterminada se conocen como paquetes “base” (contenidos en el código fuente de R). De igual forma, los son paquetes incuidos en cada distribución binaria se conocen como paquetes “recomendados.” Actualmente existen una gran cantidad de paquetes adicionales (más de 1400), conocidos como paquetes “contribuidos.”
Resulta importante mencionar que todos los paquetes están disponibles en los servidores de CRAN (se recomienda visitar http://CRAN.R-project.org/web/packages/), y algunos de estos serán necesario a medida que se avance. En particular, el paquete necesario que acompaña a este curso es llamado AER. En una computadora conectada a Internet, la instalación del paquete es tan simple como escribir el siguiente código en el área de codificado:
install.packages("AER")
Este proceso de instalación funciona en todos los sistemas operativos. Además, los usuarios de Windows pueden instalar paquetes usando “Install packages from CRAN.” Los usuarios de Mac pueden instalar paquetes usando la opción de menú “Package installer” y luego eligiendo los paquetes a instalar de una lista. Dependiendo de la instalación, en particular de la configuración de las rutas de la biblioteca, se puede usar la función install.packages() de forma predeterminada para instalar paquetes. Si se intenta instalar un paquete en un directorio donde el usuario no tiene permisos de escritura. En tal caso, es necesario especificar el argumento lib o establecer las rutas de la biblioteca de forma adecuada (se puede consultar R Development Core Team 2021d o ?library para más información). Por cierto, instalar AER descargará varios paquetes más de los que depende el buen funcionamiento del AER. No es raro que los paquetes dependan de otros paquetes; si este es el caso, el paquete lo “sabe” y asegura que todas las funciones de las que depende estarán disponibles durante el proceso de instalación.
Para usar funciones o conjuntos de datos de un paquete, el paquete debe estar cargado. El comando para cargar paquetes es library(), para el paquete AER:
library("AER")
De ahora en adelante, se asume que AER siempre está cargado. Será necesario instalar y cargar más paquetes en capítulos posteriores, y siempre se indicará cuáles son.
En vista del número cada vez mayor de paquetes contribuidos, se ha demostrado que es útil mantener una serie de “vistas de tareas CRAN” que proporcionan una descripción general de los paquetes para determinadas tareas. Las vistas de tareas actuales incluyen econometría, finanzas, ciencias sociales y estadísticas bayesianas (ver http://CRAN.R-project.org/web/views/ para mas detalles.
Trabajar con R
Existe una diferencia importante entre la filosofía de R y la mayoría de los otros paquetes de econometría. Con muchos paquetes, un análisis conducirá a una gran cantidad de resultados que contienen información sobre estimaciones, diagnósticos de modelos, pruebas de especificación, entre otros. En R, un análisis normalmente se divide en una serie de pasos. Los resultados intermedios se almacenan en objetos, con un resultado mínimo en cada paso (a menudo ninguno). En cambio, los objetos se manipulan aún más para obtener la información requerida (programación orientada a objetos).
De hecho, el principio de diseño fundamental subyacente a R (antes S) es “todo es un objeto.” Por lo tanto, no solo los vectores y las matrices son objetos que pueden ser pasados y devueltos por funciones, sino también las funciones mismas e incluso las llamadas a funciones. Esto permite realizar cálculos sobre el lenguaje y puede facilitar considerablemente las tareas de programación, como se ilustrará más adelante:
Manipulación sencilla de objetos
Para ver qué objetos están definidos actualmente, la función objects() (o la equivalente ls()) puede ser usado. De forma predeterminada, la función enumera todos los objetos en el entorno global (es decir, el espacio de trabajo del usuario):
objects()
#> [1] "escape_latex" "my_output" "stargazer_html_title"
#> [4] "ttcode" "write_html"
que devuelve un vector de caracteres de longitud 9, lo que indica que actualmente existen nueve objetos, como resultado de la sesión introductoria.
Sin embargo, esta no puede ser la lista completa de objetos disponibles, dado que algunos objetos ya deben existir antes de la ejecución de cualquier comando, entre ellos la función objects(), que se acaba de llamar. La razón es que la lista de búsqueda, que puede ser consultada mediante la función search(), comprende no sólo el medio ambiente global “.GlobalEnv” ( siempre en la primera posición) sino también varios paquetes adjuntos, incluido el paquete base al final.
search()
#> [1] ".GlobalEnv" "package:AER" "package:survival"
#> [4] "package:sandwich" "package:lmtest" "package:zoo"
#> [7] "package:car" "package:carData" "package:stats"
#> [10] "package:graphics" "package:grDevices" "package:utils"
#> [13] "package:datasets" "package:methods" "Autoloads"
#> [16] "package:base"
Lamando a la función objects(“package:base”) se pueden mostrar los nombres de más de mil objetos definidos en la base, incluyendo la función objects() en sí misma.
Los objetos se pueden crear fácilmente asignando un valor a un nombre usando el operador de asignación <-. Por ejemplo, se crea un vector x en que el numero \(2\) esté almacenado:
<- 2
x
objects()
#> [1] "escape_latex" "my_output" "stargazer_html_title"
#> [4] "ttcode" "write_html" "x"
En este punto, x ahora está disponible en el entorno global y se puede eliminar utilizando la función remove() ( o equivalente rm()):
remove(x)
objects()
#> [1] "escape_latex" "my_output" "stargazer_html_title"
#> [4] "ttcode" "write_html"
Llamada de funciones
Si se escribe el nombre de un objeto en el área de prompt, éste se imprimirá. En este contexto, el resultado de escribir los nombres de las funciones cambia dependiendo de la sintaxis:
- Si únicamente se escribe el nombre de la función, suponiendo foo, esto significa que se quiere imrpimir el correspondiente código fuente de la función en R (intente, por ejemplo, objects).
- Si se escibre el nombre de la función seguido de paréntesis, suponinedo foo(), esto implica que se quiere ejecutar una llamada de función (intente, por ejemplo, objects()).
Los argumentos dentro de una función son válidos:
- Si se especifican los valores de los argumentos que la función requiere dentro de los paréntesis (log(base = 2, x = 16) es una llamada de función válida).
- Si no se especifican los valores de los argumentos porque la función ya posee valores predeterminados (foo() por sí solo es una llamada de función válida).
Por lo tanto, a lo largo de este curso se emplean un par de paréntesis después del nombre del objeto para indicar que el objeto discutido es una llamada de función.
Las funciones a menudo tienen más de un argumento (de hecho, no existe un límite para el número de argumentos en las funciones de R). Una llamada de función puede usar los argumentos en cualquier orden, siempre que se proporcione el nombre del argumento. Si no se dan los nombres de los argumentos, R asume que aparecen en el orden en que se define la función. Si un argumento tiene un valor predeterminado, puede omitirse en una llamada de función. Por ejemplo, la función log() tiene dos argumentos, x y base:
- El primero (x) puede ser un escalar (aunque en realidad también puede ser un vector), cuyo logaritmo debe tomarse.
- El segundo (base) es la base respecto a la cual se calculan los logaritmos.
Por lo tanto, las siguientes cuatro llamadas son todas equivalentes:
log(16, 2)
#> [1] 4
log(x = 16, 2)
#> [1] 4
log(16, base = 2)
#> [1] 4
log(base = 2, x = 16)
#> [1] 4
Clases y funciones genéricas
Cada objeto tiene una clase que se puede consultar llamando a la función class(). Las clases que se usarán comúnmente en el presente curso incluyen:
- “data.frame” (una lista o matriz con una determinada estructura, el formato preferido en el que se deben guardar los datos).
- “lm” para objetos de modelo lineal (devuelto cuando se ajusta un modelo de regresión lineal por mínimos cuadrados ordinarios).
- “matrix” (que es lo que sugiere el nombre: matrices).
Para cada clase, se encuentran disponibles métodos específico que se pueden consultar mediante llamadas a las funciones. Sin embargo, existen funciones genéricas (se pueden usar para todos los tipos de clases), los ejemplos típicos de dichas funciones incluyen summary() y plot(). El resultado de estas funciones depende de la clase del objeto:
- Cuando se le proporciona un vector numérico, summary() devuelve resúmenes básicos de una distribución empírica, como la media, la mediana y la moda.
- Cuando se le proporciona un vector de datos categóricos, summary() devuelve una tabla de frecuencias.
- Cuando se le proporciona un objeto de modelo lineal, summary() devuelve el resultado de una regresión estándar.
- Cuando se le proporciona un vector, una matriz o un marco de datos numérico, plot() devuelve pares de diagramas de dispersión.
- Cuando se le proporciona un objeto de modelo lineal, plot() devuelve pares de diagramas de diagnóstico básicos.
Salir de R
Se puede salir de R usando la función q():
q()
A continuación, R pregunta si se desea guardar la imagen del espacio de trabajo. Respondiendo n (no) saldrá de R sin guardar nada, mientras que respondiendo y (yes) guardará todos los objetos actualmente definidos en un archivo .RData y el historial de comandos en un archivo .Rhistory, ambos en el directorio de trabajo.
Gestión de archivos
Si la sesión se R inicia en un directorio que tiene archivos .RData y/o .Rhistory, estos se cargarán automáticamente. En cuanto al directorio de trabajo:
- Para consultar el directorio de trabajo se debe usar getwd().
- Para cambiar el directorio de trabajo se debe usar setwd().
- Para consultar los archivos en un directorio se debe usar la función dir().
Los espacios de trabajo guardados de otros directorios se pueden cargar usando la función load(). Análogamente, los objetos de R se pueden guardar (en formato binario) usando save().
Obtención de ayuda
R es un software bien documentado. Se puede acceder a la ayuda sobre cualquier función utilizando el símbolo ? o la función help(). Por lo tanto:
?options
help("options")
Ambos abren la página de ayuda para el comando options(). En la parte inferior de una página de ayuda, normalmente se muestran ejemplos prácticos de cómo utilizar dicha función. Estos se pueden ejecutar fácilmente con la función example(); por ejemplo, si no se conoce el nombre exacto de un comando, como suele ser el caso de los principiantes, las funciones a utilizar son help.search() y apropos():
help.search() devuelve archivos de ayuda con alias, conceptos o títulos que coinciden con un “patrón” mediante la coincidencia aproximada. Por lo tanto, si se desea ayuda sobre la configuración de las opciones, pero no se conoce el nombre exacto del comando (es decir, se deconoce la función options()), una búsqueda de objetos que contenga el patrón “options” puede ser útil. En otras palabras, help.search(“option”) devolverá una lista (larga) de comandos, marcos de datos, entre otros, que contienen el patrón “options,” incluida la entrada que proporciona el resultado deseado:
options(base) Options Settings
El resultado anterior dice que existe una función llamada options() el paquete base de R que proporciona una capa de configuración de opciones.
Alternativamente, la función a apropos() enumera todas las funciones cuyos nombres incluyen el patrón introducido. Como lo ilustra:
apropos("help")
El comando anterior proporciona una lista con solo tres entradas, incluida la función deseada help(). Se debe tener en cuenta que help.search() busca en todos los paquetes instalados, mientras que a apropos() simplemente examina los objetos que se encuentran actualmente en la lista de búsqueda.
Viñetas
En un nivel más avanzado, existen las llamadas viñetas. Son archivos PDF generados a partir de archivos integrados que contienen código R y documentación (en formato LATEX). Por lo tanto, las viñetas suelen contener comandos que se pueden ejecutar directamente y que reproducen el análisis descrito. El presente curso fue escrito usando las herramientas en las que se basan las viñetas. La función vignette() proporciona una lista de viñetas en todos los paquetes adjuntos (el significado de “adjunto” se explicará más adelante). Un ejemplo es el siguiente código vignette(“strucchange-intro,” package = “strucchange”), que abre la viñeta que acompaña al paquete strucchange. El paquete trata temas relacionados con las pruebas, el seguimiento y la datación de los cambios estructurales en las regresiones de series de tiempo. Se recomienda consultar el Capítulo 3 para obtener más información sobre los detalles de las viñetas e infraestructura relacionada.
Demos
También existen “demos” para determinadas tareas. Una demo es una interfaz para ejecutar algunas demostraciones de R scripts (conocidos como guiones con comandos). Se puede escribir demo() para obtener una lista de los temas disponibles. Estos incluyen “graphics” y “lm.glm,” este último proporciona ilustraciones sobre modelos lineales y lineales generalizados. Para los principiantes, correr demo(“graphics”) es muy recomendable.
Manuales, preguntas frecuentes y publicaciones
R también viene con varios manuales:
- Una introducción a R.
- Importación / Exportación de datos en R.
- Definición del lenguaje R.
- Escritura de extensiones en R.
- Instalación y administración en R.
- Internos en R
Además, existen varias colecciones de preguntas frecuentes (Frequently Asked Questions o FAQs), las cuales consisten en preguntas generales sobre R y también sobre problemas específicos de la plataforma en Microsoft Windows y Mac OS X.
Adicionalmente, existe un boletín en línea llamado R News, lanzado en 2001. Actualmente se publica unas tres veces al año y presenta, entre otras cosas, desarrollos recientes en R (como cambios en el idioma o nuevos paquetes de complementos), un “nicho de programador” y ejemplos que analizan datos con R. Se recomienda visitar http://CRAN.R-project.org/doc/Rnews/ para más información.
Para un número creciente de paquetes en R, existen publicaciones correspondientes en el Journal of Statistical Software (Revista de Software Estadístico que se puede consultar mediante el siguiente vínculo http://www.jstatsoft.org/. Se trata de una revista de acceso abierto que publica artículos y fragmentos de código (así como reseñas de libros y software) sobre temas relacionados con algoritmos y software estadístico. Un volumen especial de Econometría en R se puede encontrar actualmente en preparación.
Por último, existe una lista de libros en rápido crecimiento sobre R, así como en estadística aplicada usando R en todos los niveles, quizás el más completo sea Venables y Ripley (2002). Además, se remite al lector interesado a Dalgaard (2002) para una introducción a la estadística, a Murrell (2005) para gráficos en R y Faraway (2005) para comprender a profundidad las implicaciones de la regresión lineal.
El modelo de desarrollo
Una de las fortalezas de R y una característica clave de su éxito es que resulta ser altamente extensible a través de paquetes que proporcionan extensiones a todo lo disponible en el sistema base. Esto incluye no solo el código R, sino también código en lenguajes compilados (como C, C++ o FORTRAN), conjuntos de datos, archivos de demostración, conjuntos de pruebas, vignettes o documentación adicional. Por lo tanto, cada usuario de R puede convertirse fácilmente en un desarrollador de R enviando sus paquetes a CRAN para compartirlos con la comunidad de R. Por lo tanto, los paquetes pueden influir activamente en la dirección en que (partes de) R irá en el futuro.
A diferencia de los paquetes CRAN, los paquetes base del sistema R son mantenidos y desarrollados solo por el equipo central de R, que lanza actualizaciones de las principales versiones (es decir, versiones x.y.0) cada dos años (actualmente alrededor del 1 de abril y el 1 de octubre). Sin embargo, como R es un sistema de código abierto, todos los usuarios tienen acceso de lectura al repositorio principal o maestro de SVN (SVN significa Subversion), que funciona como un sistema de control de versiones (se recomienda visitar http://subversion.tigris.org/. En consecuencia, cualquiera puede consultar el código fuente completo de la versión de desarrollo de R.
Asimismo, existen varios medios de comunicación dentro de la comunidad de usuarios y desarrolladores en R, así como entre los usuarios y el equipo de desarrollo central. Los dos más importantes en R son las extensas listas de correo y, como se describió anteriormente, los paquetes CRAN. El proyecto R alberga varias listas de correo, incluidas R-help y R-devel:
- El primero se utiliza para pedir ayuda sobre el uso de R.
- El segundo se utiliza para discutir temas relacionados con el desarrollo de R o los paquetes de R.
Además, se pueden informar errores y realizar solicitudes de funciones. La publicación de la guía en http://www.R-project.org/posting-guide.html es una buena estrategia para hacer esto de manera efectiva. En adición a estas listas de correo generales, existen listas para Grupos de Interés Especial o Special Interest Groups (SIGs), entre ellas almenos una lista podría ser de interés para el lector: La cual se llama R-SIG-Finance, que se encuentra dedicada a las finanzas y la econometría (financiera).
Conceptos básicos en R
Como se mencionó anteriormente, este curso no pretende ser una introducción a R, sino una guía sobre cómo usar sus capacidades para aplicaciones que se encuentran comúnmente en econometría de pregrado. Aquellos que tengan conocimientos básicos en programación en R se sentirán cómodos comenzando con el Capítulo 3. Sin embargo, esta sección está destinada a quienes no hayan trabajado con R o RStudio antes. Si al menos sabe cómo crear objetos y llamar a funciones, puede omitirlo. Si desea actualizar sus habilidades o tener una idea de cómo trabajar con RStudio, siga leyendo.
En primer lugar, inicie RStudio y abra un nuevo script R seleccionando Archivo, Nuevo archivo, Script R. En el panel del editor, escriba
1 + 1
#> [1] 2
y hacer clic en el botón etiquetado como Ejecutar en la esquina superior derecha del editor. Al hacerlo, su línea de código se envía a la consola y el resultado de esta operación debe mostrarse justo debajo. Como puede ver, R funciona como una calculadora. Puede hacer todos los cálculos aritméticos utilizando el operador correspondiente (+, -, \(\textbf{*}\), / o ^). Si no está seguro de lo que hizo el último operador, pruébelo y compruebe los resultados.
Vectores
R es, por supuesto, más sofisticado que eso. Se puede trabajar con variables o, más generalmente, con objetos. Los objetos se definen mediante el operador de asignación <-. Para crear una variable llamada x que contenga el valor 10, se necesita escribir x <- 10
y hacer clic en el botón Ejecutar una vez más. La nueva variable debería haber aparecido en el panel de entorno en la parte superior derecha. Sin embargo, la consola no mostró ningún resultado porque la línea de código no contiene ningúna llamada que creara salida. Cuando ahora se escribe x
en la consola y se presiona retorno, le pide a R que muestre el valor de x y el valor correspondiente debe imprimirse en la consola.
x es un escalar, un vector de longitud \(1\). Se pueden crear fácilmente vectores más largos usando la función c() (c es para “concatenar” o “combinar”). Para crear un vector y que contenga los números \(1\) a \(5\) e imprimirlo, se debe hacer lo siguiente.
<- c(1, 2, 3, 4, 5)
y
y#> [1] 1 2 3 4 5
También se puede crear un vector de letras o palabras. Por ahora, solo se necesita recordar que los caracteres deben estar entre comillas; de lo contrario, se analizarán como nombres de objeto.
<- c("Hola", "Mundo")
hello
hello#> [1] "Hola" "Mundo"
Aquí se ha creado un vector de longitud 2 que contiene las palabras Hola y Mundo.
¡No olvidar guardar el script! Para hacerlo, seleccionar Archivo y Guardar.
Funciones
Se ha visto la función c() que se puede usar para combinar objetos. En general, todas las llamadas a funciones tienen el mismo aspecto: el nombre de una función siempre va seguido de paréntesis. A veces, los paréntesis incluyen argumentos.
A continuación, se muestran dos ejemplos sencillos.
# generar el vector `z`
<- seq(from = 1, to = 5, by = 1)
z
# calcular la media de las entradas en `z`
mean(z)
#> [1] 3
En la primera línea se usó una función llamada seq() para crear exactamente el mismo vector que se hizo en la sección anterior, llamándolo z. La función toma los argumentos from, to y by que deberían ser autoexplicativos.
La función mean() calcula la media aritmética de su argumento x. Como se pasa el vector z como argumento x, ¡el resultado es 3!
Si no se está seguro de qué argumentos se espera en una función, se puede consultar la documentación de la función. Digamos que no se está seguro de cómo funcionan los argumentos requeridos para seq(). Luego se escribe ?Seq
en la consola. Al presionar regresar, la página de documentación para esa función aparece en el panel inferior derecho de RStudio. Allí, la sección Argumentos contiene la información que se busca. En la parte inferior de casi todas las páginas de ayuda se encontrará ejemplos sobre cómo utilizar las funciones correspondientes. Esto es muy útil para los principiantes y se recomenda siempre buscar.
Por supuesto, todos los comandos presentados anteriormente también funcionan en el widgets interactivo, que se puede probar a continuación y a lo largo del curso al finalizar los apartados.
Los lectores que no estén familiarizados con el software de código abierto pueden visitar http://www.gnu.org/.↩︎