Uploaded by ivan.olmedocortes

PID 00273871

advertisement
El entorno estadístico R
Estructura, lenguaje y sintaxis
PID_00273871
Daniel Liviano Solís
Maria Pujol Jover
Revisión a cargo de Ángel Javier Gil
El entorno estadístico R
FUOC • PID_00273871
Daniel Liviano Solís
Profesor de los Estudios de Economía
y Empresa de la Universitat Oberta de
Catalunya. Doctor en Economía por
la Universitat Rovira i Virgili.
Maria Pujol Jover
Profesora de los Estudios de Economía
y Empresa de la Universitat Oberta de
Catalunya. Doctora en Estudios
Empresariales por la Universidad de
Barcelona.
La revisión de este recurso de aprendizaje UOC ha sido coordinada
por la profesora: Laura Calvet Liñán
Tercera edición: septiembre 2020
© de esta edición, Fundació Oberta de Catalunya FUOC
Av. Tibidabo, 39-43, 08035 Barcelona
Autoría: Daniel Liviano Solís, Maria Pujol Jover
Producción: FUOC
Todos los derechos reservados
Ninguna parte de esta publicación, incluyendo el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma ni por ningún medio, sea este eléctrico,
químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
de los titulares de los derechos.
FUOC • PID_00273871
El entorno estadístico R
Índice
Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
1.
Primeros pasos con R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.1. ¿Qué es R? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3. Iniciar una sesión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.4. Gestión de paquetes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5. ¡Documentación y ayuda! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9
9
10
11
12
13
2.
Sintaxis y programación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.1. Tipos de datos y objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2. Vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1. Almacenar datos en vectores . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2. Operaciones básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.3. Secuencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.4. Operadores lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.5. Indexación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.1. Los objetos array y matrix . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.2. Creación de matrices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.3. Submatrices e indexación . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.4. Operaciones matriciales básicas . . . . . . . . . . . . . . . . . . . . . .
2.4. Funciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.5. Ciclos y condicionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.6. La familia apply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.7. Bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.8. Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.9. Lectura y escritura de ficheros csv . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.9.1. Inspección de los datos leídos . . . . . . . . . . . . . . . . . . . . . . . .
2.10. Fusión de bases de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15
15
15
15
16
17
18
19
20
20
20
23
25
26
27
28
30
31
32
33
34
3.
Rstudio y R Markdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Instalación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.3. Primeros pasos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4. R Markdown: primeros pasos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5. R Markdown: el lenguaje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
36
37
38
39
40
Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
FUOC • PID_00273871
5
Introducción
El objetivo principal de este módulo es introducir al estudiante en el entorno
estadístico R. Se podría definir como un lenguaje y un entorno para computación y gráficos estadísticos. Es un proyecto libre, es decir, no requiere el pago
de ninguna licencia. R proporciona una amplia variedad de técnicas estadísticas (modelos lineales y no lineales, pruebas estadísticas clásicas, análisis de
series temporales, análisis multivariante, etc.). Además, también ofrece una
alta potencialidad para elaborar gráficos complejos y de calidad.
El uso de R en las asignaturas cuantitativas que ofrece la UOC permite al estudiante muchas y variadas posibilidades de análisis numérico y estadístico.
Algunas se detallan a continuación. R proporciona:
1) Facilidades para almacenar y manejar datos numéricos en diferentes formatos, como vectores, matrices y bases de datos.
2) Una amplia colección de operadores y funciones matemáticas.
3) Una larga lista de paquetes estadísticos con todo tipo de herramientas estadísticas y matemáticas.
4) Facilidades gráficas para el análisis y la visualización de datos.
5) Un lenguaje de programación sencillo y eficaz muy desarrollado, que incluye condicionales, bucles y funciones recursivas.
6) La posibilidad de añadir funcionalidades adicionales mediante la definición de nuevas funciones creadas por el usuario.
7) La posibilidad de extenderse mediante paquetes. Hay cerca de ocho paquetes básicos suministrados con la distribución de R, pero hay muchos más de
disponibles en el CRAN (Comprehensive R Archive Network).
Se tiene que reconocer que empezar a trabajar con R no es fácil, sobre todo
para los estudiantes que no están acostumbrados a utilizar paquetes informáticos de análisis numérico. Es decir, hay una cierta curva de aprendizaje que
tiene que superarse con la práctica. Este módulo busca, pues, servir de apoyo
en estos primeros pasos siempre complicados, de modo que el estudiante se
familiarice con este paquete estadístico y pueda aprovechar toda su potencialidad.
A pesar de que existe una extensión llamada R Commander que permite simular un conjunto de menús similar a Minitab o SPSS y, dadas las características
de nuestros estudios, es preferible trabajar directamente con los comandos de
El entorno estadístico R
FUOC • PID_00273871
6
R y ayudarnos con un entorno de trabajo, como por ejemplo RStudio, que nos
permitirá integrar en un único documento las instrucciones de R, los resultados obtenidos, incluyendo gráficos, y nuestros comentarios.
El entorno estadístico R
FUOC • PID_00273871
7
Objetivos
1. Instalar correctamente R en el ordenador.
2. Instalar y cargar paquetes adicionales en función de las necesidades del
análisis.
3. Utilizar las herramientas de ayuda que ofrece R para resolver dudas.
4. Localizar los manuales disponibles en el web oficial del programa.
5. Identificar los tipos principales de datos y objetos admitidos en R, y poderlos manejar eficientemente.
6. Crear un script para escribir un análisis de manera coherente, asignando
nombres a nuevas variables.
7. Hacer operaciones matemáticas y estadísticas con vectores y matrices.
8. Dominar los operadores lógicos y las funciones recursivas, ciclos y condicionales.
9. En general, llevar a cabo todo tipo de operaciones matriciales.
10. Leer y escribir ficheros, sobre todo en formato csv.
11. Hacer los primeros pasos con RStudio.
El entorno estadístico R
FUOC • PID_00273871
9
El entorno estadístico R
1. Primeros pasos con R
.
1.1. ¿Qué es R?
Esta es una pregunta simple que no tiene una respuesta fácil. En la definición
más amplia, es un lenguaje de programación que permite al usuario programar algoritmos y usar herramientas programadas por otras. Si nos limitamos
al análisis estadístico y cuantitativo, podemos afirmar sin temor a exagerar
que no tiene límites, es decir, es capaz de hacer cualquier cosa que el usuario
pueda imaginar. Con R se pueden escribir funciones, hacer cálculos, aplicar
técnicas estadísticas complejas e implementar técnicas ad hoc (la manera más
sencilla de aplicar técnicas complicadas es aprovechar las que ya están disponibles en la red y, en caso necesario, optar por desarrollarlas nosotros mismos),
crear gráficos simples y complejos, e incluso escribir funciones propias. El hecho de que muchos centros de investigación y universidades lo usen hace que
The R Project for
Statistical Computing
En la página web oficial
http://www.r-project.org
encontraremos toda la
información que necesitamos
sobre este programa en
inglés: archivos de
instalación, características,
paquetes disponibles,
manuales, etc. Para encontrar
manuales en castellano,
tenemos que visitar la página
http://cran.es.r-project.org/ e
ir a la sección Contributed.
existan miles de contribuciones disponibles para todos los usuarios. Además,
hay material abundante (libros, manuales, ejemplos, etc.) de alta calidad disponibles gratuitamente. Una ventaja nada despreciable es que, a diferencia
de muchos programas estadísticos, no tiene ningún coste, puesto que es un
proyecto GNU (software libre).
En este contexto, las ventajas principales de R pueden resumirse en la siguiente lista:
• Es un programa distribuido libremente bajo una licencia GNU.
• Hay mucho material de apoyo: manuales, programas de aprendizaje y ejemplos.
• Además, hay librerías que cubren casi todas las metodologías de la estadística y las matemáticas (optimización, series temporales, programación
lineal, ecuaciones diferenciales, inferencia, etc.).
• Permite sistematizar análisis largos y complejos en unas pocas instrucciones sintéticas, por lo que es un programa muy eficiente.
Sin embargo, también podemos mencionar algunos inconvenientes:
• Hay una barrera de entrada o curva de aprendizaje considerable.
• No es el tipo de programa con ventanas y menús, como pueden serlo
Minitab, E-Views o SPSS. Sin embargo, hay extensiones de R, como RCommander, que sí que se basan en el uso de ventanas y menús, y existen
entornos como RStudio que permiten trabajar de manera muy eficiente.
¡Que nadie se asuste! Es normal que,
al principio, introducirse en el mundo
de la programación cueste un poco.
Pero una vez os acostumbréis a este
nuevo entorno y lo dominéis, todo será
mucho más fácil.
FUOC • PID_00273871
10
El entorno estadístico R
R es un lenguaje de programación muy popular en el ámbito de la estadística y
las probabilidades, y no solo se utiliza en universidades o centros de investigación sino que también tiene muchos usos en la empresa privada y el sector público. También presenta ventajas respecto a otros lenguajes de programación
que incorporan funciones estadísticas, precisamente porque está diseñado específicamente y desde su origen para trabajar eficientemente con vectores y
bases de datos, además de contar con una comunidad muy amplia y fiel que
constantemente propone nuevas soluciones y a la que podemos dirigirnos si
necesitamos ayuda en algún problema concreto. En este contexto, sería importante insistir en no “inventar la rueda” cada vez e intentar adaptarnos al
que nos propone R (por ejemplo evitar programar o recurrir a bucles cuando hay funciones propias de R que hacen el cálculo de forma más eficiente).
En lo referente a la documentación, podemos encontrar información general
en https://www.r-project.org/help.html, diferentes manuales en https://cran.
r-project.org/manuals.html, y material traducido, que puede sernos muy útil,
en https://cran.r-project.org/other-docs.html.
Es importante también destacar que hay muchas fuentes de ayuda en internet
y que cuando tengamos una idea básica del funcionamiento de R podemos
fácilmente acudir a recursos o tutoriales en línea o consultar en foros de ayuda donde no solo se habla de la parte de utilización de R sino también de las
técnicas estadísticas que pueden usarse, lo que añade interés al uso de R. Podemos empezar desde https://www.r-project.org/help.html o ir directamente,
como es bastante habitual, a la página de Stack Overflow y las discusiones
específicas sobre R en https://stackoverflow.com/questions/tagged/r.
1.2. Instalación
El primer paso obligado es instalar el programa, por lo que tendremos que
visitar la página web del proyecto:
http://www.r-project.org/
Una vez allí, veremos que hay varias secciones, entre ellas el centro de descargas CRAN. Si accedemos a este centro, tendremos en pantalla una lista de
mirrors (réplicas), es decir, servidores desde donde pueden descargarse los ar-
Los vídeos son útiles
En internet podéis encontrar
multitud de vídeos en inglés
y en castellano sobre cómo
instalar R. Muchos están
disponibles en
www.youtube.com.
chivos. Seleccionaremos el servidor que esté geográficamente más cerca de
nuestra ubicación, y nos aparecerá una página con varias opciones de instalación. La manera más rápida es seleccionar una de las opciones siguientes, que
dependerá de nuestro sistema operativo:
• Download R for Linux
• Download R for MacOS X
• Download R for Windows
Si tenéis un Mac o una distribución del
Linux, deberéis tener en cuenta,
además, la versión del sistema
operativo que tengáis en vuestro
ordenador.
FUOC • PID_00273871
11
El entorno estadístico R
Si suponemos que tenemos un sistema operativo Windows, accedemos a él y
descargamos la distribución base, a la que se accede con la opción install R for
the first time. Seguimos las instrucciones y descargamos el archivo ejecutable,
y luego realizamos la instalación sin más complicaciones.
1.3. Iniciar una sesión
Una vez instalado, ya podemos abrir el programa, desde el acceso directo o
desde el archivo ejecutable incluido en la carpeta de instalación de R. Sea
como fuere, al ejecutar encontraremos la ventana siguiente:
Figura 1. Consola de R
Como podemos ver, las instrucciones pueden introducirse directamente en la
consola, en el cursor que aparece detrás el símbolo >. Una vez introducidas
las instrucciones, si pulsamos Enter se ejecutarán los cálculos, igual que con
una calculadora:
> 2 * 3
[1] 6
No obstante, para hacer un análisis largo, lo más conveniente es escribir el
conjunto de instrucciones con los cálculos que necesitamos en un archivo de
texto, y esto puede hacerse de dos maneras:
• En un script, lo que tiene la ventaja que puede abrirse y guardarse como
un archivo con formato .R, desde la barra de menús del programa. Esta
opción, que se muestra en la figura 2, permite ejecutar cada línea de código
o toda una selección de líneas mediante la instrucción CONTROL + R, y el
resultado aparece de color azul en la consola:
Es importante tener siempre instalada
la última versión de R, puesto que las
nuevas versiones siempre incluyen
mejoras. Además, nos ahorraremos
problemas de compatibilidad con los
últimos paquetes que instalemos.
FUOC • PID_00273871
El entorno estadístico R
12
Figura 2. Consola de R con editor de textos
Figura 2
Fijaos que R se basa en la
asignación de objetos. Aquí
vemos como el resultado de
la operación 2 + 5 lo hemos
asignado a un objeto al que
hemos dado el nombre de a.
gedit
• En un documento de texto aparte, que una vez finalizado se copia y pega
en la consola. El resultado será el mismo que el de la ventana izquierda de
la figura 2, es decir, aparecerán las instrucciones y los resultados. Si elegimos esta opción, cualquier editor de textos servirá, aunque aquí recomendamos el editor gedit, puesto que destaca la sintaxis de las instrucciones.
Más adelante comentaremos como usar RStudio para facilitar nuestro trabajo.
gedit es un editor de textos
compatible con Linux, Mac
OS X y Windows. Está
diseñado como un editor de
textos de propósito general,
y enfatiza la simplicidad y
facilidad de uso. Además,
incluye herramientas para la
edición de código fuente y de
textos estructurados. Puede
descargarse libremente desde
la dirección
projects.gnome.org/gedit
1.4. Gestión de paquetes
El programa R es modular, es decir, se basa en diferente módulos o paquetes
(packages) que los usuarios han elaborado. Estos paquetes son unidades específicas que proporcionan funciones y datos para poner en práctica análisis específicos. Actualmente hay tantos paquetes que sería inviable cargarlos todos
simultáneamente en una sesión por motivos de memoria. La lista completa de
paquetes se encuentra en la página del CRAN, en el apartado Packages. Allí podremos visualizar una lista de los más de 4.000 paquetes disponibles por orden
alfabético con una breve descripción. Es muy útil saber que tenemos a nuestra disposición una lista por categorías: matemáticas, estadística, econometría,
etc. Accediendo a cada paquete obtendremos más información sobre este, y
también diferentes manuales de uso con las funcionalidades que incluyen.
En este sentido, cuando se abre una sesión de las funcionalidades básicas (denominadas base) se cargan automáticamente, y si el usuario está interesado
en una metodología específica tiene que instalar el paquete correspondiente y
cargarlo. Esto lo podemos hacer desde el menú de la consola de que se muestra
en la figura 1, en la opción Paquetes. Esta opción nos permite seleccionar un
paquete de la lista que aparece, instalarlo y/o cargarlo. Otra opción es hacer
esto manualmente utilizando la consola. Si sabemos el nombre del paquete,
para instalarlo introduciremos:
>install.packages("paquete")
Antes de intentar implementar nosotros
mismos un procedimiento numérico o
estadístico complejo, vale la pena
comprobar si alguien ya ha hecho el
trabajo. Por ello, es muy recomendable
visitar el repositorio de paquetes de
(http://cran.r-project.org/), en el que
podemos buscar paquetes por orden
alfabético o por categorías.
FUOC • PID_00273871
13
El entorno estadístico R
Una vez instalado, al inicio de cada sesión en que necesitemos este paquete
será suficiente introducir:
>library(paquete)
Una vez se ha instalado un paquete, ya
queda almacenado en nuestro
ordenador, de forma que no hay que
volverlo a instalar. Solo tendremos que
cargarlo en las sesiones en que lo
necesitemos.
Un análisis muy planificado tiene que incluir al principio una lista de todos
los paquetes que tienen que cargarse para hacer los análisis que queremos.
1.5. ¡Documentación y ayuda!
Para un usuario novel, la interfaz de R, la sintaxis y en general el modo de uso
puede resultar complejo, especialmente en comparación con otros programas
estadísticos. No obstante, dispone de muchos manuales y herramientas de
apoyo al alcance de los usuarios. Para empezar, en la página del CRAN desde
la que hemos descargado el archivo de instalación hay una sección llamada
Manuales. Si accedemos a ella tendremos acceso a los manuales oficiales de R,
el primero de los cuales es An Introduction to R, un manual completísimo muy
bien estructurado que cubre todos los aspectos elementales del programa. Si
queremos manuales en otros idiomas, en el enlace contributed documentation
disponemos de una lista ordenada por idiomas, entre los cuales el castellano.
Además, existe la posibilidad de obtener ayuda específica para cada paquete y
función. Simplemente hay que introducir en la consola la instrucción help,
¡Cuidado con las
mayúsculas!
con el nombre del paquete o la función sobre la que necesitamos ayuda entre los símbolos de paréntesis, y se nos abrirá una ventana con una página
completa de ayuda con descripciones y ejemplos.
Por ejemplo si queremos investigar sobre la función que encuentra la media
sería suficiente con escribir
> help(mean)
con lo que obtenemos una descripción detallada de la función, con referencias
y pequeños ejemplos.
Arithmetic Mean
Description
Generic function for the (trimmed) arithmetic mean.
Usage
mean(x, ...)
## Default S3 method:
mean(x, trim = 0, na.rm = FALSE, ...)
Arguments
Hay que tener en cuenta que
el lenguaje de R distingue
entre mayúsculas y
minúsculas. De este modo, la
instrucción HELP resultaría en
un mensaje de error.
FUOC • PID_00273871
14
X
An R object. Currently there are methods for numeric/logical vectors
and date, date-time and time interval objects. Complex vectors are
allowed for trim = 0, only.
trim
the fraction (0 to 0.5) of observations to be trimmed from each end of~
x~before the mean is computed. Values of trim outside that range
are taken as the nearest endpoint.
na.rm
a logical value indicating whether NA values should be stripped before
the computation proceeds.
...
further arguments passed to or from other methods.
Value
If trim is zero (the default), the arithmetic mean of the values in x
is computed, as a numeric or complex vector of length one. If x is
not logical (coerced to numeric), numeric (including integer) or
complex, NA_real_ is returned, with a warning.
If trim is non-zero, a symmetrically trimmed mean is computed with a
fraction of trim observations deleted from each end before the
mean is computed.
References
Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) The New S
Language. Wadsworth & Brooks/Cole.
See Also
weighted.mean, mean.POSIXct, colMeans for row and column means.
Examples
x <- c(0:10, 50)
xm <- mean(x)
c(xm, mean(x, trim = 0.10))
El entorno estadístico R
FUOC • PID_00273871
El entorno estadístico R
15
2. Sintaxis y programación
.
2.1. Tipos de datos y objetos
R es un lenguaje orientado a objetos o estructuras de datos diferenciados con
características específicas. Los tres tipos básicos de datos son:
1) Datos numéricos: números reales y complejos (–1, 2, 3).
Es importante tener en cuenta que R
interpreta del mismo modo las comillas
simples ‘x’ y las dobles “x”. Por lo
tanto, podemos introducir las cadenas
de texto de cualquiera de las dos
maneras.
2) Caracteres: cadenas de texto representadas entre comillas ("x", "y", "z").
3) Datos lógicos: los que únicamente toman los valores verdadero o falso (TRUE,
FALSE).
Esta orientación a objetos hace indispensable que conozcamos los diferentes
tipos de objetos con que podemos trabajar, ya que cada uno tiene características únicas. No obstante, como veremos en este módulo, nos permite que
transformamos algunos en otros (por ejemplo, convertir vectores en matrices
y viceversa). Las clases principales de objetos están enumeradas y definidas en
la Tabla 1.
Tabla 1. Clases de objetos
Objeto
Data frame
Descripción
Estructuras de datos bidimensionales, en los que se recogen diferentes variables por columnas.
Vector
Colección ordenada de datos con una longitud determinada.
Array
Conjunto de datos indexado con dos o más índices, caracterizado por tener dimensión.
Matrix
Caso particular de array cuando hay dos índices, es decir, dos dimensiones (filas y columnas).
List
Function
Factor
Objeto que recoge diferentes tipos de elementos (componentes), que pueden ser de clases diferentes.
Pieza de código que puede ser un algoritmo, una función matemática o una estructura lógica.
Vector que especifica una clasificación discreta de los elementos de otro vector de la misma longitud.
A continuación profundizaremos en cada una de estas estructuras.
2.2. Vectores
2.2.1. Almacenar datos en vectores
Hay dos maneras de introducir la información en el programa. Si introducimos información mediante expresiones sin asignarlas a ningún objeto, estamos utilizando el programa como una simple calculadora. En cambio, si lo
almacenamos y le damos un nombre estamos guardando el resultado para utilizarlo posteriormente. Estas dos funcionalidades básicas quedan explicadas a
continuación:
FUOC • PID_00273871
El entorno estadístico R
16
1) Expresión. La información se introduce en la consola, R la evalúa y la muestra en pantalla, pero no la almacena en la memoria.
> 4 + 3
[1] 7
2) Asignación. En este caso, la expresión se evalúa pero no se muestra, y se
almacena con el nombre que escribimos antes del símbolo de asignación <-.
Para ver el valor en pantalla, tendremos que introducir el nombre que hemos
dado al vector, que es la estructura de datos más simple1 . La manera más
inmediata de introducir los valores en un vector es con la instrucción c, que
significa concatenar.
Cuestión de memoria
> a <- c(1,2,3,4,5,6)
> a
[1] 1 2 3 4 5 6
Si introducimos una asignación entre paréntesis, además de quedar guardada
en la memoria temporal también se mostrará en pantalla.
Cuando asignamos un
nombre a un objeto, este
queda guardado en la
memoria temporal. Esto es,
podemos recuperar la
información de estos objetos
siempre que no cerremos la
sesión de R.
> (b <- c(3,6,9))
[1] 3 6 9
Una vez tengamos unos cuantos vectores creados, podemos combinarlos de
una manera muy flexible. Veamos un ejemplo:
> a <- c(1,2,3)
El espacio no existe
> b <- c(7,8,9)
> ab <- c(a,4,5,6,b)
En el lenguaje de R los
espacios no se interpretan. Es
decir, las expresiones a <- 6
y a<-6 son análogas, y no
hay ninguna diferencia entre
ellas.
> ab
[1] 1 2 3 4 5 6 7 8 9
2.2.2. Operaciones básicas
En la Tabla 2 se recogen las operaciones aritméticas básicas tomando como
ejemplo los vectores v1 y v2. Estas operaciones están vectorizadas, es decir, se
aplican elemento a elemento.
Hay que señalar que en R las comas
quedan reservadas para la separación
de los diferentes valores o
componentes de un mismo objeto o
bien para los diferentes parámetros de
una función.
Tabla 2. Operaciones aritméticas básicas (I)
v1 <- c(1,2,3)
v2 <- c(2,4,6)
Descripción
1
Resultado
Instrucciones
Concatenación
c(v1,v2)
1,2,3,2,4,6
Suma
v1+v2
3,6,9
Resta
v1-v2
-1,-2,-3
Multiplicación
v1*v2
2,8,18
División
v1/v2
0.5,0.5,0.5
Potencia
v1ˆv2
1,16,729
La función print también muestra el resultado en pantalla.
FUOC • PID_00273871
El entorno estadístico R
17
Cuando se intentan hacer operaciones matemáticas no definidas, como por
ejemplo la raíz de un número negativo, aparecerá el valor NaN, que significa Not a Number. Además, los valores ± Inf. aparecerán cuando el resultado
tienda a ±∞. Veamos más operaciones matemáticas elementales aplicadas elemento a elemento en la Tabla 3, tomando como ejemplo el vector v3:
Tabla 3. Operaciones aritméticas básicas (II)
Tabla 3
v3 <- c(-1,0,1,2)
Descripción
Resultado
Instrucciones
Raíz cuadrada
sqrt(v3)
NaN 0.00 1.00 1.41
Valor absoluto
abs(v3)
1 0 1 2
Exponencial
exp(v3)
0.36 1.00 2.71 7.38
Log. base e
log(v3)
NaN -Inf 0.00 0.69
Log. base 10
log10(v3)
NaN -Inf 0.00 0.30
Factorial (!)
factorial(v3)
NaN 1 1 2
Con R podemos hacer las operaciones estadísticas básicas. En la Tabla 4 se
recogen las más usuales, tomando como ejemplo los vectores v4 y v5.
Tabla 4. Operaciones estadísticas básicas
v4 <- c(-2,3,5,0,0,3)
v5 <- c(20,14,51,76,21,30)
Descripción
Resultado
Instrucciones
Longitud
length(v4)
6
Máximo
max(v4)
5
Mínimo
min(v4)
-2
Suma
sum(v4)
9
Producto
prod(v4)
0
Media
mean(v4)
1.5
Mediana
median(v4)
1.5
Desviación estándar
sd(v4)
2.58
Variancia
var(v4)
6.7
Covariancia
cov(v4,v5)
5.8
Correlación
cor(v4,v5)
0.09
Producto escalar
sum(v4*v5)
347
2.2.3. Secuencias
Una herramienta muy útil es la creación de secuencias, que puede hacerse de
diferentes maneras, entre ellas las funciones seq (sequence), rev (reverse) y rep
(repeat). La Tabla 5 lo ilustra con algunos ejemplos, partiendo del vector v6:
Es fundamental tener en
cuenta que, en R, los
decimales se expresan con un
punto, y no una coma como
se hace en España.
Confusiones en este sentido
pueden provocar errores.
FUOC • PID_00273871
El entorno estadístico R
18
Tabla 5. Secuencias y repeticiones
v6 <- c(1,2,3)
Resultado
Instrucciones
rep(v6,2)
1 2 3 1 2 3
rep(v6,each=2)
1 1 2 2 3 3
rep(v6,each=2,times=2)
1 1 2 2 3 3 1 1 2 2 3 3
rep(v6,c(2,3,4))
1 1 2 2 2 3 3 3 3
1:10
1 2 3 4 5 6 7 8 9 10
seq(1,10)
1 2 3 4 5 6 7 8 9 10
10:1
10 9 8 7 6 5 4 3 2 1
seq(10,1)
10 9 8 7 6 5 4 3 2 1
seq(4,length=8)
4 5 6 7 8 9 10 11
seq(0,40,by=5)
0 5 10 15 20 25 30 35 40
seq(0,1,length=4)
0.00 0.33 0.66 1.00
seq(from=2,to=8,by=3)
2 5 8
rev(1:5)
5 4 3 2 1
2*1:4
2 4 6 8
Tabla 5
El dominio de estas
instrucciones nos ahorrará
muchas líneas de
programación, y nos
permitirá programar
procedimientos numéricos
complejos de una manera
simple, compacta y elegante.
2.2.4. Operadores lógicos
R también nos permite operar con vectores lógicos que pueden tomar los valores TRUE (verdadero) y FALSE (falso). Los operadores principales se muestran
en la Tabla 6:
Tabla 6. Operadores lógicos
Operador
Descripción
Más pequeño
<
Más grande
>
Igual
==
No igual
!=
Más pequeño o igual
<=
Más grande o igual
>=
Intersección
a & b
Unión
a|b
Negación
!a
Tabla 6
Podemos interpretar el
operador lógico intersección
como a y b, mientras que la
unión sería interpretable
como a o b.
FUOC • PID_00273871
El entorno estadístico R
19
Veamos algunos ejemplos del uso de estos operadores:
.
Los símbolos = y ==
> a <- c(-2,-1,0,1,2)
Cuando usamos el operador
lógico igualdad, es
importante tener en mente
que se expresa con un doble
símbolo de igualdad (==),
diferente del símbolo de
igualdad simple utilizado en
asignaciones.
> a > 2
[1] FALSE FALSE FALSE FALSE FALSE
> a <= -1
[1] TRUE TRUE FALSE FALSE FALSE
> a > 0 & abs(a) == 2
[1] FALSE FALSE FALSE FALSE TRUE
> a > 0 | abs(a) == 2
[1] TRUE FALSE FALSE TRUE TRUE
2.2.5. Indexación
Para acceder a los elementos de un vector existe la posibilidad de indexar,
es decir, acceder a los valores de un vector especificándolo en una expresión
entre corchetes []. Esto lo hacemos indicando la posición de los elementos
o bien usando operadores lógicos. Un ejemplo considerando el vector v7 se
recoge en la Tabla 7:
Tabla 7. Indexación de vectores
v7 <- c(-3,-2,-1,0,1,2,3) o de manera más compacta v7 <- c(-3:3)
Expresión
Descripción
Resultado
v7[1]
-3
Primer elemento
v7[2:4]
-2 -1 0
Del segundo al cuarto elemento
v7[-(2:length(v7))]
-3
Todos menos aquel des del segundo hasta el último elemento
v7[c(2,4,6)]
-2 0 2
Elementos segundo, cuarto y sexto
v7[v7>0]
1 2 3
Elementos más grandes que 0
v7[v7!=0]
-3 -2 -1 1 2 3
Elementos diferentes de 0
v7[abs(v7)==3]
-3 3
Elementos con valor absoluto 3
v7[v7>0 & v7!=2]
1 3
Elementos positivos y que no sean 2
v7[v7<0 | v7==3]
-3 -2 -1 3
Elementos negativos o que sean 3
Además, la función which nos permite extraer la posición ordinal de los elementos descritos en la condición que se ha introducido. En el ejemplo siguiente, en el primer caso los elementos vector iguales a cero son el primero,
el tercero y el sexto. En el segundo caso, el único elemento mayor que cero
(a>0) y menor o igual que dos (a<=2) es el cuarto.
> a <- c(0,3,0,1,3,0)
> which(a==0)
[1] 1 3 6
> which(a>0 & a<=2)
[1] 4
FUOC • PID_00273871
20
El entorno estadístico R
Del mismo modo, las funciones which.min y which.max nos dan la posición
de los valores mínimos y máximos del vector, respectivamente.
2.3. Matrices
2.3.1. Los objetos array y matrix
A menudo tendremos la necesidad de almacenar los datos en estructuras más
complejas que simples vectores. Esto es, podemos necesitar tener una estructura de filas y columnas, y poder hacer operaciones matriciales. En R, hay dos
estructuras (tipos de objetos) que satisfacen esta necesidad:
1) Variable indexada (array). Estructura que organiza los datos en k dimensiones, y es muy útil para tratar con datos con varias clasificaciones simultáneas. Por ejemplo, la variable vijt puede representar las ventas de una
empresa en qué i es el sector, j la provincia y t el año, y se almacenaría en una
estructura array con dimensión k = 3.
2) Matriz (matrix). Se trata de un caso particular de array cuando hay dos
dimensiones (k = 2), siendo la primera dimensión las filas y la segunda dimensión, las columnas.
En muchos casos no hay diferencia entre los dos tipos de estructuras. No
obstante, algunas operaciones como la transposición y algunos tipos de operaciones algebraicas están reservadas solo a las matrices. Por simplicidad, a
continuación nos centraremos en la creación y manipulación de estructuras
bidimensionales (matrices). La manera más inmediata de crear una matriz es
asignando una dimensión a un vector, puesto que, como hemos visto, los
vectores tienen longitud y no dimensión:
> a <- 1:8
> a
[1] 1 2 3 4 5 6 7 8
> length(a)
[1] 8
> dim(a)
NULL
2.3.2. Creación de matrices
Supongamos que queremos convertir el vector a en una matriz de dimensión
4 × 2, es decir, una estructura con 4 filas y 2 columnas. En este caso, podemos
asignar una dimensión:
> dim(a)<-c(4,2)
El resultado NULL
Siempre que un objeto esté
vacío aparecerá el resultado
NULL. En este caso, al ser a
un vector y no una matriz, su
dimensión no existirá.
FUOC • PID_00273871
21
El entorno estadístico R
> a
[,1] [,2]
[1,]
1
5
[2,]
2
6
[3,]
3
7
[4,]
4
8
> dim(a)
[1] 4 2
Es importante destacar que, por defecto, R siempre empieza a colocar los valores de arriba abajo y de izquierda a derecha, como puede observarse en el
ejemplo anterior.
Una manera más directa de crear matrices es con la función matrix. Esta función tiene tres argumentos: el conjunto de valores que compondrán la matriz,
el número de filas y el número de columnas:
> matrix(1:8,2,4)
[,1] [,2] [,3] [,4]
[1,]
1
3
5
7
[2,]
2
4
6
8
En caso de necesitar una estructura de datos con más de dos dimensiones,
habrá que usar la función array. La diferencia principal respecto a la función
matrix es que el número de dimensiones se introduce mediante un vector. A
modo de ejemplo, crearemos una estructura 2 × 2 × 2:
> array(1:4,c(2,2,2))
El reciclaje es importante
, , 1
[,1] [,2]
[1,]
1
3
[2,]
2
4
, , 2
[,1] [,2]
[1,]
1
3
[2,]
2
4
Una característica interesante de la construcción de matrices es el reciclaje,
que consiste en que si el número total de elementos de la matriz (filas por
columnas) es superior al número de valores iniciales, estos se repiten hasta
completar la matriz. En el ejemplo anterior, hemos querido transformar un
vector con 4 elementos en una estructura con 2 × 2 × 2 = 8 elementos, esto es,
el doble. Por eso, R ha tenido que repetir los elementos del vector inicial dos
veces para completar la estructura final. Veamos otro ejemplo de reciclaje:
Fijaos que, cuando se acaban
de colocar todos los
elementos del vector 1:4 en
la estructura resultante y esta
todavía no está completa, se
vuelve a empezar hasta que
la estructura está completa.
Esta funcionalidad se
denomina reciclaje.
FUOC • PID_00273871
22
El entorno estadístico R
> matrix(1:3,3,3)
[,1] [,2] [,3]
[1,]
1
1
1
[2,]
2
2
2
[3,]
3
3
3
Además, hay la opción de que la matriz se construya invirtiendo el orden, es
decir, de izquierda a derecha y de arriba abajo. Se consigue añadiendo una
opción al final de la función:
> matrix(1:8,2,4,byrow=TRUE)
[,1] [,2] [,3] [,4]
[1,]
1
2
3
4
[2,]
5
6
7
8
También es posible especificar únicamente el número de filas y/o columnas de
la matriz que tiene que construirse:
> matrix(1:6,nrow=2)
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
> matrix(1:4,ncol=2)
[,1] [,2]
[1,]
1
3
[2,]
2
4
Es muy fácil combinar escalares, vectores y matrices. La función rbind une
varias estructuras por filas, mientras que cbind hace lo mismo por columnas.
Veamos cómo se hace:
> a<-matrix(0,2,2)
> a
[,1] [,2]
[1,]
0
0
[2,]
0
0
> b<-matrix(1,1,2)
> b
[,1] [,2]
[1,]
1
1
> rbind(a,b)
[,1] [,2]
[1,]
0
0
[2,]
0
0
[3,]
1
1
¿Por filas o columnas?
Utilizando la función byrow
invertimos el orden de
construcción de matrices,
empezando por las filas en
vez de las columnas, que es la
opción por defecto.
FUOC • PID_00273871
23
El entorno estadístico R
Como hemos visto, estas dos funciones nos ofrecen muchas posibilidades:
> cbind(1,1:4)
[,1] [,2]
[1,]
1
1
[2,]
1
2
[3,]
1
3
[4,]
1
4
La matriz identidad se crea con la función diag, especificando el número de
Otro ejemplo de reciclaje
En este caso, vemos que unir
un escalar y un vector hace
que el valor del escalar se
repita tantas veces como la
longitud del vector. Esto hace
que la estructura resultante
tenga dos columnas y tantas
filas como elementos
vectores.
filas y columnas:
> diag(2)
[,1] [,2]
[1,]
1
0
[2,]
0
1
Además, la función diag también puede usarse para acceder a los elementos
de la diagonal principal de una matriz:
> a<-matrix(5*1:4,2,2)
> a
[,1] [,2]
[1,]
5
15
[2,]
10
20
> diag(a)
[1]
5 20
2.3.3. Submatrices e indexación
De manera análoga al caso de los vectores, también es posible acceder a subconjuntos de matrices mediante corchetes []. Estos se usan con tres propósitos:
1) Tener acceso a filas y columnas específicas.
2) Crear submatrices.
3) Modificar directamente partes de una matriz.
Esto nos ofrece una gran potencialidad para realizar todo tipo de operaciones
con matrices, y hacer que estas sean fácilmente replicables, modificables y
combinables. A partir de la matriz a, la Tabla 8 muestra ejemplos de creación
de submatrices.
> a <- matrix(1:9*3,3,3)
La matriz identidad
Recordad que la matriz
identidad siempre es
cuadrada, es decir, tiene el
mismo número de filas y de
columnas.
FUOC • PID_00273871
24
El entorno estadístico R
> a
[,1] [,2] [,3]
[1,]
3
12
21
[2,]
6
15
24
[3,]
9
18
27
Tabla 8. Indexación de matrices
Expresión
Descripción
Resultado
a[,3]
21 24 27
Todas las filas, 3a columna
a[2,]
6 15 24
2a fila, todas las columnas
a[-1,-3]
6 15
Todas las filas menos la 1a y todas las
9 18
columnas menos la 3a .
6 9
De la 2a a la 3a fila, primera columna
a[2:3,1]
Es interesante comprobar que las submatrices creadas, en caso de tener una
sola fila o columna, se degradan a vectores, por lo que pierden la dimensión2 .
Para que estas submatrices sigan teniendo dimensión, tenemos que especificarlo desactivando la opción drop:
> a
[,1] [,2] [,3]
[1,]
1
3
5
[2,]
2
4
6
> b <- a[,1,drop=FALSE]
> b
[,1]
[1,]
1
[2,]
2
> dim(b)
[1] 2 1
Veamos ahora como se haría para introducir elementos nuevos en una matriz. Supongamos, por ejemplo, que queremos sustituir la primera columna de
valores por una columna de ceros:
> a<-matrix(1:8,2,4)
Modificando una matriz
> a[,1]<-0
> a
[,1] [,2] [,3] [,4]
[1,]
0
3
5
7
[2,]
0
4
6
8
2
En inglés, este hecho se denomina deprecation.
En este caso, hemos utilizado
a[,1]<-0 para transformar
la primera columna,
inicialmente compuesta por
los elementos 1 y 2, en una
columna con dos ceros.
FUOC • PID_00273871
25
El entorno estadístico R
2.3.4. Operaciones matriciales básicas
R ofrece muchas posibilidades para aplicar operaciones y funciones a vecto-
res y matrices3 . En la Tabla 9 se incluyen las funciones básicas aplicables en
matrices:
Tabla 9. Funciones con matrices
Descripción
Función
Dimensiones
dim
Traspuesta
t
Determinante
det
Inversa
solve
Valores y vectores propios
eigen
Valores singulares
svd
Factorización de Choleski
chol
Factorización QR
qr
Rango
rank
Número de filas
nrow
Número de columnas
ncol
Suma de las filas
rowSums
Suma de las columnas
colSums
Media de las filas
rowMeans
Media de las columnas
colMeans
Para finalizar el apartado dedicado a matrices, vale la pena mencionar que hay
algunas funciones que permiten, por un lado, identificar objetos y, por el otro,
transformarlos en objetos de otras clases. Este primer ejemplo es ilustrativo:
> a <- c(1,3,6)
> is.matrix(a)
[1] FALSE
> is.vector(a)
[1] TRUE
> class(a)
[1] "numeric"
La familia de funciones is. responde a la pregunta de si se trata de un objeto
determinado por un valor lógico, mientras que la función class devuelve la
clase del objeto. Finalmente, la familia de funciones as. se usa para transformar un tipo de objeto en otro. El ejemplo siguiente lo muestra:
> (A <- matrix(1,2,2))
[,1] [,2]
[1,]
1
1
[2,]
1
1
> (a <- as.vector(A))
[1] 1 1 1 1
3
El módulo 2 de este manual incluye un apartado de álgebra vectorial y matricial dedicado a
operaciones algebraicas específicas.
Convertir matrices en
vectores
En este caso, hemos
conseguido transformar la
matriz A en el vector a.
FUOC • PID_00273871
26
2.4. Funciones
Una herramienta muy útil y poderosa es el comando function, que también
es una clase de objeto. Podemos crear desde simples funciones matemáticas
a algoritmos complejos con los que podemos hacer multitud de cálculos de
una manera estructurada y sintética. La forma de función más sencilla tiene
la estructura siguiente:
.
nombre <- function (argumentos) expresión
Como ejemplo, supongamos que queremos estudiar la función matemática
y = x3 y evaluarla en el vector de valores iniciales x0 = (–4, – 3, . . . ,3,4). Los
haremos creando nuestra propia función cubic y evaluándola en el vector de
valores iniciales x0:
> cubic <- function(x) x^3
> x0 <- (-4:4)
> cubic(x0)
[1] -64 -27
-8
-1
0
1
8
27
64
Un ejemplo de una función con más de un argumento es el de la fórmula
financiera del interés simple Cf = Ci (1 + rt). Según esta fórmula, el capital final
(Cf ) que tiene que devolverse en una operación financiera con un importe
inicial Ci depende de la duración de la operación en años (t) y del tipo de
interés en tanto por un (r). ¿Qué importe final resulta de una operación a
nueve meses (t = 0.75) con un tipo nominal del 5 % (r = 0.05) y un capital
inicial Ci = 1000?
> op.fin <- function(Ci,r,t) Ci*(1+r*t)
> op.fin(1000,0.05,0.75)
[1] 1037.5
Para funciones más complejas a menudo es necesaria más de una línea para
introducir las fórmulas. En este caso, suponiendo que necesitemos n líneas, la
estructura será la siguiente:
.
nombre <- function(argumentos){
expresión 1
...
expresión n
return(resultado)
}
El entorno estadístico R
FUOC • PID_00273871
27
El entorno estadístico R
Con el objeto de ilustrar este tipo de estructura crearemos una función para
calcular la covarianza muestral. Esto es algo innecesario; podríamos usar la
función cov que nos proporciona R. De todos modos, lo hacemos para que
sirva de ejemplo de funciones más elaboradas:
N
Cov(X,Y) =
1 X
(xi – x̄) (yi – ȳ)
N–1
i=1
> mi.covar <- function(x,y){
+
N <- length(x)
+
demean.x <- x-mean(x)
+
demean.y <- y-mean(y)
+
sumat <- sum(demean.x*demean.y)
return(sumat/(N-1))
+
Funciones multiusos
+ }
Crear funciones propias nos
será muy útil para llevar a
cabo un conjunto de cálculos
que tengamos que usar más
de una vez, de manera
estructurada y ordenada.
2.5. Ciclos y condicionales
R ofrece una serie de herramientas para hacer asignaciones múltiples y con-
dicionales. ifelse permite hacer operaciones elemento por elemento a un
vector sujeto a una condición. Supongamos que queremos aplicar la siguiente
transformación a un vector:


 log(x)
