97
Introducción a R Juan Pablo Pérez Grijalbo 9 de febrero de 2007

Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Introducción a R

Juan Pablo Pérez Grijalbo

9 de febrero de 2007

Page 2: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

2

−3 −1 0 1 2 3

0.0

0.1

0.2

0.3

0.4

0.5

Densidad(velocidad)

dens

idad

Histograma(velocidad)

velocidadfr

ecue

ncia

0 5 10 15 20 25

05

1015

5 10 15 20 25

020

4060

8010

012

0

Dispersión(vel/dist)

velocidad

dist

anci

a

−2 0 1 2 3 4

0.0

0.1

0.2

0.3

0.4

0.5

Densidad(distancia)

dens

idad

Histograma(distancia)

distancia

frec

uenc

ia

0 20 40 60 80 120

05

1015

0 20 40 60 80 120

510

1520

25

Dispersión(dist/vel)

distancia

velo

cida

d

Page 3: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Índice de figuras

3.1. Manual de R enhtml . . . . . . . . . . . . . . . . . . . . . . . . . . 173.2. Hacer histogramas conhist() . . . . . . . . . . . . . . . . . . . . . . 203.3. Diagrama de dispersión con la funciónplot . . . . . . . . . . . . . . 20

5.1. Diagrama de caja con la funciónboxplot() . . . . . . . . . . . . . . . 395.2. Varios diagramas de caja con la funciónboxplot() . . . . . . . . . . . 395.3. Diagramas de caja de anchura variable con el argumentowidth . . . . 415.4. Modificación de las clases del histograma conbreaks . . . . . . . . . 415.5. Frecuencias relativas confreq=F . . . . . . . . . . . . . . . . . . . . 425.6. Histograma con la funciónhist() . . . . . . . . . . . . . . . . . . . . 435.7. Función de densidad conplot(density()) . . . . . . . . . . . . . . . . 435.8. Gráfico Q-Q con la funciónqqnorm() . . . . . . . . . . . . . . . . . 455.9. Otro gráfico Q-Q con la funciónqqnorm . . . . . . . . . . . . . . . . 455.10. Gráfico de barras conbarplot() . . . . . . . . . . . . . . . . . . . . . 545.11. Un gráfico interesante para tablas bidimensionales. . . . . . . . . . . 545.12. Representación gráfica de una tabla multidimensional. . . . . . . . . 555.13. Representación de parte de una tabla multidimensional . . . . . . . . 56

6.1. Notched boxplots. . . . . . . . . . . . . . . . . . . . . . . . . . . . 63

7.1. Un ejemplo de escasa correlación. . . . . . . . . . . . . . . . . . . . 667.2. En este caso, la correlación es fuerte. . . . . . . . . . . . . . . . . . 667.3. Diagrama de dispersión con dos grupos de datos. . . . . . . . . . . . 687.4. Diagrama mucho más elaborado. . . . . . . . . . . . . . . . . . . . 687.5. Diagrama de dispersión con dos grupos de datos obtenidoconcoplot() 697.6. Diagrama de dispersión controlando para dos variables. . . . . . . . 697.7. Diagrama de dispersión cruzada entre variables conpairs() . . . . . . 717.8. Relación entre temperatura y distancia. . . . . . . . . . . . . . . . . 757.9. Relación entre temperatura y flujo térmico. . . . . . . . . . . . . . . 757.10. Relación entre las variables detrees . . . . . . . . . . . . . . . . . . 777.11. Inclusión de la recta de regresión conabline() . . . . . . . . . . . . . 797.12. Identificación de casos conidentify() . . . . . . . . . . . . . . . . . . 80

8.1. Personalización de títulos. . . . . . . . . . . . . . . . . . . . . . . . 83

3

Page 4: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

4 ÍNDICE DE FIGURAS

8.2. Ejes logarítmicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . 838.3. Modificar etiquetas de ejes conaxis() . . . . . . . . . . . . . . . . . 858.4. Millones de colores conrgb() y hsv() . . . . . . . . . . . . . . . . . . 858.5. Añadir textos context() . . . . . . . . . . . . . . . . . . . . . . . . . 868.6. Utilizar funciones para establecer coordenadas de textos context() . . 878.7. Personalización de líneas conlty,lwd,col . . . . . . . . . . . . . . . . 878.8. Personalización de puntos conpch,cex,col. . . . . . . . . . . . . . . 898.9. Añadir puntos conpoints() . . . . . . . . . . . . . . . . . . . . . . . 898.10. Añadir lineas conabline() . . . . . . . . . . . . . . . . . . . . . . . 908.11. Añadir curvas concurve(). . . . . . . . . . . . . . . . . . . . . . . . 918.12. Modificación de parámetros gráficos conpar() (I) . . . . . . . . . . . 928.13. Modificación de parámetros gráficos conpar() (II) . . . . . . . . . . 928.14. Modificación de parámetros gráficos conpar() (III) . . . . . . . . . . 938.15. División de la pantalla gráfica conlayout() . . . . . . . . . . . . . . . 948.16. División desigual de la pantalla gráfica conlayout() . . . . . . . . . . 948.17. Dos histogramas conlayout() . . . . . . . . . . . . . . . . . . . . . . 968.18. Figuras múltiplespar(mfrow) . . . . . . . . . . . . . . . . . . . . . . 97

Page 5: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Índice general

1. Introducción 71.1. ¿Por qué escribo este libro?. . . . . . . . . . . . . . . . . . . . . . . 71.2. Características principales de R. . . . . . . . . . . . . . . . . . . . . 81.3. Algunas cuestiones sobre el texto. . . . . . . . . . . . . . . . . . . . 9

2. Obtención e instalación 112.1. Instalación en Linux . . . . . . . . . . . . . . . . . . . . . . . . . . 112.2. Instalación en Windows. . . . . . . . . . . . . . . . . . . . . . . . . 12

3. Primeros pasos 133.1. Iniciar una sesión de trabajo. . . . . . . . . . . . . . . . . . . . . . 133.2. Cómo pedir ayuda. . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.3. Manos a la obra. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.4. Primera sesión. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173.5. Acabar una sesión de trabajo. . . . . . . . . . . . . . . . . . . . . . 21

4. Gestión de objetos y ficheros 234.1. Introducción de datos en R. . . . . . . . . . . . . . . . . . . . . . . 23

4.1.1. Importación de tablas externas:read.table() . . . . . . . . . . 234.1.2. Edición de datos en R. . . . . . . . . . . . . . . . . . . . . 25

4.2. Salida de información de R. . . . . . . . . . . . . . . . . . . . . . . 264.2.1. Exportación de gráficos. . . . . . . . . . . . . . . . . . . . . 264.2.2. Exportación de textos. . . . . . . . . . . . . . . . . . . . . . 27

4.3. Manipulación dedata.frames. . . . . . . . . . . . . . . . . . . . . . 274.3.1. Selección de variables. . . . . . . . . . . . . . . . . . . . . 284.3.2. Extracción de variables. . . . . . . . . . . . . . . . . . . . . 284.3.3. Selección de casos. . . . . . . . . . . . . . . . . . . . . . . 294.3.4. Extracción de casos. . . . . . . . . . . . . . . . . . . . . . . 304.3.5. Introducción de variables. . . . . . . . . . . . . . . . . . . . 314.3.6. Incorporación de registros. . . . . . . . . . . . . . . . . . . 334.3.7. Ordenación de variables. . . . . . . . . . . . . . . . . . . . 34

5

Page 6: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

6 ÍNDICE GENERAL

5. Estadística descriptiva 355.1. Análisis exploratorio de los datos. . . . . . . . . . . . . . . . . . . . 35

5.1.1. Medidas características. . . . . . . . . . . . . . . . . . . . . 355.1.2. El gráficostem and leaf. . . . . . . . . . . . . . . . . . . . . 375.1.3. El gráficoboxplot . . . . . . . . . . . . . . . . . . . . . . . . 385.1.4. El histograma. . . . . . . . . . . . . . . . . . . . . . . . . . 405.1.5. Contraste de normalidad. . . . . . . . . . . . . . . . . . . . 40

5.2. Cómo resumir la información contenida en undata.frame . . . . . . 465.2.1. Tablas de frecuencias absolutas. . . . . . . . . . . . . . . . 465.2.2. Tablas con otras medidas estadísticas. . . . . . . . . . . . . 505.2.3. Métodos gráficos para presentar la información contenida en tablas53

6. Pruebas de significación 576.1. Pruebas no paramétricas. . . . . . . . . . . . . . . . . . . . . . . . 57

6.1.1. Pruebas basadas en laχ2 . . . . . . . . . . . . . . . . . . . . 576.1.2. Test de Wilcoxon, de Mann-Whitney y de Kolmogorov-Smirnov 596.1.3. Test de Kruskal-Wallis. . . . . . . . . . . . . . . . . . . . . 60

6.2. Pruebas paramétricas. . . . . . . . . . . . . . . . . . . . . . . . . . 626.2.1. Test basados en la t de Student. . . . . . . . . . . . . . . . . 62

7. Correlación y regresión 657.1. Estudio de la correlación bivariada. . . . . . . . . . . . . . . . . . . 65

7.1.1. Métodos gráficos. . . . . . . . . . . . . . . . . . . . . . . . 657.1.2. Matrices de correlaciones. . . . . . . . . . . . . . . . . . . 707.1.3. Coeficiente de correlación de Spearman. . . . . . . . . . . . 727.1.4. Coeficiente de correlación parcial. . . . . . . . . . . . . . . 73

7.2. Regresión lineal simple. . . . . . . . . . . . . . . . . . . . . . . . . 76

8. Personalización de gráficos 818.1. Títulos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 818.2. Ejes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 828.3. Colores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 848.4. Añadir textos a un gráfico. . . . . . . . . . . . . . . . . . . . . . . . 848.5. Tipos de puntos y lineas. . . . . . . . . . . . . . . . . . . . . . . . . 868.6. Añadir puntos y lineas a un gráfico. . . . . . . . . . . . . . . . . . . 888.7. Plantillas gráficas. . . . . . . . . . . . . . . . . . . . . . . . . . . . 908.8. Gráficos múltiples. . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

Page 7: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Capítulo 1

Introducción

1.1. ¿Por qué escribo este libro?

El objetivo de este documento es proporcionar una base en castellano para aquellosque están interesados, por el motivo que sea, en iniciarse enel uso de R.

Cuando uno se entera de la existencia de R, y se siente interesado por él, lo primeroque necesita es un poco de documentación porque, realmente,no es unprogramaquese aprenda a base detrastear. Es entonces cuando se busca por internet.

Por lo general, al que está metido en el mundo de la informática, no le queda otroremedio que manejarse con el inglés. Es entonces cuando uno siente cierta sana envidiapor esas sociedades que generan tanto conocimiento y, sobretodo, por la gente quetiene un accesoinmediatoa esa información. También es cuando uno se explica queles haya ido tan bien a algunas naciones en lo que al desarrollo (al menos científico ytecnológico) se refiere.Mientras tanto, a los demás no nos queda otra opción que intentar descifrar el lenguajeimperante; en general porque nos puede más el deseo de saber que la reticencia naturala aprender un idioma extranjero1

Para los que entienden el inglés hay buenísimos manuales disponibles en la páginaoficial de R. Se incluyen, además, documentos de tipo introductorio mucho mejoresque este2. Sin embargo, hay gente que presenta esas reticencias al inglés y que, portanto, no tienen acceso a un entorno estadístico realmente fantástico. Entre esos secto-res de población se encuentran especialmente los alumnos debachillerato e, incluso,de niveles universitarios. En realidad, este documento fueconcebido en principio comoun material de clase para ser utilizado con mis alumnos y alumnas del primer curso debachillerato. Decidí entonces redactar un pequeño manual para trabajar con ellos enel aula cuestiones de estadística básica, puesto que, por unlado, era consciente de lo

1En realidad, existen algunos documentos en castellano, como la traducción deIntroducción a R, delequipo de desarrollo de R; yGráficos estadísticos con R, de J.C. Correa y N. González. Ambos están dispo-nibles en la página web de R.

2En mi opinión, los mejores sonsimpleR. Using R for introductory statisticsde John Verzani yUsing Rfor data analysis and graphics. An introductionde J.H.Maindonald. Como los anteriores, están disponiblesen la página web de R

7

Page 8: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

8 CAPÍTULO 1. INTRODUCCIÓN

inadecuado que podría resultar remitirles a la documentación en inglés pero, por otro,deseaba introducirles en el mundo delsoftware librey darles a conocer R.3.

En fin, espero que estos apuntes sirvan para aquellos hispanoparlantes que se en-frentan por primera vez con R. Para que puedan empezar a descubrir las inmensasposibilidades que ofrece y, quién sabe, llegar a entusiasmarse con él como lo hace elque escribe estas lineas.

1.2. Características principales de R

En mi opinión las principales características de R son

1. las operaciones (cálculos estadísticos, gestión de ficheros,. . . ) se realizan te-cleando instrucciones en un terminal. No es, por lo tanto, unprograma en modográfico

2. hay toda una comunidad internetera girando alrededor de él. En la red podemosencontrar actualizaciones, paquetes, listas de correo, manuales,. . .

3. además del sistema base, existen paquetes especializados que permiten aplicar Ra campos superespecíficos como la estadística espacial, molecular, social,. . .

4. es un lenguaje de programación, de modo que tenemos la posibilidad de ampliarsu funcionalidad en la medida de nuestros conocimientos sobre programación

5. es un sistema multiplataforma, estando disponible, entre otros, para sistemas Li-nux, Windows y MacOS

6. es software libre, de modo que podemos adaptar el programaa nuestras necesi-dades ya que se distribuye con el código fuente

7. es gratuito

Por supuesto, R tiene ventajas e inconvenientes. También por supuesto, qué sonventajas y qué inconvenientes depende de cada uno, pero (sobretodo) depende deconquése compare. R es un entorno estadístico y, por lo tanto, debe ser comparado conaplicaciones de este tipo no, por ejemplo, con hojas de cálculo o similares.

Para mi son ventajas

1. el no sentirte solo ante el programa. La comunidad R es muy amplia y atenta.Siempre responde a tus dudas

2. tiene unas capacidades gráficas extraordinarias

3. poder utilizarlo tanto en Linux como en Windows

4. poder definir funciones propias

5. tener acceso a funciones de estadística avazada3Sin embargo, a medida que lo he ido escribiendo lo he ido ampliando y, en estos momentos, supera las

posibilidades de aplicación en esos niveles, por lo que a ellos les paso una versión adaptada

Page 9: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

1.3. ALGUNAS CUESTIONES SOBRE EL TEXTO 9

6. trabajar con ficheros fácilmente portables

7. aunque parezca extraño, el trabajar en linea de comandos ala larga resulta unaventaja en muchas ocasiones ya que permite realizar muchas operaciones de for-ma más rápida que en modo gráfico

8. se actualiza con mucha frecuencia

9. es gratuito, de modo que uno puede responder tranquila ypúblicamentea lapregunta¿con qué programa has hecho esto?, cosa que no pueden hacer muchosde los usuarios de otras aplicaciones estadísticas

Entre los inconvenientes destacaría

1. al principio, el trabajo en modo texto es incómodo

2. la curva de aprendizaje es, también al principio, algo pendiente, de modo que esnecesario material de apoyo para el aprendizaje

3. el lenguaje del programa es el inglés, y también en inglés está la mayor parte dela documentación disponible

4. es unprogramapoco conocido por el usuarionormal de estadística ya que nohay libros de R en las secciones correspondientes de las librerías especializadas

1.3. Algunas cuestiones sobre el texto

En el texto encontraremos ennegrita todo aquello que debamos introducir porteclado en el terminal para realizar alguna operación en R. Por otro lado, aparecerán encursiva

1. las salidas por pantalla de las instrucciones que tecleemos

2. los nombres de las funciones y argumentos o parámetros de las mismas

3. los nombres de objetos particulares del espacio de trabajo

4. como sustituto de las comillas allí donde pudieran utilizarse

La operación de asignación puede efectuarse con el signo= o con la combinación designos<-. En el texto se utiliza esta última para ser compatible con versiones anterioresde R.

Page 10: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

10 CAPÍTULO 1. INTRODUCCIÓN

Page 11: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Capítulo 2

Obtención e instalación

La versión 1.6.1 de R, de noviembre de 2002, se te proporcionacon este documentoen las versiones para Linux y para Windows. Sin embargo, cuando lo leas, casi contoda seguridad habrá alguna versión más nueva, ya que la intención del equipo quedesarrolla R es liberar dos versiones al año. Por tanto, si deseas lo último en R tendrásque descargarlo de la página oficial del proyecto CRAN (www.cran.r-project.org).La instalación difiere si eres usuario de Linux o de Windows.

2.1. Instalación en Linux

Los usuarios habituales de Linux pueden saltarse este apartado (si no lo han hechoya) porque no tienen más que obtener R e instalárselo en su ordenador.Si no lo eres, lo que sigue pretende ayudarte a instalártelo.

Si utilizas una distribución de Linux completa, tal vez se halle incorporada algunaversión de R en la selección de programas que hayan hecho; en ese caso puedes utilizarpara instalar R la aplicación de gestión de paquetes que te venga con la distribución.En cualquier caso, no será la última.

Si lo descargas de Internet debes saber que en la página de CRAN vas a encontrardiferentes versiones del programa. Por un lado están los ficheros con el código fuente y,por otro, los archivos con ficheros binarios precompilados para las distribuciones másusuales (Debian, RedHat, Suse y Mandrake). Lo mejor es descargarse el que corres-ponda a nuestra distribución e instalarlo con la herramienta de gestión de paquetes quetengamos.

Otra posibilidad es utilizar el CD que te proporciono. En él te encontrarás con unpaquete RPM y varios DEB. Para instalar R desde la linea de comandos sólo tienes queescribir en un terminalrpm -i R-1.6.1-2.i386.rpmlo que instalará R en la mayor parte de las distribuciones. Situ distribución es Debiano basada en debian, puedes utilizar los archivos DEB, para locual deberás escribirdpkg -i r-base-core_1.6.1-1_i386.debdpkg -i r-recommended_1.6.1-1_all.deb

11

Page 12: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

12 CAPÍTULO 2. OBTENCIÓN E INSTALACIÓN

dpkg -i r-doc-pdf_1.6.1-1_i386.debSi todo ha ido bien1, podrás arrancar R desde el terminal simplemente tecleandoR.

2.2. Instalación en Windows

Los que utilizan Windows no lo tienen mucho más difícil. Tienen que descargarseel archivo correspondiente que hay en el directoriobasedel enlace a Windows de lapágina de descarga. Tras descargarlo sólo hay que hacer doble clic sobre el icono delarchivo rw1061.exee ir superando las pruebas que nos pone el asistente de instala-ción. Tras concluir y, si así lo queremos, tendremos un iconoen el escritorio que nospermitirá lanzar la aplicación.

1los problemas más habituales son los de dependencias no satisfechas, en cuyo caso deberás instalarpreviamente los paquetes precisos

Page 13: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Capítulo 3

Primeros pasos

3.1. Iniciar una sesión de trabajo

Tras arrancar R nos encontramos con un terminal en el que deberemos teclear loscomandos necesarios para realizar todas las operaciones que vayamos a realizar; desdela edición y gestión de ficheros de datos, a los análisis estadísticos y generación degráficos. Como dijimos en la Introducción, deberemos aprender el idioma de R. Sinembargo, y aunque es amplio, veremos que con muy poco esfuerzo podremos empe-zar a trabajar. Además, una característica de R muy útil es que los comandos que seintroducen por teclado se van almacenando en un historial, de manera que podemosrecuperar las órdenes introducidas en un momento anterior con la ayuda de la teclaflecha-arriba. Esto nos ahorrará mucho trabajo de tecleado y de memorización de lasintaxis de los comandos ya que una vez introducido podremosrecuperarlo posterior-mente. Por otro lado, esta facultad nos va a permitir realizar análisis estadísticos de unamanera incluso más rápida de lo que lo haríamos con una aplicación en modo gráfi-co, en la que deberíamos desplazarnos por diferentes ventanas para realizar un análisisprácticamente idéntico al realizado en un momento anterior.

En R nos vamos a encontrar con lo que se denomina "espacio de trabajo"(workspaceen inglés). Es una entidad virtual en la que se van a ir almacenando las variables y aná-lisis que vayamos haciendo a lo largo de nuestra sesión de trabajo.

En Linux, el espacio de trabajo se almacena en el directorio desde el que se halanzado R, de modo que al arrancar R se cargará el espacio de trabajo correspondienteal directorio en el que nos encontremos al lanzar la aplicación. Por ese motivo, antesde comenzar un estudio estadístico (digamos, Clima de Aragón) es conveniente crearun directorio (tal vez, Clima de Aragón). Cuando vayamos a trabajar sobre este asuntoacudiremos a ese directorio para, desde allí, arrancar R. Todos los ficheros que vaya-mos generando (de texto, gráficos,...) en la sesión de R se irán guardando por defectoen este mismo directorio.Si no hacemos esto y arrancamos R, sea cual sea el problema estadístico, desde un di-rectorio cualquiera, por ejemplohome, iremos acumulando objetos de diferentes pro-blemas estadísticos en el mismo espacio de trabajo, lo que acabará creando la consi-