f (x) =


0
si
x>0
si
x≤0
> a <- c(-1,0,2,5)
> ifelse(a>0,log(a),0)
Ciclos y condicionales
[1] 0.0000000 0.0000000 0.6931472 1.6094379
Uno de los componentes fundamentales de cualquier lenguaje de programación es el uso de estructuras iterativas, es decir, de funciones que repiten una
o más expresiones en un ciclo. El comando principal que realiza esta función
es for. La estructura general de esta función es, para un ciclo de n iteraciones:
.
for (i in 1:n){
expresión(ns)
...
}
Un ejercicio sencillo para ilustrar un ciclo es la suma acumulativa. Partiendo
de un vector ~v = (v1 , · · · ,vn ), crearemos un vector ~s = (s1 , · · · ,sn ) en el que
Pj
sj = i=1 vi . Antes de implementar el ciclo crearemos un vector s vacío que
iremos completando iterativamente:
Para usar eficientemente
ciclos y condicionales es
fundamental dominar los
operadores lógicos,
explicados en este módulo.
FUOC • PID_00273871
28
El entorno estadístico R
> v <- 1:10
> n <- length(v)
> s <- rep(0,n)
> for (i in 1:n){
+
p <- v[1:i]
+
s[i] <- sum(p)
Ciclos iterativos
+ }
Utilizaremos los ciclos cuando
queramos trabajar con bucles
o realizar cálculos iterativos.
> print(s)
[1]
1
3
6 10 15 21 28 36 45 55
Obviamente, en un análisis real no usaremos este cálculo iterativo, puesto
que la función implementada cumsum ya nos ofrece esta funcionalidad de
una manera más eficiente.
2.6. La familia apply
En la práctica, es importante no hacer un uso excesivo de los ciclos iterativos,
puesto que no son eficientes en cuanto al uso de la memoria y pueden retardar
el tiempo de análisis que se requiera. Por eso, la norma es que se crearán
estructuras iterativas siempre que no haya alternativas, y el grupo de funciones
apply es una de ellas.
Para ilustrar este concepto, supongamos que tenemos una matriz A en la que
las filas corresponden a observaciones y las columnas son las variables X, Y y
Z:






A=




x1
y1
x2
..
.
y2
..
.
xn
yn

z1 


z2 


.. 
. 


zn
La función apply nos permite aplicar cualquier operación a las filas y a las
columnas,
independientemente. Supongamos que queremos aplicar la operaq
2
ción xi + yi2 + z2i a cada observación (es decir, a cada fila). El primer paso será
definir esta operación (que denominaremos hipot), y el segundo aplicarla a
las filas de la matriz A:
> hipot <- function(x) sqrt(sum(x*x))
> apply(A,1,hipot)
Si quisiéramos un vector con la media aritmética de cada columna, es decir
(x̄,ȳ,z̄), tendríamos que introducir:
> apply(A,2,mean)
La función apply
La instrucción
apply(A,1,hipot) se lee
como aplica a la dimensión 1
(filas) de la matriz A la
operación hipot. El
resultado será un vector con
n elementos.
FUOC • PID_00273871
29
El entorno estadístico R
Para explicar la funcionalidad de la función de la misma familia tapply, es
necesario introducir los factores, que son una clase de objeto que establece
una clasificación discreta de una o más variables. Supongamos que queremos
estudiar la estatura de los alumnos de una escuela, para lo que disponemos
de dos vectores: uno con la estatura de cada estudiante y otro con el género
(masculino m y femenino f ):
> altura <- c(131,125,126,140,152,119)
> genero <- c('m','m','f','m','f','f')
En este caso es conveniente convertir el vector genero en un factor con dos
categorías: masculina y femenina. Para ello, usamos la función factor para
obtener un vector de factores con las categorías f = 1 y m = 2, que llamaremos
f.genero. Veamos que son objetos de diferente clase:
Introducción de
caracteres
Al introducir un vector de
caracteres, como género, los
valores del vector tienen que
ir entre comillas, para lo que
son válidos los símbolos " y '
indistintamente.
> f.genero <- factor(genero)
> class(genero)
[1] "character"
> class(f.genero)
[1] "factor"
La instrucción levels devuelve las categorías que el vector incluye:
> levels(f.genero)
[1] 'f' 'm'
> cbind(f.genero,altura)
f.genero altura
[1,]
2
131
[2,]
2
125
[3,]
1
126
[4,]
2
140
[5,]
1
152
[6,]
1
119
Un análisis estadístico de la variable altura tendrá que diferenciar entre f y m,
para lo que se usa la función tapply. Calcularemos la media aritmética y la
desviación estándar de la altura diferenciando por género:
> tapply(altura,f.genero,mean)
f
m
132.3333 132.0000
> tapply(altura,f.genero,sd)
f
m
17.387735
7.549834
La función tapply
Utilizaremos la función
tapply cuando queramos
aplicar un cálculo a una
variable diferenciando por
grupos o segmentos, esto es,
según las categorías de un
factor.
FUOC • PID_00273871
30
El entorno estadístico R
2.7. Bases de datos
Una base de datos (data frame) es similar a una matriz, puesto que es una estructura bidimensional en la que las filas son las observaciones y las columnas
son las variables, cada una con un nombre específico. Es muy recomendable
tener las variables almacenadas en este formato por varios motivos:
• Es muy fácil extraer subgrupos (subsets) de las variables utilizando operadores lógicos.
• Muchas funciones estadísticas, como los estimadores econométricos, solo
admiten datos en este formato.
• Es posible extraer variables de la base de datos mediante la función attach.
Hay diferentes maneras de crear una base de datos. La primera es importando
datos externos de un archivo de texto limpio4 . La segunda es agrupando vectores existentes, como mostramos en el siguiente ejemplo (continuación del
anterior):
> g <- c('m','m','f','m','f','f')
# Género
> v1 <- c(131,125,126,140,152,119)
# Altura
> v2 <- c(48,53,45,40,49,50)
# Peso
>
> datos <- data.frame(genero=g,altura=v1,peso=v2)
> datos
genero altura
peso
1
m
131
48
2
m
125
53
3
f
126
45
4
m
140
40
5
f
152
49
6
f
119
50
Incorporar comentarios
mediante el símbolo #
Muy a menudo nos interesará
introducir aclaraciones y
comentarios en nuestras
líneas de código para
comprenderlo mejor. Para
que R no los interprete y dé
un error, los introduciremos
después del símbolo #.
Como vemos, en la primera columna se identifica cada elemento de la muestra, mientras que cada columna está encabezada por el nombre de la variable.
Es importante destacar que, alternativamente, la función data.frame también admite una matriz.
Supongamos que queremos hacer un análisis solo de los chicos (m) que pesan
menos de 50 kilos. Para ello, es muy práctico crear otra base de datos que sea
un subgrupo de la base de datos original. Denominaremos a este subgrupo
datos2, y como vemos solo incluye dos observaciones, las que satisfacen las
condiciones establecidas:
> datos2<-subset(datos,genero=="m" & peso<50)
> datos2
genero altura
4
peso
Más adelante se explica este procedimiento con detalle.
La función subset
La función subset nos
permite crear una nueva base
de datos que contenga una
selección condicional de
observaciones de la base de
datos original.
FUOC • PID_00273871
El entorno estadístico R
31
1
m
131
48
4
m
140
40
Si queremos operar con las variables incluidas en una base de datos, tenemos
que referenciarlas con el símbolo $, ya que las variables no están en el espacio
de trabajo individualmente, solo como elementos de una base de datos. Por
ejemplo, si necesitamos la correlación entre la altura y el peso, tenemos que
introducir la instrucción siguiente:
> cor(datos$altura,datos$peso)
[1] -0.3202351
Esto puede llegar a ser bastante pesado. Por eso, si la intención es hacer operaciones con las variables de la base de datos, es recomendable verterlas previamente en el espacio de trabajo mediante la función attach, con lo que ya
podremos hacer referencia a las variables individualmente:
> attach(datos)
> cor(altura,peso)
La función attach
Esta función es aplicable
cuando queremos realizar
operaciones y cálculos
individuales con las variables
incluidas en una base de
datos.
[1] -0.3202351
2.8. Listas
Las listas (lists) son comparables a un cajón de sastre, puesto que permiten
almacenar objetos de clases diferentes en una misma estructura. Esto es muy
útil cuando un mismo análisis tiene como resultado diferentes objetos dispares, por ejemplo vectores o matrices de longitudes o dimensiones diferentes.
Supongamos que queremos almacenar en una estructura la matriz A, su descripción, su inversa y el determinante:
> descr <- c("Matriz A")
> A <- matrix(c(3,5,6,1),2,2)
> inv <- solve(A)
> deter <- det(A)
La forma de almacenarlo es mediante la función list. Para acceder a los diferentes elementos de una lista por su nombre, usaremos el símbolo $ de la
siguiente manera:
> MatA <- list(descripcion=descr,
+
matriz=A,
+
inversa=inv,
+
deter=deter)
> MatA$descripcion
Las listas
Esta clase de objeto nos
permitirá agrupar en una
única estructura elementos
que son, a la vez, objetos de
clases diferentes.
FUOC • PID_00273871
32
El entorno estadístico R
[1] "Matriz A"
> MatA$matriz
[,1] [,2]
[1,]
3
6
[2,]
5
1
Los símbolos > y + en la
consola
> MatA$inversa
[,1]
[,2]
[1,] -0.03703704
0.2222222
[2,]
0.18518519 -0.1111111
> MatA$deter
[1] -27
También se puede acceder a los elementos de una lista no por el nombre, sino
ordinalmente. Para ello, usaremos el símbolo [[]]. Veamos una comparación
Como hemos visto, en la
consola tenemos que
introducir cada línea de
código después del símbolo
>. No obstante, algunas
instrucciones de código son
tan largas que ocupan más
de una línea, como en el caso
de la lista MatA. En este caso,
en la línea siguiente, R nos
mostrará el símbolo + para
recordarnos que la
instrucción de la línea previa
está incompleta.
de las dos maneras de acceder a los elementos de la lista:
> MatA$matriz
[,1] [,2]
[1,]
3
6
[2,]
5
1
> MatA[[4]]
[1] -27
2.9. Lectura y escritura de ficheros csv
Muchas veces encontraremos datos almacenados en ficheros de texto y necesitaremos importarlos a R para poder tratarlos estadísticamente. De los muchos
formatos existentes comentaremos uno muy utilizado en varios repositorios
de datos y presente también como opción en muchas hojas de cálculo; se trata
del formato csv (Comma Separated Values) y comentaremos la función read.csv.
El contenido de un fichero csv (que es un fichero de texto) es como el siguiente
(en un sencillo ejemplo):
.
Nom: Nombre de la persona
Ciu: Ciudad de nacimiento
Alt: Altura en metros
Nom;Ciu;Alt
David;Palma;1,75
María;Cáceres;1,77
Diferentes maneras de
acceder a los elementos
de una lista
Fijaos que, en este ejemplo,
las instrucciones
MatA$matriu y MatA[[2]]
darían el mismo resultado.
FUOC • PID_00273871
33
Como podemos observar puede haber algunas filas con la descripción del contenido de las variables (en este caso las tres primeras filas), después tenemos
una fila con los nombres de las variables (Nom;Ciu;Alt: es el llamado header) y
después propiamente los datos, que en este caso usan el punto y coma (“;”) como separador de las variables y la coma (“,”) como separador decimal. Además
hay que tener en cuenta la codificación del fichero para que lea correctamente los acentos y los caracteres especiales (en este caso supondremos que está
escrito en UTF-8). Supondremos que el nombre del fichero es NCA.csv.
Las instrucciones que usaremos para leer el fichero serán setwd (Set working
directory) para indicar el directorio de trabajo (hay que escribir la ruta entera
entre comillas) y read.table de esta forma (o bien escribiendo directamente el
fichero con toda la ruta entera) por lo que la información del fichero se copia
al data.frame de nombre test:
> setwd("Directorio")
> test<-read.table("NCA.csv", header=TRUE,
+
sep=";", dec=",", skip=3,
+
fileEncoding = "UTF-8")
Observad que “skip” indica que las tres primeras filas son información y no
datos, y cómo indicamos el separador decimal y el separador de variables.
Os recomendamos leer atentamente la documentación de la función para ver
todas las opciones.
Más adelante explicaremos cómo importar datos con RStudio.
2.9.1. Inspección de los datos leídos
Una vez leídos nuestros datos del fichero (y almacenados en test) es recomendable realizar una primera inspección de las variables, su tipo y su contenido;
pueden ayudarnos las siguientes instrucciones:
• str(test) muestra la estructura de la tabla leída (nombres de las variables y
tipos).
• names(test) muestra las variables.
• levels(factor1) muestra los niveles de una variable categórica (de nombre
factor1).
• head(test,n=5) muestra las 5 primeras filas del data.frame de nombre test o
de una variable cualquiera.
• tail(test,n=5) muestra las 5 últimas filas del data.frame.
En el caso del fichero NCA.csv tenemos:
> str(test)
'data.frame': 2 obs. of
3 variables:
$ Nom: Factor w/ 2 levels "David","María": 1 2
El entorno estadístico R
FUOC • PID_00273871
34
$ Ciu: Factor w/ 2 levels "Cáceres","Palma": 2 1
$ Alt: num
1.75 1.77
> names(test)
[1] "Nom" "Ciu" "Alt"
> levels(test$Ciu)
[1] "Cáceres" "Palma"
> head(test)
Nom
1 David
Ciu
Alt
Palma 1.75
2 María Cáceres 1.77
Si efectuamos alguna modificación en nuestra base de datos podemos guardar
el resultado en un fichero para aprovechar el trabajo más adelante; para hacerlo simplemente hay que usar por ejemplo la función write.csv, indicando el
data.frame que queremos exportar y el fichero de destino.
> write.csv(test,"NCA2.csv", row.names = FALSE)
2.10. Fusión de bases de datos
A veces necesitaremos manipular datos recogidos en diferentes ficheros. Veremos un caso muy sencillo a continuación: imaginemos por ejemplo que
tenemos otro fichero NS.csv que contiene el nombre y el sueldo de las personas involucradas; para poder tener en un solo data.frame toda la información
lo que haremos será leer el segundo fichero y después usaremos la función
merge para integrar las dos bases de datos según el campo clave común, que
en este caso será “Nombre”. Procederemos así:
Primero leemos el fichero y guardamos el resultado en test2:
> test2<-read.table("NS.csv", header=TRUE,
+
sep=";", dec=",", skip=2,
+
fileEncoding = "UTF-8")
Mostramos el contenido de test2:
> test2
Nom
Sueldo
1 María
2500
2 David
2400
El entorno estadístico R
FUOC • PID_00273871
35
Ahora combinamos las dos bases de datos con merge y obtenemos el siguiente
resultado:
> merge(test,test2,by="Nom")
Nom
Ciu
Alt
Sueldo
1 David
Palma
1.75
2400
2 María
Cáceres
1.77
2500
El entorno estadístico R
FUOC • PID_00273871
El entorno estadístico R
36
3. Rstudio y R Markdown
.
3.1. Introducción
Como ya se ha comentado, R es un lenguaje muy adecuado para trabajar temas estadísticos y de probabilidad, pero, además de hacer los cálculos, es muy
importante trabajar en un entorno amigable y poder también realizar una
presentación adecuada y eficiente de los resultados y es en este momento en
el que el popular IDE (Integrated Development Environment) llamado RStudio
puede ayudarnos de una manera muy sencilla y cómoda. Sin entrar en detalles técnicos, RStudio es un entorno integrado que permite (además de otras
muchas opciones) tener en un solo documento las instrucciones de R, los resultados que proporciona R (incluyendo los gráficos), nuestros comentarios y
exportarlo todo en forma de documento Word o PDF. Para que os hagáis una
idea podéis mirar las siguientes imágenes donde se ve el aspecto del código
introducido en RStudio y el resultado obtenido (en este caso exportado a PDF
usando la opción de fichero R Markdown):
Figura 3. Código en RStudio
Título de sección
Primer ejemplo
Introducimos un vector y calculamos su media:
Después podemos usar el valor de las variables dentro del texto, por ejemplo podemos decir que la media del vector
es
y la del vector
es
También podemos poner fórmulas usando la sintaxis de
como por ejemplo
o bien
FUOC • PID_00273871
El entorno estadístico R
37
Figura 4. Resultado en pdf
´
Titulo
de seccion
´
Primer ejemplo
Introducimos un vector y calculamos su media:
´ podemos usar el valor de las variables dentro del texto, por ejemplo podemos decir que la media del
Despues
vector 1, 2, 3 es 2 y la del vector 2, 4, 6 es 4.
´
´ podemos poner formulas
Tambien
usando la sintaxis de
como por ejemplo
o bien
Observad que RStudio, a partir de un fichero R Markdown, ejecuta los comandos de R, los reproduce (opcionalmente) en el documento final e inserta en el
documento los resultados de los comandos, todo con opciones relativamente sencillas para controlar el formato del documento, sin tener que recorrer
cada vez a copiar-pegar o a capturar pantallas. Es evidente que cada vez que
“compilamos – knit” el fichero R Markdown dentro de Rstudio, los resultados
se actualizan y vuelve a generarse el fichero actualizado.
A continuación comentaremos la instalación de RStudio y el uso básico de
ficheros R Markdown.
3.2. Instalación
Se descarga desde la página https://rstudio.com/products/rstudio/ (la versión
Open Source) según vuestro sistema operativo y se siguen las instrucciones de
instalación. Lo mejor es hacerlo después de tener R instalado porque, evidentemente, trabajan conjuntamente.
FUOC • PID_00273871
38
3.3. Primeros pasos
Cuando entremos a RStudio encontraremos una pantalla dividida en cuatro
secciones:
Figura 5.
1) En la parte superior izquierda encontramos el editor en el que podremos
trabajar con diferentes tipos de fichero y lenguajes de programación (no solo
R o R Markdown, también C++, Python...)
2) En la parte superior derecha encontramos diferentes pestañas, entre las
que destacamos la de Environment, donde se visualizarán las variables y los
data.sets que estamos utilizando (además de las opciones de importar ficheros
–csv y Excel también– y grabar el entorno).
3) La parte inferior izquierda tiene, entre otros, la Console del programa que
usamos, en este caso R, para ejecutar comandos directamente y la pestaña
correspondiente al tipo de fichero que tengamos abierto, en el supuesto de
que nos ocupa R Markdown.
4) La parte inferior izquierda contiene un visualizador para los gráficos, para
la ayuda...
Hay que destacar en la parte superior derecha las opciones de importación de
ficheros tanto Excel como de tipo texto:
El entorno estadístico R
FUOC • PID_00273871
39
Figura 6.
En particular, dentro de la opción From Text (readr)... encontramos un desplegable que permite, una vez dado el nombre del fichero, especificar las opciones
de lectura explicadas anteriormente (con un poco de práctica y con ficheros
sencillos vale la pena aprender los correspondientes comandos):
Figura 7.
Además en la barra de menús propia del programa encontramos las opciones
habituales para editar código y, además, dentro de Tools tendremos todo lo
relativo a la gestión de los paquetes (o packages).
3.4. R Markdown: primeros pasos
Como ya se ha comentado, R Markdown proporciona una manera relativamente sencilla de integrar los comandos, los resultados, los gráficos y los comentarios de nuestro trabajo con R.
Para empezar, en RStudio escogeremos File->New File->R Markdown, por lo que
después de indicar el título, el autor o la autora y si queremos generar el resultado final en HTML, PDF (en caso de disponer de una instalación de TeX)
o Word, nos aparece un modelo de fichero ya preparado para ser generado y
comprobar que todo está correctamente instalado. Para hacerlo escogeremos
la opción
Knit (y la flecha que hay al lado)
indicando el tipo de fichero que queremos generar, por ejemplo Word (primero nos pedirá guardar el fichero en el disco, con la extensión Rmd). A
continuación, veremos actividad en la consola R Markdown y se nos creará el
correspondiente fichero Word con las instrucciones y los resultados.
El entorno estadístico R
FUOC • PID_00273871
40
3.5. R Markdown: el lenguaje
R Markdown ofrece diferentes posibilidades de una forma relativamente sencilla de usar. Indicaremos a continuación las más habituales y suficientes para
hacer un pequeño informe estadístico. Escribiremos en la columna de la izquierda las instrucciones usadas y a la derecha el resultado en Word (a pesar
de que en PDF o HTML son similares), después de haber generado el correspondiente fichero con Knit.
Para más información podéis consultar la R Markdown Reference Guide (https:
//rstudio.com/wp-content/uploads/2015/03/rmarkdown-reference.pdf) o la
correspondiente Cheat-Sheet (desde https://rstudio.com/resources/cheatsheets/).
Secciones y niveles de texto
Tabla 10.
R Markdown
Resultado
# Sección de nivel 1
Sección de nivel 1
## Sección de nivel 2
Sección de nivel 2
Se usa por lo tanto # o ##...
Listas numeradas
Tabla 11.
R Markdown
Resultado
1. Un
1. Un
1. Dos
2. Dos
1. Tres
3. Tres
Observad que no es necesario poner los números “reales”: es suficiente poner
“1.”.
Listas alfabéticas
Tabla 12.
R Markdown
Resultado
a. Un
a) Un
a. Dos
b) Dos
a. Tres
c) Tres
Como antes, basta con poner siempre “a)” para generar la correspondiente
lista.
El entorno estadístico R
FUOC • PID_00273871
41
Otras listas
Tabla 13.
R Markdown
Resultado
+ Un
• Un
+ Dos
• Dos
+ Tres
• Tres
Texto en cursiva y negrita
Tabla 14.
R Markdown
Resultado
*Hola*
Hola
**Hola**
Hola
Código R
Podemos introducir código apropiado escrito en R (los llamados chunks) de
dos maneras:
En un bloque separado sin enseñar las instrucciones
Tabla 15.
R Markdown
Resultado
```r echo=FALSE
vec<-c(1,2,3)
## [1] 2
mean(vec) ```
Observad que hay que usar 3 ``` para abrir y cerrar el bloque.
En un bloque separado mostrando las instrucciones
Tabla 16.
R Markdown
Resultado
```{r}
vec<-c(1,2,3)
vec<-c(1,2,3)
mean(vec)
mean(vec) ```
## [1] 2
Observad que se muestran las instrucciones y el resultado precedido de ##.
Dentro de la misma línea y mezclado con el texto
Tabla 17.
R Markdown
Resultado
La media de 1, 2, 3 vale `r mean(3,4,5) `
La media de 1, 2, 3 vale 3
El entorno estadístico R
FUOC • PID_00273871
El entorno estadístico R
42
Aquí con una “ `” es suficiente y observad cómo obtenemos directamente el
resultado de la media, sin tener que calcularlo ni tener que copiar el resultado.
Combinación de los dos sistemas para pasar variables al texto
Tabla 18.
R Markdown
Resultado
```{r}
vec<-c(2,4,6)
vec<-c(2,4,6)
mv<-mean(vec)
mv<-mean(vec)
```
La media del vector 2, 4, 6 es 4 y la
La media del vector `r vec ` es `r mv ` y la
del vector –2, 0, 2 es 0
del vector `r vec-mv ` es `r mean(vec-mv) `
Observad cómo se definen y se usan las variables. Dentro de los bloques de
R podemos definir funciones, variables, hacer operaciones, bucles... De paso
hemos comprobado que la media del vector vec-mv, obtenido restando a todos
los componentes de vec la media del mismo vector, es 0.
Fórmulas matemáticas
En el fichero R Markdown podemos escribir fórmulas matemáticas usando la
misma sintaxis que LaTeX; a continuación damos algunos ejemplos sencillos
de como quedan las fórmulas en el documento generado en Word:
Tabla 19.
R Markdown
Resultado
$x^2$
x2
$t_{\alpha}$
tα
√
$\sqrt{x}$
x
y otros más complicados combinando las anteriores:
Tabla 20.
R Markdown
Resultado
\[\sum_{n=1}^7 x_n\]
7
X
\[\dfrac{1}{n-1}\sum_{k=1}^{10}\] \[\frac{x^2}{\sqrt{k+2}}\]
\[\left( \frac{2}{3} \right)\]
xn
n=1
10
1 X x2
√
n–1
k+2
k=1
2
3
Observad que en el propio editor de RStudio puede verse el resultado de las
fórmulas, simplemente poniendo la marca del ratón encima:
FUOC • PID_00273871
43
Esta manera de escribir fórmulas puede parecer muy complicada al comienzo
pero con un poco de práctica supone un gran ahorro de tiempo.
Ejemplo final
Reproducimos a continuación un fichero R Markdown que podría servir como
modelo simplificado de entrega de un informe estadístico y el resultado final
que se obtendría en Word:
--title: "Prueba"
author: "XXX"
date: ""
output: word_document
--```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
# Pregunta 1
Dados los valores 2, 4, 5, se pide
1. Calculad su media.
1. Calculad su desviación típica.
## Solución
1. Introducimos los datos y hacemos los cálculos (como
estamos dentro de una lista, hay que poner **exactamente
cuatro** espacios al comienzo de la primera línea del
bloque de R para respetar la numeración)
```{r}
vec<-c(2,4,5)
mvec<-mean(vec)
svec<-sd(vec)
```
La media es `r mvec`. Recordamos que se calcula como
\[\bar{x}= \frac{\sum_{i=1}^n x_i}{n}\]
1. La desviación típica es `r svec`.
El entorno estadístico R
FUOC • PID_00273871
44
Después de realizar Knit to Word obtenemos lo siguiente:
.
Prueba
XXX
Pregunta 1
Dados los valores 2, 4, 5, se pide
1) Calculad su media.
2) Calculad su desviación típica.
Solución
1. Introducimos los datos y hacemos los cálculos (como estamos dentro de una lista, hay que poner exactamente cuatro espacios al
comienzo de la primera línea del bloque de R para respetar la numeración)
vec<-c(2,4,5)
mvec<-mean(vec)
svec<-sd(vec)
La media es 3.6666667. Recordamos que se calcula como
x=
n
P
xi
i=1
2. La desviación típica es 1.5275252.
n
El entorno estadístico R
FUOC • PID_00273871
45
Bibliografia
Gibernans Bàguena, J.; Gil Estallo, À. J.; Rovira Escofet, C. (2009).
Estadística. Barcelona: Material didàctic UOC.
Grolemund, G. (2014). Hands-On Programming with R: Write your own functions and simulations. O’Reilly Media https://rstudio-education.github.io/hopr/
R notes for professionals book: http://books.goalkicker.com/RBook/
R-Bloggers (hub de blogs sobre temática R): http://www.r-bloggers.com/
R-Statistics (compilación de funcionalidades R): http://www.r-statistics.com/
R-Studio (promotores del entorno de desarrollo IDE): http://www.rstudio.com/
R-Studio at UOC: https://vimeo.com/channels/816639/138296660
Rseek (buscador web): http://rseek.org/
El entorno estadístico R
Download