13

Page 14: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

14 CAPÍTULO 3. PRIMEROS PASOS

guiente confusión.Si analizamos los ficheros ocultos contenidos en el directorio de trabajo, vemos quehay uno llamado.Rhistoryque es el que va almacenando el histórico de comandosintroducidos en R. Como es un fichero de texto, podemos visualizarlo con cualquiereditor.

En la versión de R para Windows las cosas son algo distintas porque, aunque elespacio de trabajo también se guardará en el directorio desde el que se lance la aplica-ción, lo cierto es que la operación de arranque se suele hacer, bien con un doble clicsobre el icono colocado en el escritorio o la barra de programas, bien desplegando elmenú de Inicio hasta llegar a la aplicación.Una vez arrancado R, para saber cuál es el directorio de arranque deberemos tecleargetwd()y anotar la ruta de acceso que nos indica por pantalla que, si hemos hecho unainstalación de Aceptar en Aceptar, estará en C:\Archivos de programa\R\rw1051 .Cuando hayamos acabado la sesión de trabajo con R y guardado el espacio de trabajo,nos encontraremos en el directorio que nos haya indicadogetwd()con un icono en for-ma de R. Es conveniente entonces poner un nombre a ese icono (que de momento notiene ninguno) y trasladarlo a la carpeta en la que vayamos a guardar todo el materialque vayamos generando en nuestro trabajo estadístico.

Si este procedimiento nos parece demasiado complicado, podemos utilizar el co-mando/File/Save Workspace, que nos permite guardar una imagen de nuestro espaciode trabajo en el directorio que deseemos. Tras acabar nuestra sesión de trabajo, debe-remos descartar los cambios si queremos que, al abrir de nuevo R desde el icono de laaplicación, no se cargue ningúnworkspace.

A partir de ese momento, cuando queramos recuperar ese espacio de trabajo enconcreto, tendremos dos opciones:

1. lanzar R haciendo doble clic sobre el icono situado en la carpeta de trabajo

2. hacer sobre doble clic sobre el icono que abre la aplicación y cargar el espaciode trabajo desdeFile/Load workspace. Nos aparecerá una ventana en la que sólodeberemos indicar la carpeta en la que hemos guardado la imagen del espacio detrabajo.

Cuando arrancamos R desde el icono de la aplicación, se recupera el último espaciode trabajo abierto, que puede ser,o no, el que nos interese a nosotros. La mejor manerade averiguarlo es tecleandols(); si se ha cargado el que deseamos, es obvio que no espreciso hacer la operación anterior.

En la versión de R para Windows disponemos de una ventana con menús, una pe-queña barra de herramientas y la consola para introducir loscomandos por teclado.Aunque no hay procedimientos estadísticos en modo gráfico, sí que hay algunos co-mandos útiles, como el que permite la importación de paquetes desde el sitio web deCRAN o la personalización del entorno.

3.2. Cómo pedir ayuda

R dispone de un sistema de ayuda muy eficaz que nos va a permitiraprender el usode los comandos con bastante rapidez. Si conocemos el nombredel comando sobre el

Page 15: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

3.2. CÓMO PEDIR AYUDA 15

que deseamos ayuda (p.e.plot) podemos utilizar la funciónhelp(). Lo único que debe-mos teclear eshelp(plot) o ?plot.En ese momento, si trabajamos con la versión de Linux, el terminal abandona entornode R en el que estamos para arrancar el visualizador de la ayuda. El desplazamientopor la ayuda se realiza con las teclas dearriba-abajo y deAv.Pag-Re.Pag. Todas lasayudas suelen acabar con ejemplos de utilización de la función. Para salir de ella sólohay que pulsar la teclaq.Existe la posibilidad de visualizar la ayuda con un navegador web. Para ello, en el casoanterior se debería teclearhelp(plot, htmlhelp=T) con lo que arrancaría el navegadorMozilla. En la página web aparecerá el mismo contenido de la ayuda pero con sus ven-tajas en cuanto a navegación. Además, en este caso, no se pierde en ningún momentoel controlde edición de comandos en elpromptde R.El problema viene cuando no conocemos el nombre de los comandos, pero, ni siquieraen ese caso está todo perdido. Entre otras cosas, tenemos manuales (como este) que nosvan presentando algunos de los comandos más habituales. Sólo es cuestión de empezara recordarlos. Además, existen varias posibilidades de ayuda desde R. Si tecleamoshelp.start(), arrancará el navegador web en una página de inicio que presenta enlacesa diferentes documentos. En este momento nos interesa especialmente el enlace a lospaquetes de R (Packages). De este modo podremos obtener una relación de todo loque contiene un paquete determinado. De entrada nos viene elnombre del comandoa teclear y una pequeña descripción de lo que hace (si es un procedimiento) o de loque contiene (si es un fichero de datos). Aunque tiene infinidad de funciones, es con-veniente echar un vistazo al paqueteBaseporque podremos ir reconociendo las queutilizaremos con más frecuencia.Si tenemos alguna idea de cómo puede llamarse la función que queremos emplear po-demos utilizar la funciónapropos(). Por ejemplo, si quiero hacer una media ponderadapero no sé el nombre exacto de la función que me permita obtenerla, puedo teclearapropos(mean)cuya salida sería[1]“mean” “mean.POSIXc” “mean.POSIXl” “mean.default”[5] “weighted.mean”Podemos ver entonces que existe una función llamadaweighted.mean(). El siguientepaso sería solicitar ayuda sobre la misma conhelp(weighted.mean)para aprender autilizarla.

Otra herramienta muy útil para pedir ayuda en R es la funciónhelp.search(). Estanos devuelve todas las entradas de ayuda que presenten en sustilulos o palabras clavela cadena de caracteres introducida como argumento de la función. Así,help.search(“help”)devuelveexample(base) Run an Examples Section from the Online Helphelp(base) Documentationhelp.search(base) Search the Help Systemhelp.start(base) Hypertext Documentationindex.search(base) Search Indices for Help FilesCuandoapropos(help)devuelve

Page 16: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

16 CAPÍTULO 3. PRIMEROS PASOS

[1]“help” “help.search” “help.start”Otra función muy útil esmethods(), que permite conocer diferentes posibilidades de

uso de procedimientos utilizados en R. Por ejemplo, si nos interesa conocer variantesde uso de la funciónlines(), podemos teclearmethods(lines)que nos proporciona la siguiente salida[1] “lines.default” “lines.formula” “lines.histogram” “ lines.ts”.Tambiém podemos aplicarlo a una clase de objetos, como hacemos en el siguienteejemplo con las tablasmethods(class=table)[1] “pairwise.table” “as.data.frame.table” “as.table”[4] “is.table” “margin.table” “plot.table”[7] “print.summary.table” “int.table” “prop.table”[10] “read.table” “summary.table” “write.table”Posteriormente, con las funciones normales de ayuda, podemos entrar a estudiar elfuncionamiento de aquellas que nos puedan interesar.

En Windows encontramos en la pantalla un menú de ayuda. Allí nos encontramoscon accesos a las FAQ’s, al manual de R y otras fuentes de documentación. Éstosestán en formato PDF, pero la versión en HTML podemos lanzarla desde la línea decomandos con la funciónhelp.start(). La captura de pantalla de la Figura3.1 se haobtenido de esa manera.

3.3. Manos a la obra

Antes de ponernos a trabajar con nuestros datos, es conveniente echar un vistazoa alguno de los datos que vienen incorporados con R. Si tecleamosdata(), apareceráen pantalla una relación de ficheros de datos que podremos cargar en nuestro espaciode trabajo. Para cargar uno en concreto, debe incluirse comoargumento de la función.Así, data(cars)cargaría el ficherocars.

Para ver qué objetos tenemos en nuestro espacio de trabajo hay que utilizar la fun-ción ls() sin argumentos. En este caso el único objeto debe ser el recién cargado ficherocars.

Para ver el contenido de un objeto de datos tenemos dos posibilidades: la primeraes llamarlo directamente por su nombre. En nuestro caso, si tecleamoscars, aparecerápor pantalla todo el contenido del fichero. Veremos entoncesque consta de cincuen-ta registros de velocidad y distancia de frenada de otros tantos vehículos. Este modode exploración no es conveniente cuando el fichero contiene muchas variables y/o re-gistros. En estos casos es mejor utilizar la funciónstr() para hacernos una idea delcontenido del objeto. Así,str(cars) generaría la siguiente salida‘data.frame’: 50 obs. of 2 variables:$ speed: num 4 4 7 7 8 9 10 10 10 11 ...$ dist : num 2 10 4 22 16 10 18 26 34 17 ...La funciónstr() nos informa de quecarses undata.frame, es decir, una tabla de da-tos en la que podemos encontrarnos variables de diferentes tipos. Nos dice que hay 50observaciones de dos variables que son de tipo numérico y cuyos nombres sonspeedy

Page 17: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

3.4. PRIMERA SESIÓN 17

Figura 3.1: Manual de R enhtml

dist.Los data.frameson un tipo de objeto de importancia capital en R ya que en la

mayor parte de los análisis estadísticos los datos serán almacenados endata.frames. Lafunciónstr() es la mejor manera de conocer la estructura de un objeto en R.

3.4. Primera sesión

Las estadísticas más básicas que debemos conocer de nuestros datos son las relati-vas a medidas de tendencia central y de dispersión. La función summary()nos propor-ciona algunas de ellas. Por ejemplo,summary(cars)nos indica lo siguiente

speed distMin. : 4.0 Min. : 2.001st Qu.:12.0 1st Qu.: 26.00Median :15.0 Median : 36.00Mean :15.4 Mean : 42.983rd Qu.:19.0 3rd Qu.: 56.00Max. :25.0 Max. :120.00

es decir, proporciona los valores mínimo y máximo de cada variable así como la mediaaritmética y los tres cuartiles.

Como veremos, consummary()podemos conocer algunos estadísticos básicos. Lasfuncionesmean(), median(), max(), min(), sum() y var()aplicadas a una varible pro-porcionarán por separado la media aritmética, mediana, valor máximo, mínimo, suma

Page 18: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

18 CAPÍTULO 3. PRIMEROS PASOS

y varianza respectivamente.Sin embargo, si nos limitamos a teclear estas funciones, R sólo presentará el valor delestadístico en la pantalla. Si deseamos almacenar alguno deestos valores para trabajarcon ellos posteriormente (o por el motivo que sea) será preciso guardarlo en nuestroespacio de trabajo. Para ello debemos hacer una de las operaciones más básicas en R,que es laasignación.Llamamos asignación al proceso por el cual almacenamos en unobjeto el resultadoobtenido a través de una función de R. El objeto se incorporará automáticamente alespacio de trabajo. Para llevar a cabo la asignación debemosdecidir en primer lugar elnombre que queremos dar al objeto. Una vez hecho esto, podemos pasar a teclear enel terminal la orden. Por ejemplo, si quisiéramos almacenarla media de la distancia defrenado, podríamos teclear lo siguientemedia.frenado<-mean(cars$dist)Como ya sabemos,mean(cars$dist)le dice a R que obtenga la media de la variabledist deldata.frame cars. La combinación de caracteres< (menor que) y- (guión) indi-ca que el resultado de la funcióndebe asignarse a...1 Finalmentemedia.frenadoes elnombre que hemos querido dar en este caso al objeto que almacenará la media.Si hacemosls() veremos que, efectivamente, el nuevo objeto se ha incorporado al es-pacio de trabajo. A partir de ahora, para conocer el valor de ese estadistico deberemosteclear, símplemente,media.frenadoy, lo que es más importante, podré manipular elvalor de la media en operaciones algebraicas. Por ejemplo, si desease dividir esa mediaentre tres, teclearíamedia.frenado/3. El proceso sería el siguientemedia.frenado<-mean(cars$dist)media.frenado[1] 42.98media.frenado/3[1] 14.32667Como puedes imaginar, el último valor no se almacenará en el espacio de trabajo puestoque no ha sido asignado a ningún objeto. Sin embargo, si consideras que sería conve-niente, ya sabes cómo puedes hacerlo muy rápidamente y casi sin teclear nada. Sólodebes recuperar con la teclaflecha-arriba la línea en la que introdujiste la orden decálculo (en este caso la última), desplazarte en ella con lasflechas-derecha-izquierdahasta el comienzo de la línea y teclear el nombre que quieras dar al objeto seguido deloperador de asignación<-.La asignación es, como ya hemos dicho, una operación básica en R. En una sesión detrabajo pueden realizarse multitud de asignaciones. Por ese motivo es muy recomen-dable que elijamos nombres adecuados para los objetos. Es muy conveniente que elnombre nos recuerde inmediatamente qué es lo que almacena elobjeto, pero tampocodebe ser excesivamente largo. La experiencia nos irá ayudando en la elección de nom-bres.Cuando hacemosls() y vemos que hay objetos que hemos almacenado, pero que no nosinteresan, podemos quitarlos del espacio de trabajo. Para eso está la funciónrm(). Así,rm(media.frenado)haría desaparecer el objetomedia.frenado. Si queremos quitar va-rios objetos, no tenemos más que teclear sus nombres dentro de la función separados

1recuérdese que puede sustituirse por el signo = en las versiones 1.5 y posteriores

Page 19: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

3.4. PRIMERA SESIÓN 19

por comas. Así,rm(media.frenado,cars)quitaría esos dos objetos que, por el momen-to, deben ser todo lo que tenemos en el espacio de trabajo.Podemos comprobarlo conls():ls()[1] “cars” “media.frenado”rm(cars,media.frenado)ls()character(0)Esecharacter(0)nos dice que el espacio de trabajo está vacío. De momento, volvere-mos a cargar el archivocars.

Aunque estemos en los primeros pasos, seguramente también nos interesará ana-lizar la distribución de frecuencias de las variables. Paragenerar un histograma de lavariablespeeddeberemos teclearhist(cars$speed)lo que viene a traducirse por “coge eldata.frame cars, selecciona lavariablespeedy haz el histograma con las opciones que tengas por defecto”.El resul-tado es el que vemos en la Figura3.2. 2. Vemos que al pulsar la teclaIntro se abre unapantalla nueva que R llamaDevice 2y dice que está activa.Si quiero ver el histograma, pero ahora de la variabledist, tengo dos opciones: pre-sentarlo en la pantalla que acaba de abrirse (en cuyo caso desaparecerá el histogramaanterior), o abrir una nueva pantalla. Para ello deberemos teclear, en Linux,X11() y, enWindows,windows(). En ese momento se abrirá y activará automáticamente un nuevodispositivo. Cualquier función gráfica que introduzcamos en R se representará en esanueva pantalla.Abrir dispositivos de esta manera es una de las posibilidades que ofrece R para vervarios gráficos de forma simultanea. Podemos conocer en cualquier momento cuántosdispositivos tenemos abiertos tecleandodev.list(). Nos aparecerá por pantalla una listaque nos informa del tipo de dispositivo, y el número que tieneasignado. El último dis-positivo abierto será siempre el que esté en estado activo a no ser que activemos otro.Esto podemos hacerlo con la funcióndev.set(). Tecleandodev.set(which=3)activare-mos inmediatamente el dispositivo número 3.Si queremos cerrar un dispositivo, podemos hacerlo con el ratón, pulsando sobre la Xde la esquina superior derecha. Sin embargo, hay dispositivos, como elpostscript(queveremos más adelante), que no presenta ventana alguna. Paracerrarlo en ese caso de-bemos teclear, por ejemplo,dev.off(4)siendo en este caso4 el número del dispositivoa cerrar.

En muchos casos también vamos a interesarnos por la relaciónexistente entrelas distintas variables. Una aproximación gráfica la obtendremos mediante la fun-ción plot(). Para ver el gráfico dispersión despeedfrente adist deberemos teclearplot(cars$speed,cars$dist)lo que genera la Figura3.3

2Posteriormente estudiaremos más en profundidad los métodos gráficos y veremos cómo modificar ypersonalizar el gráfico resultante

Page 20: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

20 CAPÍTULO 3. PRIMEROS PASOS

Figura 3.2: Hacer histogramas conhist()

5 10 15 20 25

020

4060

8010

012

0

speed

dist

Figura 3.3: Diagrama de dispersión con la funciónplot

Page 21: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

3.5. ACABAR UNA SESIÓN DE TRABAJO 21

3.5. Acabar una sesión de trabajo

Podemos dar por terminada nuestra primera sesión de R. Para salir sólo hay queteclearq(). En ese momento nos preguntarán si deseamos guardar los objetos presentesen el espacio de trabajo que han sido generados en la última sesión. Si pulsamos la teclay, se guardarán, y nos los encontraremos de nuevo cuando arranquemos el programa. Sipulsamosn todos los objetos que no hubieran sido guardados en alguna sesión anteriorde R se perderán sin posibilidad de recuperarlos.

Page 22: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

22 CAPÍTULO 3. PRIMEROS PASOS

Page 23: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Capítulo 4

Gestión de objetos y ficheros

Después de conocer las bases de R, estamos en condiciones de comenzar a trabajarcon datos propios y presentar al mundo los resultados de tus análisis. En este capítuloveremos cómo introducir datos en R, cómo manipularlos y cómoexportar los resultadospara poder incorporarlos a un informe.

4.1. Introducción de datos en R

Al llegar a este punto, podemos encontrarnos con varias situaciones:

1. en algunos casos, los datos los tendremos ya metidos en algún fichero (de hojade cálculo, de base de datos,...) bien porque los introdujimos en un momentoanterior, o porque nos los proporcionaron en esos formatos

2. podemos tener datos propios todavía sin digitalizar, y esposible que, después deconocer las posibilidades que te ofrece R, prefieras introducir los datos en unaaplicación que te permita editarlos de una manera más ágil

3. finalmente, es posible que deseas introducir los datos directamente en R

En primer lugar vamos a ver qué hay que hacer en los dos primeros casos para importardatos externos.

4.1.1. Importación de tablas externas:read.table()

Por lo general, los datos los tenemos en forma de tablas en lasque encontramosuna serie de variables de diferentes tipos dispuestas en columnas; y un número variablede registros que aparecen ocupando las filas de la tabla.Sea cual sea la aplicación en la que tengamos la información,siempre podremos ex-portar la tabla en forma de fichero de texto. Esta es una de las formas más fáciles detrasladar datos desde cualquier aplicación hacia R. Tal vezlo más frecuente sea ex-portar las tablas a ficheros de texto en los que cada campo (columna, variable) quede

23

Page 24: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

24 CAPÍTULO 4. GESTIÓN DE OBJETOS Y FICHEROS

limitado por tabuladores (tab delimiteden inglés). Si tenemos una tabla como la si-guiente:

ALTITUD ORIENTACIÓN TEMPERATURA500 N 151500 625 S

y la exportamos (desde la aplicación en la que la hemos creado) con el nombreda-tos.txtal directorio de trabajo de R, podremos incorporarla al espacio de trabajo con lasiguiente orden:datos<-read.table("datos.txt", header=T, sep="\t")en ella se dice que el fichero (que debe ir entrecomillado) tiene una primera fila en laque van los nombres de las variables (header=T) y que el separador de columnas es eltabulador (sep="\t"

). La orden podría funcionar correctamente aun sin colocar esa última opción siem-pre y cuando no haya ningún valor perdido (celdas en blanco) en la tabla original, perocomo en nuestro caso sí los hay, es preciso introducirla. Si comprobamos el resultado,obtenemos lo siguientedatos

ALTITUD ORIENTACIÓN TEMPERATURA1 500 N 152 1500 63 25 S NA

vemos que el valor perdido en la variable TEMPERATURA se ha convertido auto-máticamente en un NA (Not Avalaibleen inglés), pero el perdido en la variable ORIEN-TACIÓN aparece en blanco. Esto se debe a que R transforma en NA’s sólo las variblesnuméricas. Si queremos que los valores perdidos de una variable no numérica se trans-formen en NA’s para ser tratados como tales en R, debemos indicar a la hora de importarla tabla qué forma adoptan los valores perdidos en esos casos. Como en el nuestro (yes lo habitual) son celdas que están en blanco, lo que haremosserá introducir la opciónna.strings=""datos<-read.table("datos.txt", header=T, na.strings=“”, sep=" \t")datos

ALTITUD ORIENTACIÓN TEMPERATURA1 500 N 152 1500 NA 63 25 S NA

Con esta orden de importación, las variables numéricas contenidas en la tabla deorigen serán mantenidas como numéricas, pero las variablesde tipo carácter serántransformadas en lo que en R se llamafactores. Cuando conozcamos mejor cómo

Page 25: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

4.1. INTRODUCCIÓN DE DATOS EN R 25

funciona R podremos decidir si eso nos conviene o no. Cuando deseemos mantenerlas variables de tipo carácter como tales, deberemos añadira la funciónread.tablelaopciónas.is=T.

4.1.2. Edición de datos en R

En alguna ocasión es posible que deseemos introducir los datos directamente en R.Hay dos posibilidades para hacerlo: una es por la línea de comandos, y la otra medianteuna pantalla gráfica.En la línea de comandos podemos crear un objeto y asignarle almismo tiempo losvalores que ha de almacenar. Por ejemplo, si quisiéramos introducir directamente losdatos de la tabla anterior podríamos teclear lo siguiente:ALTITUD <-c(500,1500,25)ORIENTACIÓN <-c("N",NA,"S")TEMPERATURA <-c(15,6,NA)tabla<-data.frame(ALTITUD,ORIENTACIÓN,TEMPERATURA)En las tres primeras líneas creamos las variables y les asignamos los valores que adop-tan. La funciónc() lo que hace es concatenar los tres valores para crear un vector. Losvalores perdidos los introducimos comoNA’s, y los valores de las variables no numéri-cas deben ir entrecomillados. En la cuarta línea hemos procedido a crear undata.frameque hemos llamadotablaen el que hemos reunido las tres variables.También podríamos haber realizado la operación en un sólo paso. Símplemente debe-ríamos haber tecleado:tabla<-data.frame(ALTITUD=c(500,1500,25),ORIENTACIÓN=c( "N",NA,"S"),TEMPERATURA=c(15,6,NA)) Si tecleamosstr(tabla) obtenemos:str(tabla)‘data.frame’: 3 obs. of 3 variables:$ALTITUD : num 500 1500 25$ORIENTACIÓN: Factor w/ 2 levels "N","S": 1 NA 2$TEMPERATURA: num 15 6 NAEl mensaje nos indica que, efectivamente, hemos generado undata.frameque tienetres observaciones y tres variables, dos de las cuales son numéricas y una tercera, laorientación, es lo que en R se llama unfactor; en este caso, el factor presenta sólo dosmodalidades: N y S. También nos advierte de la presencia de valores perdidos.

Este sistema desde luego no es muy práctico si tenemos que introducir muchosdatos. Una alternativa es utilizar un editor tipohoja de cálculoal que podemos acce-der con la funcióndata.entry(). Esta posibilidad sólo está disponible en determinadasplataformas y GUI’s, por lo que no siempre funciona. Cuando funciona, disponemosde una herramienta muy útil. La única precaución que debemosguardar es la de crearpreviamente el objeto, por ejemplo undata.frame, antes de introducir los datos en éldesde el editor. La secuencia de instrucciones en Windows podría ser la siguientedatos<-data.frame()Edit/Data editor...Con la primera instrucción creamos undata.framevacío llamadodatos. Luego vamosal menúEdit/Data editor.... Nos saldrá una ventana en la que nos pedirán el nombredel objeto a editar. Deberemos introducir el nombre, en estecasodatos. Tras esta ope-

Page 26: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

26 CAPÍTULO 4. GESTIÓN DE OBJETOS Y FICHEROS

ración, se abre una rejilla de filas y columnas en las que podremos introducir nombresde variables (haciendo clic con el botón izquierdo del ratónen la cabecera de columna)y los valores que correspondan.Tras concluir la edición, cerramos la ventana haciendo clicsobre el aspa de la esqui-na superior derecha. Desde ese momento, podemos ver el contenido deldata.frametecleandodatos.

4.2. Salida de información de R

Como es lógico, parte de la información que obtengamos con R alo largo de nuestroanálisis (valores de estadísticos, gráficos,...) querremos llevarla fuera para incorporarlaa alguna aplicación que nos permita editarla (por lo generalun procesador de texto).En este apartado veremos algunas funciones que nos van a permitir llevar a cabo estasoperaciones.

4.2.1. Exportación de gráficos

En un apartado anterior hemos visto cómo generar un gráfico con la funciónplot().Si quisiéramos exportarlo, podríamos hacerlo con la función dev2bitmap(), que trans-forma el contenido de la pantalla X11 activa en una imagen en formatobitmap. Loúnico que habría que hacer es decidir con qué nombre quiero guardar el gráfico y te-cleardev2bitmap("GráficoCars", res=300)con esta función guardamos el gráfico con el nombre deGráficoCarsy con una resolu-ción (resde 300 puntos por pulgada. Por supuesto, la resolución puedemodificarse. Elfichero gráfico se guarda en el directorio de trabajo, a no ser que en el nombre (que debeir entrecomillado) se indique lo contrario. Por ejemplo,dev2bitmap(”/home/pablo/GráficoCars”, res=150), guardaría el gráfico (siempre que tengamos permiso de escritura) en el di-rectorio/home/pablo. En este caso, lo hará con una resolución de 150 ppp.

En Linux es muy habitual manejar ficheros gráficos en formato PS (Postscript).Para exportar el gráfico anterior en este formato habría que introducir la ordendev.print(postscript)lo que genera un fichero llamadoRplots.psen la carpeta/directorio de trabajo. Con unvisor PS podremos comprobar que el gráfico es realmente el quenos interesa. Posterior-mente deberemos cambiar inmediatamente el nombre del fichero por uno que nos re-cuerde qué gráfico contiene, porque la próxima vez que ejecutemosdev.print(postscript)se generará un nuevo ficheroRplots.psque borrará el contenido del anterior. Como pue-de apreciarse, este método resulta un poco lioso y arriesgado, de modo que lo habitualserá exportar el gráfico con un nombre ya definido. Esto puede hacerse con la opciónfile. Así, si queremos guardar el fichero postscript con el nombreGrafico1, podríamostecleardev.print(postscript, file="Grafico1")

En la versión de Windows podemos acceder al menú para guardarel gráfico sólocon hacer clic con el botón derecho del ratón sobre la ventanagráfica. Entonces nosaparecen una serie de opciones y formatos para elegir.

Page 27: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

4.3. MANIPULACIÓN DEDATA.FRAMES 27

4.2.2. Exportación de textos

En muchos casos querremos exportar la información obtenidamediante análisisestadísticos y que R nos presenta por pantalla. Por ejemplo,el resultado de la funciónsummary(), o de un análisis de regresión entre dos variables. Para ellodisponemos dela funciónsink(). Esta función lo que hace es dirigir la salida de una orden introducidaen R a un fichero de texto cuyo nombre debemos incluir en la primera llamada a lafunción. Tras introducirsink(), todo lo que hagamos en R (salvo gráficos) se almace-nará en el fichero externo sin llegar a presentarse por pantalla. Obviamente, hay quedecirle a R cuándo queremos dejar de extaer información. Esolo haremos con un nuevallamada asink(). A continuación se presenta un ejemplo de utilización de esta funciónsink(“resultados")str(cars)summary(cars)cor(cars)sink()Si exploramos el directorio de trabajo veremos que existe unnuevo fichero, de nombreresultados, que es el nombre que hemos introducido entrecomillado al llamar a la fun-ción. Si lo abrimos con un editor de texto confirmaremos que contiene la informaciónesperada, en este caso, acerca de la estructura, estadísticas básicas y matriz de corre-laciones deldata.frame cars. Como hemos cerrado la exportación de resultados sonsink(), los resultados de las operaciones que hagamos en adelante yque tengan salida,se presentarán en la pantalla. Es muy importante no olvidarse de cerrar la exportación.De lo contrario iremos llenando el fichero de resultados indeseados.

Cuando queramos exportar undata.framecontenido en nuestro espacio de trabajo,podremos hacerlo con la funciónwrite.table(). La siguiente orden exportaría elda-ta.frame carsal ficherococheswrite.table(cars, “coches")

4.3. Manipulación dedata.frames

Como hemos comentado anteriormente, losdata.frameson un tipo de objeto fun-damental en R. La mayor parte de los datos que queramos analizar estadísticamenteestarán almacenados en forma dedata.frameya que, por lo general, tendremos una se-rie de variables numéricas y otras que no lo serán. Nada impide que en undata.frametodas las variables sean de un solo tipo. Cuando todas son numéricas, eldata.framepuede transformarse en unamatriz, que es otro tipo de objetos presentes en R.

Se entiende, por tanto, que sea imprescindible conocer las técnicas de manipulaciónbásicas de losdata.frame. En unas ocasiones querremos extraer información de ellos;en otras, eliminar o añadir variables; seleccionar datos;.. . En los siguientes apartadosveremos cómo hacer algunas de estas operaciones.

Para los ejemplos de esta sección utilizaremos los datos contenidos en el ficheroresultados académicosque se adjunta con el CD.Para cargar esos datos, es recomendable copiar el fichero en nuestro directorio de tra-bajo. Entonces, sólo con teclear

Page 28: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

28 CAPÍTULO 4. GESTIÓN DE OBJETOS Y FICHEROS

resultados<-read.table(resultados.txt",sep=",",header=T)tendremos en nuestroworkspaceel data.frame resultados.Como se puede apreciar, en la instrucción le indicamos aread.tableque el fichero esde tipodelimitado por comas(sep=","

) y que la primera fila contiene el nombre de las variables(header=T). Como estees eldata.frameque vamos a utilizar más a menudo, es una buena idea colocarloen laruta de búsqueda conattach(resultados), de esa manera podremos referirnos a las va-riables sin necesidad de indicar a R continuamente que se encuentran en eldata.frameresultados. Una vez cargados los datos es conveniente estudiar su estructura constr()str(resultados)‘data.frame’: 4838 obs. of 9 variables:$ Evaluacion: Factor w/ 4 levels "1","2","F","N": 4 3 3 2 2 3 3 32 3 ...$ Curso : num NA 1 2 1 1 1 1 2 2 1 ...$ B : num NA 0 0 0 0 0 0 0 0 0 ...$ IN : num NA 0 0 0 0 0 0 0 0 0 ...$ NT : num NA 0 0 0 1 1 1 1 1 1 ...$ SB : num NA 9 9 9 8 8 8 8 8 8 ...$ SF : num NA 0 0 0 0 0 0 0 0 0 ...$ Año : Factor w/ 9 levels "1994","1995",..: 9 5 6 8 5 7 7 5 6 5 ...$ Alumno : Factor w/ 4838 levels "1","10","100",..: 4838 4265 374 1973 2200 24312593 2598 33103311 ...

4.3.1. Selección de variables

Ya sabemos cómo aplicar una función a una variable de undata.frame. Por ejemplo,length(resultados$NT)nos proporcionará el número de valores (incluidos los perdi-dos) que tiene la variableNT (número de Notables). Sin embargo, hay otras manerasequivalentes de obtener el mismo resultado. Entre otras, las siguienteslength(resultados[,6])length(resultados[[6]])length(NT)como puede verse, en los dos primeros casos hemos sustituidoel nombre de la variable(NT) por el número de orden que ocupa en eldata.frame(el notablees la variable nú-mero 6). En el tercer caso hemos obviado la referencia al nombre deldata.frame; estosólo funcionará siempre y cuando antes lo hayamos colocado en la ruta de búsquedaconattach().

4.3.2. Extracción de variables

En ocasiones el fichero de datos original tiene más variablesde las que nos interesanpara nuestro análisis. En esos casos, puede interesarnos crear un nuevodata.frameenel que sólo aparezcan las variables que realmente vayamos a necesitar. Esta operaciónpuede realizarse con la funciónsubset(). Esta es una función muy útil y la estudiaremostambién en otra sección.

Page 29: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

4.3. MANIPULACIÓN DEDATA.FRAMES 29

Para extraer variables hay que indicar a la función el nombredeldata.framey las varia-bles que deseamos extraer. Como queremos generar undata.framenuevo, deberemosrealizar una operación de asignación. Por ejemplo, para crear un data.framellama-do fracasoescolarcon las variablesAño, Evaluacion, Cursoe IN deberíamos teclearfracasoescolar<-subset(resultados,select=c(8,1,2,4)). Si solicitamos a R la estructuradel nuevodata.frameconstr(fracasoescolar)veremos lo siguiente:‘data.frame’: 4838 obs. of 4 variables:$ Año : Factor w/ 8 levels "1994","1995",..: 5 6 8 5 7 7 5 6 5 6 ...$ Evaluacion: Factor w/ 3 levels "1","2","F": 3 3 2 2 3 3 3 2 3 1 ...$ Curso : num 1 2 1 1 1 1 2 2 1 2 ...$ IN : num 0 0 0 0 0 0 0 0 0 0 ...

Como se ve, han desaparecido las variables no deseadas y se han seleccionado lasque queremos, respetando el orden en el que se han introducido en la funciónsubset().

Vamos a estudiar un poco en detalle cómo se indica qué variables se quieren extraer.Esto de hace con el argumentoselect. En el ejemplo hemos tecleadoselect=c(8,1,2,4).Esec(8,1,2,4)indica a R queconcatenelas variables que ocupan el octavo, primero,segundo y cuarto lugar. Lac que precede al paréntesis es imprescindible y se utiliza enR siempre que se quiere crear lo que se llama unvector.

En lugar de número de orden, podríamos haber utilizado el nombre de las variables,asífracasoescolar<-subset(resultados,select=c(Año,Evaluacion,Curso,IN)habría producido el mismo resultado.

En ocasiones son más las variables que quiero extraer que lasque deseo descartar.En esos casos es más conveniente utilizar otra forma de selección. Por ejemplofracasoescolar<-subset(resultados,select=-c(B,NT,SB)incluiría en eldata.frame fracasoescolartodas las notasmenos(como le indica el signo- delante del operador de concatenación) el B, el NT y el SB.

Si, por casualidad, las variables a extraer son consecutivas, podríamos seleccionar-las en bloque. Así,probatinas<-subset(resultados,select=(1:5))crearía undata.frameen el que se incluirían las primeras cinco variables. Nóteseque,en este caso, no se introduce la concatenación; R entiende los dos puntos entre el 1 yel 5 comodesde la uno a la cinco, ambas inclusive.

4.3.3. Selección de casos

Al igual que hemos seleccionado variables para aplicarles procedimientos estadísti-cos, también podemos seleccionar casos para aplicarles funciones. Por lo general, estaselección se basará en el cumplimiento de determinadas condiciones. Los operadoreshabituales en las expresiones condicionales son

1. ==, igual a

2. >=, mayor o igual a

3. <=, menor o igual a

Page 30: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

30 CAPÍTULO 4. GESTIÓN DE OBJETOS Y FICHEROS

4. !=, diferente a

5. &, y

6. |, o

En nuestrodata.framesobre resultados académicos se almacenan datos correspondien-tes a varios cursos escolares. En alguna ocasión, seguro quequerremos conocer esta-dísticas relativas a un año en concreto. Si quisiéramos conocer la mediana del númerode insuficientes en el año 1999, podríamos introducir la siguiente ordenmedian(IN[Año==1999])la condición de selección se indica entre corchetes. En estecaso se dice:coge los re-gistros correspondientes a 1999, fíjate en la variable IN y calcula su mediana1.

Las condiciones de selección se pueden anidar. Por ejemplo,si queremos analizarsólo la evaluación final, escribiríamosmedian(IN[Año==1999&Evaluación=="F"])En muchas ocasiones nos interesará (o, incluso, será preciso) eliminar los valores per-didos para efectuar un análisis. Por ejemplo, la funciónmedian()no funciona si existenNA’sen la variable. En muchas ocasiones podemos remediar el problema introducien-do la opciónna.rm=T en la función como vemos a continuación.median(IN)[1] NAmedian(IN,na.rm=T)[1] 2En el primer caso la función no actúa correctamente; en el segundo, sí.

4.3.4. Extracción de casos

Esta es otra de las operaciones básicas del análisis estadístico, especialmente cuan-do tenemos ficheros de datos muy grandes.

Como casi todo en R, hay varias maneras de llevar a cabo tal selección. Una deellas es mediante la funciónsubset(). En este caso introduciremos una condición queafecta a los registros y no a las variables. Por ejemplo, paraseleccionar alumnos/as conmás de 3 insuficientes deberíamos proceder de la siguiente maneragranfracasoescolar<-subset(resultados,IN>3)en este caso, a continuación del nombre deldata.framese introduce el nombre de lavariable, y la condición de selección. Hay que hacer notar que la condición de igualdadse indica con doble signo igual (==). Para ver el resultado, utilizaremos de nuevostr()str(granfracasoescolar)‘data.frame’: 1581 obs. of 9 variables:$ Evaluacion: Factor w/ 3 levels "1","2","F": 2 1 2 3 1 2 3 3 3 2 ...$ Curso : num 2 1 1 2 1 2 1 2 1 1 ...$ B : num 0 0 0 0 0 0 0 0 0 0 ...$ IN : num 0 0 0 0 0 0 0 0 0 0 ...$ NT : num 3 3 3 3 3 3 3 3 3 3 ...

1Como hemos hecho previamenteattach(resultados), podemos referirnos directamente aIN . De lo con-trario, deberíamos haber tecleadoresultados$IN

Page 31: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

4.3. MANIPULACIÓN DEDATA.FRAMES 31

$ SB : num 6 6 6 6 6 6 6 6 6 6 ...$ SF : num 0 0 0 0 0 0 0 0 0 0 ...$ Año : Factor w/ 8 levels "1994","1995",..: 5 5 8 7 5 8 5 7 6 7 ...$ Alumno : Factor w/ 4838 levels "1","2","3","4",..: 3117 3208 2692 3834 3619 38964024 4188 2693 3835 ...Podemos ver que el nuevodata.framesigue teniendo las mismas 9 variables pero elnúmero de casos se ha reducido de 4838 a 1581.

En muchas ocasiones la condición de selección es múltiple. En ese caso no hay másque encadenarlas con el signo& . Por ejemplo, para seleccionar el alumnado con másde tres notables y con tres bienes habría que teclearselección<-subset(resultados,NT>3 & B==3).Una manera menos intuitiva de conseguir el mismo resultado es la siguienteselección<-resultados[resultados$NT>3& resultados$B==3 ]

Combinando las dos posibilidades estudiadas anteriormente, se puede realizar unaextracción simultanea de variables y casos. Así, para crearundata.frameque contengasólo el número de caso y el número de insuficientes del alumnado correspondiente alaño 1998 podríamos teclearotraseleccion<-subset(resultados,Año==1998,select=c(Alumno,IN))

En alguna ocasión puede interesarnos eliminar del análisistodos los datos en losque haya algún valor perdido. Como veremos, esta puede ser una medida extrema yaque hay funciones en R que nos permiten ignorar los casos con valores perdidos paralas variables implicadas sin necesidad de eliminarlas deldata.frame(ver la sección deEstadística básica). En cualquier caso, si quisiéramos hacerlo, podríamos teclearsinNA<-na.omit(resultados)lo que crearía un nuevodata.frameen el que encontraremos sólo los casos completos.

4.3.5. Introducción de variables

Hay dos situaciones que pueden hacer necesaria la entrada denuevas variables enundata.frame.

1. cuando deseamos obtener una nueva variable calculada a partir de variables yacontenidas en eldata.frame

2. cuando necesitamos actualizar los datos que teníamos

El primer problema es de naturaleza matemática; el segundo es un problema más biende edición. Veamos cómo podemos afrontar ambas situaciones.

Añadir variables calculadas a undata.frame

Resulta bastante sencillo llevar a cabo esta operación. Supongamos que quisiéra-mos introducir en nuestrodata.frame resultadosun índice de resultados académicosdel estilo

indice= (NT +SB/IN +SF+B+NT+SB)∗100

Para llevarlo a cabo deberíamos teclear la siguiente ordenresultados$indice<-(NT+SB)/(IN+SF+B+NT+SB)*100

Page 32: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

32 CAPÍTULO 4. GESTIÓN DE OBJETOS Y FICHEROS

que viene a decircalcula la suma de notables y sobresalientes, divídela entre el núme-ro total de notas, multiplica el resultado por cien y colócalo en la variable que llamoindice en el data.frame resultados. (Nótese que, de nuevo, presuponemos que elda-ta.frame resultadosestá en la ruta de búsqueda. De lo contario, no podríamos llamardirectamente a las variables como hemos hecho en la orden anterior).Como vemos, el problema se reduce a una operación de asignación; cuestión que yahemos analizado anteriormente. El resultado sería el siguientestr(resultados)‘data.frame’: 4838 obs. of 10 variables:$ Evaluacion: Factor w/ 3 levels "1","2","F": 3 3 2 2 3 3 3 2 3 1 ...$ Curso : num 1 2 1 1 1 1 2 2 1 2 ...$ B : num 0 0 0 0 0 0 0 0 0 0 ...$ IN : num 0 0 0 0 0 0 0 0 0 0 ...$ NT : num 0 0 0 1 1 1 1 1 1 1 ...$ SB : num 9 9 9 8 8 8 8 8 8 8 ...$ SF : num 0 0 0 0 0 0 0 0 0 0 ...$ Año : Factor w/ 8 levels "1994","1995",..: 5 6 8 5 7 7 5 6 5 6 ...$ Alumno : Factor w/ 4838 levels "1","2","3","4",..: 4838 1334 2774 2979 3186 33313336 3978 3979 2607 ...$ indice : num 100 100 100 100 100 100 100 100 100 100 ...como podemos observar, en eldata.frame resultadosaparece en último lugar la nuevavariableindice.

Incorporación de nuevas variables

Puede ocurrir que en un momento determinado de nuestra investigación necesite-mos añadir alguna variable a nuestros registros. Como hemosdicho antes, esto es másbien un problema de edición y, por lo general, resulta mejor idea resolverlo fuera deR e incorporar el nuevo conjunto de datos por los medios de importación que ya he-mos estudiado anteriormente. Sin embargo, vamos a ver algunas maneras de resolverla cuestión dentro de R.Si tenemos dosdata.framescon uno o varios campos (utilizando la terminología de lasbases de datos) en común, podemos utilizar la funciónmerge()para incorporar campos(variables) de uno a otro. Como siempre que se desea enlazar dos tablas, debemos in-dicar sus nombres, y qué campos tienen en común.Supongamos que tenemos dosdata.framecomo los siguientesenfeNombre Enero Febrero1 María 10 202 José 20 103 Sara 30 40maNombre Marzo1 María 132 José 453 Sara 32

Page 33: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

4.3. MANIPULACIÓN DEDATA.FRAMES 33

enfealmacena los puntos acumulados por tres alumnos/as en los meses de enero y fe-brero.maalmacena los que han almacenado,los mismos alumnosdurante marzo. Paraañadir los datos de marzo a los de enero y febrero deberíamos teclearmerge(enfe,ma,by.x="Nombre",by.y="Nombre")el resultado seríaNombre Enero Febrero Marzo1 José 20 10 452 María 10 20 133 Sara 30 40 32

Como se ve, el resultado es el deseado. En este caso nos ha parecido convenientecrear un nuevodata.frame(mediante una asignación) con los datos de los tres meses. Siquisiéramos añadir la variable a undata.frameexistente sin crear uno nuevo, lo únicoque deberíamos hacer es asignar el resultado de la funciónmergea dichodata.frame.En este caso,enfe<- merge(enfe,ma,by.x="Nombre",by.y="Nombre")añadiría los datos de marzo aldata.frame enfe.En muchas ocasiones, losdata.framesa unir no tienen exactamente los mismos regis-tros. En el caso anterior, por ejemplo, en el mes de marzo podría haberse incorporadoalgún alumno nuevo. Para que le resultado de la unión recoja todos los registros conte-nidos en uno y otrodata.framedebemos modificar un poco la ordenmerge(enfe,ma,by.x="Nombre",by.y="Nombre",all.x=T,all.y=T)con esosall.x=T y all.y=T (la T hace referencia al inglésTRUE, VERDAD) le decimosque incorpore todos los casos (all) del data.frame x(el que ponemos en primer lugar),y también deldata.frame y. Como es natural, en este caso se completarán con NA’s losvalores de las variables para los que no tengamos datos.Hay que tener en cuenta que sin esos dos argumentos, sólo los casos comunes a ambosdata.frameserían seleccionados.Finalmente, si sólo quisiéramos considerar los casos incluidos en uno de losdata.frame,deberíamos indicarlo en la orden. Por ejemplo,merge(enfe,ma,by.x="Nombre",by.y="Nombre",all.y=T)daría como resultado la unión considerando sólo los alumnospresentes en el mes demarzo, que es eldata.frame y.

4.3.6. Incorporación de registros

Vamos a considerar ahora la posibilidad de añadir a undata.framenuevos registrosde las mismas variables. En el apartado anterior hemos vistoque la funciónmerge()permitía incorporar casos nuevos cuando añadíamos variables a undata.frame. Sinembargo, en ese caso, los nuevos registros no presentaban valores para las variablesprevias. En el caso de que sí lo hicieran, los valores de los registros nuevos no seincorporarían a la variable deldata.frameprevio sino que la variable se duplicaría. Porlo tanto, para añadir registros a undata.frameutilizaremos otra función:rbind().

Supongamos que aldataframe enfecon el que trabajábamos antes queremos aña-dirle los casos contenidos en este otro llamadonuevoNombre Enero Febrero Marzo

Page 34: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

34 CAPÍTULO 4. GESTIÓN DE OBJETOS Y FICHEROS

1 Manuel 45 1 142 Aurora 10 2 323 Jorge 2 4 20Si ejecutamosunion<-rbind(enfe,nuevo), conseguiremos nuestro cometido. El resul-tado será:Nombre Enero Febrero Marzo1 José 20 10 452 María 10 20 133 Sara 30 40 324 Manuel 45 1 145 Aurora 10 2 326 Jorge 2 4 20Hay que hacer notar que no es preciso que el orden de las variables en los dosda-ta.framesea el mismo, pero sí el nombre de las mismas. Por otro lado, nohay problemaen unirdata.framesen los que las variables sean de tipo numérico o de carácter, pero sialguna de ellas es un factor, de todas las clases contenidas en el data.frameque vamosa añadir, sólo las que estén presentes en eldata.framede destino serán reconocidas.Todas las demás serán ignoradas y transformadas en NA’s con la consiguiente pérdi-da de información. Por lo tanto, si nuestrosdata.framescontienen factores, puede serconveniente transformarlos en vectores (con la funciónas.vector()) antes de procedera incorporar datos de uno a otro. Otra posibilidad sería almacenar las variables de tipocarácter como tales (sin transformarlas en factores) al leer ficheros externos. Para ellohabría que añadir la opciónas.is=Ten la funciónread.table().

4.3.7. Ordenación de variables

En algunas ocasiones es necesario disponer los casos en orden ascendente del valorde una variable. En R podemos llevar a cabo esta ordenación con la funciónsort(). Así,sort(cars$speed)nos devolverá un vector con los valores de la variable de los casosordenados de menor a mayor.La funciónorder() también está relacionada con las operaciones de ordenaciónde va-riables. En este caso, la función nos devuelve un vector que nos indica en qué posiciónse encuentra el caso con el valor mínimo, el segundo más bajo,el tercero, . . . , hastallegar a indicar la posición que ocupa el valor máximo. Obviamente, si la variable estáen orden ascendente,order() proporcionará el vector(1,2,3,....,n)siendon el númerode casos.

Page 35: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Capítulo 5

Estadística descriptiva

En este capítulo veremos cómo realizar en R una serie de análisis estadísticos bási-cos. Se da por supuesto que el lector conoce el cometido y significado de todos ellos,por lo que las referencias en este sentido serán reducidas.

5.1. Análisis exploratorio de los datos

En este apartado vamos a considerar algunas de las posibilidades que ofrece R pararecabar información básica de la naturaleza de las variables que deseamos analizar.Además estudiaremos algunos procedimientos gráficos: el gráfico stem and leaf, elboxploty el histograma.

5.1.1. Medidas características

Como dijimos anteriormente, la funciónsummary()proporciona información bá-sica acerca de una variable. También acepta como argumento un data.frame, en cuyocaso la salida informará acerca de todas las variables contenidas en el mismo.Otras funciones nos dan medidas estadísticas de forma aislada. Ya comentamos algunasde ellas (mean(),median(),max(),min(),sum(), var()). Otras sonrange(), que nos mues-tra los valores mínimo y máximo, pero no el rango;sd(), que devuelve la desviaciónestandard; yquantile(), que nos va a permitir dividir la variable en partes iguales paraobtener los cuartiles, deciles o percentiles. Veamos su funcionamiento para la variableINquantile(resultados$IN,probs=1:10/10,na.rm=T)

10 %20 %30 %40 %50 %60 %70 %80 %90 %100 %0 0 0 1 2 3 4 5 7 10

Como vemos, con la función hemos obtenido los diez deciles dela variable.Sin embargo, no existe ninguna función que nos proporcione un listado o una tabla

con todas las medidas estadísticas que puedan interesarnos. De lo que sí dispone R (por

35

Page 36: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

36 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

ser en definitiva un lenguaje de programación) es la posibilidad de editar personalmen-te operaciones aritméticas y de crear funciones que realicen determinadas operaciones.En el siguiente ejemplo se puede ver cómo se crea una función que nos devuelva lamedia, suma, desviación estandard, variancia y rango de unavariable. Una vez creada,podremos aplicarla a cualquier variable.estadisticos<-function(x){+ cat("\n","La media es",mean(x)," \n")+ cat("\n","La suma es",sum(x)," \n")+ cat("\n","La desviacion estandard es",sd(x),"\n")+ cat("\n","La variancia es",var(x)," \n")+ cat("\n","El rango es","[",range(x),"]"," \n") + } 1

Las funciones deben tener un nombre, en este casoestadisticos, y su cuerpo vaencerrado entre llaves ({}) . En el ejemplo, la función es unasucesión de funcionescat()(que encadena secuencias decaracteres) y las funciones estadísticas que queremosobtener. Por supuesto, pueden añadir todas las que deseen. ..Una vez creada, se puede aplicar a cualquier variable; por ejemplocars$speed. Así,estadisticos(cars$speed)devuelveLa media es 15.4La suma es 770La desviacion estandard es 5.287644La variancia es 27.95918El rango es [ 4 25 ]Esta función estará disponible en el espacio de trabajo siempre y cuando sea guardada(por ejemplo, al abandonar R, comunicando que deseamos guardar las modificaciones)y no sea borrada del mismo (conrm(estadisticos).

Si queremos que la función esté disponible en cualquier otroespacio de trabajo,podemos introducirla en el fichero de funciones de R. Otra posibilidad sería crear unpaquete con nuestras propias funciones, pero esta posibilidad de momento no vamos aconsiderarla.

Una de las ventajas de R es que essoftware libre, de modo que se distribuye conel código fuente en formato editable. De esta manera, podemos modificar el programasegún nuestros intereses. En este caso, lo que nosotros vamos a hacer es introducir unafunción nueva, creada por nosotros mismos, en el paquetebasede R.Para ello (en Linux) no tenemos más que abrir el fichero/usr/lib/R/library/base/R/base(la localización puede variar en función de la distribuciónde Linux) con cualquier edi-tor de texto y teclear la función tal y como lo hemos hecho en R.Por supuesto, debemostener permiso de escritura sobre el fichero, cuyo propietario será por defectoroot. Alguardar los cambios, la nueva función estará disponible siempre que arranquemos R yaque el paquetebasese carga automáticamente.

Como hemos adelantado anteriormente, en R también podemos construir expresio-nes algebráicas que nos permiten calcular medidas no implementadas en los paquetes

1El signo + que aparece en el texto no se introduce por teclado sino que es añadido automáticamente porR cuando en la linea de comandos pulsamos la teclaIntro para añadir un salto de linea

Page 37: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.1. ANÁLISIS EXPLORATORIO DE LOS DATOS 37

con los que trabajemos. Por ejemplo, si necesitamos conocerla media geométrica deuna variable, sabiendo que se define como

G = n√

x1 ·x2 . . . ·xn

podemos introducir (en el caso decars$dist)prod(cars$dist)̂ (1/length(cars$dist))dondeprod() es la función que calcula el producto de los elementos de un vector ylength()devuelve el número de elementos de un vector.Por supuesto, si vamos a requerir a menudo la media geométrica, podemos construiruna función que acepte como argumento cualquier variable. En este caso podría sermedia.geometrica<-function(x) {prod(x) ^(1/length(x)) }Así,media.geometrica(cars$dist)devolvería[1] 34.32615

5.1.2. El gráficostem and leaf

Este gráfico constituye una manera rápida y efectiva de aproximarnos a la distri-bución de frecuencias de una variable. La función que debemos utilizar esstem(). Porejemplostem(cars$speed)da la siguiente salida por pantallaThe decimal point is at the |

4 | 006 | 008 | 0010 | 0000012 | 0000000014 | 000000016 | 0000018 | 000000020 | 0000022 | 0024 | 00000

Podemos expandir la escala (vemos que los intervalos en los que se ha dividido lavariable van de dos en dos) introduciendo la opciónscaleen la función. A continuaciónvemos el resultadostem(cars$speed, scale=3)The decimal point is at the |

4 | 005 |6 |

Page 38: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

38 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

7 | 008 | 09 | 010 | 00011 | 0012 | 000013 | 000014 | 000015 | 00016 | 0017 | 00018 | 000019 | 00020 | 0000021 |22 | 023 | 024 | 0000 25 |0

5.1.3. El gráficoboxplot

Este es uno de los clásicos del análisis exploratorio. Permite hacernos una idea dela distribución de la variable a partir de los cuartiles y losvalores extremos. Existenmuchas posibilidades para personalizar y mejrar el resultado que genera la funciónboxplot()sin opciones, pero serán tratadas más en profundidad en el capítulo dedicadoa los procedimientos gráficos. De momento veremos sólo su usobásico. Para obtenerel boxplotde la variabledist deldata.frame carshabría que teclear simplementeboxplot(cars$dist)obteniéndose la Figura5.1. También se puede representar más de una variable en elmismo gráfico. Para ello no hay más que introducirlas como argumentos de la función.A continuación vemos cómo obtener losboxplot de las variablesIN,SF,B,NT,SBdeldata.frame resultadosboxplot(resultados$IN,resultados$SF,resultados$B,resultados$NT,

resultados$SB)(recordar que podríamos evitarnos teclear continuamente la referencia aresultadossipreviamente hemos hechoattach(resultados))en la pantalla gráfica aparecerá la Figura5.2. En ella pueden observarse todos loselementos típicos de los diagramas de caja, como los valoresextremos y los valoresatípicos. También queda patente que la figura merece un retoque profundo, pero esoaprenderemos a hacerlo posteriormente.

Puede ser muy interesante que, en elboxplot, la anchura de las cajas sea variable enfunción del número de casos representado en cada categoría.Para ello hay que utilizarel parámetrowidth, que permite introducir un vector de anchuras. En nuestro caso laanchura dependerá del número deIN,SF,B,NTy SBpresentes en eldata.frame. Paraconseguir la Figura5.3hemos hecho lo siguientea<-c(sum(IN,na.rm=T),sum(SF,na.rm=T),sum(B,na.rm=T),

Page 39: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.1. ANÁLISIS EXPLORATORIO DE LOS DATOS 39

020

4060

8010

012

0

Figura 5.1: Diagrama de caja con la funciónboxplot()

1 2 3 4 5

02

46

810

Figura 5.2: Varios diagramas de caja con la funciónboxplot()

Page 40: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

40 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

sum(NT,na.rm=T),sum(SB,na.rm=T))boxplot(IN,SF,B,NT,IN,width=a)Con la primera instrucción creamos el vector de anchuras, que es resulta de sumar elnúmero de IN,SF,B . . . descontando los valores perdidos. En la segunda introducimosese vector en el argumentowidthde la función.

5.1.4. El histograma

El histograma es uno de los gráficos estadísticos más populares, y es uno de loshabituales en el análisis exploratorio de las variables porque conocer la distribución defrecuencias de las mismas es una cuestión realmente importante.Ya hemos visto antes cómo usar la funciónhist()sin más argumento que la serie de da-tos a representar para obtener la Figura3.2. Ahora vamos a ver cómo controlar algunasde las cuestiones básicas en el diseño (no tanto en la presentación, cosa que veremosen el capítulo final) del histograma.

Una cuestión importante (más bien, importantísima) es la definición de los interva-los de las clases en que vamos a fragmentar la variable. Eso loharemos con el argu-mentobreaks. A continuación vemos cómo se utiliza con un ejemplo que da lugar a laFigura5.4. hist(cars$speed,labels=T,breaks=0:9*3,col=3)hist(cars$speed,labels=T,breaks=0:9*4,col=3)hist(cars$speed,labels=T,breaks=0:14*2,col=3)Con la primera instrucción creamos el histograma de la izquierda. Como vemos, loslímites de clase son 0, 3, 6, 9,. . . ,27. Para evitarnos poner todos esos valores, introdu-cimos la expresión0:9*3, que multiplica por 3 los enteros que van del 0 al 9 (ambosincluidos).Con la segunda obtenemos el histograma del medio. En este caso los intervalos tienenuna amplitud de 4 unidades y el rango va desde 0 a 36.Finalmente, con la tercera instrucción obtenemos la figura de la derecha, en la que lasclases van de dos en dos desde el 0 hasta el 28.En todos los casos, con el argumentocol=3hacemos que los histograms sean de colorverde. Conlabels=T hacemos que se impriman los valores de frecuencia asociadosacada clase.

Como puede observarse, la definición de las clases determinala forma del histo-grama. Veremos más adelante cómo evitar este problema.

Podemos hacer tanto histogramas de frecuencias absolutas como de frecuenciasrelativas. Por defecto, son del primer tipo. Para conseguirlos segundos no hay más queincluir el argumentofreq=F. Así,hist(cars$speed,labels=T,col=2,freq=F)genera la Figura5.5. En ella se aprecia que el eje de ordenadas está etiquetado comodensityy no comofrequency.

5.1.5. Contraste de normalidad

Asegurarnos de que una variable se ajusta a la distribución normal es un requisitoprevio a la aplicación de muchos procedimientos estadísticos y por ello debe realizarse

Page 41: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.1. ANÁLISIS EXPLORATORIO DE LOS DATOS 41

1 2 3 4 5

02

46

810

Figura 5.3: Diagramas de caja de anchura variable con el argumentowidth

Histogram of cars$speed

cars$speed

Fre

quen

cy

0 5 10 15 20 25

02

46

810

0

2

4

9

11

9

8

6

1

Histogram of cars$speed

cars$speed

Fre

quen

cy

0 5 10 15 20 25 30 35

05

1015

23

10

13

15

6

10 0

Histogram of cars$speed

cars$speed

Fre

quen

cy

0 5 10 15 20 25

02

46

8

0

2

0

3

4

6

8

5

7

8

1

5

1

0

Figura 5.4: Modificación de las clases del histograma conbreaks

Page 42: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

42 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

Histogram of cars$speed

cars$speed

Den

sity

0 5 10 15 20 25

0.00

0.01

0.02

0.03

0.04

0.05

0.06

0.07

0.008

0.028

0.068 0.068

0.028

Figura 5.5: Frecuencias relativas confreq=F

en las primeras fases de cualquier análisis estadístico. Vamos a considerar dos posiblesaproximaciones al problema: el método gráfico y el test de Shapiro-Wilk .

Método gráfico

Existen varias posibilidades para llevar a cabo este análisis. La primera y más clá-sica es la representación del histograma de frecuencias de la variable (por ejemplo,Figura5.6)2.

Sin embargo, el histograma presenta por lo general el problema de la elección delnúmero y amplitud de las clases. Estos problemas se resuelven si, en lugar de repre-sentar el histogrma, representamos la función de densidad de la variable. Para ello, Rdispone de la funcióndensity(). Así, tecleandoplot(density(cars$speed))se obtiene la (Figura5.7). En este caso, permite apreciar un buen ajuste de los datos ala ley normal.

Otro método gráfico es la observación del gráfico Q-Q (cuantil-cuantil) de la va-riable. En este gráfico se representan los valores observados en el eje de ordenadas ylos valores teóricos en el de las abcisas. Cuando la variablesigue una ley normal, lospuntos deben alinearse en línea recta.Para ilustrar el caso, vamos a considerar si determinado índice de resultados académi-cos (definido como una combinación lineal del número de IN,SF, B,NT y SB acumu-lados por el alumnado deldata.frame resultados) se ajusta a la distribución normal. La

2En el capítulo final se explica cómo añadir al histograma la curva normal

Page 43: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.1. ANÁLISIS EXPLORATORIO DE LOS DATOS 43

Histogram of scale(cars$speed)

scale(cars$speed)

Den

sity

−2 −1 0 1 2

0.0

0.1

0.2

0.3

0.4

Figura 5.6: Histograma con la funciónhist()

0 5 10 15 20 25 30

0.00

0.01

0.02

0.03

0.04

0.05

0.06

density(x = cars$speed)

N = 50 Bandwidth = 2.15

Den

sity

Figura 5.7: Función de densidad conplot(density())

Page 44: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

44 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

secuencia de instrucciones a introducir sería la siguienteresultados$indice<-(-2*IN)+SF+(2*B)+(3*NT)+(4*SB)qqnorm(resultados$indice)Con la primera instrucción creamos el índice y lo añadimos como una variable nueva aldata.frame resultados. Con la segunda pedimos que dibuje el gráfico Q-Q de la nuevavariable. El resultado es el de la Figura5.8. En este caso se aprecia claramente que lavariable no sigue la ley normal porque la nube de puntos no se ajusta en absoluto a unarecta. Sin embargo, en muchas ocasiones la valoración visual puede llegar a ser pro-blemática. Por ejemplo, si analizamos la misma variable seleccionando sólo los casoscorrespondientes al año 1996 (Figura5.9), vemos que no es tan fácil decidir si se ajustao no a la ley normal ya que parece haber un segmento lineal más definido.

Para estos casos es conveniente aplicar alguna prueba de inferencia no paramétricacomo el test de Shapiro-Wilk que estudiamos a continuación.

Contraste de Shapiro-Wilk

Una de las características que diferencia los métodos numéricos de los gráficos esque vamos a poder introducir un nivel de significación para aceptar o rechazar la hipó-tesis de ajuste a la distribución teórica. Para el caso concreto de la distribución normal,el test que vamos a estudiar es una de las mejores opciones quenos proporciona R. Selleva a cabo con la funciónshapiro.test()y a continuación se aplica al caso anterior conun nivel de significación del 5 %shapiro.test(resultados$indice[Año==1996])Shapiro-Wilk normality testdata: resultados$indice[Año == 1996]W = 0.9805, p-value = 0.00249Al ser la probabilidadp< 0,05, se debe rechazar la hipotesis de ajuste a la distribuciónnormal con ese nivel de significación, eliminando la duda quepodía introducir el aná-lisis meramente gráfico.

Sin embargo, aplicado a la variablecars$speed,shapiro.test(cars$speed)Shapiro-Wilk normality testdata: cars$speedW = 0.9776, p-value = 0.4576En este caso, la probabilidad asociada al estadísticow de Shapiro-Wilk (0,4576) esmayor que 0,05, por lo que se situa dentro de la zona de aceptación de la hipótesis deajuste a la ley normal. Así, el test confirma lo que parecía adelantar la representacióngráfica de la función de densidad (5.7).

Page 45: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.1. ANÁLISIS EXPLORATORIO DE LOS DATOS 45

−4 −2 0 2 4

−20

−10

010

2030

40

Normal Q−Q Plot

Theoretical Quantiles

Sam

ple

Qua

ntile

s

Figura 5.8: Gráfico Q-Q con la funciónqqnorm()

−3 −2 −1 0 1 2 3

−20

−10

010

2030

40

Normal Q−Q Plot

Theoretical Quantiles

Sam

ple

Qua

ntile

s

Figura 5.9: Otro gráfico Q-Q con la funciónqqnorm

Page 46: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

46 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

5.2. Cómo resumir la información contenida en unda-ta.frame

Desde sus inicios, la Estadística ha sido entendida como unadisciplina cuyos fun-damentos básicos eran el almacenamiento y análisis de grandes cantidades de datos. Eneste apartado vamos a estudiar cómo realizar en R lo que, aun hoy, la mayor parte de lagente considera comoestadísticas, es decir, la síntesis en forma de tablas de recuentos,frecuencias,. . . de grandes bases de datos. Para ello son fundamentales las funcionestable()y las diferentes variantes de la funciónapply().

5.2.1. Tablas de frecuencias absolutas

Estas son las tablas más básicas. Nos informan del número de casos que presentancada una de las modalidades de determinada variable. Analizaremos por separado lacreación de tablas de diferente dimensión.

Tablas unidimensionales

Estas son las más sencillas de todas. Sólo tomamos en consideración una variable.Por ejemplo, para hacer un recuento del número total de alumnos con 0,1,2, ..,10 insu-ficentes presentes en eldata.frame resultadosdeberíamos teclear simplemente (siem-pre queresultadoshaya sido puesto en ruta de búsqueda conattach())table(IN)cuyo resultado estable(IN)IN

0 1 2 3 4 5 6 7 8 9 101644703 510 410 329 321 317 225 172 113 93

En muchos casos nos interesa agrupar los casos en intervalos. Para ello, podemosutilizar la funcióncut(). Por ejemplo,cut(IN,c(-0.01,2,5,8,10))agrupará los registrosderesultadosen los intervalos definidos por los límites de clase−0,01,2,5,8,10 . Hayque hacer notar quecut(), por defecto, genera intervalos semiabiertos por abajo, demodo que para incluir en la primera clase los casos con 0 insuficientes, hay que definirun límite de clase ligeramente inferior (en este caso,−0,01).

Ahora, para tabular el número de casos que contiene cada clase podríamos utilizarla funcióntapply()de la siguiente manera:tapply(Alumno,cut(IN,c(-0.01,2,5,8,10)),length)cuyo resultado es

(-0.01,2] (2,5] (5,8] (8,10]2858 1061 715 207

Veamos con más detalle cuál es la sintaxis de la función aplicada: se le dice a R quecoja la variableAlumnoy reparta los casos en los intervalos definidos por la función

Page 47: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.2. CÓMO RESUMIR LA INFORMACIÓN CONTENIDA EN UNDATA.FRAME 47

cut()según el número deIN que tenga cada uno. Una vez hecho este reparto, se aplicala funciónlength()para ver cuál es la longitud del vector resultante, es decir,el númerode casos. En este ejemplo no podemos utilizar la funciónsum()para obtener este últimovalor, como parecería más normal, porque la variableAlumnono es de tipo numéricosino que es un factor, de modo que no se le pueden aplicar operaciones de tipo alge-bráico.Como vemos, la tabla resultante nos informa de que hay 2858 alumnos/as con 0,1 o 2insuficientes, 1061 con 3,4 o 5,. . . Sin embargo, los datos no coinciden con la primeratabla, según la cual hay 2857,1060, . . . Esta diferencia se debe a que la funcióntable()ignora por defecto los valores perdidos, perotapply() los toma en consideración y losincorpora a cada una de las clases. Como en eldata.frame resultadoshay un caso, el4838, con NA’s en casi todas las variables, la agrupación tabulada portapply()da valo-res superiores en una unidad a los que corresponden eliminando los valores perdidos.Una manera de evitar esta situación, si así nos interesa, es eliminar previamente el casoproblemático.

Tablas bidimensionales

Constituyen el ejemplo más típico de lo que entendemos por tablas de contingenciao “de referencias cruzadas” (en terminología de bases de datos). En el caso anterior,en el que estábamos interesados en el estudio de la variablenúmero de insuficientes,una tabla bidimensional podría ser la que proporcionara el reparto de la variable en losdiferentes años incluidos en eldata.frame. Para conseguir esa tabla podríamos tecleartable(Año,IN)resultando

INAño 0 1 2 3 4 5 6 7 8 9 101994 27 11 2 3 3 1 5 4 9 5 01995 69 20 21 4 14 6 7 6 4 8 41996 104 37 26 24 7 7 10 6 5 6 41997 110 64 29 19 10 4 11 7 6 4 211998 415 160 117 87 88 60 61 53 31 14 161999 383 149 129 94 69 78 81 39 30 37 182000 323 144 101 95 78 91 79 69 49 20 172001 213 118 85 84 60 74 63 41 38 19 13

En las tablas de contingencia aparecen con frecuencia una columna y una fila conlos valores totales por filas y columnas. En R no hay ninguna función que genere di-rectamente tal tipo de tabla, pero resulta bastante sencillo generarla a partir de la tablaobtenida anteriormente. Los pasos serían los siguientes:(1) tabla.normal<-table(Año,IN)(2) total.filas<-apply(tabla.normal,1,sum)(3) tabla.intermedia<-cbind(tabla.normal,total.filas)(4) total.columnas<-apply(tabla.intermedia,2,sum)(5) tabla.final<-rbind(tabla.intermedia,total.columnas)En la primera instrucción se crea la tabla original y se asigna a un objeto que llamamos

Page 48: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

48 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

tabla.normal.En la segunda, calculamos el total por filas con la funciónapply() (no confundir contapply()). A apply()debemos indicarle varias cosas. En primer lugar, el objeto sobre elque aplicar la función (en este casotabla.normal); en segundo, que se aplica por filas1; y, finalmente, la acción que queremos aplicar (en este caso,calcular la suma,sum).El resultado de la función lo asignamos al objeto que llamamos total.filas.En la tercera instrucción incorporamos a la tabla inicial, mediante la funcióncbind(),la columna de totales calculada en el paso anterior. Asignamos el nuevo objeto a unatabla llamadatabla.intermediaque no nos interesará una vez terminado el proceso.En la cuarta, calculamos el total por columnas de la tabla intermedia, que contiene yael total por filas. Lo hacemos con la funciónapply(), pero en este caso, como el cálculose efectúa por columnas y no por filas, en lugar de poner como argumento el número1,ponemos el2. También, asignamos el resultado al objeto que llamamostotal.columnas.En el último paso, incorporamos el total por columnas a la tabla intermedia concbind()para obtener latabla.final.El resultado sería:tabla.final

0 1 2 3 4 5 6 7 8 9 10 total.filas1994 27 11 2 3 3 1 5 4 9 5 0 701995 69 20 21 4 14 6 7 6 4 8 4 1631996 104 37 26 24 7 7 10 6 5 6 4 2631997 110 64 29 19 10 4 11 7 6 4 21 2851998 415 160 117 87 88 60 61 53 31 14 16 11021999 383 149 129 94 69 78 81 39 30 37 18 11072000 323 144 101 95 78 91 79 69 49 20 17 10662001 213 118 85 84 60 74 63 41 38 19 13 808total.columnas1644703 510 410 329 321 317 225 172 113 93 4837

Por supuesto, sería posible realizar la acción con una sola instrucción que reuniera lasanteriores, pero la creación demacroinstruccionesdebería reservarse a los casos en losque se tenga gran control de sus resultados.

Como este tipo de tablas es muy habitual, podría ser conveniente crear una funciónque la generase con sólo indicar qué variables queremos tabular. Un ejemplo de fun-ción que llevaría a cabo ese cometido sería la siguiente.crea.tabla<-function(x){+TF<-margin.table(x,1)+ TC<-margin.table(x,2)rbind(cbind(x,TotalFilas=TF),TotalColumnas=c(TC,sum(TC)))}Como puede apreciarse, en este caso hemos utilizado la funciónmargin(), que calculadirectamente la suma por filas o columnas de manera similar a como lo haceapply().La función se guardaría en el espacio de trabajo con el nombrecrea.tabla. Ahora sólohabría que teclearcrea.tabla(table(IN,Año))para obtener la tabla anterior.

Page 49: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.2. CÓMO RESUMIR LA INFORMACIÓN CONTENIDA EN UNDATA.FRAME 49

Del mismo modo,crea.tabla(table(Evaluacion,IN))generaría una tabla de contingencia de las variablesEvaluacióne IN con totales de filasy columnas.

Siempre que guardemos los objetos en el espacio de trabajo enel momento deabandonar R, dispondremos de la funcióncrea.tabla()al abrir de nuevo ese espacio detrabajo.Sin embargo, la función no estaría disponible al abrir cualquier otro espacio de trabajo.Para que sí lo estuviera, podemos introducir la función en elpaquetebasetal y comose explicó en el apartadoMedidas características.

Tablas multidimensionales

En las tablas multidimensionales se resume la información de más de dos varia-bles. Por supuesto, para visualizarlas en un plano bidimensional, es preciso agruparlasen dos ejes.

Supongamos que queremos conocer el número de calificacionescontenidas en nues-tra tabla de resultados académicos agrupadas por año,cursoy evaluación. Podríamosteclearftable(Año,Curso,Evaluacion)saliendo por pantalla la siguiente tabla

Evaluacion 1 2 FAño Curso1994 1 0 0 0

2 0 0 03 0 0 704 0 0 0

1995 1 0 0 02 0 0 03 0 0 1114 0 0 52

1996 1 0 0 02 0 0 273 0 0 1194 0 0 90

1997 1 0 0 92 0 0 663 0 0 1074 0 0 103

1998 1 99 100 1022 96 102 1063 95 97 844 72 76 73

Page 50: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

50 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

1999 1 103 103 1042 132 138 1333 44 82 724 65 66 65

2000 1 90 97 1002 110 120 1213 100 101 694 56 59 43

2001 1 95 97 02 146 148 03 102 102 04 58 60 0

Por supuesto, es posible agrupar alguna de las variables en clases tal y como hici-mos en las tablas bidimensionales. Así,ftable(Año,Curso,cut(SB,3))nos proporcionará una tabla con el número de sobresalientesagrupado en tres clases(cut(SB,3)) en los diferentes cursos de los años incluidos en la base de datos.

Finalmente, indicar que podemos agrupar las variables mediante expresiones cua-sialgebráicas que facilitarán la creación de tablas de dimensiones mayores. Si deseamosagrupar, por un lado,Cursoy Añoy, por otro,Evaluaciony SB. Podríamos introducirla siguiente instrucciónftable(Año+Curso~Evaluacion+SB)3

lo que generaría una tabla de cuatro dimensiones agrupadas en dos entradas.

5.2.2. Tablas con otras medidas estadísticas

Además de las tablas de recuento de casos estudiadas en el apartado anterior, eshabitual elaborar otros tipos de tablas. Las más comunes son, tal vez, las tablas defrecuencias relativas, pero también nos pueden interesar otras medidas estadísticas. Eneste apartado veremos algunas de las solcuiones que proporciona R para elaborar tablasde este tipo.

Tablas de frecuencias relativas

Para crear este tipo de tablas podemos utilizar, de nuevo, las posibilidades que ofre-ce R (y que son típicas de los sistemas UNIX) para llegar a un objetivo final mediantepasos intermedios. Veamos el procedimiento con un ejemplo.(1)tabla.inicial<-table(Año,Curso)(2)total.filas<-apply(tabla.inicial,1,sum)(3)str(tabla.inicial)(4)tabla.frecuencias.rel<-tabla.inicial[1:8,1:4]/total.filas*100(5)options(digits=4)(6)tabla.frecuencias.relCon la primera instrucción creamos una tabla bidimensional.

3La tilde se introduce con la combinación de teclas AltGr + 4

Page 51: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.2. CÓMO RESUMIR LA INFORMACIÓN CONTENIDA EN UNDATA.FRAME 51

Con la segunda, creamos el total por filas, tal y como se hizo enun apartado anterior,con la funciónapply()Con la tercera instrucción analizamos la estructura de la tabla inicial. En este casonos informa quetabla.inicial es el resultado de tabular la variableAño (que presenta8 elementos[1:8] ) y la variableCurso(que presenta 4 elementos[1:4] ). Estos datosson utilizados en la siguiente orden, que hace dividir de manera adecuada los elemen-tos detabla.inicial entre los elementos detotal.filas para generar la nueva tablata-bla.frecuencias.rel. El resultado se multiplica por 100 para obtener porcentajes. Comose puede apreciar, la estructura de la tabla inicial se incorpora a la operación algebráicaentre corchetes para efectuar la selección de los elementosde la tabla.La quinta es una instrucción símplemente para reducir el número de decimales de lasalida (por defecto,digits=7).La última orden imprime por pantalla la tabla de frecuenciasrelativas calculadas enbase al total por filas. La tabla es la siguiente

CursoAño 1 2 3 41994 0.000 0.00 100.00 0.001995 0.000 0.00 68.10 31.901996 0.000 11.44 50.42 38.141997 3.158 23.16 37.54 36.141998 27.314 27.59 25.05 20.051999 28.004 36.40 17.89 17.712000 26.923 32.93 25.33 14.822001 23.762 36.39 25.25 14.60

Afortunadamente, R nos proporciona la funciónprop.table()que nos genera direc-tamente tablas de frecuencias relativas por filas o columnas. En el caso anterior, sólodeberíamos teclearprop.table(tabla.inicial,1)*100para obtener el mismo resultado. Obsérvese que hay que multiplicar por 100 si desea-mos que la tabla muestre porcentajes ya que por defecto el resultado aparece en tantospor uno.Si hubiéramos introducido la siguiente ordenprop.table(tabla.inicial,2)*100el resultado hubiera sido una tabla de frecuencias relativas por columnas (como mandael 2 introducido como argumento de la función).

Otras tablas estadísticas

Conocemos ya la funciónsummary()y la manera de obtener otras medidas estadís-ticas de las variables incluidas en undata.frame. Por otro lado, en el apartado anteriorhemos visto cómo utilizar la funciónapply()para calcular totales por filas y columnas.En este apartado vamos a profundizar un poco más en las posibilidades de extracciónde información en forma de tablas.

Page 52: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

52 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

Cuando nos interese obtener determinado estadístico de unaserie de variables deundata.frameo una tabla bidimensional, podemos aplicar la funciónapply(). Por ejem-plo, para conocer el rango de las variablesIN,SF,B,NTy SB, podemos teclearapply(resultados[3:7],2,range,na.rm=T)la orden es ya familiar. Los corchetes seleccionan las variables que queremos analizar,el 2 ordena a la función que “trabaje” por columnas,range es la función que desea-mos aplicar a las variables, yna.rm=T indica que se omitan los valores perdidos. Elresultado es

B IN NT SB SF[1,] 0 0 0 0 0[2,] 9 10 9 10 10

La función también puede aplicarse a una tabla. Por ejemplo,podemos pedir la des-viación estandard para las diferentes modalidades de la variable IN en los diferentesaños deldata.frame resultados. La tabla que hemos llamadotabla.finalen un apartadoanterior será ahora el argumento de la funciónapply(). Este es el resultado:apply(tabla.final,2,sd,na.rm=T)

0 1 2 3 4 5 6 7 8 9 10 total.filas499.82 213.02155.81125.92101.66100.4997.8669.85 52.8034.57 28.10 1474.60

Podemos incluso hacer tablas más complejas, en las que se presente el estadísticode una variable en una relación cruzada de dos variables diferentes. Por ejemplo, po-demos querer conocer la media de insuficientes en los diferentes cursos a lo largo delos distintos años recogidos en nuestrodata.frame. Como se ve, en este caso entran enjuego tres variables. Dos de ellas,Añoy Curso, serán las entradas de la tabla y la ter-cera,IN, será el valor. Para obtener este tipo de tablas aplicaremosla funcióntapply()de la siguiente maneratapply(IN,list(Año,Curso),mean)el resultado es

1 2 3 41994 NA NA 3.09 NA1995 NA NA 3.00 1.061996 NA 1.15 2.32 1.701997 1.89 0.71 3.64 1.891998 2.11 2.68 2.90 1.491999 2.26 3.02 3.05 1.762000 2.26 3.04 3.64 2.512001 2.83 2.89 3.99 1.81

Este tipo de tablas va bastante más allá que las simples tablas de frecuencias y pro-porcionan información solicitada muy habitualmente en losestudios estadísticos. Estatabla nos dice, por ejemplo, que en 1996, la media de insuficientes en tercero fue de2.32 y que en 2001 fue de 3.99.

Page 53: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.2. CÓMO RESUMIR LA INFORMACIÓN CONTENIDA EN UNDATA.FRAME 53

5.2.3. Métodos gráficos para presentar la información contenidaen tablas

Además de las tablas, podemos utilizar diferentes gráficos para visualizar la infor-mación contenida en una base de datos. El tipo de representación dependerá del númerode variables que queramos analizar y la naturaleza de las mismas.

En apartados anteriores ya hemos presentado algunas de las funciones gráficas quepodremos aplicar con este fin (hist(), plot(), boxplot(). Por ese motivo nos centraremosen la aplicación de la funciónplot() al caso concreto de tablas.

Anteriormente hemos creado una tabla unidimensional con elnúmero de casos quepresentaban cada uno de los valores que adopta la variableIN. Podemos representargráficamente la información contenida en esa tabla con la instrucciónbarplot(table(resultados$IN))cuyo resultado es el gráfico de la Figura5.10, un gráfico de barras, que resulta unaopción muy adecuada a una variable de este tipo.

Para el caso de tablas bidimensionales podemos utilizar la funciónplot(). Por ejem-plo, si queremos representar el número de insuficientes a lo largo de los diferentes años,podemos teclearplot(table(IN,Año))que proporciona el gráfico de la Figura5.11. Este gráfico permite descubrir algunasparticularidades a primera vista, como el hecho de que durante los cuatro primerosaños haya bastantes menos registros que durante los cuatro segundos; la disminuciónprogresiva del alumnado con cero insuficientes; o la gran cantidad de alumnos quetuvieron 10 insuficientes en el año 1997.

Cuando la representación que queremos hace es de carácter multidimensional, lafunciónplot() da lugar a un gráfico más complejo. Para ilustrarlo utilizaremos los datoscontenidos en la tablaTitanicque viene con R. Ejecutando las siguientes instruccionesse obtiene la Figura5.12.El gráfico requiere mayor esfuerzo de interpretación pues serepresenta por un lado elsexo de la persona y si sobrevivió o no y, por otro, la clase de pasaje y la edad. Puedeapreciarse como la mayor mortandad afectó a los varones adultos de clase inferior yque la mayor tasa de supervivencia se dio entre las mujeres deprimera clase. Lo hemosobtenido del siguiente mododata(Titanic)plot(Titanic)Logicamente, es posible representar parte de una tabla utilizando las técnicas de se-lección que ya conocemos. Por ejemplo, para analizar la evolución de la media deinsuficientes en tercero a lo largo de los años podemos seleccionar la columna corres-pondiente de la última tabla elaborada. Para ello no habría mas que teclearplot(tapply(IN,list(Año,Curso),mean)[,3],type=“l”)En esta instrucción, con[,3] se le indica a R que seleccione todos los elementos de latercera columna. Contype=“l” se le dice que el gráfico sea de líneas. El resultado esel de la Figura5.13. Como puede observarse, en el eje de las abcisas aparece un índiceen lugar del año. Como dijimos anteriormente, los retoques necesarios para hacer los

Page 54: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

54 CAPÍTULO 5. ESTADÍSTICA DESCRIPTIVA

0 1 2 3 4 5 6 7 8 9 10

050

010

0015

00

Figura 5.10: Gráfico de barras conbarplot()

Año

IN

19941995 1996 1997 1998 1999 2000 2001

01

23

45

67

89

10

Figura 5.11: Un gráfico interesante para tablas bidimensionales

Page 55: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

5.2. CÓMO RESUMIR LA INFORMACIÓN CONTENIDA EN UNDATA.FRAME 55

Class

Sex

1st 2nd 3rd Crew

Mal

eF

emal

e

Child Adult

No

Yes

No

Yes

Child Adult Child Adult Child Adult

Figura 5.12: Representación gráfica de una tabla multidimensional

gráficos más elegantes se verán en el capítulo final.

Page 56: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

56

CA

PÍT

ULO

5.E

STA

DÍS

TIC

AD

ES

CR

IPT

IVA

12

34

56

78

2.5 3.0 3.5 4.0

Index

tapply(IN, list(Año, Curso), mean)[, 3]

Fig

ura

5.1

3:R

epresen

tación

de

parte

de

un

atab

lam

ultid

ime

nsio

nal

Page 57: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Capítulo 6

Pruebas de significación

6.1. Pruebas no paramétricas

6.1.1. Pruebas basadas en laχ2

Vamos a considerar la aplicación de laχ2 en dos situaciones:

1. para evaluar el ajuste de unos datos unidimensionales a una distribución de pro-babilidad

2. para determinar la homegeneidad de una variable a partir de una tabla de contin-gencia

χ2 para analizar el ajuste a una distribución

La función que proporciona R para la aplicación de los test basados en laχ2 eschisq.test(). Aplicada a un vector de datos sin más argumentos, evalua el ajuste de losmismos a una función de distribución uniforme.Por ejemplo, consideremos que en el centro escolar cuyos resultados estamos anali-zando el alumnado procede de cuatro barrios diferentes. En el Cuadro6.1se indican elnúmero de alumnos/as que escolariza de cada barrio así como el número de alumnos/ascon problemas educativos que aporta cada uno de los barrios.Supongamos que estamos interesados en saber si la procedencia del alumnado por ba-rrios es unidorme con un nivel de significación del 1 %. Para ello podríamos introducir

A B C DNúmero de alumnos/as 195 90 28 23

Alumnos/as con dificultades 84 54 11 11

Cuadro 6.1: Alumnado total y con problemas educativos

57

Page 58: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

58 CAPÍTULO 6. PRUEBAS DE SIGNIFICACIÓN

la siguiente instrucciónchisq.test(c(195,90,28,23))cuyo resultado esChi-squared test for given probabilitiesdata: c(195, 90, 28, 23)X-squared = 228.7381, df = 3, p-value =< 2.2e-16Como la probabilidad asociada al parámetroχ2 p-value =< 2.2e-16 es inferior al nivelde significación (0.01), se rechaza la hipótesis de uniformidad en la procedencia delalumnado (tal y como podíamos prever a la luz de los datos proporcionados).

Pasemos ahora al análisis del ajuste a una distribución de probabilidad no unifor-me. En el ejemplo que estamos considerando, podríamos estudiar si el alumnado condificultades educativas se distribuye entre los barrios de procedencia en concordanciacon el número total de alumnos/as que viene de cada barrio. Eneste caso tendremosque evaluar laχ2 incorporando como frecuencias teóricas la probabilidad deproceden-cia que le corresponde a cada barrio, que es el cociente entreel alumnado del barrio yel alumnado total. Podríamos actuar del siguiente modoalumnado<-c(195,90,28,23)prob.alumnado<-alumnado/sum(alumnado)alum.dificultades<-c(84,54,11,11)chisq.test(alum.dificultades,p=prob.alumnado)en la primera sentencia se asigna los datos de procedencia delos diferentes sectores aalumnado. En la segunda se calcula la probabilidad asociada a cada barrio dividiendoel número de alumnos/as de cada barrio entre el total (sum(alumnado)). En la tercerase asigna aalum.dificultadesel número de alumnos con dificultades educativas pro-cedentes de cada barrio en el orden adecuado. En la cuarta se aplica el test deχ2 alalumnado con dificultades tomando como probabilidades teóricas las incluidas en elvectorprob.alumnado. Hay que notar que la asignación de un nuevo vector de proba-bilidades se hace con el argumentop. El resultadoChi-squared test for given probabilitiesdata: al.problemasX-squared = 4.1505, df = 3, p-value = 0.2457nos muestra que la distribución por barrios del alumnado condificultades no se desvíasignificativamente de la teórica pues la probabilidad de quelos valores observados seajusten a los teóricos, 0.2457, es muy superior al 0.05 o 0.01que suelen tomarse comoniveles de significación para rechazar la hipótesis nula.

Test deχ2 para tablas de contingencia

Este tipo de pruebas suele utilizarse para analizar la homogeneidad de una variablerespecto a otra. Consideremos el siguiente caso: en el centro escolar se han recogidolos datos de la Tabla6.2 que representa el número de alumnos/as que supera/repiteel primer curso de bachillerato en relación al número de áreas que suspendió el cursoprecedente (0,1,2 o más). Si analizamos la tabla, parece claro que no tienen las mismasprobabilidades de susperar el curso los alumnos que aprobaron todas las áreas que losque promocionaron con alguna área suspensa, pero deseamos poner a prueba estadísti-

Page 59: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

6.1. PRUEBAS NO PARAMÉTRICAS 59

camente esta suposición. Podríamos hacerlo mediante laχ2 de la siguiente manerapromocionan<-c(101,14,7)repiten<-c(14,25,13)tabla3<-data.frame(promocionan,repiten,row.names=c(“0”,”1”,”2+”))Con las dos primeras instrucciones creamos los vectores queformarán las columnascon valores de la tabla de contingencia. Con la tercera creamos undata.frame, llamadotabla3, en el que introducimos como nombres de filas (row.names) los correspondien-tes a0,1,2+suspensos.

Una vez creada la tabla de contingencia, podemos aplicar el test mediantechisq.test(tabla3)cuya salida esPearson’s Chi-squared testdata: tabla3X-squared = 50.777, df = 2, p-value = 9.417e-12el valor dep = 9,417e−1 permite rechazar claramente la hipótesis de homogeneidadde la variablerepetir/no repetiren relación con la variablenúmero de suspensos en elcurso anteriorlo que demuestra claramente que, a la hora de aprobar o repetir el primercurso de bachillerato, no es lo mismo haber aprobado la ESO con 0, 1 o 2 o más áreassuspensas.

6.1.2. Test de Wilcoxon, de Mann-Whitney y de Kolmogorov-Smirnov

La funciónwilcox.test(), permite aplicar varias pruebas de significación: el test derangos signados de Wilcoxon; el contraste de suma de rangos de Wilcoxon; y el testde la U de Mann-Whitney. Las diferencias entre ellos radicanen los argumentos quese pasen a la función: si tenemos dos muestras y se incorpora la opciónpaired=T,tendremos muestras emparejadas y el test aplicado será el desuma de rangos de Wil-coxon. Si dejamos la opción por defecto, que espaired=F, el test aplicado será el deMann-Whitney. Si sólo hay una muestra, podemos utilizar la función como contrastede localización incorporando como argumento el valor(mu) de la mediana que quere-mos contrastar.

Nosotros nos centraremos en la aplicación de la función paracontrastar la hipótesisde que dos muestras provengan, o no, de la misma distribución.Supongamos que en nuestra centro educativo se ha definido un índice algebráico pa-ra medirel rendimiento académico del alumnado y se quiere contrastar su adecuación

Suspensos curso anterior Promocionan Repiten0 101 141 14 25

2+ 7 13

Cuadro 6.2: Promoción con suspensos

Page 60: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

60 CAPÍTULO 6. PRUEBAS DE SIGNIFICACIÓN

comparando los resultados obtenidos con el índice con las valoraciones realizadas porel profesorado. En el Cuadro6.3 se pueden ver los resultados obtenidos por los dosmedios.Para llevar a cabo la prueba tecleamos:profes<-c(1,4,1,1,2,2,3,4,5,3,2,5,4,3,2,3,2,4,4,4)indice<-c(1,4,1,1,2,1,3,4,5,3,2,5,5,3,2,3,2,5,4,3)wilcox.test(profes,indice,paired=T)En las dos primeras instrucciones se asignan los valores de las muestras a contrastar,y en la tercera se aplica la función a las mismas, indicando que se trata de muestrasemparejadas. El resultado esWilcoxon signed rank test with continuity correctiondata: profes and indiceV = 5, p-value = 1alternative hypothesis: true mu is not equal to 0Warning messages:1: Cannot compute exact p-value with ties in: wilcox.test.default(profes, indice, paired= T)2: Cannot compute exact p-value with zeroes in: wilcox.test.default(profes, indice, pai-red = T)a pesar de los dos mensajes que da, informando de los problemas encontrados, quedade manifiesto que la hipótesis nula, que establece el mismo origen de las dos muestras,queda totalmente confirmada ya que la probabilidad de que asísea es máxima (p = 1).

A la misma conclusión llegamos aplicando el test de Kolmogorov-Smirnov parados muestras. La función de R encargada de esta prueba esks.test(). En el ejemplo quenos ocupa, deberíamos teclearks.test(profes,indice)cuyo resultado esTwo-sample Kolmogorov-Smirnov testdata: profes and indiceD = 0.1, p-value = 1alternative hypothesis: two.sided

6.1.3. Test de Kruskal-Wallis

Con esta prueba podemos contrastar la procedencia (o no) de la misma distribuciónde tres o más muestras. Supongamos que queremos saber si el índice de resultadosacadémicos contenido en eldata.frame resultadosha variado significativamente desdeel año 1994 a 1996. Aplicando la funciónkruskal.test()a los valores correspondientespodremos contestar la pregunta. El procedimiento podría ser el siguiente:a<-subset(resultados,resultados$Año==1994,select=10)b<-subset(resultados,resultados$Año==1995,select=10)c<-subset(resultados,resultados$Año==1996,select=10)kruskal.test(list(a[,1],b[,1],c[,1]))Con las tres primeras sentencias se selecciona el índice quequeremos analizar (la co-lumna 10) para los años que nos interesan y se asignan a tresdata.framellamadosa,b,c.En la cuarta sentencia se aplica el test de Kruskal-Wallis. Para ello tenemos que cons-

Page 61: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

6.1. PRUEBAS NO PARAMÉTRICAS 61

Alumno/a Valoración profesorado Valoración índice1 1 12 4 43 1 14 1 15 2 26 2 17 3 38 4 49 5 510 3 311 2 212 5 513 4 514 3 315 2 216 3 317 2 218 4 519 4 420 4 3

Cuadro 6.3: Valoraciones alumnado

Page 62: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

62 CAPÍTULO 6. PRUEBAS DE SIGNIFICACIÓN

truir una lista encadenando las tres series de datos. Como están en sendosdata.frames,es preciso seleccionar la columna (en estos casos, única) que los almacena.El resultadoKruskal-Wallis rank sum testdata: list(a[, 1], b[, 1], c[, 1])Kruskal-Wallis chi-squared = 2.1531, df = 2, p-value = 0.3408nos indica que no podemos rechazar la hipótesis de que las tres muestras provengande la misma distribución, pues la probabilidad de que así sea, p− value= 0,3408, essuperior al nivel de significación del 5 %.

La funciónboxplot()nos proporciona una aproximación gráfica a este tipo de aná-lisis como puede apreciarse si tecleamosboxplot(a[,1],b[,1],c[,1], notch=T)el resultado es la Figura6.1en la que se aprecia que el primer cuartil ha aumentado alo largo de los tres años y que el rango intercuartílico se ha ido reduciendo. A pesar deello, las medianas son similares y, como nos indican las cuñas laterales introducidas porla opciónnotch=T, no difieren entre sí de manera significativa al nivel de significacióndel 5 % puesto que las incisiones se solapan unas con otras.

6.2. Pruebas paramétricas

6.2.1. Test basados en la t de Student

Debemos abandonar eldata.frame resultadospara hacer una pequeña incursiónen las pruebas paramétricas. Este tipo de pruebas sólo pueden ser aplicadas bajo lacondición de normalidad y con variables medidas en escala deintervalo o de razón,y ninguna de las contenidas en él cumple esas condiciones. Para ilustrar el uso de lafunción t.test(), utilizaremos los datos contenidos en eldata.frame surveydel paqueteMASS. Para cargarlo tecleamoslibrary(MASS)data(survey)attach(survey)para obtener una descripción de los datos teclearemos?survey

En eldata.frametenemos varias variables. Supongamos que nos interesa estudiarla estatura, que es una variable que se distribuye normalmente y se mide en una escalade razón, y su relación con el sexo y el carácter zurdo o diestro de los estudiantes. Paraver si hay diferencias por sexos, teclearíamost.test(Height~Sex)que le dice a R que aplique el test a la variable altura diferenciando dos muestras enfunción del sexo (es lo que indicamos con la tilde que enlaza ambas variables) De nue-vo, como hemos puesto los datos en la ruta de búsqueda conattach(survey), podemoshacer referencia directa al nombre de las variables. El resultado que sale por pantallaes

Page 63: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

6.2. PRUEBAS PARAMÉTRICAS 63

1 2 3

−20

−10

010

2030

40

Figura 6.1: Notched boxplots

Welch Two Sample t-testdata: Height by Sext = -12.9243, df = 192.703, p-value =< 2.2e-16alternative hypothesis: true difference in means is not equal to 095 percent confidence interval:-15.14454 -11.13420sample estimates:mean in group Female mean in group Male165.6867 178.8260el valor dep =< 2,2e− 16 nos indica que la hipótesis alternativa, es decir, que lasmedias de estatura de las dos muestras difieren significativamente, es perfectamenteaceptable. Por el contrario, las diferencias entre los zurdos y los diestros no son signi-ficativas, ya quet.test(Height~ W.Hnd)da unp−value= 0,2807.

Page 64: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

64 CAPÍTULO 6. PRUEBAS DE SIGNIFICACIÓN

Page 65: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Capítulo 7

Correlación y regresión

Continuaremos con los datos deldata.frame surveypara explicar los procedimien-tos básicos de los análisis de correlación y de regresión. A lo largo del capítulo se pre-sentarán procedimientos gráficos algo más sofisticados que los estudiados hasta ahora.En este caso serán explicados en el momento de su aplicación ya que son inseparablesdel contenido conceptual de la materia. Serán dejados para el capítulo final los proce-dimientos de carácter general válidos para todo tipo de gráficos.

7.1. Estudio de la correlación bivariada

7.1.1. Métodos gráficos

La primera aproximación al estudio de la relación entre variables es el análisis vi-sual del diagrama de dispersión de ambas que, como ya se sabe,puede obtenerse conla funciónplot().En la Fig7.1se puede observar la relación entre el pulso y la estatura de los individuosdel data.frame survey, como puede apreciarse, la correlación es escasa. En la Fig7.2,por el contrario, se observa una elevada correlación positiva entre la estatura y el ta-maño de la mano. En ocasiones, al estudiar la relación entre dos variables, nos interesaagrupar los casos en función de una tercera variable, generalmente categórica (lo queen R se llama unafactor). Podemos optar por dos soluciones: representar en el mismográfico todos los casos representando cada grupo con un símbolo y/o color distinto; orepresentar por separado los dos grupos. Veamos qué podemoshacer en R.Supongamos que deseamos estudiar la relación entre la estatura y el tamaño de la manopero queremos diferenciar en el diagrama de dispersión los puntos en función del sexode la persona. Una forma sencilla de conseguirlo sería tecleandoplot(Height,NW.Hnd,pch=as.integer(Sex))obsérvese que hemos añadido a la función un argumento (pch) que gestiona el tipo desímbolo que aparece en el gráfico. Cada símbolo tiene asociado un número, por esemotivo se transforma el código del sexo, que en eldata.frameestá como factor, en un

65

Page 66: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

66 CAPÍTULO 7. CORRELACIÓN Y REGRESIÓN

150 160 170 180 190 200

4050

6070

8090

100

Height

Pul

se

Figura 7.1: Un ejemplo de escasa correlación

150 160 170 180 190 200

1416

1820

22

Height

NW

.Hnd

Figura 7.2: En este caso, la correlación es fuerte

Page 67: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

7.1. ESTUDIO DE LA CORRELACIÓN BIVARIADA 67

número. En este caso asociará al sexo femenino el 1 y al masculino el 2. El resultado esla Figura7.3en la que vemos que aparecen triángulos y circunferencias diferenciandolos sexos.

Sin embargo, este tipo de gráficos precisa una leyenda pues, de lo contrario, nosabremos qué símbolo está asociado a cada grupo. Para crear un gráfico con leyendadeberíamos teclearplot(Height,NW.Hnd,pch=as.integer(Sex))legend(locator(1),legend=c(“Chicas”,“Chicos”),pch=as.integer(Sex))La primera instrucción es la que ya hemos utilizado anteriormente: crea el gráfico ylo presenta en la pantalla gráfica. La segunda es la que añadirá la leyenda y debemosanalizarla en detalle.La función utilizada eslegend(), una de las funciones de tipointeractivoque encon-tramos en R y que permite realizar acciones con el ratón sobrela pantalla gráfica.Con el argumentolocator(1) se indica que haremos sobre la pantalla un solo clic conel botón izquierdo del ratón allí donde queramos situar la leyenda. El argumentole-gend=c(“Chicas”,“Chicos”) indica los nombres de los grupos representados en elgráfico. Es muy importante ponerlos en el mismo orden en el quese encuentran enel diseño deldata.frame, lo cual puede conocerse con la funciónstr(). Hay que darsecuenta de que R no puede adivinar, qué entendemos nosotros por Chico o Chica demodo que tendremos que decírselo explícitamente. Por último, pch=as.integer(Sex)define el símbolo que utilizaremos en la leyenda que debe ser,evidentemente, el mis-mo que hayamos utilizado al hacer el gráfico.Tras teclear la instrucción, la linea de comandos pasa el control al ratón. Deberemoshacer clic en el gráfico en la zona adecuada y veremos cómo, efectivamente, se insertala leyenda. El resultado es el que podemos ver en la Figura7.4.

Este tipo de gráficos puede ser en ocasiones un poco lioso y talvez nos intereseseparar los dos grupos en gráficos separados pero en la misma figura. Para ello podemosutilizar la funcióncoplot(), diseñada para hacer gráficos condicionados. En este casoqueremos representar la relación entre dos variables controlando la salida gráfica enfunción del sexo de los registros. Para obtener dicho gráficopodemos teclearcoplot(Height~NW.Hnd | Sex)Obsérvese que la tilde indica qué variables queremos analizar, y la barra (|) nos indicaqué variable queremos controlar. El resultado es muy interesante y podemos verlo enla Figura7.5. Por supuesto, es posible introducir más de una variable de control. Porejemplo, si queremos condicionar los diagramas de dispersión no sólo por el sexo, sinotambién por el carácter diestro o zurdo del individuo, deberíamos teclearcoplot(Height~NW.Hnd | Sex + W.Hnd)como se vé en la expresión, los factores condicionantes se encadenan con el signo +.El resultado será un gráfico 2x2 como el de la Figura7.6.

Para acabar con el análisis gráfico de la correlación entre variables comentaremosel gráfico que presenta diagramas de dispersión cruzados para varias variables. Pode-mos crearlos con la funciónpairs(). Así,pairs(survey)generaría un gráfico que permitiría apreciar las relacionesentre todas las variables del

Page 68: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

68 CAPÍTULO 7. CORRELACIÓN Y REGRESIÓN

150 160 170 180 190 200

1416

1820

22

Height

NW

.Hnd

Figura 7.3: Diagrama de dispersión con dos grupos de datos

150 160 170 180 190 200

1416

1820

22

Height

NW

.Hnd

ChicasChicos

Figura 7.4: Diagrama mucho más elaborado

Page 69: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

7.1. ESTUDIO DE LA CORRELACIÓN BIVARIADA 69

14 16 18 20 22

150

160

170

180

190

200

14 16 18 20 22

NW.Hnd

Hei

ght

Female

Male

Given : Sex

Figura 7.5: Diagrama de dispersión con dos grupos de datos obtenido concoplot()

150

160

170

180

190

200

14 16 18 20 22

14 16 18 20 22

150

160

170

180

190

200

NW.Hnd

Hei

ght

Female

Male

Given : Sex

Left

Rig

ht

Giv

en :

W.H

nd

Figura 7.6: Diagrama de dispersión controlando para dos variables

Page 70: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

70 CAPÍTULO 7. CORRELACIÓN Y REGRESIÓN

data.frame. Muchas de ellas no son numericas y por lo tanto su interés es menor, perola representación, en general, facilita el análisis exploratorio de la correlación entre va-riables.Para observar las correlaciones entre las variables numéricas podemos crear unda-ta.framecon las mismas y pasarle la funciónpairs(). Así,pairs(data.frame(Pulse,Height,NW.Hnd,Wr.Hnd)crea la Figura7.7, que permite apreciar las relaciones entre todas las variables numéri-cas de estedata.framecomo, por ejemplo, la clara relación entre el tamaño de ambasmanos o la menor que hay entre el tamaño de la mano y la estatura.

7.1.2. Matrices de correlaciones

La funcióncor() proporciona la matriz de coeficientes de correlación de Pearsonde las variables introducidas como argumento. Así,cor(survey$Height,survey$Wr.Hnd, use=”complete.obs”)nos da el coeficiente de correlación entre la estatura y el tamaño de la mano. El resul-tado[1] 0.600991es lo que deberemos interpretar. Hay que hacer notar que, cuando hay valores perdi-dos, a la funcióncor() hay que decirle a R qué hacer con los mismos. Para que haga elcálculo del coeficiente sólo a partir de los casos completos para ambas variables intro-ducimos la opciónuse=”complete.obs”.Para calcular el coeficiente de determinación sólo deberíamos elevar al cuadrado el va-lor devuelto por la función. Por ejemplo tecleandocor(survey$Height,survey$Wr.Hnd, use=”complete.obs”)̂2Adviértase que, como no hemos asignado el valor a ningún objeto, no quedará almace-nado en el espacio de trabajo; tan sólo será presentado por pantalla.

Podemos aplicar la funcióncor() a undata.framecon variables numéricas. En estecaso obtendremos una matriz de correlaciones. Para obtenerla matriz de correlacionesde las cuatro variables numéricas contenidas en eldata.frame surveypodemos teclearoptions(digits=3)cor(data.frame(NW.Hnd,Wr.Hnd,Height,Pulse),use=”complete.obs”)como se ve, se crea undata.frameinterno que almacena las variables numéricas. Esteserá el objeto que recibirá la acción de la función. Como antes, sólo se tendrán encuenta los casos completos. El resultado es

NW.Hnd Wr.Hnd Height PulseNW.Hnd 1.0000 0.96643 0.6000 -0.01698Wr.Hnd 0.9664 1.00000 0.6184 -0.00761Height 0.6000 0.61835 1.0000 -0.08468Pulse -0.0170 -0.00761 -0.0847 1.00000

Como se explicó en un capítulo anterior, si nos interesase calcular estos valores conasiduidad, sería conveniente definir sendas funciones.

Page 71: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

7.1. ESTUDIO DE LA CORRELACIÓN BIVARIADA 71

Wr.Hnd

14 18 22 150 170 190

1418

22

1418

22

NW.Hnd

Pulse40

6080

100

14 18 22

150

170

190

40 60 80 100

Height

Figura 7.7: Diagrama de dispersión cruzada entre variablesconpairs()

Page 72: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

72 CAPÍTULO 7. CORRELACIÓN Y REGRESIÓN

Una cuestión importante es contrastar el grado de significación de los coeficientesde la matriz de correlaciones. Para unα = 0,05, podemos considerar que son significa-tivos los valoresr i j que cumplen|r i j | ·

√n > 1,96 siendon el número de casos de la

serie de datos1.En el ejemplo que estamos utilizando, para obtener el valor de n debemos tener encuenta que en el cálculo de los coeficientes de correlación estamos considerando sólolos casos completos para las cuatro variables numéricas. Para sabér cuántos son, pode-mos teclearstr(na.omit((data.frame(NW.Hnd,Wr.Hnd,Height,Pulse))))que solicita la estructura deldata.framede variables numéricasomitiendo(cosa queconseguimos conna.omit())los casos con algún valor perdido. El resultado‘data.frame’: 170 obs. of 4 variables:$ NW.Hnd: num 18 20.5 20 17.7 17.7 17.3 19.5 18.5 17.2 20.2 ...$ Wr.Hnd: num 18.5 19.5 20 18 17.7 17 20 18.5 17 19.5 ...$ Height: num 173 178 165 173 183 ...$ Pulse : num 92 104 35 64 83 74 72 90 80 66 ...- attr(*, "na.action")=Class ’omit’ Named int [1:67] 3 4 12 13 15 16 19 25 26 29 ..... ..- attr(*, "names")= chr [1:67] "341213"...nos informa de que eldata.frameconsta de 170 observaciones.En este momento podemos multiplicar los coeficientes de correlación por la raiz cua-drada del número de observaciones efectuando la siguiente operacióncor(data.frame(NW.Hnd,Wr.Hnd,Height,Pulse),

use=”complete.obs”)*sqrt(170)cuyo resultado es

NW.Hnd Wr.Hnd Height PulseNW.Hnd 13.0384048 12.60072500 7.822565 -0.22136976Wr.Hnd 12.6007250 13.03840481 8.062344 -0.09920578Height 7.8225652 8.06234371 13.038405 -1.10414082Pulse -0.2213698 -0.09920578 -1.104141 13.03840481

Puede apreciarse que la diagonal se ha transformado en la√

170 y que son signifi-cativos al 5 % los coeficientes de correlación entre las variables tamaño de la manoescritora/tamaño de la mano no escritora, r= 12,600 y altura frente atamañodeambas manos (r = 7,823 yr = 8,062).

7.1.3. Coeficiente de correlación de Spearman

Veamos ahora cómo calcular el coeficiente de correlación de Spearman. Este estábasado en rangos y es aplicable, por lo tanto, a variables de tipo ordinal.Como en nuestrodata.frameno tenemos variables ordinales, crearemos dos con lafuncióncut(), que divide un vector en partes iguales. Así,a<-na.omit(cut(NW.Hnd,5))b<-na.omit(cut(Wr.Hnd,5))reclasificará esas dos variables a sendas variables ordinales con cinco modalidades

1En el caso deα = 0,01, el valor que debería ser superado es 2,575

Page 73: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

7.1. ESTUDIO DE LA CORRELACIÓN BIVARIADA 73

(1,2,3,4,5) y además eliminará los valores perdidos.Para calcular el coeficiente de correlación de Spearman sólohabrá que teclearcor(rank(a),rank(b))dando como resultado[1] 0.8834653

7.1.4. Coeficiente de correlación parcial

Finalmente, veremos cómo calcular el coeficiente de correlación parcial entre dosvariables controlando los efectos que ejerce una tercera variable sobre la relación en-tre ellas. Este coeficiente de correlación parcial se suele utilizar cuando se supone quepuedan existir relaciones espúreas entre variables.Si definimos el coeficiente de correlación parcial entre las variablesa,b controlado porla variablec como

rab|c =rab− rac · rbc

1− r2ac·

1− r2bc

y tenemos tres variablesa,b,c, podremos calcularrab|c con la siguiente serie de instruc-ciones.r.ab<-cor(a,b)r.bc<-cor(b,c)r.ac<-cor(a,c)r.abc<-(r.ab-(r.ac*r.bc))/(sqrt(1-(r.ac^2))*sqrt(1-(r.bc^2)))Con las tres primeras se calculan los coeficientes de correlación bivariada entre las tresvariables tomadas dos a dos. En la cuarta se introduce la expresión algebraica que per-mite obtener el coeficiente de correlación parcial.La siguiente función, bautizada comocor.par() nos daría el coeficiente con sólo in-troducir las variables en orden consecutivo, siendo las dosprimeras las variables aestudiar, y la tercera la variable que queremos controlar.cor.par<-function(a,b,c){r.ab<-cor(a,b)r.bc<-cor(b,c)r.ac<-cor(a,c)coef<-(r.ab-(r.ac*r.bc))/(sqrt(1-(r.ac^2))*sqrt(1-(r.bc^2)))return(coef)}

Para ilustrar el uso de los índices de correlación parcial consideraremos los datosdel Cuadro7.1. En él aparecen una serie de variables (temperatura, albedo, flujo térmi-co, radio y distacia media al Sol) para los cuatro planetas gigantes del Sistema Solar.

En primer lugar deberemos introducir los datos de la tabla enundata.frameal quepodemos llamar, por ejemplos.solar.

Ahora, supongamos que nos interesa conocer los factores queinfluyen en la tempe-ratura de los planetas. En primer lugar, desearemos confirmar que exite relación entreésta y la distancia al Sol. Para ello podríamos teclear

Page 74: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

74 CAPÍTULO 7. CORRELACIÓN Y REGRESIÓN

Planeta Distancia(u.a.) Temperatura(K) Radio(Km) AlbedoFlujo térmico(erg/cm2sg)Júpiter 5,203 125 71714 0,42 7600Saturno 9,539 94 60330 0,36 2800Urano 19,18 58 26200 0,37 175

Neptuno 30,06 55 25225 0,33 285

Cuadro 7.1: Algunos datos de los planetas gigantes

cor(s.solar$dist,s.solar$temp)que da[1] -0.9085313es decir, una elevada correlación negativa; a mayor alejamiento del Sol, menor tempe-ratura planetaria.Para analizar gráficamente esta relación podemos teclearplot(s.solar$dist,s.solar$temp)lo que genera la Figura7.8en la que se observa que hay un descenso de la temperaturacon la distancia claramente exponencial.Si queremos conocer las relaciones entre todas las variables tomadas de dos en dos, de-beremos solicitar la matriz de correlaciones, para lo cual sólo tenemos quecor(s.solar).El resultado es

temp albedo flujo dist radiotemp 1.0000000 0.8361303 0.9774232 -0.9085313 0.9808471albedo 0.8361303 1.0000000 0.8731807 -0.8367831 0.7406799flujo 0.9774232 0.8731807 1.0000000 -0.8295449 0.9198315dist -0.9085313 -0.8367831 -0.8295449 1.0000000 -0.9220161radio 0.9808471 0.7406799 0.9198315 -0.9220161 1.0000000

Puede observarse que los coeficientes son elevados para casitodos los pares de va-riables, llamando especialmente la atención la relación entre la temperatura y el radioplanetario y el flujo térmico. En la Figura7.9vemos gráficamente la relación entre latemperatura y el flujo térmico.

Aparentemente, la distancia al Sol no es el factor que más afecta a la temperaturade estos planetas. Para conocer cuál es la correlación entretemperatura y distancia,“descontando” el efecto del flujo térmico, podemos utilizarnuestra funcióncor.par()del siguiente modoattach(s.solar)cor.par(temp,dist,flujo)el resultado[1] -0.828139refleja que, cuando controlamos el efecto del flujo térmico, la relación entre tempe-ratura y distancia al Sol disminuye. Si lo analizamos en términos delcoeficiente dedeterminación(cuadrado del coeficiente de correlación), pasamos de que ladistanciaexplique el 83 % de la varianza a que explique sólo el 69 %.Los astrónomos conocen bien este hecho. Los planetas gaseosos están tan lejos del Sol

Page 75: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

7.1. ESTUDIO DE LA CORRELACIÓN BIVARIADA 75

5 10 15 20 25 30

6070

8090

100

110

120

dist

tem

p

Figura 7.8: Relación entre temperatura y distancia

60 70 80 90 100 110 120

020

0040

0060

00

temp

flujo

Figura 7.9: Relación entre temperatura y flujo térmico

Page 76: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

76 CAPÍTULO 7. CORRELACIÓN Y REGRESIÓN

que, incluso, emiten al espacio más energía de la que recibendel astro rey. Por esemotivo, su temperatura depende en gran medida del aporte de calor interno. Esto quedaclaramente de manifiesto al analizar la relación entre estasdos variables removiendo elefecto de la distancia como vemos a continuacióncor.par(temp,flujo,dist)[1] -0.9589847Comparando este valor con el valor de la matriz de correlaciones, apreciamos que con-trolar para la distancia no conlleva una reducción muy grande del coeficiente de corre-lación entre temperatura y flujo térmico.

7.2. Regresión lineal simple

En esta sección trabajaremos con los datos contenidos en eldata.frame trees. Lasiguiente sucesión de órdenes nos permiten cargarlos, conocer su contenido y ponerloen ruta de búsqueda.data(trees)str(trees)?treesattach(trees)Vemos que consiste en una serie de datos de altura, diámetro yvolumen de 31 árboles.Como en todo análisis de regresión simple, intentaremos analizar las relaciones exis-tentes entre las variables con la intención de predecir valores de un de ellas en funciónde otra. Antes de comenzar, haremos un análisis preliminar de las correlaciones biva-riadas. Concor(trees)obtendremos la siguiente matriz de correlaciones

Girth Height VolumeGirth 1.0000000 0.5192801 0.9671194Height 0.5192801 1.0000000 0.5982497Volume0.96711940.5982497 1.0000000

Conpairs(trees)obtendremos la Figura7.10.

Tanto en la matriz como en la figura se puede apreciar que hay una relación linealmuy fuerte entre el volumen del árbol y su diámetro. También se observa que la rela-ción entre el volumen y la altura no lo es tanto. Finalmente, hay también relación entreel diámetro y la altura.

En R, para efectuar el análisis de regresión linear se utiliza la funciónlm(). Estagenera un tipo especial de objeto que puede ser argumento de muchas funciones quepodremos utilizar para obtener información sobre el modelode regresión calculado.Por ese motivo, es conveniente asignar el resultado delm() a algún objeto con su co-rrespondiente nombre. En nuestro caso, para hacer la regresión simple entrevolumenydiámetroteclearemos

Page 77: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

7.2. REGRESIÓN LINEAL SIMPLE 77

Girth

65 70 75 80 85

810

1418

6570

7580

85

Height

8 10 14 18 10 30 50 70

1030

5070

Volume

Figura 7.10: Relación entre las variables detrees

lm.vol.dia<-lm(Volume~Girth)lo que almacena en el objetolm.vol.diatodos los resultados del análisis de regresión.Como puede observarse,lm() utiliza el sistema defórmulas(con la tilde) para expresarla variable dependiente y la independiente.La funciónsummary()aplicada al objeto de regresión, nos va a proporcionar la mayorparte de la información que nos interesa en un principio comovemos a continuaciónsummary(lm.vol.dia)Call:lm(formula = Volume Girth)Residuals:Min 1Q Median 3Q Max-8.0654 -3.1067 0.1520 3.4948 9.5868Coefficients:Estimate Std. Error t value Pr(>|t|)(Intercept) -36.9435 3.3651 -10.98 7.62e-12 ***Girth 5.0659 0.2474 20.48< 2e-16 ***—Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1Residual standard error: 4.252 on 29 degrees of freedomMultiple R-Squared: 0.9353, Adjusted R-squared: 0.9331F-statistic: 419.4 on 1 and 29 DF, p-value: 0Tanto el valor como el grado de significación los coeficientesde la recta de regresiónaparecen en el apartadocoefficients. En la penúltima linea aparecen los valores der yr2; y, en la última, la probabilidad de que el modelo obtenido sea inadecuado.

Page 78: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

78 CAPÍTULO 7. CORRELACIÓN Y REGRESIÓN

En este caso, el coeficiente de determinación (r2) nos indica que el 93 % de la variaciónen el volumen del árbol puede explicarse por variaciones en el diámetro del mismo. Porotro lado, el modelo de regresión obtenido es apropiado puesto que la probabilidad deque no lo sea es cero.

Para hacer predicciones del volumen de una serie de árboles apartir de su diáme-tro debemos crear undata.framecon una columna que almacene los diámetros de losmismos. Por ejemplo, si tenemos tres ejemplares,A,B,Ccon diámetros11.5,10.6,18.7,para obtener los volúmenes predichos habría que proceder como sigue.muestra<-data.frame(Girth=c(11.5,10.6,18.7),

row.names=c(“A”;”B”;”C”))predict(lm.vol.dia,muestra)Con la primera instrucción creamos eldata.frame muestraque contiene una colum-na con el nombre de la variable independiente (en este caso eldiámetro) que albergalos valores de la muestra. Además se indica la etiqueta de cada uno de los registros(A,B,C).Con la segunda instrucción pedimos que calcule los valores predichos según el modeloguardado enlm.vol.dia. El resultado es

A B C21.31389 16.75462 57.78806

Si, además del valor predicho, deseamos conocer el intervalo de confianza a unnivel determinado (digamos del 95 %), deberemos teclearpredict(lm.vol.dia,muestra,level=.95,interval=“confidence”)el resultado será

fit lwr uprA 21.3138919.5188923.10889B 16.7546214.6967218.81252C 57.7880654.6183260.95779

donde podemos conocer el valor inferior (lwr) y superior (upr) para ese nivel de con-fianza. Para modificar el nivel de confianza, sólo hay que introducir otro valor en elargumentolevelde la funciónpredict().

Finalmente, vamos a ver cómo incorporar al diagrama de dispersión algunos ele-mentos importantes en análisis de regresión.El primero es la recta de regresión. Para ello vamos a utilizar la funciónabline()que,pasada por consola tras haber generado un gráfico, le incorpora una recta con los pará-metros que se le indiquen como argumentos. Veamos cómo hacerlo si queremos estu-diar la relación entre el volumen y la altura.plot(Height,Volume)abline(lm(Volume~Height))El resultado se presenta en la Figura7.11.

En muchas ocasiones sería conveniente identificar ciertos puntos del diagrama dedispersión que destacan por alguna circunstancia (en general, valores anómalos). Parahacer esto podemos utlizar la funciónidentify()de la siguiente maneraplot(Height,Volume)

Page 79: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

7.2. REGRESIÓN LINEAL SIMPLE 79

65 70 75 80 85

1020

3040

5060

70

Height

Vol

ume

Figura 7.11: Inclusión de la recta de regresión conabline()

identify(Height,Volume)Tras haber realizado el gráfico conplot(), tecleamos la funciónidentify() aplicada almismo. Esto es así porque la función interactúa con el dispositivo gráfico. Tras te-clearla, deberemos utilizar el ratón para marcar con el botón izquierdo los puntos quedeseamos etiquetar. Por defecto se añadirá al gráfico un número índice, pero esto pue-de modificarse si existe alguna otra etiqueta. Cuando hayamos concluido, deberemoshacer clic con el botón derecho sobre el gráfico para cerrar lafunción. En ese momentoaparacerán sobre la consola los índices de los puntos seleccionados. En la Figura7.12puede apreciarse cómo se ha seleccionado y etiquetado algunos de los casos.

Page 80: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

80 CAPÍTULO 7. CORRELACIÓN Y REGRESIÓN

65 70 75 80 85

1020

3040

5060

70

Height

Vol

ume

6

18

28

31

Figura 7.12: Identificación de casos conidentify()

Page 81: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

Capítulo 8

Personalización de gráficos

R posee unas capacidades gráficas extraordinarias. En este (último) capítulo vamosa estudiar las más básicas, las que nos van a permitir personalizar nuestros gráficos ydotarlos de una mayor presencia. Para ello nos serviremos delos gráficos que hemos idopresentando a lo largo del manual y cuya presentación no ha sido la que desearíamospara presentar en una publicación.

8.1. Títulos

Consideremos la Figura3.3 de la página20. Lo primero que llama la atención esque los títulos de los ejes están en inglés. Ello se debe a que el data.frame carsvienecon R. Posiblemente, con datos nuestros eso no ocurrirá, pero aún así es convenientesaber cómo añadir/modificar los títulos de una figura. Consideraremos tanto el texto ensí como su formato (fuente y color).

Para los títulos de ejes tenemos los argumentosx.lab e y.lab. Tras ellos sólo hayque teclear entrecomillado el texto que queremos que vaya a cada uno de los ejes. Asíplot(speed,dist,x.lab=“Velocidad“,y.lab=”Distancia“)cambiaría los nombres de las variables del inglés al castellano.Si queremos, podemos cambiar la fuente del texto con el argumentofont.lab, que aceptacuatro valores que van del 1 al 4. Para que aparezcan en negrita habría que añadir a lasentencia anteriorfont.lab=2.También podemos cambiar el color. Posteriormente hablaremos de cómo conseguirmillones de colores diferentes, ahora nos conformaremos con las posibilidades que nosdan los primeros diez números enteros. Para ello utilizaremos el argumentocol.labseguido de un número del 0 al 9. Para el azul, el número es el 4. También podemosmodificar el tamaño de la fuente concex.lab. Este argumento acepta valores numéricos,resultando los menores a 1 en una reducción del tamaño y, los superiores a 1, en unaumento. Así,plot(speed,dist,x.lab=“Velocidad“,y.lab=”Distancia“,font.lab=2,

col.lab=4,cex.lab=1.5)nos dejerá unos títulos en castellano, en negrita,de mayor tamaño, y de color azul.

81

Page 82: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

82 CAPÍTULO 8. PERSONALIZACIÓN DE GRÁFICOS

Para añadir un título al gráfico utilizaremos el argumentomain seguido del títuloentrecomillado. Al igual que con los títulos de los ejes, podremos utilizar los argumen-tos col.main, cex.mainy font.mainpara modificar el color, el tamaño y la fuente deltítulo principal.

El resultado final de la personalización de títulos puede apreciarse en la Figura8.1,y resulta de la siguiente instrucciónplot(cars$speed,cars$dist,xlab="Velocidad",ylab="Distancia",

font.lab=3,col.lab=4,cex.lab=1.5,main="Diagrama dedispersión\nVelocidad/Distancia", cex.main=2,col.main=4)

Obsérvese que, para introducir un salto de linea en el títuloprincipal se ha tecleado\nallí donde se desea que aparezca.

8.2. Ejes

El aspecto de los ejes puede modificarse de la misma manera quehemos comen-tado en los títulos con los argumentosfont.axis, col.axisy cex.axis. También podemosmodificar el rango de los ejes con los argumentosxlimeylimque, como puede adivinar-se, establecen los límites para cada uno de los ejes. Así,xlim=c(0,40),ylim=c(20,45)generáría un eje de abcsisas de 0 a 40 y un eje de ordenadas de 20a 45.

Además de modificar el rango, se puede variar la escala de los ejes. Con el argu-mento log podemos transformar a escala logarítmica el ejex, el y o ambos. Con lasiguiente orden modificaríamos los dos ejes de la Figura7.8(página75) para transfor-marlos a escala logarítmica y obtener la Figura8.2.plot(s.solar$dist,s.solar$temp,log="xy",xlab="log(distancia)",

ylab="log(temp)",col.axis=4,fg=2)Para modificar sólo uno de los ejes lo único que hay que hacer esnotificárselo al

argumento. Así,log=“x” sólo pasaría a logarítmico el eje de abcisas, ylog“y” haría lopropio sólo con el eje de ordenadas.

Hemos visto que en algunos casos (por ejemplo en la Figura5.2, página39) en eleje de abcisas no nos aparece el nombre de la variable sino queaparece un número-índice. En este caso en concreto nos convendría que apareciera en lugar de1, IN, enlugar de2, SF, ... Para conseguirlo podemos utilizar la funciónaxis(), que modifica lasetiquetas de los ejes como vemos a continuación. Para obtener la Figura8.3 debería-mos introducir la siguiente secuencia de instruccionesattach(resultados)boxplot(IN,SF,B,NT,SB,xaxt="n")axis(1,at=1:5,lab=c("IN","SF","B","NT","SB"),col.ax is=2)La primera ya la conocemos bien; nos evitará hacer continuamente llamadas alda-ta.frameen las siguientes instrucciones. Con la segunda obtenemos un boxplotmúlti-ple en el queno visualizaremos las etiquetas del eje de abcisasporque hemos añadidola opciónxaxt=“n” (del inglésx axis text, no). Estas etiquetas las añadimos con latercera instrucción. A la funciónaxis()se le indica con el1 que va a trabajar con el ejede abcisas. Conat=1:5 se le dice que debe colocar las primeras cinco etiquetas, queson las cinco que indicamos conlab=c("IN","SF","B","NT","SB") . Finalmente leindicamos que las coloree de rojo simplemente para destacarel efecto de la función

Page 83: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

8.2. EJES 83

5 10 15 20 25

020

4060

8010

012

0

Diagrama de dispersión Velocidad/Distancia

Velocidad

Dis

tanc

ia

Figura 8.1: Personalización de títulos

5 10 15 20 25 30

6070

8090

100

110

120

log(distancia)

log(

tem

p)

Figura 8.2: Ejes logarítmicos

Page 84: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

84 CAPÍTULO 8. PERSONALIZACIÓN DE GRÁFICOS

sobre el gráfico original.

8.3. Colores

Como hemos visto, podemos personalizar los colores de fuentes y ejes. Por supues-to, podemos establecer un color para el objeto principal de la representación (puntos,líneas, polígonos) con el argumentocol. Asímismo,podemos modificar el color de fon-do (bg) y de los objetos situados en primer plano (fg).Con las funcionesrgb() y hsv()aplicadas a cualquier argumento que indique un color,podemos conseguir millones de colores. Tan sólo hay que introducir como parámetrosde esas funciones tres valores decimales comprendidos entre el 0 y el 1. En la primera(rgb()), será una mezcla de rojo, verde y azul. En la segunda (hsv()), son los valores dematiz, saturación y valor.En la Figura8.4podemos ver el resultado de la siguiente instrucciónhist(cars$dist,col=rgb(.3,.6,.2),fg=2,main="Histograma",

col.main=hsv(.2,.8,.9),xlab="velocidad",ylab="frecuencia",col.lab=hsv(.2,.8,.6)).

Puede verse cómo han cambiado tanto el color del histograma como de los títulos.También hay que hacer notar que el argumentofg=2 determina que el color de los ejessea rojo.

8.4. Añadir textos a un gráfico

Esta es una operación habitual en gráficos. Los textos nos permiten realizar co-mentarios o resaltar información. Veamos cómo utilizar la funcióntext()para añadir unpequeño comentario a la Figura3.3. Podríamos hacer lo siguienteplot(cars$speed,cars$dist)text(5,100,"Se puede apreciar una\nbuena correlación\nentre ambas

variables,\nespecialmente para velocidades\nbajas y medias.",adj=0,col=4)

Con la primera instrucción creamos la figura. La segunda es laque debemos analizaren profundidad.En primer lugar le decimos a R dónde debe colocar el texto. Para ello nos basamosen las coordenadas utilizadas en el gráfico. Como vemos que enla zona de bajas ve-locidades y elevadas distancias hay bastante espacio en blanco, ponemos5,100(5 develocidad y 100 de distancia). A continuación introducimosel texto entrecomillado(obsérvese la inserción de nuevas lineas con\n). Conadj=0 indicamos que queremosun texto justificado a la izquierda (por defecto es centrado). Finalmente, le decimos quequeremos un texto en color azul concol=4. El resultado es el de la Figura8.5.

Para establecer las coordenadas que definen la localizaciónde los textos tambiénpodemos utilizar funciones. Por ejemplo, si quisiéramos etiquetar los elementos prin-cipales delboxplotde la Figura5.1 (página39) podríamos proceder de la siguientemaneraboxplot(cars$speed)

Page 85: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

8.4. AÑADIR TEXTOS A UN GRÁFICO 85

Figura 8.3: Modificar etiquetas de ejes conaxis()

Histograma

velocidad

frec

uenc

ia

0 5 10 15 20 25

05

1015

Figura 8.4: Millones de colores conrgb() y hsv()

Page 86: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

86 CAPÍTULO 8. PERSONALIZACIÓN DE GRÁFICOS

5 10 15 20 25

020

4060

8010

012

0

cars$speed

cars

$dis

t

Se puede apreciar unabuena correlaciónentre ambas variables,especialmente para velocidadesbajas y medias.

Figura 8.5: Añadir textos context()

axis(1,at=1,"Velocidad",cex.axis=1.5,col.axis=2)text(1.3,fivenum(cars$speed)[1],"mínimo",col=4,adj=0)text(1.3,fivenum(cars$speed)[2],"primer cuartil",col=4,adj=0)text(1.3,median(cars$speed),"mediana",col=4,adj=0)text(1.3,fivenum(cars$speed)[4],"tercer cuartil",col=4,adj=0)text(1.3,fivenum(cars$speed)[5],"máximo",col=4,adj=0)Como vemos, tras dibujar el gráfico y añadirle la etiquetaVelocidadal eje de abci-sas, se procede a incorporar textos a los elementos delboxplot. Para que aparezca aun lado de la caja y no encima de ella, la primera coordenada laestablecemos en1.3.Para situar el textomínimo a la altura exacta, no hace falta obtener previamente esevalor mínimo, podemos establecer su coordenaday seleccionando el primer elementodel vector proporcionado por la funciónfivenum(), que da el mínimo, primer cuartil,mediana, tercer cuartil y máximo, de una variable. Para colocar los demás textos sólohabrá que ir seleccionando los correspondientes elementosde ese vector como se haceen las sentencias 4,5,6 y 7. El resultado es el que se aprecia en la Figura8.6.

8.5. Tipos de puntos y lineas

Podemos modificar tanto el tipo de linea o punto, como su colory tamaño.Por ejemplo, la Fig5.7representa una gráfica de tipolineaobtenida con la instrucciónplot(density(cars$speed)). Vamos a ver qué argumentos debemos utilizar para modi-ficarla y obtener la Figura8.7. La instrucción requerida esplot(density(cars$speed),lty=6,lwd=4,col=4)El argumentocol establecerá el color. El tipo de línea lo definimos conlty, que acepta

Page 87: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

8.5. TIPOS DE PUNTOS Y LINEAS 87

510

1520

25

Velocidad

mínimo

primer cuartil

mediana

tercer cuartil

máximo

Figura 8.6: Utilizar funciones para establecer coordenadas de textos context()

0 5 10 15 20 25 30

0.00

0.01

0.02

0.03

0.04

0.05

0.06

density(x = cars$speed)

N = 50 Bandwidth = 2.15

Den

sity

Figura 8.7: Personalización de líneas conlty,lwd,col

Page 88: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

88 CAPÍTULO 8. PERSONALIZACIÓN DE GRÁFICOS

varios valores numéricos. De la misma manera estableceremos la anchura de la lineacon lwd .

Para gráficos de puntos el procedimiento es muy similar. Paratransformar la Figu-ra3.3en la Figura8.8debemos teclearplot(cars$speed,cars$dist,pch=3,cex=.5,col=2)Podemos ver que volvemos a dar color concol. Conpch, que acepta valores numéri-cos, establecemos el tipo de símbolo, correspondiendo el 3 ala cruz. Finalmente, concexintroducimos un factor de disminución o aumento del tamaño con respecto al queestá definido por defecto.

8.6. Añadir puntos y lineas a un gráfico

En R es posible superponer puntos y lineas a gráficos recien creados en la pantallagráfica. Por ejemplo, supongamos que queremos añadir al diagrama de dispersión dela Figura3.3unos puntos que indiquen los cuartiles y la media de ambas variables. Elresultado (Figura8.9), se obtiene de la siguiente maneraplot(cars$speed,cars$dist)points(fivenum(cars$speed)[c(2,3,4)],fivenum(cars$dist)[c(2,3,4)],

pch=18,cex=2,col=2)points(mean(cars$speed),mean(cars$dist),pch=15,cex=2,col=4)Con la segunda instrucción añadimos el primer cuartil, la mediana y el tercer cuartil1 deuna variable frente a los de la otra, en forma de rombos rojos.Con la tercera, añadimosla media despeedfrente a la media dedisty la representamos como un cuadrado azul.

En la sección correspondiente a la regresión, hemos visto cómo añadir la linea deajuste por mínimos cuadrados a un diagrama de dispersión conla funciónabline(). Eneste apartado veremos otras posibilidades en relación a la adición de curvas y líneas agráficos.

Volvamos de nuevo al gráfico decars. Imaginemos que deseamos añadir dos lineasque indiquen los valores medios de vada variable, de modo queel gráfico quede dividi-do en cuatro sectores (valores inferiores a las dos medias, inferiores a una pero superiora la otra, y superiores a las dos medias). Podríamos hacerlo como sigueplot(cars$speed,cars$dist)abline(h=mean(cars$dist),lty=3,col=4)abline(v=mean(cars$speed),lty=3,col=4)Con la segunda orden, mandamos hacer una linea horizontal que pase por la media dela variabledist. Con la tercera hacemos una horizontal que pase por la media despeed.El resultado lo vemos en la Figura8.10.

Veamos, finalmente, cómo añadir a un gráfico una función matemática. Comoejemplo tomaremos la Figura5.6de la página43.En ella se puede observar un histograma al que se le ha superpuesto la función de dis-tribución normal teórica para su contraste visual. Se ha obtenido mediante la siguienteserie de instruccioneshist(scale(cars$speed),prob=T)

1Que son el segundo, tercer y cuarto elemento, respectivamente, del vector devuelto porfivenum()

Page 89: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

8.6. AÑADIR PUNTOS Y LINEAS A UN GRÁFICO 89

5 10 15 20 25

020

4060

8010

012

0

cars$speed

cars

$dis

t

Figura 8.8: Personalización de puntos conpch,cex,col

5 10 15 20 25

020

4060

8010

012

0

cars$speed

cars

$dis

t

Figura 8.9: Añadir puntos conpoints()

Page 90: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

90 CAPÍTULO 8. PERSONALIZACIÓN DE GRÁFICOS

5 10 15 20 25

020

4060

8010

012

0

cars$speed

cars

$dis

t

Figura 8.10: Añadir lineas conabline()

curve(dnorm(x),add=T)Con la primera obtenemos el histograma de la variable estandarizada. Con la segundase le superpone la distribución teórica para lo cual se utiliza la funcióndnorm(). Parauna variable estandarizada, la gráfica se obtiene condnorm(x). Hay que hacer notar eladd=T que se incorpora para que la función se superponga al gráfico preexistente.También podemos utilizar estas herramientas para añadir a la función de densidad dela Figura5.7(página43) la función teórica y obtener la Figura8.11.Las instrucciones para ello seríanplot(density(scale(cars$speed)),col=4,lwd=2,ylim=c(0,0.5))curve(dnorm(x),add=T,col=2,lwd=2)Con la primera dibujaremos la función de densidad de la variablecars$speedestanda-rizada en color azul. Con la segunda le superpondremos la función de densidad teóricaen color rojo.

8.7. Plantillas gráficas

De las secciones anteriores se deduce que, si nuestra intención es utilizar con fre-cuencia determinada configuración gráfica (porque nos gustaun tipo determinado decaracter, color, grosor de linea,...), sería muy conveniente almacenarlo de alguna ma-nera para evitarnos teclear continuamente esa serie de parámetros. Eso es lo que vamosa poder hacer con la funciónpar().

Antes de crear una nueva configuración, puede ser conveniente guardar la configu-ración por defecto con un nombre concreto. Así,

Page 91: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

8.7. PLANTILLAS GRÁFICAS 91

−3 −2 −1 0 1 2 3

0.0

0.1

0.2

0.3

0.4

0.5

density(x = scale(cars$speed))

N = 50 Bandwidth = 0.4066

Den

sity

Figura 8.11: Añadir curvas concurve()

defecto<-par()guardará todos esos parámetros en el objeto llamadodefecto.

Ahora, podríamos querer definir una configuración nueva comola siguientecol=3,pch=2,lwd=2,fg=2,bg=hsv(.4,.1,.8),cex=.7cuyo significado conocemos ya.

La siguiente secuencia de órdenes generará la Figura8.12, la Figura8.13y la Fi-gura8.14.plantilla <-par(col=3,pch=2,lwd=4,fg=2,bg=hsv(.4,.1,.8),cex=.7)hist(cars$speed)hist(cars$speed,col=8)plot(cars$speed,cars$dist,col=7)par(defecto)

Con la primera instrucción definimos la nueva plantilla gráfica y se abre automáti-camente un dispositivo gráfico si no estaba abierto ninguno.Con la segunda generamosel primer gráfico sin pasar como argumento ningún parámetro gráfico. Con la terceramantenemos todos los parámetros deplantilla pero introducimos un color que rellenarálas barras del histograma. Con la cuarta generamos un diagrama de dispersión de lasdos variables. Como se ve, no se indica el tipo de punto ni su color porque estamosbajo los efectos deplantilla. Finalmente, con la última (par(defecto)) lo que hacemoses desactivar la plantilla y volver a los parámetros por defecto.A partir de este momento los gráficos volverán a crearse con los parámetrosnormales.Para cargar de nuevo los de nuestra plantilla deberemos teclearpar(plantilla)

Page 92: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

92 CAPÍTULO 8. PERSONALIZACIÓN DE GRÁFICOS

Histogram of cars$speed

cars$speed

Fre

quen

cy

0 5 10 15 20 25

05

1015

Figura 8.12: Modificación de parámetros gráficos conpar() (I)

Histogram of cars$speed

cars$speed

Fre

quen

cy

0 5 10 15 20 25

05

1015

Figura 8.13: Modificación de parámetros gráficos conpar() (II)

Page 93: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

8.8. GRÁFICOS MÚLTIPLES 93

5 10 15 20 25

020

4060

8010

012

0

cars$speed

cars

$dis

t

Figura 8.14: Modificación de parámetros gráficos conpar() (III)

8.8. Gráficos múltiples

Por lo general presentaremos sólo un gráfico por figura, pero en ocasiones nos pue-de interesar presentar varios gráficos agrupados en una misma figura (por ejemplo, doshistogramas de sendas variables). Para hacer esto, R dispone de varias posibilidades.Una de ellas es la funciónlayout(). Esta función requiere como argumento una matrizen la que se informe del número de ventanas en las que hay que dividir el dispositi-vo gráfico, su numeración y el número de columnas y filas que vamos a utilizar. Porejemplo, para dividir la figura en seis ventanas (cada una para un gráfico diferente)agrupadas en dos filas de tres columnas, deberemos teclearlayout(matrix(1:6,2,3))los que dividirá la pantalla tal y como vemos en la Figura8.15.La matriz que introducimos como argumento incluye en primerlugar el número de

ventanas que vamos a crear y su numeración (en este caso seránseis consecutivas,1:6). En segundo lugar se indica el número de filas2 y, finalmente el de columnas3.Puede apreciarse en la figura el orden en el que serán ocupadaslas ventanas cuandodesde R se mande realizar un gráfico. Por defecto se numeran desde la esquina supe-rior izquierda y siguiendo las columnas.

Las posibilidades de subdivisión son inmensas; en realidad, van más allá de lo quenecesitaremos en la práctica. Podemos. por ejemplo, hacer divisiones desiguales de lapantalla sólo con asignar a ventanas consecutivas la misma numeración. Por ejemplo,layout(matrix(c(1,1,2,3,4,4),2,3))

Page 94: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

94 CAPÍTULO 8. PERSONALIZACIÓN DE GRÁFICOS

1

2

3

4

5

6

Figura 8.15: División de la pantalla gráfica conlayout()

genera la división de la Figura8.16.

Puede resultar una buena idea tener creadas unas cuantas matrices para las divisio-nes que utilicemos más habitualmente. Por ejemplo, crear las siguientes matricesdos.hor<-matrix(1:2,1,2)dos.ver<-matrix(1:2,2,1)cuatro<-matrix(1:4,2,2)normal<-matrix(1)nos permitirá dividir las pantallas en dos ventanas horizontales, dos verticales, cuatroventanas, y volver a la pantalla única original con sólo teclearlayout(dos.hor)layout(dos.ver)layout(cuatro)layout(normal)Para crear la Figura8.17, podríamos introducir las siguientes órdenesX11() layout(dos.ver)hist(cars$speed,main="Velocidad",col=2,xlab="V(mph)",

ylab="Frecuencia")hist(cars$dist,main="Distancia",col=4,xlab="d(pies)",

ylab="Frecuencia")

Para crearlayoutsregulares (con todas las ventanas del mismo tamaño) tambiénpodemos utilizar un parámetro de la funciónpar(); se trata demfrow. Este nos permiteestablecer el número de ventanas en términos de filas y columnas. Así, para dividir el

Page 95: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

8.8. GRÁFICOS MÚLTIPLES 95

1

2

3

4

Figura 8.16: División desigual de la pantalla gráfica conlayout()

Velocidad

V(mph)

Fre

cuen

cia

0 5 10 20

05

1015

Distancia

d(pies)

Fre

cuen

cia

0 40 80 120

05

1015

Figura 8.17: Dos histogramas conlayout()

Page 96: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

96 CAPÍTULO 8. PERSONALIZACIÓN DE GRÁFICOS

dispositivo gráfico en seis ventanas organizadas en tres columnas de dos filas habríaque teclearpar(mfrow=c(2,3))lo que, tras la siguiente serie de instrucciones, permite obtener la Figura8.18.plot(density(scale(cars$speed)),col=4,lwd=2,ylim=c(0,0.5),

main="Densidad(velocidad)",ylab="densidad",xlab=)hist(cars$speed,col=3, main="Histograma(velocidad)",

ylab="frecuencia",xlab="velocidad")plot(cars$speed,cars$dist,main="Dispersión(vel/dist)",

xlab="velocidad",ylab="distancia")plot(density(scale(cars$dist)),col=2,lwd=2,ylim=c(0,0.5),

main="Densidad(distancia)",xlab=,ylab="densidad")hist(cars$dist,col=6,main="Histograma(distancia)",

xlab="distancia",ylab="frecuencia")plot(cars$dist,cars$speed,main="Dispersión(dist/vel)",

xlab="distancia",ylab="velocidad")

Page 97: Introducción a R - geonomia.org · 2 −3 −1 0 1 2 3 0.0 0.1 0.2 0.3 0.4 0.5 Densidad(velocidad) densidad Histograma(velocidad) velocidad frecuencia 0 5 10 15 20 25 0 5 10 15 5

8.8. GRÁFICOS MÚLTIPLES 97

−3 −1 0 1 2 3

0.0

0.1

0.2

0.3

0.4

0.5

Densidad(velocidad)

dens

idad

Histograma(velocidad)

velocidad

frec

uenc

ia

0 5 10 15 20 25

05

1015

5 10 15 20 25

020

4060

8010

012

0

Dispersión(vel/dist)

velocidad

dist

anci

a

−2 0 1 2 3 4

0.0

0.1

0.2

0.3

0.4

0.5

Densidad(distancia)

dens

idad

Histograma(distancia)

distancia

frec

uenc

ia

0 20 40 60 80 120

05

1015

0 20 40 60 80 120

510

1520

25

Dispersión(dist/vel)

distancia

velo

cida

d

Figura 8.18: Figuras múltiplespar(mfrow)