You are on page 1of 378

Castor Guisande González

Catedrático del Área de Ecología


Universidad de Vigo. España

Antonio Vaamonde Liste


Catedrático del Área de Estadística
e investigación Operativa
Universidad de Vigo. España

Gráficos
estadísticos
y mapas con R
©Cástor Guisande González, Antonio Vaamonde Liste, 2012 (Versión papel)

©Cástor Guisande González, Antonio Vaamonde Liste, 2013 (Versión electrónica)

Reservados todos los derechos.

Queda prohibida, salvo excepción prevista en la ley ,cualquier forma de reproducción,


distribución, comunicación pública y transformación de esta obra sin contar con la autorización
de los titulares de propiedad intelectual. La infracción de los derechos mencionados puede ser
constitutiva de delito contra la propiedad intelectual (art.270 y siguientes del Código Penal). El
Centro Español de Derechos Reprográficos (CEDRO) vela por el respeto de los citados
derechos.

EdicionesDíazdeSantos
Email:ediciones@diazdesantos.es
www.editdiazdesantos.com

ISBN: 978-84-9969-610-2 (Libro electrónico)


ISBN:978-84-9969-211-1(Libro en papel)
ÍNDICE

PRÓLOGO Y AGRADECIMIENTOS............................................. XI

I. PROGRAMACIÓN DE GRÁFICOS CON R............................... 1


I.1. PRIMEROS PASOS CON R..................................................... 1
I.1.1. Instalación........................................................................... 1
I.1.2. Interfaz................................................................................ 1
I.1.3. Seleccionar directorio de trabajo........................................ 2
I.1.4. Paquetes gráficos................................................................ 3
I.1.5. Scripts y archivos que se usan en el libro........................... 6
I.2. COMPLEMENTOS GRÁFICOS............................................... 6
I.3. ARGUMENTOS GENERALES................................................ 11
I.4. COLORES.................................................................................. 20
I.5. FÓRMULAS MATEMÁTICAS Y CARACTERES
ESPECIALES................................................................................... 32
I.6. DISPOSITIVOS PARA GRÁFICOS......................................... 34

II. GRÁFICOS BÁSICOS.................................................................. 39


II.1. GRÁFICOS DE DISPERSIÓN................................................ 39
II.2. GRÁFICOS CON BARRAS DE DESVIACIONES................ 46
II.3. MODELOS Y GRÁFICOS EN PANELES.............................. 48
II.4. DIAGRAMA DE CAJAS......................................................... 49
II.5. BEANPLOTS............................................................................. 52
II.6. CURVAS DE AJUSTE............................................................. 58
II.7. HISTOGRAMAS...................................................................... 59
II.8. DIAGRAMA DE TALLO Y HOJAS....................................... 64
II.9. GRÁFICOS DE BARRAS........................................................ 65
II.10. GRÁFICOS CIRCULARES................................................... 73
II.11. GRÁFICOS DE PUNTOS...................................................... 77
II.12. GRÁFICOS TERNARIOS..................................................... 78
II.13. GRÁFICOS DE CONTORNOS Y SUPERFICIES................ 83
II.14. GRÁFICOS TRIDIMENSIONALES..................................... 87
II.15. CONFIGURACIÓN DE MÁRGENES Y EJES
ADICIONALES............................................................................... 94
II.16. FORMAS ESPECIALES........................................................ 96
II.17. GRÁFICOS COMBINADOS................................................. 99

VII
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
VIII

II.18. GRÁFICOS DENTRO DE GRÁFICOS................................. 100


II.19. AMPLIACIÓN DE UN ÁREA DENTRO DE UN
GRÁFICO......................................................................................... 103
II.20. GRÁFICOS CON INTERVALOS EN LOS EJES................. 104
II.21. PAQUETES QUE PERMITEN REALIZAR VARIOS
TIPOS DE GRÁFICOS BÁSICOS.................................................. 106
II.21.1. R Commander.................................................................. 106
II.21.2. GrapheR........................................................................... 112
II.22. REPRESENTACIONES INTERACTIVAS PARA
PÁGINAS WEB............................................................................... 117
II.22.1. Gráficos........................................................................... 117
II.22.2. Tablas.............................................................................. 120
II.22.3. Combinación de representaciones................................... 121

III. GRÁFICOS AVANZADOS......................................................... 123


III.1. GRÁFICOS DEMOGRÁFICOS............................................. 123
III.2. GRÁFICOS DE BURBUJAS.................................................. 125
III.3. GRÁFICOS DE ESCALERA.................................................. 128
III.4. DIAGRAMAS DE FLUJO...................................................... 129
III.5. GRÁFICOS DE TELARAÑAS.............................................. 131
III.6. DIAGRAMA DE EVENTOS.................................................. 133
III.7. MATRICES DE GRÁFICOS….............................................. 139
III.8. GRÁFICOS DE MATRICES DE CORRELACIONES.......... 147
III.9. DIAGRAMA DE VENN Y EULER....................................... 152
III.10. GRÁFICOS DE VARIABLES CUALITATIVAS
EN FUNCIÓN DE VARIABLES CUANTITATIVAS................... 153
III.11. DISTRIBUCIONES DE VARIABLES CUALITATIVAS.. 158
III.12. GRÁFICOS PARA TABLAS DE CONTINGENCIA.......... 161
III.13. GRÁFICOS PARA GRANDES CONJUNTOS DE
DATOS............................................................................................. 165
III.13.1. Dispersión...................................................................... 166
III.13.2. Matrices de gráficos....................................................... 167
III.13.3. Espectros........................................................................ 169
III.13.4. Gráficos polares............................................................. 171
III.14. GRÁFICOS PARA PRUEBAS ALEATORIAS................... 173
III.15. DIAGRAMA DE TAYLOR.................................................. 177
III.16. CURVAS DE SUPERVIVENCIA Y REGRESIÓN DE
COX.................................................................................................. 180
III.17. ANÁLISIS DE VARIANZA................................................. 182
III.18. GRÁFICOS DE DIAGNÓSTICO EN MODELOS
LINEALES....................................................................................... 186
ÍNDICE
IX

III.19. GRÁFICOS DE MEDIDAS DE RIESGO DE


EXTINCIÓN..................................................................................... 188
III.20. GRÁFICOS PARA ANÁLISIS MULTIVARIANTE........... 190
III.20.1. Biplot.............................................................................. 190
III.20.2. Análisis Discriminante................................................... 192
III.20.3. GGE Biplot..................................................................... 199
III.20.4. Gráficos combinando Análisis de Componentes
Principales y Análisis Discriminante........................................... 212
III.21. MODELO DE EFECTOS PRINCIPALES ADITIVOS
E INTERACCIÓN MULTIPLICATIVA (AMMI).......................... 216
III.22. GRÁFICOS DE INFERENCIA EN COSTE/EFICACIA..... 219
III.23. META-ANÁLISIS................................................................ 224
III.23.1. Diagrama de bosque....................................................... 225
III.23.2. Gráfico de L'Abbé.......................................................... 232
III.23.3. Diagrama de embudo..................................................... 234
III.23.4. Diagrama de análisis de sensibilidad............................. 236
III.23.5. Diagrama de meta-análisis acumulativo........................ 237
III.24. GRÁFICOS DE CLASIFICACIÓN...................................... 239
III.24.1. Clasificación jerárquica (dendrograma)......................... 239
III.24.2. Clasificación de k-medias.............................................. 242
III.24.3. Árbol de consenso.......................................................... 247
III.24.4. Árboles de Clasificación y Regresión: CARTs.............. 249
III.24.5. Árboles de Clasificación y Regresión (CARTs) y
Análisis de Componentes Principales.......................................... 255
III.24.6. Árboles de Inferencia..................................................... 260
III.25. DIAGRAMAS PALEOECOLÓGICOS................................ 271
III.26. GRÁFICOS CLIMÁTICOS.................................................. 274
III.26.1. Rosa de vientos.............................................................. 274
III.26.2. Diagrama de Walter-Lieth............................................. 276
III.27. CONTROL DE CALIDAD................................................... 278
III.27.1. Definir............................................................................ 279
III.27.1.1. Diagrama de Ishikawa........................................... 279
III.27.1.2. Diagrama de Pareto............................................... 280
III.27.2. Medir.............................................................................. 282
III.27.2.1. MSA tipo I............................................................... 282
III.27.2.2. MSA tipo II............................................................. 284
III.27.3. Analizar.......................................................................... 288
III.27.4. Mejorar........................................................................... 290
III.27.4.1. Diseño factorial...................................................... 291
III.27.4.2. Diseño con mezclas................................................ 296
III.27.4.3. Diseños Taguchi..................................................... 299
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
X

III.27.5. Controlar........................................................................ 302


III.27.5.1. Variables................................................................ 303
III.27.5.2. Atributos................................................................. 307
III.28. MINERÍA DE DATOS.......................................................... 309
III.28.1. Cargar datos................................................................... 310
III.28.2. Explorar.......................................................................... 312
III.28.3. Pruebas........................................................................... 315
III.28.4. Modelos.......................................................................... 316

IV. MAPAS.......................................................................................... 319


IV.1. ÁREAS ADMINISTRATIVAS.............................................. 319
IV.2. GRÁFICOS DENTRO DE MAPAS....................................... 327
IV.3. MAPAS CON INFORMACIÓN ADICIONAL..................... 328
IV.4. MAPAS DE VECTORES....................................................... 338
IV.5. MAPAS INTERACTIVOS..................................................... 340
IV.6. MAPAS HIDROLÓGICOS.................................................... 341

BIBLIOGRAFÍA................................................................................. 347

ÍNDICE DE PAQUETES, FUNCIONES Y ARGUMENTOS........ 355


PRÓLOGO Y
AGRADECIMIENTOS

Los estadísticos han utilizado siempre gráficos para mostrar los resultados de
forma que pudieran ser interpretados por diferentes tipos de lectores, incluyendo
aquellos con escasos o nulos conocimientos de estadística. Los gráficos ayudan a
entender mejor las conclusiones obtenidas en la aplicación de diferentes métodos
estadísticos, y generalmente se busca con la representación reforzar visualmente
los aspectos más destacables de los datos y los resultados.
Algunos gráficos estadísticos aparecen con frecuencia en la prensa o en los
distintos medios de comunicación, ya que son necesarios para entender mejor la
realidad que nos rodea. Un conocimiento elemental de los gráficos más comunes
forma parte hoy en día de la cultura general de los ciudadanos, y es habitual
encontrarlos, junto con otros conceptos estadísticos elementales, en los planes
de estudios de la enseñanza obligatoria de cualquier país moderno.
Existen centenares de tipos distintos de gráficos y múltiples variantes de cada
uno de ellos. Los programas estadísticos generalmente han prestado mucha
atención a la construcción de gráficos, que suele ser un apartado importante del
menú de usuario. A menudo se busca la construcción automática del gráfico,
liberando al usuario del esfuerzo y la incomodidad de definir tamaños, escalas,
líneas, colores, leyendas, o complementos diversos.
Existen programas no estadísticos de uso general, como por ejemplo hojas de
cálculo, sistemas de gestión de bases de datos, entornos de programación, pro-
gramas de edición o de diseño de páginas web, que incluyen también herra-
mientas para la construcción de gráficos estadísticos, ya que la presentación de
la información de una forma adecuada es un elemento esencial que ha superado
hace mucho tiempo el estricto ámbito de la Estadística para convertirse en una
necesidad transversal de aplicación prácticamente universal.
Algunos gráficos son fácilmente interpretables, sin requerir una formación
previa, ya que son intuitivos y asequibles a todos. Otros requieren un conoci-
miento adicional sobre el significado exacto de los distintos elementos represen-
tados. Por último, existe una tercera categoría de gráficos, en número creciente,
cuya complejidad interpretativa requiere un conocimiento experto de la técnica
estadística que lo emplea. No es posible interpretar adecuadamente esos gráficos
sin haber comprendido suficientemente un método estadístico concreto, siendo el
gráfico en esos casos una parte importante del mismo. Muchos métodos estadís-
ticos conducen a un gráfico de interpretación no trivial, por ejemplo el escala-
miento multidimensional, árboles de clasificación, algunas técnicas de control de
calidad, análisis de series temporales, meta-análisis, etc.
Muchos gráficos nacieron históricamente como herramientas meramente des-
criptivas, como una alternativa o un complemento a las tablas y medidas numé-
ricas. Sin embargo, desde antiguo se conocen las posibilidades analíticas y expli-
cativas de algunos gráficos, y actualmente existen gráficos que constituyen po-
tentes instrumentos de análisis y decisión.

XI
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
XII

R se ha convertido durante la última década en el programa estadístico de uso


general más potente, con mucha diferencia sobre los restantes, y también el más
versátil. No solo es el preferido por la comunidad estadística, que ha apostado
sin reservas por su desarrollo mediante un esfuerzo colectivo generoso y desin-
teresado sino que, además, quizás en parte por su carácter de programa total-
mente gratuito, empieza a ser utilizado cada vez más por investigadores y técni-
cos de cualquier ámbito de conocimiento, hasta el punto de que actualmente es
posible encontrar sin dificultad aplicaciones, desarrolladas en R, de interés para
usuarios con necesidades estadísticas especializadas, en campos tan distintos
como ecología, medicina, ingeniería, biología, economía, lingüística, sociología, o
–como no- estadística.
R es por añadidura el programa estadístico con mayor capacidad y flexibilidad
para la construcción de gráficos, y ese es el objeto de este libro, mostrar las
enormes posibilidades que R brinda en este aspecto, y enseñar a los usuarios
interesados como construir los gráficos que necesitan.
La filosofía de R no coincide con la mayoría de los programas estadísticos al-
ternativos. No se busca tanto la rapidez y comodidad del usuario mediante la
construcción automática de un gráfico único y cerrado sino, por el contrario, la
flexibilidad y el control de los distintos elementos del gráfico, que el usuario
puede diseñar a su medida. Este planteamiento, que hace posible obtener gráfi-
cos personalizados, obliga por otra parte a un mayor esfuerzo de programación y
a un mayor nivel de conocimientos, pero el esfuerzo obtiene su recompensa en
un resultado en general mucho más satisfactorio. Por otra parte existen muchos
procedimientos de R que permiten obtener gráficos de forma rápida y sencilla si
se desea, aplicando condiciones estándar y opciones por defecto, que no requie-
ren un esfuerzo para el usuario mucho mayor del que exigen otros programas
estadísticos.
En la primera parte del libro se presentan las técnicas generales para la cons-
trucción de gráficos con R: paquetes, funciones, argumentos y opciones, con
numerosos ejemplos de aplicación reales que permitirán al lector utilizar las fun-
ciones básicas con soltura para la construcción de la mayoría de los gráficos más
comunes. Un buen conocimiento de estas técnicas básicas será útil también para
la construcción y modificación de otros gráficos más complejos.
El objetivo es el manejo de los distintos parámetros que controlan el tamaño
y aspecto, escalas, ejes, líneas, puntos, colores, textos y leyendas, símbolos y
otros elementos gráficos, así como las utilidades que permiten combinar distintos
gráficos, añadir elementos nuevos a un gráfico, y otras más avanzadas.
En la segunda parte del libro se revisan de forma sistemática los principales
gráficos, desde los más básicos y habituales (histograma, diagrama de barras, de
sectores, de cajas, de dispersión, etc.) hasta los más complejos (biplot, curvas
de nivel, gráficos de control, etc.), incluyendo algunos gráficos de reciente apari-
ción asociados a técnicas estadísticas novedosas.
No se pretende elaborar un catálogo de todos los gráficos existentes sino so-
lamente describir los más usuales o los más útiles para el lector general, entre
otras cosas porque el mundo de R está vivo y tiene una gran vitalidad, de modo
que constantemente aparecen nuevas propuestas, nuevas técnicas, nuevos pa-
quetes y nuevos gráficos, así como mejoras en los ya existentes.
Para cada uno de los gráficos descritos en el libro se presentan con detalle los
procedimientos para la construcción y las principales claves de interpretación, de
modo que puedan ser utilizados por usuarios no expertos o sin conocimientos
estadísticos avanzados.
PRÓLOGO Y AGRADECIMIENTOS
XIII

Para todos los gráficos se muestra con ejemplos la construcción paso a paso,
de tal forma que sea sencillo reproducir el resultado con cualquier otro conjunto
de datos. Se explican las características del gráfico, el significado de los diferen-
tes argumentos de cada una de las funciones, y el ámbito de aplicación.
También se lleva a cabo una interpretación de los resultados para la aplicación
concreta y el ejemplo utilizado en cada caso. Esta interpretación es quizás el
aspecto más difícil, sobre todo en algunos gráficos relacionados con técnicas es-
tadísticas complejas, ya que depende siempre de los resultados, que pueden ser
distintos en cada aplicación. Aunque se intenta explicar las claves principales de
interpretación, lo cierto es que solamente un conocimiento profundo de los as-
pectos teóricos y prácticos relacionados con la técnica estadística involucrada
garantizará una interpretación correcta de todos los resultados gráficos obteni-
dos, por lo que recomendamos vivamente a los lectores interesados que no se
detengan en la realización práctica de los gráficos, sino que intenten comprender
los diferentes elementos teóricos (propios del campo de aplicación) y estadísticos
que subyacen en los resultados a interpretar, y consulten con un experto es-
tadístico sus dudas cuando sea necesario.
Dado el carácter abierto y libre de R, los paquetes -y los datos contenidos en
ellos- pueden ser modificados o incluso suprimidos por sus autores cuando lo
consideren oportuno. En ese caso algunos ejemplos citados en este libro podrían
dar lugar a resultados diferentes de los indicados, o requerir datos e instruccio-
nes distintas de las que se citan. Los autores del libro no se hacen responsables
de estos hipotéticos cambios ajenos a su voluntad.
Por último, agradecemos a Aldo Barreiro Felpeto su ayuda con alguno de los
scripts que se muestran en el libro.
CAPÍTULO I

PROGRAMACIÓN DE GRÁFICOS
CON R

I.1. Primeros pasos con R

I.1.1. INSTALACIÓN

El programa está en la dirección http://cran.r-project.org/. Allí veremos, en la


parte superior, un enlace para la instalación de R en Linux, MacOS y Windows.
Para Windows debemos seguir el enlace al subdirectorio base. En el caso de
MacOS, el enlace nos lleva a una página donde podemos encontrar el archivo de
instalación con la última versión. Hay varias formas de instalar R en distribucio-
nes de Linux; de forma general, primero es necesario añadir «CRAN» a la lista de
repositorios, configurar el nuevo repositorio adecuadamente e instalar el r-base.

I.1.2. INTERFAZ

Existen diferentes entornos gráficos que facilitan la interacción con el usuario


(llamados GUI, del inglés Graphical Users Interface). Entre los más populares se
encuentran RGui (disponible para Windows), Tinn-R (Windows, MacOS), R
Commander (Windows, MacOS, Linux), Emacs (Windows, MacOS, Linux), RKward
(Linux), pero existen muchos otros. En este libro hemos elaborado la mayoría de
los ejemplos con RGui en Windows, y algunos con R Commander. La siguiente
pantalla muestra el aspecto de la interfaz RGui, disponible para Windows:

1
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
2

RGui se instala de forma automática con el paquete base de Windows. El


resto de GUIs es necesario instalarlas específicamente. Se encuentran gratuita-
mente en internet.
Estas GUIs, para facilitar la interacción con el usuario, disponen de una serie
de menús desplegables, cuya complejidad puede ir desde solamente algunas
sencillas posibilidades de edición, apertura de ficheros, guardar datos, cargar
paquetes, actualizar, etc. como podría ser el caso de RGui, hasta corrección de
sintaxis de instrucciones, menús desplegables para importar/exportar datos,
gráficos y múltiples técnicas estadísticas, como es el caso de R Commander y
RKward.

I.1.3. SELECCIONAR DIRECTORIO DE TRABAJO

Si disponemos de alguno de los múltiples tipos de interfaz gráfica, además de


la consola, podemos usar el correspondiente icono de acceso directo para abrir el
programa R.
Una vez dentro del programa, es muy importante seleccionar el directorio o
carpeta de trabajo. Este directorio es el que estará disponible de forma automá-
tica para cargar archivos de datos, abrir archivos para incluir instrucciones
(scripts), guardar áreas de trabajo y archivos de salida, etc. Si no seleccionamos
un directorio de trabajo específico utilizará el que tiene por defecto, que depende
de la instalación que se haya hecho. El directorio de trabajo se selecciona con la
siguiente instrucción:

¾ setwd(“C:/Documents and Settings/All Users/ArchivosR”)

La función «setwd()» permite seleccionar el directorio deseado escribiendo


como argumento toda la ruta de directorios entrecomillada, con las barras sepa-
radoras orientadas hacia la derecha. Si queremos saber cuál es el directorio de
trabajo actual, debemos escribir la siguiente instrucción:

¾ getwd()

Aquí tenemos un ejemplo de cómo establecer un directorio de trabajo me-


diante instrucciones y después preguntar cual es el directorio de trabajo actual:

¾ setwd("C:/Archivos de programa")
¾ getwd()

La mayoría de las GUIs disponen de una opción a través de menú para esta-
blecer el directorio de trabajo. En RGui, que como se mencionó anteriormente es
el entorno que se usará en la mayoría de los ejemplos en este libro, se encuentra
en el menú «Archivo» Ö «Cambiar dir…». Tras pulsar en esta opción surge un
cuadro de diálogo en el que seleccionaremos nuestro directorio.
PROGRAMACIÓN DE GRÁFICOS CON R
3

Para salir de R es suficiente con teclear «q()» en la línea de instrucciones. Si


trabajamos con cualquiera de los GUIs, suele haber además un menú con la op-
ción «Salir» (como se observa en la anterior ventana). Cualquiera que sea la
forma que escojamos para salir, se nos preguntará si queremos guardar o no el
área de trabajo. En el área de trabajo se guardan objetos que hayamos creado y
que quedan disponibles hasta la próxima vez que deseemos utilizarlos abriendo
el archivo. Se guarda como un archivo con extensión Rdata. Es posible tener
abiertas simultáneamente varias áreas de trabajo. También es posible guardar la
serie de instrucciones que hayamos escrito, como archivo Rhistory. No obs-
tante, para esto es más interesante la opción de editarlos creando un script,
como veremos a continuación.

I.1.4. PAQUETES GRÁFICOS

Para realizar cualquier aplicación con R se usa un paquete, que es un archivo


con el código que contiene las funciones que nos interesa utilizar. Estos paque-
tes son programados por usuarios que los ponen a disposición pública en los re-
positorios de «CRAN». Una librería es un directorio donde se instala un de-
terminado grupo de paquetes. Hay un listado con todos los paquetes disponibles,
incluyendo también todos los paquetes gráficos, en la página web de R:
http://cran.r-project.org/web/packages/available_packages_by_name.html#
available-packages-L. Para ver solamente los paquetes que incluyen funciones
gráficas véase la página http://rgm2.lab.nig.ac.jp/RGM2/images.php?show=all
donde, además de tener una lista de los paquetes, también se muestran los
gráficos.
Las diferentes instrucciones de R para realizar gráficos, que forman parte de
los diferentes paquetes, se pueden dividir en:

x Funciones gráficas. Permiten realizar diferentes tipos de gráficos y tie-


nen sus propios argumentos específicos.
x Complementos gráficos. Son también funciones que permiten añadir a
los gráficos líneas, textos, flechas, leyendas, etiquetas, etc., y también
tienen sus propios argumentos específicos.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
4

x Argumentos generales. Son argumentos que se pueden usar en las


funciones y complementos gráficos anteriores, además de los argumen-
tos específicos de cada una de ellas.

El siguiente esquema resume la estructura de los paquetes, con sus funcio-


nes, las cuales tienen argumentos específicos y también pueden usar argumen-
tos generales que son de uso común para todas las funciones.

Paquetes Funciones Argumentos Argumentos


específicos generales
text()

graphics plot() type= xm ain=

contour() nlevels=

triangle.
ade4 addm ean= xlim it=
plot()

El modo más elemental de instalar un paquete es ejecutando la siguiente ins-


trucción:

¾ install.packages("nombre del paquete", dep=TRUE)

El nombre del paquete se escribe entre comillas, y después de la coma es


muy recomendable incluir el argumento «dep=TRUE», que indica que se instalen
también las dependencias de ese paquete. Las dependencias son otros paquetes
que contienen elementos necesarios para que funcionen todas las aplicaciones
que hay en el paquete que queramos instalar. Sin esas dependencias, algunas
aplicaciones de nuestro paquete podrían no funcionar.
Los GUIs suelen incluir algún tipo de menú para instalar paquetes. Por ejem-
plo, en RGui se encuentra en «Paquetes» Ö «Instalar paquetes(s)…», y ya instala
por defecto todas las dependencias.
PROGRAMACIÓN DE GRÁFICOS CON R
5

Inmediatamente después de la anterior instrucción, aparece una ventana en


la que se nos pide que seleccionemos un servidor “espejo” desde el que podamos
descargar el paquete. Suele escogerse por proximidad geográfica. Todos los eu-
ropeos funcionan bien. Después de seleccionar el servidor, elegimos el paquete
en la lista alfabética, y se descargará de forma automática, quedando instalado
en ese ordenador de forma permanente.

Cuando se instala un paquete se instalan las funciones que contiene y, en


muchos casos, también se instalan datos que se utilizan para ilustrar los ejem-
plos de uso de las funciones. Para acceder a una lista completa de todas las fun-
ciones dentro de un paquete, teclearíamos la siguiente instrucción:

¾ library(help="graphics")

La mejor forma de consultar la lista de argumentos disponibles de cada fun-


ción es cargando el paquete y luego ver el menú ayuda de la función:

¾ library(vcd)
¾ help(assoc)
Existen demos que nos muestran buenos ejemplos de gráficos con su corres-
pondiente código:

¾ demo(graphics)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
6

¾ demo(image)

Las funciones gráficas que permiten hacer los distintos tipos de gráficos se
explicarán en el siguiente capítulo. Como los complementos gráficos y los argu-
mentos generales son importantes cuando se realiza cualquier tipo de gráfico, se
explicarán antes de pasar a ver todas las funciones gráficas disponibles en R.

I.1.5. SCRIPTS Y ARCHIVOS QUE SE USAN EN EL LIBRO

Todos los scripts y archivos con los datos utilizados en los ejemplos de este
libro se pueden descargar de la página web http://www.ipez.es/GRAFICOS_
ESTADISTICOS_Y_MAPAS_CON_R.rar.

I.2. Complementos gráficos

Como se mencionó anteriormente, los complementos gráficos son también


funciones que sirven para añadir a los gráficos líneas, textos, cuadros, flechas,
leyendas, etiquetas, etc. Por lo tanto sirven para complementar los gráficos que
se realizan con las funciones gráficas que veremos en el siguiente capítulo.
En el esquema que sigue se muestra en primer lugar cada función y la página
de este libro donde se puede encontrar un ejemplo de utilización. Después se
explica para que sirve, el paquete al que pertenece, y los argumentos específicos
que tiene, junto con sus valores por defecto, indicados con el símbolo ‘*’ en la
descripción de los argumentos.

a y b: intersección y
pendiente de la recta

h: valor de y en una
línea horizontal

v: valor de x en una
línea vertical

Añade líneas: reg: un vector del tipo


Paquete graphics c(a,b) con la inter-
abline abline(a = NULL, b = NULL, h sección y pendiente de
pág. 41 = NULL, v = NULL, reg = la regresión
NULL, coef = NULL, untf =
FALSE,....)
coef: Se especifica una
regresión, por ejemplo
coef (lm c(x~y))

untf: FALSE* o TRUE. Si


un eje tiene trans-
formación log y se pone
TRUE, representa la
línea sin transformar
PROGRAMACIÓN DE GRÁFICOS CON R
7

x0 e y0: coordenadas de
origen

x1 e y 1 : coordenadas
Representa flechas: finales
Paquete graphics
arrows length: longitud en pul-
arrows(x0, y0, x1, y1, length =
pág. 97 gadas de la punta de
0,25, angle = 30, code = 2,
col, lty, lwd,....) flecha
angle: ángulo de la
punta de la flecha

code: tipo de flecha

side: 1 eje inferior, 2 eje


izquierdo, 3 eje superior
y 4 eje derecho

at: variable con los valo-


res donde se pondrán las
divisiones del eje. En ca-
so de no ponerla se cal-
culan automáticamente

labels: TRUE*, FALSE,


variable con las etiquetas
de los intervalos, un ca-
Añade ejes: rácter o un vector
Paquete graphics
axis(side, at = NULL, labels = tick: valor lógico (TRUE*
TRUE, tick = TRUE, line = NA, o FALSE) que indica si se
axis
pos = NA, outer = FALSE,font representan los interva-
pág. 95
= NA, lty = "solid", lwd = 1, los
lwd.ticks = lwd, col = NULL,
col.ticks = NULL, hadj = NA, line: número de líneas
padj = NA.....) de separación con el eje

pos: coordenada donde


se pondrá el eje

outer: valor lógico


(TRUE o FALSE*) que
define si el eje se
representa fuera o den-
tro de los márgenes del
gráfico

hadj y padj: ajustes ho-


rizontales y verticales en
una escala de 0 a 1
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
8

which: indica donde


Pinta un marco en el gráfico:
box representar el marco y
Paquete graphics
pág.95 puede ser "plot", "figure",
box(which = "plot", lty,....)
"inner" o "outer"

Representa una cuadrícula:


nx y ny: número de
Paquete graphics
grid celdas en las direcciones
grid(nx = NULL, ny = nx, col =
pág. 48 x e y. Por defecto utiliza
"lightgray", lty = "dotted",
las divisiones de los ejes
lwd = par("lwd"),....)

x e y: coordenadas de la
leyenda

legend: texto de la le-


yenda
Añade una leyenda:
Paquete graphics
legend(xx, y = NULL, legend, fill: color de relleno
fill = NULL, col = par("col"),
border="black", lty, lwd,pch,
angle = 45, density = NULL, ncol: número de colum-
bty = "o", bg = par("bg"), nas
box.lwd = par("lwd"), box.lty
= par("lty"), box.col =
par("fg"), pt.bg = NA, cex = horiz: si es TRUE los
legend textos son horizontales
1, pt.cex = cex, pt.lwd =
pág. 42
lwd, xjust = 0, yjust = 1,
x.intersp = 1, y.intersp = 1,
adj = c(0, 0.5), text.width = La posición de la le-
NULL, text.col = par("col"), yenda se especifica con
merge = do.lines && coordenadas o con
has.pch, trace = FALSE, plot palabras clave: "bo-
= TRUE, ncol = 1, horiz = ttomright", "bottom",
FALSE, title = NULL, inset = "bottomleft", "topleft",
0, xpd, title.col = text.col, "left", "top", "topright",
title.adj = 0.5, seg.len = 2 "right" o "center"

bty: define el marco de


la leyenda: "o" con
marco y "n" sin marco

x, y: coordenadas de los
Añade líneas o une los puntos puntos a unir mediante
con líneas: líneas
lines
Paquete graphics
pág. 58
lines(x = NULL, y = NULL, type type: véase la función
= "l",....) «plot()» para ver los dis-
tintos tipos de línea
PROGRAMACIÓN DE GRÁFICOS CON R
9

n: el número máximo de
objetos que se desea
ubicar
Permite definir con el ratón la
posición de objetos en el panel
locator gráfico y devuelve las coorde- type: Con "n" ubica
pág. 42 nadas: cualquier objeto, con "p"
Paquete graphics representa símbolos y
locator(n = 512, type = "n",....) con "l" pinta líneas
uniendo los puntos, pa-
ra lo cual n debe ser
mayor que 1

text: texto

side: eje donde se


ubicará el texto; abajo
(1), izquierda (2), arriba
(3), y derecha (4)

line: valor numérico con


la distancia, en líneas,
desde el eje

outer: si es TRUE utiliza


los márgenes exte-
riores si están dispo-
nibles

at: posición en el gráfico


Permite añadir textos en el donde se quiere escribir
margen del gráfico: el texto
Paquete graphics
mtext
mtext(text, side = 3, line =
pág. 46 adj: ajuste del texto en
0, outer = FALSE, at = NA,
adj = NA, padj = NA, cex, el sentido de la direc-
col, font,...) ción de lectura. Para los
textos paralelos a los
ejes, adj = 0 significa
alineación hacia la iz-
quierda o abajo, y adj
= 1 significa alineación
derecha o arriba.

padj: ajuste del texto


perpendicular a la di-
rección de lectura (que
es controlada por adj).
Para los textos para-
lelos a los ejes, padj =
0 significa alineación
derecha o arriba, y
padj = 1 significa ali-
neación hacia la iz-
quierda o abajo.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
10

x e y: coordenadas de
Permite representar símbolos
los puntos
en la coordenadas especifi-
points
cadas:
pág. 42 type: véase la función
Paquete graphics
points(x, y, type = "p",....) «plot()» para ver los
distintos tipos de grá-
ficos

x e y: coordenadas de
los vértices del polígono

Representa polígonos: density: densidad del


Paquete graphics sombreado
polygon
polygon (c(x1,x2), c(y1,y2),
pág. 44 angle: ángulo de las
density = NULL, angle = 45,
border = NULL, col, lty,....) líneas del sombreado

border: color del borde,


NA es sin borde y NULL*
con el color por defecto
(negro)

xleft, ybottom, xright,


ytop: extremos del
rectángulo

Pinta un rectángulo: density: densidad del


Paquete graphics sombreado
rect rect(xleft, ybottom, xright, ytop,
pág. 58 density = NULL, angle = 45, col angle: ángulo de las
= NA, border = TRUE, lty, líneas de sombreado
lwd,...)

border: si es TRUE se
pinta un borde y NA sin
bordes

z: posición en el eje x
Añade al gráfico una “alfom-
bra”, con pequeños trazos
verticales en cada punto z del ticksize: longitud de los
rug trazos verticales
eje horizontal:
pág. 95
Paquete graphics
rug(z, ticksize = 0.03, side = side: lado en el que
1, lwd = 0.5, col,....) dibujará la alfombra: 1
inferior, 3 superior

Dibuja segmentos entre pun-


tos: x0, y0, x1, y1: coordena-
segments
Paquete graphics das de origen y final de
pág. 58
segments(x0, y0, x1, y1, col, la línea
lty, lwd,....)
PROGRAMACIÓN DE GRÁFICOS CON R
11

x o y: coordenadas
donde se ubicará el texto

labels: texto que se


quiere escribir o variable
con las etiquetas del
Permite añadir etiquetas a las texto de los puntos
coordenadas de un gráfico:
Paquete graphics
text
text(x, y = NULL, labels, adj = srt: ángulo del texto
pág. 44
NULL, srt, offset = 0.5, pos =
NULL, cex = 1, col = NULL, font offset: posición del texto
= NULL, ...) en el eje vertical res-
pecto a la coordenada

pos: eje donde se ubi-


cará el texto; abajo (1),
izquierda (2), arriba (3),
y derecha (4)

main: texto del título del


gráfico

sub: subtítulo

xlab: leyenda del eje x


Añade texto en títulos o leyen-
das:
title Paquete graphics ylab: leyenda del eje y
pág. 40 title(main = NULL, sub = NULL,
xlab = NULL, ylab = NULL, line = line: valor numérico que
NA, outer = FALSE, ...) define la separación del
texto con respecto al
gráfico

outer: si es TRUE utiliza


los márgenes exteriores
si están disponibles

I.3. Argumentos generales

En la sección anterior se mostraron los complementos gráficos. A continua-


ción se resumen los argumentos gráficos generales, es decir, aquellos que se
pueden usar en la mayoría de las funciones y complementos gráficos. La estruc-
tura de los esquemas consiste en mostrar en primer lugar el argumento y la
página donde se da un ejemplo del mismo, después se explica para que sirve y,
por último, los diferentes valores que tiene (el símbolo * indica cual es la opción
por defecto que tiene el argumento). La abreviación A.L. indica que son argu-
mentos solamente de lectura.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
12

Los siguientes argumentos solamente se usan con la función «par()»: «fig»,


«fin», «mai», «mar», «mex», «mfcol», «mfrow», «new», «oma», «omd», «omi»,
«pin», «plt», «ps», «pty», «xlog» e «ylog». El resto de argumentos con la ma-
yoría de funciones gráficas, además de la función «par()».

Si se selecciona TRUE añade el


gráfico a uno ya creado. Es igual al FALSE*
add argumento «new», pero este
pág. 46 último solamente se usa con la
función «par()». No se puede usar TRUE
con todas las funciones gráficas

0 (texto a la
izquierda)

0.5 (texto
Especifica la alineación de los centrado)*
adj textos en los gráficos y también
pág. 95 sirve para las funciones «text», 1 (texto a la
«mtext» y «title» derecha)

Puede tomar cual-


quier valor entre 0
y 1, y algunas
funciones permiten
valores mayores

Si se selecciona FALSE elimina las TRUE*


ann leyendas de los ejes y los títulos de
pág. 95 los gráficos cuando se usa con la
función «plot.default» FALSE

TRUE
ask Si es TRUE se pregunta antes de
pág. 174 añadir un nuevo gráfico
FALSE*

Define la proporción de escala o


asp relación de aspecto de los ejes: una Cualquier valor nu-
pág. 40 unidad en x tiene la misma longitud mérico positivo: 1*
que asp unidades en y

TRUE*
axes Especifica si se representan los ejes
pág. 99 del gráfico
FALSE

La función
bg Define el color de fondo de la ven- «colors()» informa
pág. 42 tana donde se ubicarán los gráficos de los 657 colores
disponibles
PROGRAMACIÓN DE GRÁFICOS CON R
13

En la función «plot.default»
bg en La función
indica el relleno de los símbolos
«plot.default» «colors()» informa
que son transparentes y en
y «points» de los 657 colores
«points» indica el relleno de los
pág. 42 disponibles
símbolos pch = 21 a 25

"o" (marco
completo)*

"n" (sin marco en la


función «legend»)

"c" (no se
representa el borde
derecho)

"u" (no se
representa el borde
Permite definir el tipo de marco de superior)
los gráficos. En el caso de la
bty
función «legend» solamente admite
pág. 42
los valores "o" (con marco ) y "n" "l" (no se
(sin marco) representan los
bordes superior y
derecho)

"7" (no se
representan los
bordes inferior e
izquierdo)

"]" (no se
representa el
borde izquierdo)

cex.axis (rótulos de
los ejes)

Valor numérico que define el cex.lab (leyendas de


tamaño de los textos. Se puede los ejes)
cex
combinar con alguno de los
pág. 40 siguientes subargumentos para cex.main (título del
especificar el tipo de texto gráfico)

cex.sub (subtítulo
del gráfico)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
14

col.axis (rótulos de
los ejes)

col.lab (leyendas de
los ejes)
col
Define el color
pág. 42 col.main (título del
gráfico)

col.sub (subtítulo
del gráfico)

cra Argumento de lectura que da infor-


mación sobre el ancho y el alto de A.L.
pág. 95 los caracteres en píxeles

din Argumento de lectura que da infor-


mación sobre el ancho y el alto del A.L.
pág. 95 gráfico en pulgadas

"" (Utiliza el tipo de


letra que existe por
defecto)*
family Especifica el tipo de letra de los
textos. Se puede utilizar en «par()»
pág. 40 y en «text()» Otros tipos de
letras como "serif",
"sans", "mono", etc

La función
Si se usa con la función «par()», se
fg «colors()» informa
define el color del marco, líneas y
pág. 83 de los 657 colores
texto del gráfico
disponibles

Define los límites del gráfico con el


fig formato c(x1, x2, y1, y2). Si no se En una escala de 0
pág. 92 usa con el argumento «new= a1
TRUE» crea un nuevo gráfico.

Define el tamaño del gráfico en


pulgadas con el formato c(ancho,
fin Cualquier valor
alto). Si no se usa con el
pág. 92 numérico
argumento «new=TRUE» crea un
nuevo gráfico.
PROGRAMACIÓN DE GRÁFICOS CON R
15

font.axis (rótulos
de los ejes)

Valor numérico que define la fuente font.lab (leyendas


font de los textos. El valor 1 es la letra de los ejes)
pág. 40 normal, 2 es negrita, 3 es itálica y
4 es itálica y negrita font.main (título del
gráfico)

font.sub (subtítulo
del gráfico)

Valor numérico con el formato


c(x,y,len) que define el número de
lab Cualquier valor
divisiones de los ejes. El valor de
pág. 58 numérico (5,5,7)*
«len» hay que especificarlo pero R
no lo utiliza

0* es paralelo al eje

1 horizontal
las Define la posición de las etiquetas
pág. 97 de los ejes
2 perpendicular al
eje

3 vertical

0 o "round" es un
extremo
Define el estilo del final de la línea redondeado*
lend
y se puede especificar con un 1 o "butt" es un
pág. 54 número o letras extremo grueso
2 o "square" es un
extremo cuadrado

0 ó "blank" sin línea

1 o "solid" línea
sólida* 1
2 ó "dashed" línea
discontinua 2
lty 3 ó "dotted" línea
pág. 48
Define el tipo de línea
punteada 3
4 ó "dotdash" línea
de puntos y rayas 4
5 ó "longdash" línea
de guión largo 5
6 ó "twodash" línea
de doble raya 6
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
16

lwd Cualquier valor


Define el grosor de línea
pág. 60 numérico 1*

Un vector numérico con el formato


mai c(abajo, izquierda, arriba, derecha) Cualquier valor
pág. 99 que define los márgenes de la fi- numérico
gura en pulgadas

main
Permite poner títulos en los gráficos Cualquier texto
pág. 40

Un vector numérico con el formato


mar c(abajo, izquierda, arriba, derecha) Cualquier valor
pág. 99 que define el número de líneas de numérico
los márgenes de la figura

mex Factor de expansión del tamaño de Cualquier valor


pág. 94 caracteres en los márgenes numérico

Vector con el formato c(nr, nc) que


mfcol indica el número de figuras por fila Cualquier valor
pág. 48 (nr) y por columna (nc), rellenando numérico
primero columnas

mfrow Igual que «mfcol» pero rellenando Cualquier valor


pág. 48 primero las filas numérico

Vector numérico con el formato


c(t,e,l) que especifica la posición de
mgp la leyenda de los ejes (t), el texto Cualquier valor
pág. 48 de las divisiones de los ejes (e) y la numérico
línea de los ejes (l). El valor por
defecto es (3,1,0)

Indica que el nuevo gráfico se TRUE


new ponga en el panel que ya existe y
pág. 45 no se borre, por tanto, el gráfico
anterior FALSE*

Un vector numérico con el formato


oma c(abajo, izquierda, arriba, derecha) Cualquier valor
pág. 96 que define los márgenes del texto numérico
en el panel, en número de líneas

Vector numérico con el formato


omd c(x1,x2,y1,y2) que define los már-
Entre 0 y 1
pág. 100 genes internos donde se ubicará el
gráfico, en una escala de 0 a 1

Un vector numérico con el formato


omi c(abajo, izquierda, arriba, derecha) Cualquier valor
pág. 100 que define los márgenes del panel numérico
en pulgadas
PROGRAMACIÓN DE GRÁFICOS CON R
17

MARGEN
EXTERNO oma (3) omi (3)

ÁREA DEL
PANEL GRÁFICO mar (3) mai (3)

ÁREA DE
LA FIGURA

oma (2) mar (2) mar (4) oma (4)

omi (2) mai (2) mai (4) omi (4)

omd (1) mar (1) mai (1)


omd (4)

omd (2)
omd (3)
oma (1) omi (1)

De 1 a 14 símbolos
sin relleno negro

De 15 a 20 símbolos
Valor numérico entre 1 y 25 que con relleno negro
define el tipo de símbolo (el
símbolo que corresponde a cada
pch número se muestra en el siguiente De 21 a 25 se
cuadro). También se puede poner puede poner el color
pág. 40 que se quiera en el
entre "" cualquier carácter, como
se muestra a modo de ejemplo en borde con el
el cuadro con a, *, !, ¡ y $ argumento «col» y
de relleno con «bg»
Cualquier carácter
que se ponga entre
""

1 2 3 4 5 6 7 8 9 10
Ă

11 12 13 14 15 16 17 18 19 20

21 22 23 24 25
a * ! ¡ $
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
18

Tamaño del punto de texto (unidad


ps Cualquier valor
de medida de los caracteres) en
pág. 39 numérico
1/72 pulgadas
Con "s" genera una
Carácter que indica si el gráfico es figura cuadrada
pty
cuadrado o se alarga lateralmente
pág. 83 Con "m" el gráfico
cuando se amplía la ventana
se amplia al máximo
posible

Valor numérico que define el ángulo


srt Cualquier valor
del texto. Solamente funciona con
pág. 44 numérico
la función «text()»

sub Permite poner subtítulos en los


Cualquier texto
pág. 129 gráficos

Valor alfanumérico que define el Con tck=NA deja la


tck tamaño de las marcas de los ejes, marca por defecto*
en proporción al área de la región
pág. 48 de la figura. El valor 1 pone líneas Cualquier otro valor
interiores en el gráfico numérico

Valor alfanumérico que define el Con tck=NA deja la


tcl tamaño de las marcas de los ejes. marca por defecto*
Se diferencia de «tck» en que las
pág. 48 medidas son reales y no en Cualquier otro valor
proporción numérico

Vector numérico con el formato


c(x1, x2, n), donde x1 y x2 son los
xaxp Cualquier valor
extremos de las marcas de eje x, y
pág. 60 numérico
n el número de intervalos o marcas
en el eje

"r" (regular) ex-


tiende un 4% más
de los límites
dados en «xlim», y
calcula el número
Caracter que define como se de intervalos que
xaxs calculan los intervalos en el eje x, mejor se ajustan a
pág. 95 donde el límite viene definido por esos límites*
«xlim» o los datos originales
"i" (interno) busca
el número de in-
tervalos más ade-
cuado a los datos
originales

xaxt "s"*
Valor lógico que especifica si se
pág. 96 representan los intervalos del eje x
"n"
PROGRAMACIÓN DE GRÁFICOS CON R
19

xlab
Texto de la leyenda del eje x Cualquier texto
pág. 40

Vector numérico con el formato


xlim Cualquier valor
c(x0, x1), donde x0 y x1 son los
pág. 42 numérico
límites del eje x

xlog FALSE*
Valor lógico que especifica si se
pág. 58 pone el eje x en escala logarítmica
TRUE

Vector numérico con el formato


c(y1, y2, n), donde y1 e y2 son los
yaxp Cualquier valor
extremos de las marcas del eje y, y
pág. 60 numérico
n el número de intervalos o marcas
en el eje

"r" (regular)
extiende un 4%
más de los límites
dados en «ylim», y
calcula el número
Caracter que define como se de intervalos que
yaxs calculan los intervalos en el eje y, mejor se ajustan a
pág. 95 donde el límite viene definido por esos límites*
«ylim» o los datos originales
"i" (interno) busca
el número de
intervalos más
adecuado a los
datos originales

yaxt "s"*
Valor lógico que especifica si se
pág. 96 representan los intervalos del eje y
"n"

ylab
Texto de la leyenda del eje y Cualquier texto
pág. 40

Vector numérico con el formato


ylim Cualquier valor
c(y0, y1), donde y0 e y1 son los
pág. 42 numérico
límites del eje y

ylog FALSE*
Valor lógico que especifica si se
pág. 58 pone el eje y en escala logarítmica
TRUE
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
20

I.4. Colores

Con la función «colors()», que viene en el paquete básico, es posible obtener


un listado de los 657 colores disponibles.

"white" "aliceblue" "antiquewhite"


"antiquewhite1" "antiquewhite2" "antiquewhite3"
"antiquewhite4" "aquamarine" "aquamarine1"
"aquamarine2" "aquamarine3" "aquamarine4"
"azure" "azure1" "azure2"
"azure3" "azure4" "beige"
"bisque" "bisque1" "bisque2"
"bisque3" "bisque4" "black"
"blanchedalmond" "blue" "blue1"
"blue2" "blue3" "blue4"
"blueviolet" "brown" "brown1"
"brown2" "brown3" "brown4"
"burlywood" "burlywood1" "burlywood2"
"burlywood3" "burlywood4" "cadetblue"
"cadetblue1" "cadetblue2" "cadetblue3"
"cadetblue4" "chartreuse" "chartreuse1"
"chartreuse2" "chartreuse3" "chartreuse4"
"chocolate" "chocolate1" "chocolate2"
"chocolate3" "chocolate4" "coral"
"coral1" "coral2" "coral3"
"coral4" "cornflowerblue" "cornsilk"
"cornsilk1" "cornsilk2" "cornsilk3"
"cornsilk4" "cyan" "cyan1"
"cyan2" "cyan3" "cyan4"
"darkblue" "darkcyan" "darkgoldenrod"
"darkgoldenrod1" "darkgoldenrod2" "darkgoldenrod3"
"darkgoldenrod4" "darkgray" "darkgreen"
"darkgrey" "darkkhaki" "darkmagenta"
"darkolivegreen" "darkolivegreen1" "darkolivegreen2"
"darkolivegreen3" "darkolivegreen4" "darkorange"
"darkorange1" "darkorange2" "darkorange3"
"darkorange4" "darkorchid" "darkorchid1"
"darkorchid2" "darkorchid3" "darkorchid4"
"darkred" "darksalmon" "darkseagreen"
"darkseagreen1" "darkseagreen2" "darkseagreen3"
"darkseagreen4" "darkslateblue" "darkslategray"
"darkslategray1" "darkslategray2" "darkslategray3"
"darkslategray4" "darkslategrey" "darkturquoise"
"darkviolet" "deeppink" "deeppink1"
"deeppink2" "deeppink3" "deeppink4"
"deepskyblue" "deepskyblue1" "deepskyblue2"
"deepskyblue3" "deepskyblue4" "dimgray"
"dimgrey" "dodgerblue" "dodgerblue1"
"dodgerblue2" "dodgerblue3" "dodgerblue4"
"firebrick" "firebrick1" "firebrick2"
"firebrick3" "firebrick4" "floralwhite"
PROGRAMACIÓN DE GRÁFICOS CON R
21

"forestgreen" "gainsboro" "ghostwhite"


"gold" "gold1" "gold2"
"gold3" "gold4" "goldenrod"
"goldenrod1" "goldenrod2" "goldenrod3"
"goldenrod4" "gray" "gray0"
"gray1" "gray2" "gray3"
"gray4" "gray5" "gray6"
"gray7" "gray8" "gray9"
"gray10" "gray11" "gray12"
"gray13" "gray14" "gray15"
"gray16" "gray17" "gray18"
"gray19" "gray20" "gray21"
"gray22" "gray23" "gray24"
"gray25" "gray26" "gray27"
"gray28" "gray29" "gray30"
"gray31" "gray32" "gray33"
"gray34" "gray35" "gray36"
"gray37" "gray38" "gray39"
"gray40" "gray41" "gray42"
"gray43" "gray44" "gray45"
"gray46" "gray47" "gray48"
"gray49" "gray50" "gray51"
"gray52" "gray53" "gray54"
"gray55" "gray56" "gray57"
"gray58" "gray59" "gray60"
"gray61" "gray62" "gray63"
"gray64" "gray65" "gray66"
"gray67" "gray68" "gray69"
"gray70" "gray71" "gray72"
"gray73" "gray74" "gray75"
"gray76" "gray77" "gray78"
"gray79" "gray80" "gray81"
"gray82" "gray83" "gray84"
"gray85" "gray86" "gray87"
"gray88" "gray89" "gray90"
"gray91" "gray92" "gray93"
"gray94" "gray95" "gray96"
"gray97" "gray98" "gray99"
"gray100" "green" "green1"
"green2" "green3" "green4"
"greenyellow" "grey" "grey0"
"grey1" "grey2" "grey3"
"grey4" "grey5" "grey6"
"grey7" "grey8" "grey9"
"grey10" "grey11" "grey12"
"grey13" "grey14" "grey15"
"grey16" "grey17" "grey18"
"grey19" "grey20" "grey21"
"grey22" "grey23" "grey24"
"grey25" "grey26" "grey27"
"grey28" "grey29" "grey30"
"grey31" "grey32" "grey33"
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
22

"grey34" "grey35" "grey36"


"grey37" "grey38" "grey39"
"grey40" "grey41" "grey42"
"grey43" "grey44" "grey45"
"grey46" "grey47" "grey48"
"grey49" "grey50" "grey51"
"grey52" "grey53" "grey54"
"grey55" "grey56" "grey57"
"grey58" "grey59" "grey60"
"grey61" "grey62" "grey63"
"grey64" "grey65" "grey66"
"grey67" "grey68" "grey69"
"grey70" "grey71" "grey72"
"grey73" "grey74" "grey75"
"grey76" "grey77" "grey78"
"grey79" "grey80" "grey81"
"grey82" "grey83" "grey84"
"grey85" "grey86" "grey87"
"grey88" "grey89" "grey90"
"grey91" "grey92" "grey93"
"grey94" "grey95" "grey96"
"grey97" "grey98" "grey99"
"grey100" "honeydew" "honeydew1"
"honeydew2" "honeydew3" "honeydew4"
"hotpink" "hotpink1" "hotpink2"
"hotpink3" "hotpink4" "indianred"
"indianred1" "indianred2" "indianred3"
"indianred4" "ivory" "ivory1"
"ivory2" "ivory3" "ivory4"
"khaki" "khaki1" "khaki2"
"khaki3" "khaki4" "lavender"
"lavenderblush" "lavenderblush1" "lavenderblush2"
"lavenderblush3" "lavenderblush4" "lawngreen"
"lemonchiffon" "lemonchiffon1" "lemonchiffon2"
"lemonchiffon3" "lemonchiffon4" "lightblue"
"lightblue1" "lightblue2" "lightblue3"
"lightblue4" "lightcoral" "lightcyan"
"lightcyan1" "lightcyan2" "lightcyan3"
"lightcyan4" "lightgoldenrod" "lightgoldenrod1"
"lightgoldenrod2" "lightgoldenrod3" "lightgoldenrod4"
"lightgoldenrodyellow" "lightgray" "lightgreen"
"lightgrey" "lightpink" "lightpink1"
"lightpink2" "lightpink3" "lightpink4"
"lightsalmon" "lightsalmon1" "lightsalmon2"
"lightsalmon3" "lightsalmon4" "lightseagreen"
"lightskyblue" "lightskyblue1" "lightskyblue2"
"lightskyblue3" "lightskyblue4" "lightslateblue"
"lightslategray" "lightslategrey" "lightsteelblue"
"lightsteelblue1" "lightsteelblue2" "lightsteelblue3"
"lightsteelblue4" "lightyellow" "lightyellow1"
"lightyellow2" "lightyellow3" "lightyellow4"
"limegreen" "linen" "magenta"
PROGRAMACIÓN DE GRÁFICOS CON R
23

"magenta1" "magenta2" "magenta3"


"magenta4" "maroon" "maroon1"
"maroon2" "maroon3" "maroon4"
"mediumaquamarine" "mediumblue" "mediumorchid"
"mediumorchid1" "mediumorchid2" "mediumorchid3"
"mediumorchid4" "mediumpurple" "mediumpurple1"
"mediumpurple2" "mediumpurple3" "mediumpurple4"
"mediumseagreen" "mediumslateblue" "mediumspringgreen"
"mediumturquoise" "mediumvioletred" "midnightblue"
"mintcream" "mistyrose" "mistyrose1"
"mistyrose2" "mistyrose3" "mistyrose4"
"moccasin" "navajowhite" "navajowhite1"
"navajowhite2" "navajowhite3" "navajowhite4"
"navy" "navyblue" "oldlace"
"olivedrab" "olivedrab1" "olivedrab2"
"olivedrab3" "olivedrab4" "orange"
"orange1" "orange2" "orange3"
"orange4" "orangered" "orangered1"
"orangered2" "orangered3" "orangered4"
"orchid" "orchid1" "orchid2"
"orchid3" "orchid4" "palegoldenrod"
"palegreen" "palegreen1" "palegreen2"
"palegreen3" "palegreen4" "paleturquoise"
"paleturquoise1" "paleturquoise2" "paleturquoise3"
"paleturquoise4" "palevioletred" "palevioletred1"
"palevioletred2" "palevioletred3" "palevioletred4"
"papayawhip" "peachpuff" "peachpuff1"
"peachpuff2" "peachpuff3" "peachpuff4"
"peru" "pink" "pink1"
"pink2" "pink3" "pink4"
"plum" "plum1" "plum2"
"plum3" "plum4" "powderblue"
"purple" "purple1" "purple2"
"purple3" "purple4" "red"
"red1" "red2" "red3"
"red4" "rosybrown" "rosybrown1"
"rosybrown2" "rosybrown3" "rosybrown4"
"royalblue" "royalblue1" "royalblue2"
"royalblue3" "royalblue4" "saddlebrown"
"salmon" "salmon1" "salmon2"
"salmon3" "salmon4" "sandybrown"
"seagreen" "seagreen1" "seagreen2"
"seagreen3" "seagreen4" "seashell"
"seashell1" "seashell2" "seashell3"
"seashell4" "sienna" "sienna1"
"sienna2" "sienna3" "sienna4"
"skyblue" "skyblue1" "skyblue2"
"skyblue3" "skyblue4" "slateblue"
"slateblue1" "slateblue2" "slateblue3"
"slateblue4" "slategray" "slategray1"
"slategray2" "slategray3" "slategray4"
"slategrey" "snow" "snow1"
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
24

"snow2" "snow3" "snow4"


"springgreen" "springgreen1" "springgreen2"
"springgreen3" "springgreen4" "steelblue"
"steelblue1" "steelblue2" "steelblue3"
"steelblue4" "tan" "tan1"
"tan2" "tan3" "tan4"
"thistle" "thistle1" "thistle2"
"thistle3" "thistle4" "tomato"
"tomato1" "tomato2" "tomato3"
"tomato4" "turquoise" "turquoise1"
"turquoise2" "turquoise3" "turquoise4"
"violet" "violetred" "violetred1"
"violetred2" "violetred3" "violetred4"
"wheat" "wheat1" "wheat2"
"wheat3" "wheat4" "whitesmoke"
"yellow" "yellow1" "yellow2"
"yellow3" "yellow4" "yellowgreen"

La función «colorTable()» del paquete “fBasics” (Wuertz, 2011) permite ver


los números de los diferentes tipos de colores.

¾ library(fBasics)
¾ colorTable(cex=1)

0 10 20 30 40 50 60 70 80 90

1 11 21 31 41 51 61 71 81 91

2 12 22 32 42 52 62 72 82 92

3 13 23 33 43 53 63 73 83 93

4 14 24 34 44 54 64 74 84 94

5 15 25 35 45 55 65 75 85 95

6 16 26 36 46 56 66 76 86 96

7 17 27 37 47 57 67 77 87 97

8 18 28 38 48 58 68 78 88 98

9 19 29 39 49 59 69 79 89 99

La función «show.colors()» del paquete “DAAG” (Maindonald, 2011) permite


ver los nombres de los diferentes tipos de colores: "singles" son los colores que
no tienen diferentes intensidades, "shades" son los que si tienen diferentes in-
tensidades y "gray" es para ver la escala de grises.
PROGRAMACIÓN DE GRÁFICOS CON R
25

¾ library(DAAG)
¾ show.colors("singles")

darkred navy

darkmagenta midnightblue

mediumvioletred darkviolet gainsboro

peru darkslateblue palegoldenrod

lightcoral blueviolet moccasin

darksalmon dimgray lavender

sandybrown mediumslateblue blanchedalmond

black lightslateblue papayawhip

darkgreen lightslategray linen

forestgreen cornflowerblue beige

mediumseagreen lightseagreen oldlace

limegreen violet aliceblue

darkkhaki darkturquoise lightgoldenrodyellow

mediumspringgreen darkgray ghostwhite

lawngreen mediumturquoise floralwhite

lightgreen lightgray mintcream

greenyellow powderblue white

¾ show.colors("shades")
1 2 3 4 1 2 3 4 1 2 3 4
red darkgoldenrod slateblue

magenta lightpink dodgerblue


1 2 3 4
deeppink goldenrod mediumorchid lightblue

firebrick gold mediumpurple bisque

orangered burlywood deepskyblue darkslategray

maroon green orchid wheat

brown springgreen steelblue thistle

violetred chartreuse turquoise mistyrose

tomato seagreen skyblue paleturquoise

indianred palegreen pink antiquewhite

coral olivedrab cyan lavenderblush

darkorange lightgoldenrod plum seashell

chocolate darkolivegreen rosybrown lemonchiffon

hotpink yellow lightskyblue cornsilk

sienna darkseagreen lightsteelblue lightcyan

palevioletred khaki slategray honeydew

salmon blue peachpuff snow

orange purple aquamarine azure

lightsalmon darkorchid navajowhite lightyellow

tan royalblue cadetblue ivory


GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
26

¾ show.colors("gray")

gray gray25 gray51


gray1 gray26 gray52 gray76
gray2 gray27 gray53 gray77
gray3 gray28 gray54 gray78
gray4 gray29 gray55 gray79
gray5 gray30 gray56 gray80
gray6 gray31 gray57 gray81
gray7 gray32 gray58 gray82
gray8 gray33 gray59 gray83
gray9 gray34 gray60 gray84
gray10 gray35 gray61 gray85
gray11 gray36 gray62 gray86
gray12 gray37 gray63 gray87
gray13 gray38 gray64 gray88
gray14 gray39 gray65 gray89
gray15 gray40 gray66 gray90
gray16 gray42 gray67 gray91
gray17 gray43 gray68 gray92
gray18 gray44 gray69 gray93
gray19 gray45 gray70 gray94
gray20 gray46 gray71 gray95
gray21 gray47 gray72 gray96
gray22 gray48 gray73 gray97
gray23 gray49 gray74 gray98
gray24 gray50 gray75 gray99

En el script I.1.R se muestran las tres funciones más importantes que per-
miten representar colores. La función «rgb()» permite hacer múltiples combina-
ciones de colores, donde el primer número es para definir la intensidad del color
rojo, el segundo para el verde y el tercero para el azul, en una escala de 0 a 255.
El argumento «alpha» indica el grado de transparencia (rango de 0 a 255).

¾ plot(0,0, type="n", xlim=c(-1,10), ylim=c(0,10), axes=F, xlab="", ylab="")


¾ text(-0.5,1.5,"rgb", cex=1.5)
¾ color<-rgb(255, 1, 1, alpha=255, maxColorValue=255)
¾ rect(0.5,1,2.5,2, col=color, border=NA)
¾ text(1.5,2.5, "255, 1, 1")
¾ color<-rgb(100, 255, 50, alpha=255, maxColorValue=255)
¾ rect(3.5,1,5.5,2, col=color, border=NA)
¾ text(4.5,2.5, "100, 255, 50")
¾ color<-rgb(1, 1, 255, alpha=255, maxColorValue=255)
¾ rect(6.5,1,8.5,2, col=color, border=NA)
¾ text(7.5,2.5, "1, 1, 255")
PROGRAMACIÓN DE GRÁFICOS CON R
27

La función «hcl()» también permite hacer diferentes colores, donde «h» de-
fine el color en un rango de 0 a 360, «c» es la intensidad de color (de 0 a 100) y
«l» es la luminosidad (también de 0 a 100, valores más pequeños es más
oscuro).

¾ text(-0.5,4.5,"hcl", cex=1.5)
¾ color<-hcl(h = 188, c = 100, l =2, alpha=1)
¾ rect(0.5,4,2.5,5, col=color, border=NA)
¾ text(1.5,5.5, "188, 100, 2")
¾ color<-hcl(h = 120, c = 100, l = 88, alpha=1)
¾ rect(3.5,4,5.5,5, col=color, border=NA)
¾ text(4.5,5.5, "120, 100, 88")
¾ color<-hcl(h = 240, c = 100, l = 20, alpha=1)
¾ rect(6.5,4,8.5,5, col=color, border=NA)
¾ text(7.5,5.5, "240, 100, 20")
La última función es «hsv()», donde «h» define el color, «s» es la intensidad
de color, y «v» es la luminosidad (cuanto más alto, más claro es el color). Los
tres argumentos tienen un rango de 0 a 1.

¾ text(-0.5,7.5,"hsv", cex=1.5)
¾ color<-hsv(h = 0, s = 1, v = 1, alpha=1)
¾ rect(0.5,7,2.5,8, col=color, border=NA)
¾ text(1.5,8.5, "0, 1, 1")
¾ color<-hsv(h = 0.24, s = 1, v = 1, alpha=1)
¾ rect(3.5,7,5.5,8, col=color, border=NA)
¾ text(4.5,8.5, "0.24, 1, 1")
¾ color<-hsv(h = 0.7, s = 1, v = 1, alpha=1)
¾ rect(6.5,7,8.5,8, col=color, border=NA)
¾ text(7.5,8.5, "0.7, 1, 1")
0, 1, 1 0.24, 1, 1 0.7, 1, 1

hsv

188, 100, 2 120, 100, 88 240, 100, 20

hcl

255, 1, 1 100, 255, 50 1, 1, 255

rgb

Al final del script I.1.R se representa un diagrama de tarta con un bucle, para
ver los cambios de color de la función «hcl()», a medida que cambian «h» y «l».
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
28

La función «color.scale()» del paquete “plotrix” (Lemon, 2012) permite utili-


zar algunas de las paletas mencionadas anteriormente, hcl, hsv y rgb, para poder
hacer gradientes de colores. Las instrucciones están en el script I.2.R.
En la primera parte del script se hace un gráfico sin ejes, para lo cual se usa
el argumento «axes=FALSE», y luego se pone el eje y con la función «axis()»,
añadiendo etiquetas al eje.
En la función «color.scale()», el argumento «x» define cual es el valor o
rango de valores que tomarán los puntos. En este caso, como se representan 10
puntos, es una secuencia de 1 a 10. El argumento «alpha» indica el grado de
transparencia (rango de 0 a 1). El argumento «na.color» especifica el color de
los datos vacíos de la variable x.
Los argumentos «cs1», «cs2», y «cs3» definen los tres parámetros de color,
dependiendo del sistema utilizado. En rgb y hsv la escala es de 0 a 1 en los tres
argumentos «cs1», «cs2» y «cs3». En hcl la escala es de 0 a 360 para «cs1», y
de 0 a 100 para «cs2» y «cs3». En hsv y hcl, en los tres argumentos se puede
poner un único valor o un vector con dos valores, que indicarían un rango. Por
ejemplo, en hsv «cs1=0» indica que solo se pinta en color rojo, mientras que
«cs1=c(0,0.5)» indica que varían los colores del rojo al azul.

¾ library(plotrix)
¾ plot(1:10,rep(1:3,length.out=10),axes=FALSE,type="n",xlim=c(0,11),ylim=
c(0,18), main="Test de rgb, hsv y hcl",xlab="",ylab="Paletas de colores",
cex.lab=1.7, cex.main=1.9)
¾ par(cex=0.8,font=2)
¾ axis(2,at=1:18,labels=c("rgb","","rgb","","rgb","","hcl","","hcl","","hcl","","
hsv","","hsv","","hsv",""))
¾ #rgb
¾ points(1:10,rep(1,10),pch=19,cex=7,col=color.scale(x=1:10,cs1=c(0,0.1,1),
cs2=c(1,0.7,1),cs3=c(1,0.5,0),color.spec="rgb",alpha=1,na.color=NA))
¾ points(1:10,rep(3,10),pch=19,cex=7,col=color.scale(x=1:10,cs1=c(0,1,1),
cs2=c(1,1,0),cs3=0,color.spec="rgb",alpha=1,na.color=NA))
¾ points(1:10,rep(5,10),pch=19,cex=7,col=color.scale(x=1:10,cs1=c(0,1,1),
cs2=c(1,1,0),cs3=c(0,0.5,1),color.spec="rgb",alpha=1,na.color=NA))
¾ #hcl
¾ points(1:10,rep(7,10), pch=19,cex=7, col=color.scale(x=1:10, cs1=c(0,100),
cs2=c(25,55),cs3=c(85,25), color.spec="hcl",alpha=1,na.color=NA))
¾ points(1:10,rep(9,10),pch=19,cex=7,col=color.scale(x=1:10,cs1=c(100,0),
cs2=c(55,25),cs3=c(25,85), color.spec="hcl",alpha=1,na.color=NA))
¾ points(1:10,rep(11,10),pch=19,cex=7,col=color.scale(x=1:10,cs1=c(200,0),
cs2=c(55,85),cs3=c(55,85), color.spec="hcl",alpha=1,na.color=NA))
¾ #hsv
¾ points(1:10,rep(13,10),pch=19,cex=7,col=color.scale(x=1:10,cs1=c(0.5,1),
cs2=c(0.5,1),cs3=c(1,1),color.spec="hsv",alpha=1,na.color=NA))
¾ points(1:10,rep(15,10),pch=19,cex=7,col=color.scale(x=1:10,cs1=c(0,1),
cs2=c(0.8,1),cs3=c(0.5,1),color.spec="hsv",alpha=1,na.color=NA))
¾ points(1:10,rep(17,10),pch=19,cex=7,col=color.scale(x=1:10,cs1=c(0.5,1),
cs2=c(0.2,1),cs3=c(1,1),color.spec="hsv",alpha=1,na.color=NA))
PROGRAMACIÓN DE GRÁFICOS CON R
29

Test de rgb, hsv y hcl

hsv
hsv
hsv
Paletas de colores
hcl
hcl
hcl
rgb
rgb
rgb

En el siguiente gráfico del script se muestra un ejemplo sencillo de cómo usar


«color.scale()». En primer lugar se generan dos vectores y el color de los pun-
tos en la función «color.scale()» lo define el valor de y. Con la función
«par(oma=c(3,3,3,4))» se dejan más líneas en el eje y derecho para poder
mostrar la leyenda de colores. La función «color.legend()» permite una barra
de colores a modo de leyenda. Con los argumentos «xl», «yb», «xr» e «yt» se
define la posición de la leyenda. Con «gradient» se especifica si el rango de
colores cambia en el sentido del eje x o del y. Con el argumento «align» se es-
pecifica si las etiquetas de las leyendas se ponen por la izquierda (barra hori-
zontal) o arriba (barra vertical) con «lt», o por la derecha (barra horizontal) o
abajo (barra vertical) con «rb». Por último, en el argumento «rect.color» se
debe poner la misma secuencia y tipo de colores utilizada en el gráfico.

¾ x<-c(1,20,35,46,57,50,7,18,29)
¾ y<-c(10,21,5,68,95,36,75,18,7)
¾ par(mar=c(3,3,3,4))
¾ plot(x, y, col=color.scale(y, cs1=c(0,1,1), cs2=c(1,1,0), cs3=0, color.spec=
"rgb"), pch=16,cex=3,xlab="",ylab="")
¾ color.legend(xl=61, yb=10, xr=64, yt=90, seq(1,100,by=20), gradient="y",
align="rb", cex=1.2, rect.col=color.scale(seq(1,100,by=20), cs1=c(0,1,1),
cs2= c(1,1,0), cs3=0, color.spec="rgb"))
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
30

81
80

61
60

41
40

21
20

0 10 20 30 40 50

También son muy útiles las paletas de colores que se pueden obtener con al-
guna de las funciones «gray.colors()», «rainbow()», «heat.colors()»,
«terrain.colors()», «topo.colors()» o «cm.colors()» del paquete “grDevices”,
el cual se instala por defecto con R. A modo de ejemplo, las siguientes
instrucciones representan un diagrama de tartas, en el cual el gradiente de co-
lores se realiza con las funciones mencionadas anteriormente. Las instrucciones
están en el script I.3.R.
En todas las funciones el argumento «alpha» indica el grado de transparencia
(rango de 0 a 1). En el caso de la función «rainbow()» con el argumento «s» se
especifica el grado de saturación (rango de 0 a 1). Con «v» se puede oscurecer
más o menos (rango de 0 a 1), donde 0 es negro y 1 es la máxima claridad. Los
argumentos «start» (rango de 0 a 1) y «end» (rango de 0 a 1) son los colores
corregidos donde comienza y finaliza el arco iris, respectivamente.

¾ pie(rep(1,50), col=gray.colors(n=50))
¾ text(0,1,"gray.colors()",font=2,cex=1.5)
¾ pie(rep(1,15), col=rainbow(n=15, s =1, v=1, start=0, end=0.9, alpha=1))
¾ text(0,1,"rainbow()",font=2,cex=1.5)
¾ pie(rep(1,50), col=heat.colors(n=50))
¾ text(0,1,"heat.colors()",font=2,cex=1.5)
¾ pie(rep(1,50), col=terrain.colors(n=50))
¾ text(0,1,"terrain.colors()",font=2,cex=1.5)
¾ pie(rep(1,50), col=topo.colors(n=50))
¾ text(0,1,"topo.colors()",font=2,cex=1.5)
¾ pie(rep(1,50), col=cm.colors(n=50))
¾ text(0,1,"cm.colors()",font=2,cex=1.5)
PROGRAMACIÓN DE GRÁFICOS CON R
31

gray.colors() rainbow()
15 14 13 12 11 4
16 10 5
17 9 3
18 8
19 7 6
20 6
2
21 5
22 4 7
23 3
24 2 1
25 1
8
26 50
27 49 15
28 48
29 47 9
30 46
14
31 45
32 44 10
33 43
34 42 13
35 36 41 11
37 38 39 40 12

heat.colors() terrain.colors()
15 14 13 12 11 15 14 13 12 11
16 10 16 10
17 9 17 9
18 8 18 8
19 7 19 7
20 6 20 6
21 5 21 5
22 4 22 4
23 3 23 3
24 2 24 2
25 1 25 1
26 50 26 50
27 49 27 49
28 48 28 48
29 47 29 47
30 46 30 46
31 45 31 45
32 44 32 44
33 43 33 43
34 42 34 42
35 36 41 35 36 41
37 38 39 40 37 38 39 40

topo.colors() cm.colors()
13 12 11 15 14 13 12 11
15 14 16 10
16 10 17 9
17 9
18 8 18 8
19 7 19 7
20 6 20 6
21 5 21 5
22 4 22 4
23 3 23 3
24 2 24 2
25 1 25 1
26 50 26 50
27 49 27 49
28 48 28 48
29 47 29 47
30 46 30 46
31 45 31 45
32 44 32 44
33 43 33 43
34 42 34 42
35 36 41 35 36 41
37 38 39 40 37 38 39 40
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
32

I.5. Fórmulas matemáticas y caracteres especiales

En muchas ocasiones a los gráficos hay que añadirles fórmulas matemáticas o


texto con caracteres especiales, que se pueden realizar con la función
«plotmath()» (Murrell y Ihaka, 2000), combinada con alguna de las funciones
«expression()», «substitute()» y/o «paste()». A continuación se muestran
algunos ejemplos, los cuales están en el script I.4.R, y en la tabla siguiente al-
gunos códigos útiles de la función «plotmath()» para construir fórmulas y tex-
tos especiales. Para que estas instrucciones funcionen deben integrarse en los
gráficos usando las funciones «mtext()», «title()» o «text()», como se mos-
trará en varios ejemplos en el próximo capítulo.

¾ expression(x^2==sum(sum(frac(((O[mc] - E[mc]) - frac(1,2))^2, E[mc]), c-


1, i), m-1, j))

୨ ୧ ͳ ଶ
ቀሺ୫ୡ െ ୫ୡ ሻ െ ቁ
šଶ ൌ ෍  ෍ ʹ
୫ୡ
୫ିଵ ୡିଵ

¾ expression(L[t]==L[infinity](1-e^-k(t-t[0])))

୲ ൌ  ൫ͳ െ ‡ି୩ሺ୲ି୲బ ሻ ൯

¾ expression(a[i] == sqrt(b[i]^2 + c[i]^2))

ƒ୧ ൌ ට„ଶ୧ ൅ …୧ଶ

¾ expression("r"==paste(frac(paste(mu[max]*"S"), paste("K"[s]+"S"))))

Ɋ୫ୟ୶ 
”ൌ
ୱ ൅ 

¾ expression(bar(x) == frac(sum(x[i], n, i==1), n))

¦x i
šത ൌ i 1
n

¾ expression(paste("Producción primaria en mg C m"^"-2","d"^"-1"))

Producción primaria en mg C m-2 d-1

¾ expression(bold(paste("Pigmentos de ", italic("Alexandrium minutum"))))

Pigmentos de Alexandrium minutum


PROGRAMACIÓN DE GRÁFICOS CON R
33

Tabla I.1. Tabla de códigos para la construcción de fórmulas utilizando las


funciones «plotmath()» y «expression()».

n
šത Ö bar(x) ¦x i Ö sum(x[i], i==1, n) f Ö infinity
i 1

ෑ ሺ ൌ šሻ Ö  Ö alpha
šොÖ hat(x) ୶
A Ö Alpha
prod(plain(P)(X==x), x)

‫׬‬ୟ ˆሺšሻ†š Ö  Ö beta
š›
ෞÖ widehat(xy)
integral(f(x)*dx, a, b) B Ö Beta

ራ ୧ Ö  Ö gamma
š෤ Ö tilde(x) ୧ୀଵ
 Ö Gamma
union(A[i], i==1, n)

ሩ ୧ Ö  Ö delta
š›
෦ Ö widetilde(xy) ୧ୀଵ
 Ö Delta
intersect(A[i], i==1, n)
Ž‹ ˆሺšሻÖ  Ö epsilon
šሶ Ö dot(x) š՜Ͳ
lim(f(x), x %->% 0) E Ö Epsilon
‹ ˆሺšሻÖ Ö zeta
x Ö plain(x) ୶வ଴
min(f(x), x > 0) Z Ö Zeta

Ö eta
x Ö bold(x) x  y Ö x %subset% y
H Ö Eta
Ö theta
x Ö italic(x) x Ž y Ö x %subseteq% y
Ö Theta
Ö iota
x Ö bolditalic(x) x Œ y Ö x %notsubset% y
I Ö Iota

 Ö frac(x,y)
 Ö kappa

x Š y Ö x %supset% y
K Ö Kappa

୶୷ Öatop(x,y) x ‹ y Ö x %supseteq% y


 Ö lambda
 Ö Lambda
 Ö mu
x2 Ö x^2 x  y Ö x %in% y
M Ö Mu
 Ö nu
x2 Ö x[2] x  y Ö x %notin% y
N Ö Nu
 Ö xi
ξš Ö sqrt(x) x Ö displaystyle(x)
 Ö Xi
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
34

౯  Ö pi
ξš Ö sqrt(x,y) x Ö textstyle(x)
 Ö Pi
 Ö rho
x r y Ö x %+-% y x Ö scriptstyle(x)
P Ö Rho
 Ö sigma
x / y Ö x %/% y x Ö scriptscriptstyle(x)
 Ö Sigma
 Ö tau
x * y Ö x %*% y x y Ö x ~~ y
T Ö Tau
 Ö upsilon
x d y Ö x <= y x+ +y Ö x+phantom(0)+y
Y Ö Upsilon
 Ö phi
x t y Ö x >= y x l y Ö x %<->% y
 Ö Phi
 Ö chi
x | y Ö x %~~% y x o y Ö x %->% y
X Ö Chi
 Ö psi
x { y Ö x %==% y x m y Ö x %<-% y
! Ö Psi
$ Ö omega
x # y Ö x %=~% y x n y Ö x %up% y
& Ö Omega

x v y Ö x %prop% y x p y Ö x %down% y

x œ y Ö x %<=>% y x   y Ö x %dbldown% y

x Ÿ y Ö x %=>% y x ž y Ö x %dblup% y

x  y Ö x %<=% y w Ö partialdiff

I.6. Dispositivos para gráficos

Una vez creado un gráfico es necesario visualizarlo y, para ello, existen dife-
rentes dispositivos (devices). El más común, el cual se usa por defecto, es la
pantalla y la función que controla este dispositivo es «windows()». Sin em-
bargo, se puede visualizar el gráfico exportándolo a un archivo, que puede tener
diferentes formatos, y se controlan con alguna de las siguientes funciones:
«png()», «bitmap()» «jpeg()», «bmp()», «tiff()», «pdf()», «postscript()»
e incluso a una impresora «win.print()». Los argumentos de estas funciones se
explican en el cuadro siguiente.
En el script I.5.R hay un ejemplo de la paleta de colores rgb que, además de
verse en pantalla, se exporta a un archivo pdf. El mismo proceso serviría para
PROGRAMACIÓN DE GRÁFICOS CON R
35

exportarlo a otros formatos de archivo usando las funciones mencionadas ante-


riormente.
En el script se hace una función con «function()» y varios bucles con
«for()». Además se usan varias funciones gráficas como «plot()», «mtext()»,
«text()», «rug()» y «points()», que se explicarán en detalle en el Capítulo II.
El archivo pdf con el gráfico exportado estará en el directorio de trabajo.
Siempre que se exporte a un archivo es conveniente cerrar el dispositivo con la
función «dev.off()». Cada vez que se ejecuta la función «windows()» se abre
una ventana, es decir, que se van superponiendo las ventanas sin borrar las
anteriores. En el gráfico se puede observar como varían los colores conforme
cambian los valores de rojo, verde y azul.

¾ #Se muestra en la pantalla


¾ windows(15,6)
¾ funcion<-function(){
¾ plot(0,0, axes=FALSE, cex=0, xlab="", ylab="", xlim=c(0,1800),
ylim = c(-30, 290), main="Paleta rgb",cex.main=2)
¾ mtext("Rojo",1,1.5,font=2,cex=1.5)
¾ text(-50,125,"Verde",font=2,cex=1.5,srt=90)
¾ text(175,275,"Azul (0)",font=2,cex=1.5)
¾ text(475,275,"Azul (50)",font=2,cex=1.5)
¾ text(775,275,"Azul (100)",font=2,cex=1.5)
¾ text(1075,275,"Azul (150)",font=2,cex=1.5)
¾ text(1375,275,"Azul (200)",font=2,cex=1.5)
¾ text(1675,275,"Azul (250)",font=2,cex=1.5)
¾ rug(325, ,ticksize=1,side=3, lwd=3, col="black")
¾ rug(625, ,ticksize=1,side=3, lwd=3, col="black")
¾ rug(925, ,ticksize=1,side=3, lwd=3, col="black")
¾ rug(1225, ,ticksize=1,side=3, lwd=3, col="black")
¾ rug(1525, ,ticksize=1,side=3, lwd=3, col="black")
¾ k<-0
¾ i<--50
¾ for (z in 1:6){
¾ i<-i+50
¾ h<--50
¾ for (z in 1:6){
¾ h<-h+50
¾ j<--50
¾ k<-k+50
¾ text(k,-30,h)
¾ for (z in 1:6){
¾ j<-j+50
¾ color<-rgb(h, j, i, alpha=255, maxColorValue=255)
¾ points(k,j, col=color,cex=3,pch=16)
¾ text(0,h,h)
¾ }}}}
¾ funcion()
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
36

¾ #Se exporta a un archivo pdf


¾ pdf("Paleta rgb.pdf",paper="a4r",w=15,h=6)
¾ funcion()
¾ dev.off()

Paleta rgb
Azul (0) Azul (50) Azul (100) Azul (150) Azul (200) Azul (250)
250

200
Verde

150

100

50

0
0 50 100 150 200 250 0 50 100 150 200 250 0 50 100 150 200 250 0 50 100 150 200 250 0 50 100 150 200 250 0 50 100 150 200 250

Rojo

Dispositivos para gráficos

windows(width=7, height=7, pointsize = 1/72 inch, rescale = "R",


xpinch = NA_real_, ypinch = NA_real_, bg = "transparent", canvas =
"white", gamma = 1, xpos = -25, ypos = 0, buffered = TRUE, title = "",
clickToConfirm = TRUE, fillOddEven = TRUE )

win.print(width = 7, height = 7, pointsize = 12, printer = "")

bmp(filename = "Rplot%03d.bmp", width = 480, height = 480, units =


"px", pointsize = 12, bg = "white", res = NA)

jpeg(filename = "Rplot%03d.jpg", width = 480, height = 480, units =


"px", pointsize = 12, quality = 75, bg = "white", res = NA)

png(filename = "Rplot%03d.png", width = 480, height = 480, units =


"px", pointsize = 12, bg = "white", res = NA)

tiff(filename = "Rplot%03d.tif", width = 480, height = 480, units = "px",


pointsize = 12, compression = "none", res = NA)

bitmap(file, type = "png16m", height = 7, width = 7, res = 72, units =


"in", pointsize)

pdf(file = ifelse(onefile, "Rplots.pdf", "Rplot%03d.pdf"), width = 7, height


= 7, onefile, family = "Helvetica", title, version = "1.4", paper = "special",
encoding, bg = "transparent", fg = "black", pointsize, pagecentre =
TRUE, colormodel = "rgb", fillOddEven)
PROGRAMACIÓN DE GRÁFICOS CON R
37

Dispositivos para gráficos (Continuación)

ƒ bg: color de fondo.


ƒ buffered: si es TRUE se evitan posibles parpadeos a la hora de
mostrar el gráfico.
ƒ canvas: color del dispositivo cuando el fondo es transparente.
ƒ clickToConfirm: si es TRUE cuando se crea un nuevo gráfico la
confirmación se hace con un click en la pantalla con el ratón, en vez
de respondiendo a una pregunta en la consola.
ƒ colormodel: tipo de paleta de colores: "rgb", "gray" o "cmyk".
ƒ compression: tipo de archivo comprimido que puede ser "none",
"rle", "lzw", "jpeg" o "zip".
ƒ family: tipo de fuente de letra.
ƒ fg: color que se pone al frente.
ƒ filename: nombre del archivo.
ƒ fillOddEven: si es TRUE la manera en que se resuelve la intersección
de formas se hace de forma automática por R.
ƒ onefile: si es TRUE permite varias figuras en un solo archivo.
ƒ pagecentre: si es TRUE todo lo que se imprime en el pdf se centra.
ƒ paper: tamaño del papel: "a4", "letter", "legal", "executive", "a4r",
"USr" o "special", en este último el tamaño viene definido por width y
height.
ƒ pointsize: tamaño del texto.
ƒ printer: nombre de la impresora como la reconoce el sistema opera-
tivo del ordenador.
ƒ quality: calidad del archivo jpeg en porcentaje.
ƒ res: resolución en ppi para texto y ancho de líneas.
ƒ rescale: define como re-escala el gráfico cuando se agranda la panta-
lla y las opciones son "R", "fit" o "fixed".
ƒ title: título de la salida.
ƒ type: tipo de bitmap.
ƒ units: unidades del width y height en píxeles "px", centímetros "cm"
o pulgadas "in".
ƒ version: versión de pdf necesaria para poder ver el archivo.
ƒ width y height: ancho y alto en pulgadas.
ƒ xpinch e ypinch: píxeles por pulgada. El valor por defecto NA_real_
significa que tome los valores por defecto de Windows.
ƒ xpos e ypos: posición en píxeles del cuadrante superior izquierdo de
la ventana.
CAPÍTULO II

GRÁFICOS BÁSICOS

II.1. Gráficos de dispersión

Se utilizan muy frecuentemente, y representan dos variables cuantitativas en


un sistema de coordenadas rectangulares. Para el ejemplo se usará el conjunto
de datos iris, y se representarán dos variables con relación lineal entre ellas:
«Petal.Length» y «Petal.Width». Para el gráfico de dispersión más simple, utili-
zamos la función «plot()» sin modificar ninguno de sus argumentos por defecto.
La función «par(ps=15)» permite definir el tamaño de la letra. Las instrucciones
están en el archivo II.1.R.

¾ data(iris)
¾ attach(iris)
¾ par(ps=15)
¾ plot(Petal.Length,Petal.Width)
2.5
2.0
1.5
Petal.Width
1.0
0.5

1 2 3 4 5 6 7
Petal.Length

39
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
40

Función plot (paquete graphics)

ƒ x e y: coordenadas de los puntos.


ƒ type:
"p": puntos.
"l": líneas.
"b": puntos y líneas sin superposición.
"c": deja las líneas y pone un hueco donde van los puntos.
"o": puntos y líneas superpuestos.
"s": en escalera, con movimiento horizontal y luego vertical.
"S": en escalera, con movimiento vertical y luego horizontal.
"h": líneas de alta densidad, tipo histograma.
"n": sin representación.

Se pueden usar todos los argumentos generales.

Ahora podemos ir añadiendo y modificando elementos en el gráfico. Como


muchas veces existen varios datos en el mismo punto, con la función
«sunflowerplot()» es posible que pinte tantas rayas como número de datos
coinciden en el mismo punto. Los argumentos que iremos cambiando sirven
tanto para la función «sunflowerplot()» como para la función «plot()». Con el
argumento «pch» es posible cambiar el tipo de símbolo:

¾ sunflowerplot(Petal.Length,Petal.Width, pch=19)

Ahora cambiamos el rótulo de los ejes, de forma que el nombre de las varia-
bles tenga un mejor formato y se indiquen las unidades. Esto podríamos hacerlo
con los argumentos «xlab» e «ylab»:

¾ sunflowerplot(Petal.Length, Petal.Width,pch=19, xlab="Longitud (cm)",


ylab="Anchura (cm)")

Ahora le podemos añadir un título, para lo cual existen dos opciones: o bien el
argumento «main», dentro de las funciones «plot()» o «sunflowerplot()», o
bien otra función llamada «title()». En este caso optaremos por la primera op-
ción.

¾ sunflowerplot(Petal.Length,Petal.Width,pch=19, xlab="Longitud (cm)",


ylab="Anchura (cm)", main=" Longitud de pétalo vs Anchura de pétalo")

Ahora haremos una serie de ajustes en el tipo de letra: convertiremos en ne-


grita la letra de la escala en los ejes (con «font.axis»), la etiqueta de los ejes
(con «font.lab»), aumentaremos el tamaño de letra en el título (con
«cex.main») y en la etiqueta de los ejes (con «cex.lab»). Además, cambiare-
mos el tipo de letra en todo el gráfico para que sea Times New Roman (con
«family»). Los valores de cada uno de los argumentos anteriores serían los si-
guientes: para negrita, el valor es 2, para el tamaño de fuente se usa un número
que es una proporción relativa al tamaño actual (1). Así pues, si lo cambiamos a
0,5, el tamaño se reduciría un 50%, si lo aumentamos a 1,5, se aumentaría un
50%. El valor de «family» para Times New Roman es serif. El argumento «asp»
GRÁFICOS BÁSICOS
41

define la proporción de escala o relación de aspecto de los ejes, es decir, una


unidad en x tiene la misma longitud que asp unidades en y.

¾ sunflowerplot(Petal.Length,Petal.Width,pch=19, xlab="Longitud (cm)",


ylab="Anchura (cm)", main=" Longitud de pétalo vs Anchura de pétalo",
font.axis=2, font.lab=2, cex.main=1.5, cex.lab =1.25, family="serif",
asp=1.5, ylim=c(0.5,2.5))

A continuación añadiremos a este gráfico una recta de regresión con la fun-


ción «abline()». En esta función es necesario especificar los valores de los
parámetros de la recta. Para conocer esos valores haremos un modelo lineal con
la función «lm()», y utilizaremos el resultado como parámetro de «abline()»:

¾ reg<-lm(iris$Petal.Width~iris$Petal.Length)
¾ abline(reg)

Así daríamos por terminada esta gráfica, cuyo aspecto final sería el siguiente:

Longitud de pétalo vs Anchura de pétalo


3.0
2.5
2.0
Anchura (cm)
1.5
1.0
0.5
0.0

1 2 3 4 5 6 7

Longitud (cm)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
42

Función sunflowerplot (paquete graphics)

ƒ x e y: coordenadas de los puntos.


ƒ number: vector opcional que indica cuantas veces se repite cada uno
de los puntos.
ƒ digits: número de decimales que se tienen en cuenta. Cuando se
omite number (en cuyo caso lo calcula R a partir de los datos), el
redondeo de decimales se hace antes: digits = 6.
ƒ rotate: si es TRUE las líneas (pétalos), que indican el número de da-
tos, se rotan al azar para evitar solapamientos: rotate = FALSE.
ƒ cex.fact: tamaño del punto central donde hay flores con pétalos
(valores más cercanos a cero el punto es mayor): cex.fact = 1.5.
ƒ size: tamaño de los pétalos en pulgadas: size = 1/8.
ƒ seg.col: color de los pétalos: seg.col = 2.
ƒ seg.lwd: grosor de los pétalos: seg.lwd = 1.5.

Se pueden usar todos los argumentos generales.

Vamos ahora con un ejemplo en el que complicaremos un poco más las cosas.
Se trata de una gráfica de dispersión similar a la anterior, en la que queremos
resaltar diferentes grupos de datos. Las instrucciones están en el archivo II.2.R.
Utilizaremos nuevamente el conjunto de datos iris, por lo que debemos cargarlo
con «data()» y adjuntarlo con «attach()» para poder localizar a las variables
por su nombre. Vamos a representar la variable longitud de pétalo frente a la
variable longitud de sépalo, diferenciando los resultados para cada especie. El
conjunto total de órdenes se muestran a continuación; iremos explicándolas una
por una.
La primera instrucción, «plot()», sirve para representar el diagrama de dis-
persión para la especie setosa. Además añadimos un rango de valores para los
ejes, «xlim» e «ylim», indicamos que se usa un círculo relleno como símbolo
«pch=19», de color azul con «col="blue"» y que la etiqueta de los ejes esté en
blanco (eso es así porque está previsto etiquetar los ejes con otra función). Con
la función «colors()» podemos obtener el listado de diferentes colores que
existen. Con el argumento «bty="l"» se indica que no dibuje los bordes superior
y derecho del marco.
En las siguientes dos órdenes, con «points()» añadimos los valores corres-
pondientes a las otras dos especies, con el mismo símbolo en un color diferente,
verde y rojo (para los colores podríamos usar un código en números además del
código en letra). El argumento «bg» permite especificar el color de relleno de
algunos símbolos (solamente «pch» de 21 a 25). En la siguiente instrucción utili-
zamos la función «title()» para añadir el título del gráfico y las etiquetas de los
ejes, especificando que ambos tipos de letra deben estar en cursiva y el tamaño
del título aumentado en un 50%.
Por último, añadimos un recuadro con la leyenda con la función «legend()»,
que situaremos sobre el gráfico con la función «locator()». Esta función permite
obtener las coordenadas de cualquier punto que se señale sobre el plano de la
gráfica con el ratón y situar el ángulo superior izquierdo de la leyenda sobre él.
En lugar de la función «locator()» también podríamos escribir las coordenadas
directamente. El siguiente argumento indica los nombres que debe llevar la le-
yenda y después los símbolos y colores respectivos. Al ejecutar esta última or-
GRÁFICOS BÁSICOS
43

den, la leyenda no aparece hasta que hagamos click en el lugar en que deseemos
situarla (debido al argumento «locator()»).

¾ data(iris)
¾ attach(iris)
¾ plot(iris[Species=="setosa", "Petal.Length"], iris[Species=="setosa",
"Sepal.Length"], xlim=c(0,9), ylim=c(3,9), pch=19, col="blue", xlab="",
ylab="", bty="l")
¾ points(iris[Species=="virginica", "Petal.Length"], iris[Species=="virginica",
"Sepal.Length"],pch=19,col="green")
¾ points(iris[Species=="versicolor","Petal.Length"],iris[Species=="versicolor"
,"Sepal.Length"],pch=21,bg="red")
¾ points(iris[Species=="versicolor","Petal.Length"],iris[Species=="versicolor"
,"Sepal.Length"],pch=21,bg="red")
¾ title(main="Longitud de Pétalo vs Longitud de sépalo", xlab="Longitud de
pétalo (cm)", ylab="Longitud de sépalo (cm)", font.main=2, font.lab=2,
cex.main=1.5)
¾ legend(locator(1), c("setosa","virginica","versicolor"), pch=c(19,19,19),
col=c("blue","green","red"))

Longitud de Pétalo vs Longitud de sépalo


9

setosa
virginica
versicolor
8
Longitud de sépalo (cm)

7
6
5
4
3

0 2 4 6 8

Longitud de pétalo (cm)


GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
44

En el siguiente ejemplo de gráfico de dispersión identificaremos cada uno de


los puntos. Las instrucciones están en el archivo II.3.R. Los datos consisten en
las coordenadas obtenidas a partir de un método de ordenación espacial reali-
zado con ciertas características de las comunidades fitoplanctónicas de una serie
de lagos sudamericanos. Para ello representamos una gráfica de dispersión sim-
ple con las coordenadas x e y. Posteriormente, por medio de la función «text()»
etiquetamos cada uno de los puntos del gráfico anterior con el nombre de cada
lago, que se encuentra en la variable «Lago» en el archivo de datos. El argu-
mento «pos» indica la posición de la etiqueta respecto al punto (el valor 4 signi-
fica a la derecha), el argumento «offset» indica cuanto se aleja respecto al
punto, y el argumento «cex» indica el tamaño de las etiquetas. Con «srt» es
posible dar el ángulo que se quiera al texto. Por último, se resaltan los lagos del
Amazonas y, para ello, se utiliza la función «polygon()», que nos permite dibu-
jar un polígono y colorearlo o rellenarlo con diferentes tramas. A esta función es
necesario indicarle las coordenadas de cada vértice.

¾ datos<-read.csv2("Ordenación Lagos.csv", header=TRUE, encoding=


"latin1")
¾ attach(datos)
¾ plot(X,Y,xlim=c(-1.2,1.2), ylim=c(-0.6,1), main="Lagos Sudamericanos",
font.main=2,font.lab=2,font.axis=2,pch=19)
¾ text(X,Y,labels=Lago,pos=4,offset=0.4,cex=1, srt= 0)
¾ polygon(x = c(-1,-0.33,0.25,-1), y = c(-0.55,0,-0.55,-0.55), col =
"#0000ff22", border = NA)
GRÁFICOS BÁSICOS
45

En los gráficos de dispersión es posible incluir una recta de regresión y repre-


sentar intervalos de confianza para el valor estimado, o rango de valores dentro
del cual debe estar la predicción de la variable dependiente con una probabilidad
determinada. Además en este ejemplo veremos la forma de insertar imágenes en
los gráficos; para archivos jpg se puede usar la función «read.jpeg()», en la
cual simplemente hay que especificar el nombre del archivo a importar. Si se
tienen archivos tiff se podría usar la función «readTiff()» del paquete “rtiff”
(Kort, 2012). Para más detalles de los tipos de dispositivos donde se pueden
exportar los archivos véase el Capitulo I. También veremos cómo guardar los
gráficos en un archivo pdf usando la función «pdf()». Las instrucciones están en
el archivo II.4.R. Es necesario tener instalado el paquete “ReadImages”
(Loecher, 2011). En el ejemplo se usan datos, los cuales están en el archivo
Carangidae.csv, de la longitud estándar y base de la aleta dorsal de varias es-
pecies de peces de la familia Carangidae.
Después de importar los datos, se calcula la regresión con la función «lm()» y
el ANOVA con «summary()». La función «predict()» permite calcular el inter-
valo de confianza de la regresión, en este caso al 99%. Con la función «pdf()»
abrimos un archivo pdf donde se guardará el gráfico. El argumento «onefile=
TRUE» permite que se puedan poner varios gráficos dentro del mismo archivo de
pdf. La función «par(new=T)» permite añadir un gráfico al que ya está creado.
La función «matplot()» permite representar los intervalos de confianza de forma
fácil, ya que representa las columnas de una matriz con las columnas de otra
matriz. No hay cuadro explicativo porque los argumentos son iguales a los de la
función «plot()». En este caso se representa «Longitud» que solo tiene una co-
lumna, frente a «Conf» que tiene tres columnas: los límites (inferior y superior)
del intervalo y los valores que predice la regresión. La instrucción «dev.off()»
cierra el archivo pdf. Para poder ver el gráfico hay que abrir el archivo pdf que se
ha creado, ya que no sale en pantalla. El script puede tardar unos segundos,
dependiendo de la calidad y tamaño de la imagen a importar.

¾ library(ReadImages)
¾ Datos<-read.csv2("Carangidae.csv", header=TRUE, encoding="latin1")
¾ attach(Datos)
¾ regre<-lm(Dorsal~Longitud)
¾ modelo<-summary(regre)
¾ modelo
¾ Conf<- predict(regre,interval="confidence",level=0.99)
¾ pdf("Carangidae.pdf", height = 7, width = 7, pointsize = 10, paper = "a4",
onefile = TRUE)
¾ foto<-read.jpeg("Carangidae.jpg")
¾ plot(foto)
¾ par(new=T)
¾ plot(Longitud,Dorsal,xlim=c(0,700), ylim=c(0,400), xlab= "Longitud
estándar (mm)", cex.lab=1.6, font.lab=2, ylab="Base aleta dorsal (mm)",
main="Especies de la familia Carangidae",cex.main=2.0, font.main=2)
¾ par(new=T)
¾ matplot(Longitud, Conf, type="l", lty=c(1,2,2), xlim=c(0,700), ylim=
c(0,400), col=c(1,2,2),xlab="",ylab="")
¾ dev.off()
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
46

II.2. Gráficos con barras de desviaciones

Una representación muy común es la de medias y sus errores o desviaciones


estándar y, para ello, se puede usar la función «plotCI()». Las instrucciones
están en el archivo II.5.R. Es necesario tener instalado el paquete “gregmisc”
(Warnes, 2012a). En este ejemplo hay datos del área de distribución geográfica
de diferentes especies de tiburones, que están en el archivo Tiburones.csv, los
cuales son la media y la desviación típica para cada familia de tiburones.
Con la función «windows()» se amplía la ventana de presentación del
gráfico. En la función «plotCI()» es necesario indicar los valores del eje x (solo
admite valores numéricos), el valor de la media (eje y) y la columna donde están
las desviaciones con «uiw». La instrucción «xaxt="n"» indica que no se repre-
senten los intervalos del eje x. Con «gap=0» se indica que las barras de las des-
viaciones estén pegadas al valor medio y no se deje ningún hueco. Para repre-
sentar también un intervalo para el eje x, se añade otra función «plotCI()», con
los argumentos «add=T» para que represente el nuevo gráfico sobre el anterior
y con «err="x"». Para poner los nombres de las familias en el eje x se utiliza la
función «text()», explicada anteriormente. Debido a que la leyenda del eje y
tiene caracteres especiales, usamos la instrucción «mtext()». En esta función,
indicamos en primer lugar el texto que deseamos escribir, el margen en el que
deseamos escribir el texto y la línea (contando desde el recuadro del gráfico) en
la que se desea añadir el texto.
GRÁFICOS BÁSICOS
47

¾ library(gregmisc)
¾ windows(12,8)
¾ datos<-read.csv2("Tiburones.csv",header=TRUE,encoding= "latin1")
¾ plotCI(datos$Tipo, datos$Media, uiw = datos$STD, xlim=c(0,7), ylim=
c(0,250000000), pch=15, col="black", ylab="",xlab="Familia", font.axis=1,
font.lab=1,cex.axis=1.3,cex.lab=2.5,main="Area geográfica de tiburones",
font.main=2, cex.main=2.5, cex=1.5,xaxt="n", gap=0)
¾ text(datos$Tipo, datos$Media, labels=datos$Familia, pos=2, offset=0.5,
cex=1.6)
¾ mtext(expression(paste("Area media por especie (km"^2,")")), 2, line=2.2,
font = 1, cex=1.8)

Area geográfica de tiburones


2.5e+08
2.0e+08
Area media por especie (km )
2

Alopiidae
1.5e+08

Pseudocarchariidae Lamnidae
Cetorhinidae
1.0e+08
5.0e+07

Odontaspididae

Carcharhinidae
0.0e+00

Squalidae

Familia

Función plotCI (paquete gplots)

ƒ x, y, z: variables a representar
ƒ uiw: valor superior o derecho de la barra. NULL para no pintarlas.
ƒ liw: valor inferior o izquierdo de la barra. NULL para no pintarlas: liw
= uiw.
ƒ ui: límite superior de las barras. Por defecto y + uiw (verticales) o x +
uiw (horizontales).
ƒ li: valor inferior de las barras. Por defecto y - liw (verticales) o x - liw
(horizontales).
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
48

Función plotCI (Continuación)

ƒ err: indica la dirección de las barras; "y" verticales y "x" para barras
horizontales: err="y".
ƒ barcol: color de las barras.
ƒ pt.bg: utilizar pch=21 con pt.bg=par("bg") para puntos superpuestos
a las barras de error.
ƒ sfrac: grosor de la línea del extremo de las barras de error, como una
fracción de la longitud del eje x: sfrac = 0.01.
ƒ gap: espacio entre el punto central y el comienzo de la barra: gap=1.
ƒ minbar y maxbar: valores mínimo y máximo permitidos para los
topes de las barras de error.

Se pueden usar los argumentos generales xlab, ylab, add, lty y lwd.

II.3. Modelos y gráficos en paneles

Ahora veremos un ejemplo en el que representaremos un modelo de supervi-


vencia. Las instrucciones están en el archivo II.6.R y los datos en el archivo
DaphniaSurv.csv. Para esto también nos sirve la función «plot()», gracias a
que con ella es posible representar ciertos objetos como modelos. Los datos con-
sisten en la supervivencia de individuos de cladócero de la especie Daphnia sp.,
los cuales han sido sometidos a diferentes tratamientos en los que cambia el tipo
de alimento, la concentración, y si reciben o no un tipo de suplemento alimenti-
cio. Haremos dos modelos; en el primero de ellos (modelo1) ajustamos la super-
vivencia al tipo de alimento que reciben «FeedMode» y en el otro (modelo2) ten-
dremos en cuenta si reciben o no el suplemento y las diferencias de concentra-
ción. Queremos que los modelos sean representados por líneas y en el mismo
panel queremos un gráfico para el modelo1 y otro para el modelo 2.
En primer lugar se carga el paquete “survival” (Therneau, 2012), que contiene
las funciones necesarias para trabajar con modelos de supervivencia. El argu-
mento «mgp» permite especificar la posición de la leyenda, del texto de las divi-
siones y de los ejes con respecto al cuadro principal del gráfico. Solamente se
modifica la posición de las leyendas, ya que el valor por defecto es c(3,1,0) y se
ha puesto c(2,1,0). Después ajustamos los modelos con la función «survfit()»,
que usa «Surv()» para definir el modelo. El argumento «mfrow» sirve para
indicar que queremos un panel con varias gráficas. En nuestro caso queremos
una fila y dos columnas, así que en el panel se dibujarán dos gráficas. El argu-
mento «mfcol» hace lo mismo pero rellenando primero las columnas. En este
caso, queremos que se represente el gráfico con líneas, por lo que utilizaremos el
argumento «lty», en el que se indica qué tipo de línea representará cada grupo
de datos. Los tipos de línea están codificados con números. En nuestro caso indi-
camos que se representen las líneas tipo 1 a 4. Los argumentos «tck» y «tcl»
permiten definir la longitud de las marcas de los ejes. El primero en proporción
(un valor 1 pondría líneas interiores) y el segundo son medidas reales. Al se-
gundo gráfico se le añade una cuadrícula con «grid()», donde se define el
número de celdas x e y. Para añadir la leyenda, debemos saber el orden de los
tratamientos, para indicar a cuál le corresponde cada tipo de línea. En este caso,
GRÁFICOS BÁSICOS
49

para situar ambas leyendas exactamente en el mismo punto del área del gráfico,
utilizamos coordenadas en lugar de la función «locator()».

¾ library(survival)
¾ datos<-read.csv2("DaphniaSurv.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ par(mgp=c(2,1,0))
¾ modelo1<-survfit(Surv(Time,Status)~FeedMode)
¾ modelo2<-survfit(Surv(Time,Status)~Trat+Conc)
¾ par(mfrow=c(1,2))
¾ plot(modelo1,lty=1:4,main="Tipo de alimentación",xlab="Tiempo (h)",
ylab= "Supervivencia",font.main=2,font.lab=2,cex.main=1.25, tck = -0.03)
¾ legend(205,0.7,c("H","HM","O","OM"),lty=1:4)
¾ plot(modelo2,lty=1:4,main="Tratamiento",xlab="Tiempo
(h)",ylab="Supervivencia",font.main=2,font.lab=2,cex.main=1.25, tcl= 0)
¾ grid(10,10,col="grey")
¾ legend(205,0.7,c("NoH","NoL","SiH","SiL"),lty=1:4)
Tipo de alimentación Tratamiento
1.0

1.0
0.8

0.8

H NoH
HM NoL
0.6

0.6
Supervivencia

Supervivencia

O SiH
OM SiL
0.4

0.4
0.2

0.2
0.0

0.0

0 50 150 250 350 0 50 150 250 350


Tiempo (h) Tiempo (h)

II.4. Diagrama de cajas

El diagrama de cajas se utiliza para variables cuantitativas. Se representa la


mediana (línea gruesa dentro de la caja) y otros parámetros relacionados con su
dispersión.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
50

La caja abarca el rango en el que se encuentran el 1er y 3er cuartil. Las líneas
punteadas indican el máximo y el mínimo si no hay outliers, o 1,5 veces la lon-
gitud de la caja si los hay. Los outliers (valores atípicos o extremos) se repre-
sentan como puntos aislados más allá de los límites de la línea punteada. Repre-
sentaremos con un diagrama de cajas la tasa de crecimiento de rotíferos a los
que se somete a diferentes tratamientos, algunos de ellos con alimento tóxico.
Las instrucciones están en el archivo II.7.R.

¾ datos<-read.csv2("Rotíferos.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ boxplot(r~Treatment)
¾ title("Tasa de crecimiento de los rotíferos",xlab="Tratamiento", ylab="r",
font.main=2, font.lab = 2, cex.main=1.25)

Tasa de crecimiento de los rotíferos


1
0
-1
r

-2
-3
-4

High Tox A Low Tox A No Tox A No Tox B

Tratamiento

Una versión de este tipo de gráfico consiste en añadir un elemento, llamado


«notch» (muesca) que representa intervalos de confianza aproximados al 95%
para la mediana: dos medianas son distintas (los grupos son distintos) si los in-
tervalos o muescas de las cajas correspondientes no se solapan.

¾ boxplot(r~Treatment,notch=TRUE)
¾ title(xlab="Tratamiento", ylab="r",font.lab=2)
GRÁFICOS BÁSICOS
51

1
0
-1
-2
r

-3
-4
-5

High Tox A Low Tox A No Tox A No Tox B

Tratamiento

Función boxplot (paquete graphics)

ƒ x o formula: vector o variable con los datos (x) o expresión (formula)


con las variables a representar del tipo y ~ grp, donde grp es un
factor o variable de agrupación.
ƒ range: indica cuanto se extienden las barras, desde el borde de la
caja, en número de veces la longitud de la caja: range=1.5.
ƒ width: vector del tipo c(x1, x2,..) con el ancho de las cajas: width =
NULL.
ƒ varwidth: si su valor es TRUE el ancho de la caja es proporcional a la
raíz cuadrada del número de datos: varwidth = FALSE.
ƒ notch: si es TRUE se ponen muescas en las barras. Si las muescas de
dos cajas no se solapan, los grupos (sus medianas) son diferentes:
notch = FALSE.
ƒ outline: si es FALSE no se representan los outliers: outline = TRUE.
ƒ names: variable o vector con las etiquetas de las cajas.
ƒ plot: si es FALSE no se pinta el gráfico y se muestran los resultados:
plot=TRUE.
ƒ border: color de los bordes de las cajas. NA es sin borde: border =
par("fg").
ƒ col: color de las cajas: col = NULL.
ƒ pars: listado de otros posibles parámetros gráficos: pars = list
(boxwex = 0.8, staplewex = 0.5, outwex = 0.5).
ƒ horizontal: cajas horizontales si es TRUE: horizontal = FALSE.
ƒ add: si es TRUE añade otro boxplot al existente: add = FALSE.
ƒ at: valor numérico que indica donde se añade el nuevo boxplot: at =
NULL.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
52

II.5. Beanplots

Una alternativa a los diagramas de cajas son los beanplots, los cuales se re-
presentan con la función «beanplot()». Al igual que los diagrama de cajas, se
utilizan para comparar una variable cuantitativa entre diferentes grupos. Sin
embargo, tienen la ventaja de que, además de mostrar el rango de variación de
la variable, también muestran la distribución de la variable, lo que permite com-
probar si es Normal o no.
Como ejemplo usaremos el Índice de Masa Corporal de niñas y niños de Italia
y España que están en el archivo IMC.csv. Las instrucciones están en el archivo
II.8.R. Para que el script funcione es necesario tener instalado el paquete
“beanplot” (Kampstra, 2008; Kampstra, 2012). En el script hay tres gráficos.
En el primer gráfico, al no especificar nada, los grupos se ordenan alfabéti-
camente en función de la etiqueta asignada a cada grupo.

¾ library(beanplot)
¾ datos<-read.csv2("IMC.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ beanplot(IMC ~ Sexo, ll = 0.04, what=c(1,1,1,1), ylim = c(17,24), xlim =
c(0,5), ylab = "Índice de masa corporal", cex.lab=1.6, log="")
24
23
Índice de masa corporal
22
21
20
19
18
17

Niña-España Niña-Italia Niño-España Niño-Italia


GRÁFICOS BÁSICOS
53

Si se quiere otro tipo de orden es necesario etiquetar los grupos con números,
en este caso la columna «Sexo1» en el archivo. Se define el carácter «levels»
con el orden en que están los grupos en la nueva columna y simplemente se
utiliza «Sexo1» en vez de «Sexo» para identificar la variable de agrupación. Es
necesario incorporar la instrucción «names», la cual informa de las nuevas eti-
quetas de los grupos.
En lo que se refiere al resto de argumentos, la instrucción «ll» indica la lon-
gitud de la línea dibujada en color blanco por cada punto existente. El argumento
«what» es un vector lógico (0 no y 1 si) que indica si se muestran los siguientes
cuatro elementos: la línea discontinua con el valor medio de todos los grupos, las
“judías” o distribuciones, la línea que indica la media de cada grupo y las líneas
para cada punto cuyo tamaño se definía con «ll». El argumento «method» de-
fine qué hacer cuando hay dos datos iguales: la opción por defecto «stack» los
apila, «overplot» los pone unos encima de otros y con «jitter» es posible definir
un pequeño desplazamiento o “ruido”. Con el argumento «log=""» se especifica
que no aplique los logaritmos de forma automática y eso permite poner cero en
los límites inferiores de los ejes x e y.

¾ levels<-c("Niño-España", "Niña-España", "Niño-Italia", "Niña-Italia")


¾ beanplot(IMC ~ Sexo1, ll = 0.04, what=c(1,1,1,1), ylim = c(17,24), xlim =
c(0,5) , ylab = "Índice de masa corporal", cex.lab=1.6, names=levels,
method = "overplot", log="")
24
23
Índice de masa corporal
22
21
20
19
18
17

Niño-España Niña-España Niño-Italia Niña-Italia


GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
54

En el tercer gráfico se observa que se puede representar en parejas, para una


mejor comparación. El argumento «lend» define como es el acabado de las
líneas; al ponerle el valor 1, que significa el extremo grueso, se ve más uniforme
la zona de unión entre los grupos. Con «side="both"» se especifica que se re-
presenten ambos grupos juntos; la opción por defecto es «no» y otras opciones
son «first» o «second». Con «border» se indica el color del borde (en este ejem-
plo se especifica que no se pinte). Con el argumento «innerborder», que no se
utiliza en el ejemplo, se podría poner una línea de separación entre los grupos de
un color determinado. Con «boxwex» se define un factor de escala para el ta-
maño de las “judías”. Al ponerle el valor 1, deja el tamaño por defecto. Con la
instrucción «overallline» se define si se representa una línea con la media
«"mean"» o la mediana «"median"» general de todos los grupos. Con
«show.names=F» se indica que no se ponga la leyenda de los grupos en el eje.
Por último, en la leyenda con «ncol=4» se especifica que se pongan las etique-
tas de los grupos en cuatro columnas en vez de cuatro filas.

¾ par(lend=1)
¾ beanplot(IMC ~ Sexo, ll = 0, ylim=c(18, 24), ylab = "Índice de masa
corporal", side = "both", border = NA, boxwex=1, overallline="median", col
= list("black","grey", "red", c("blue", "white")), show.names=F, cex.lab=1.6)
¾ legend("topleft", fill = c("black", "grey", "red", "blue"), legend = c ("Niña-
España", "Niña-Italia", "Niño-España", "Niño-Italia"), bty="n", ncol=4)
24

Niña-España Niña-Italia Niño-España Niño-Italia


23
Índice de masa corporal
22
21
20
19
18
GRÁFICOS BÁSICOS
55

Función beanplot (paquete beanplot)

ƒ …...: fórmula con las variables a representar del tipo y ~ x, vector o


data frame.
ƒ bw: método para calcular la longitud de las bandas: bw = "SJ-dpi".
ƒ kernel: especificación del núcleo para la función de suavizado
("epanechnikov", "gaussian", "rectangular", "triangular", "biweight",
"cosine", "optcosine"): kernel = "gaussian".
ƒ cut: define cuanto se alargan los extremos: cut = 3.
ƒ cutmin: define cuanto se alarga el extremo inferior: cutmin = -Inf.
ƒ cutmax: define cuanto se alarga el extremo superior: cutmax = Inf.
ƒ grownage: el ancho de la “judía” crece con el número de puntos
hasta que se alcanza este valor: grownage = 10.
ƒ what: vector del tipo 0 ó 1 que define lo que se representa en el
siguiente orden: la media total, las curvas de densidad, la media de
cada grupo y las líneas de los puntos: what = c(TRUE, TRUE, TRUE,
TRUE).
ƒ col: vector con hasta 4 colores en el siguiente orden: relleno del área
interior, líneas interiores, líneas exteriores y la media de cada grupo.
ƒ ll: longitud de las líneas por punto: ll = 0.16.
ƒ maxwidth: ancho máximo de cada beanplot: maxwidth = 0.8.
ƒ maxstripline: longitud máxima de cada beanplot: maxstripline =
0.96.
ƒ method: define que hacer cuando hay dos datos iguales: "stack" los
apila, "overplot" los pone unos encima de otros y con "jitter" es posi-
ble definir el ruido deseado cuando hay varios puntos en la misma
posición: method="stack".
ƒ names: vector con los nombres de los grupos.
ƒ overallline: promedio general utilizado, "mean" (media) o "median"
(mediana): overallline = "mean".
ƒ beanlines: promedio a representar en cada grupo: "mean", "median"
o "quantiles": beanlines = overallline.
ƒ boxwex: factor de escala de los puntos: boxwex=1.
ƒ horizontal: si es TRUE los grupos se pintan horizontales. horizontal
= FALSE.
ƒ side: lado en que se representan los grupos. Para grupos simétricos
es “no”, y también se puede usar "first", "second" y "both": side =
"no".
ƒ jitter: valor numérico que introduce un ruido en caso de solapa-
miento, si method = "jitter": jitter = NULL.
ƒ beanlinewd: el grosor de línea de la media de cada grupo:
beanlinewd = 2.
ƒ frame.plot: si es TRUE se pinta un marco: frame.plot=TRUE.
ƒ border: color del borde externo de cada grupo: border = NULL.
ƒ innerborder: color del borde interno de cada grupo: innerborder =
NA.
ƒ at: posición de cada grupo. Por ejemplo at = c(1:2, 1, 2) significa que
los grupos 1 y 2 se queden en su posición, el grupo 3 en la posición 1
y el grupo 4 en la posición 2: at = NULL.
ƒ show.names: si es TRUE se muestran las etiquetas en los ejes:
show.names = NA.

Se pueden usar los argumentos generales add, axes, log, xlim e ylim.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
56

Por último, en el gráfico 4 se muestra que es posible obtener una representa-


ción similar utilizando la función «bwplot()», para lo cual es necesario tener ins-
talado el paquete “lattice” (Sarkar, 2008; 2012). Esta función gráfica además de
dar información de la distribución de los datos, también muestra un diagrama de
cajas. Las modificaciones que se quieran realizar de las etiquetas y formato de
las divisiones de los ejes, se deben introducir con una lista en el argumento
«scales». Del mismo modo, las modificaciones de las leyendas de los ejes, títu-
los o subtítulos, deben incluirse dentro del propio argumento por medio de una
lista, como se muestra en este ejemplo para «ylab».

¾ library(lattice)
¾ bwplot(IMC ~ Sexo, ylim=c(18,24), scales=list(cex=1.2, font=2), ylab = list
("Indice de masa corporal", cex=2), panel = function(..., box.ratio)
{
panel.violin(..., col = "transparent",
varwidth = FALSE, box.ratio = box.ratio)
panel.bwplot(..., fill = NULL, box.ratio = 0.1)
})

23
Indice de masa corporal

22

21

20

19

Niña-España Niña-Italia Niño-España Niño-Italia


GRÁFICOS BÁSICOS
57

Función bwplot (paquete lattice)

ƒ formula: variables a representar con el formato del tipo y ~ x.


ƒ data: datos donde pueden existir otras variables que se pueden utili-
zar para definir grupos, hacer selecciones con subset, etc.
ƒ allow.multiple: si por ejemplo en la fórmula y se pone como la suma
de dos variables y1 + y2, si se coloca FALSE, lo que hace es sumar las
celdas, y si se coloca TRUE las dos variables las considera como dife-
rentes, es decir, no suma los datos y considera los datos indepen-
dientes de las dos variables.
ƒ outer: si allow.multiple = TRUE y por ejemplo en la fórmula y se puso
como y1 + y2, entonces al poner TRUE se hacen dos gráficos, uno con
y1 y otro con y2 como variable independiente: outer=FALSE.
ƒ auto.key: si es TRUE se genera una leyenda automáticamente. Si se
quiere hacer la leyenda manualmente, se usa por ejemplo auto.key =
list(colum=2), donde se pondrían dos columnas. Para ver las posibili-
dades de una leyenda manual véase en el menú ayuda de R la función
simpleKey: auto.key=FALSE.
ƒ aspect: define el tamaño del gráfico y su aspecto. Puede ser un
número o un carácter: con "fill" intenta hacer el panel lo más grande
posible, "xy" intenta conseguir un aspecto basado en los 45 grados de
la pendiente de los ejes (véase la función banking en el menú de
ayuda de R), e "iso" intenta que las diferencias de los datos se mani-
fiesten también en diferencias en los ejes, teniendo así los dos ejes la
misma escala: aspect = "fill".
ƒ panel: dentro de este argumento se pueden especificar diferentes
funciones que se van a realizar como por ejemplo panel.xyplot,
panel.barchart, panel.violin, panel.bwplot, etc.
ƒ prepanel: tiene la misma función que panel, es decir, agrupar argu-
mentos y funciones a realizar, pero previas al uso de panel. Por ejem-
plo, útil para especificar xlim, ylim, realizar gráficos previos de pre-
paración del panel, etc.: prepanel = NULL.
ƒ scales: una lista especificando como las marcas y etiquetas de los
ejes se van a representar (véase el menú ayuda de bwplot si se quiere
tener más detalles): scales = list().
ƒ strip: cuando se tienen varios paneles, si se pone TRUE se represen-
tan unas etiquetas identificadoras de cada panel: strip = TRUE.
ƒ groups: variable que se puede utilizar para agrupar los datos:
groups = NULL.
ƒ box.ratio: define la proporción de tamaño de las curvas de densidad
con respecto al rectángulo interior: box.ratio = 1.
ƒ horizontal: determina cual es la variable que actúa como factor, si es
FALSE x, y si es TRUE y: horizontal = NULL.
ƒ drop.unused.levels: si es TRUE los niveles de los factores que no se
utilizan son eliminados. Solamente es útil cuando se ha hecho una
selección de datos y se desea que no se eliminen del gráfico los
niveles no seleccionados.

Se pueden usar los argumentos generales xlab, ylab, xlim e ylim.


GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
58

II.6. Curvas de ajuste

Otros gráficos de uso muy frecuente son aquellos en los que se representa
una curva ajustada a un diagrama de dispersión de datos. La curva puede ajus-
tarse por métodos paramétricos o no paramétricos. En nuestro caso veremos un
ejemplo paramétrico en el que se representa la tasa de crecimiento. Se trata de
los resultados de tasa de crecimiento de una microalga (Chlorella vulgaris), con
nitrato como recurso limitante. Queremos representar una curva del modelo de
Michaelis-Menten. Para ello debemos crear por separado un objeto con la curva
predicha por el modelo sobre unas coordenadas determinadas, que añadiremos a
nuestro gráfico con la función «lines()». Aprovecharemos este ejemplo para
mostrar cómo se pueden escribir caracteres especiales en la leyenda de los ejes
y fórmulas matemáticas (o cualquier otro tipo de texto) en el panel. Las
instrucciones están en el archivo II.9.R. Los datos están en el archivo Curva de
crecimiento.csv.
Después de cargar el archivo de datos y adjuntarlos, utilizamos la función
«plot()», a la cual le añadimos el título del gráfico (esta vez en negrita y cur-
siva, código 4) y las etiquetas de los ejes. El argumento «lab=c(8,8,1)» define
el número de divisiones de los ejes y el último número, aunque es necesario es-
pecificarlo, R no lo utiliza. Con «xlog=F» e «ylog=F» se especifica que los ejes
no sean logarítmicos. En este caso, la complicación está en el eje x, que debe
utilizar la letra griega μ para indicar las unidades micromolares. Esta letra existe
con el nombre de mu en la fuente symbol (véase Capítulo I). Generalmente, to-
das las letras griegas se pueden utilizar de la misma manera (pi, sigma, phi,
etc.). Después ajustamos un modelo de Michaelis-Menten mediante la función
«nls()» y creamos dos vectores de coordenadas para representar esa función,
«coordx» y «coordy». Ambos vectores deben tener la misma longitud, y en
nuestro caso nos interesa que se extiendan en el mismo rango que nuestros da-
tos. La función «lines()» dibujará las líneas de la ecuación predicha para el mo-
delo por la función «predict()». Estas líneas no son continuas, sino segmentos
entre cada par de coordenadas. Por eso al crear los vectores de coordenadas
hemos definido un paso muy pequeño (0,01); así los segmentos no se notan y
parece una línea continua. Con «rect()» pintamos un rectángulo para resaltar la
ecuación de Michaelis–Menten, la cual se escribe con la función para texto
«paste()» combinada con las funciones «substitute()» y «frac()» para expre-
siones matemáticas, además de una serie de símbolos («[]» indica subíndice). En
la página de ayuda que aparece al teclear «help(symbol)» o «help
(plotmath)», podemos ver una relación completa de los símbolos matemáticos
disponibles para esta fuente. Además utilizamos el argumento «cex» para
aumentar el tamaño de esta expresión. Con la función «segments()» se
representa la línea azul que indica el máximo de crecimiento. Es importante re-
saltar que los diferentes tipos de fuente (negrita, cursiva, negrita cursiva) no se
aplican a las expresiones matemáticas ni símbolos de este tipo.

¾ datos<-read.csv2("Curva crecimiento.csv", header=TRUE, encoding=


"latin1")
¾ attach(datos)
¾ plot(N,r,main="C. vulgaris",xlab=expression(paste("Nitrato (",paste (mu,
"M)"), sep=" ")), ylab="Tasa de crecimiento", font.main=4,
cex.main=1.75,pch=19, lab=c(8,8,1), cex.lab = 1.5, xlog=F, ylog=F)
GRÁFICOS BÁSICOS
59

¾ modeloMM<-nls(r~rmax*N/(Ks+N),start=list(rmax=1.8,Ks=5))
¾ coordx<-seq(0,160,0.01)
¾ coordy<-predict(modeloMM,list(N=coordx))
¾ lines(coordx,coordy)
¾ rect(80,0.3,120,0.7, col="grey", density=20, angle=45)
¾ text(100,0.5,substitute("r"==paste(frac(paste("r"[max]*"S"),
paste("K"[s]+"S")))),cex=1.5)
¾ segments(-8,1.55,163,1.55,lty=2,col="blue",lwd=2)

C. vulgaris
1.8
1.6
1.4
Tasa de crecimiento
1.2
1.0
0.8
0.6

rmaxS
r
Ks  S
0.4
0.2
0.0

0 20 40 60 80 100 120 140 160

Nitrato (PM)

II.7. Histogramas

El histograma representa las frecuencias de una variable continua mediante


áreas. Veremos un ejemplo de histograma sobre el que representaremos una
curva de densidad de probabilidad. Jugando con los argumentos de la función
para crear histogramas definiremos las clases de forma que cada barra repre-
sente –en lo posible– la frecuencia absoluta o relativa de solamente un valor.
Además, introduciremos algunos nuevos parámetros gráficos. Las instrucciones
están en el archivo II.10.R. Los datos de que disponemos son una serie de
parámetros celulares correspondientes a una población de microalgas en el ar-
chivo Microalga.csv. Las unidades de medida se corresponden con una señal
eléctrica de un determinado detector en un citómetro de flujo. Nos interesa re-
presentar un histograma sin agrupar los tamaños en clases, de modo que a cada
valor individual de la variable le corresponda su densidad de probabilidad en el
eje y.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
60

Con la función «hist()» representaremos el histograma. El argumento


«breaks» define el número de barras del histograma y, por ello, el rango de
valores de nuestra variable que abarca cada barra. Le indicamos que sea igual al
número de valores de nuestra variable, por lo que cada barra abarcará un solo
valor. El argumento «freq» es específico de esta función. Por defecto tiene valor
«TRUE» y entonces se representarían las frecuencias absolutas de cada valor. Al
darle valor «FALSE», se representan valores de densidad de probabilidad. Con
«xaxp» se definen los límites de los intervalos del eje x y el número de ellos.
Para el eje y se usa «yaxp». Además, utilizamos la función «lines()» para aña-
dir una línea que estime la densidad de probabilidad, de un modo no paramé-
trico. El argumento «lwd» define el grosor de la línea.

¾ datos<-read.csv2("Microalga.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ hist(Tamaño,breaks=length(Tamaño),xlim=c(0,1000),ylim=c(0,0.02),main=
"Tamaño del alga",xlab="Tamaño",ylab="Densidad" ,font.main=2, font.lab
=2, cex.main=1.25, freq=FALSE, xaxp=c(0,1000,10))
¾ lines(density(Tamaño,na.rm=TRUE),lwd=2,col="red")

Tamaño del alga


0.020
0.015
Densidad

0.010
0.005
0.000

0 100 200 300 400 500 600 700 800 900 1000

Tamaño

También es posible representar dos series de datos en la misma gráfica. En el


siguiente ejemplo, cuyas instrucciones están en el archivo II.11.R, además de
representar el tamaño se representa la rugosidad; ambas variables se miden en
mV y tienen un rango similar. Una instrucción nueva es «border», con la cual
asignamos dos tonalidades de gris diferentes para el tamaño («grey22») y la
rugosidad («grey55»). Utilizando la función para modificar parámetros de gráfi-
cos «par()», indicamos por medio del argumento «new=TRUE», que represen-
taremos un nuevo histograma en el mismo panel.
GRÁFICOS BÁSICOS
61

¾ datos<-read.csv2("Microalga.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ hist(Tamaño,breaks=length(Tamaño),xlim=c(0,1000),ylim=c(0,0.02),main=
"Tamaño y Rugosidad", xlab="mV", ylab="Densidad", font.main=2,
font.lab=2, cex.main=1.25,freq=FALSE,border="grey22")
¾ par(new=TRUE)
¾ hist(Rugosidad, breaks=length(Tamaño), xlim=c(0,1000), ylim=c(0,0.02),
main="", xlab="", ylab="",freq=FALSE,border="grey55")
¾ lines(density(Tamaño,na.rm=TRUE),lwd=2,col="red")
¾ lines(density(Rugosidad,na.rm=TRUE),lwd=2,col="blue")
¾ legend(0,0.0175, c("Tamaño","Rugosidad"), lty=c(1,1), lwd=c(2,2), col=
c("red","blue"))

Tamaño y Rugosidad
0.020

Tamaño
Rugosidad
0.015
Densidad

0.010
0.005
0.000

0 200 400 600 800 1000

mV

En el siguiente ejemplo se muestra cómo combinar dos histogramas en un


panel y seleccionar determinados casos. Las instrucciones están en el archivo
II.12.R, en el cual se detalla cada uno de los pasos a modo de resumen de todo
lo visto anteriormente. Los datos, que están en el archivo Morfología.csv, son
medidas morfométricas de peces.
Con la instrucción «par(mfrow)» se crea un panel con dos gráficas, posicio-
nadas en dos filas y una columna. La siguiente instrucción selecciona solo el or-
den Perciformes. Posteriormente se hace el histograma para la variable M2. Con
la instrucción «par(new=TRUE)» permitimos que el nuevo histograma con la
variable M3 se haga en el mismo gráfico de antes. Luego se hacen las curvas de
densidad para ambas variables y se coloca una leyenda. Posteriormente, se
selecciona el orden Characiformes y se repite todo el proceso.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
62

¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ par(mfrow=c(2,1))
¾ datos1 <- datos[Orden=="Perciformes", ]
¾ hist(datos1$M2,breaks=length(M2),xlim=c(0,0.25),ylim=c(0,60),main="Per
ciformes",xlab="",ylab="Nº de individuos", font.main=2, font.lab=2,
cex.main=1.25, freq=FALSE,border="grey22")
¾ par(new=TRUE)
¾ hist(datos1$M3,breaks=length(M3), xlim=c(0,0.25), ylim=c(0,60), main="",
xlab="", ylab="", freq=FALSE, border="grey55")
¾ lines(density(datos1$M2,na.rm=TRUE),lwd=2,col="red")
¾ lines(density(datos1$M3,na.rm=TRUE),lwd=2,col="blue")
¾ legend(0.2,60,c("M2","M3"),lty=c(1,1),lwd=c(2,2),col=c("red","blue"))
¾ datos2 <- datos[Orden=="Characiformes", ]
¾ hist(datos2$M2, breaks=length(M2), xlim=c(0,0.25), ylim=c(0,300), main=
"Characiformes", xlab="Ratio de las variables M2 y M3 frente a la longitud
estándar", ylab="Nº de individuos", font.main=2, font.lab=2, cex.main=1.25,
freq=FALSE,border="grey22")
¾ par(new=TRUE)
¾ hist(datos2$M3,breaks=length(M3),xlim=c(0,0.25),ylim=c(0,300),main="",
xlab="",ylab="",freq=FALSE,border="grey55")
¾ lines(density(datos2$M2,na.rm=TRUE),lwd=2,col="red")
¾ lines(density(datos2$M3,na.rm=TRUE),lwd=2,col="blue")

Perciformes
60
Nº de individuos

M2
M3
40
20
0

0.00 0.05 0.10 0.15 0.20 0.25

Characiformes
300
Nº de individuos

200
100
0

0.00 0.05 0.10 0.15 0.20 0.25

Ratio de las variables M2 y M3 frente a la longitud estándar


GRÁFICOS BÁSICOS
63

Función hist (paquete graphics)

ƒ x: vector o variable con los valores a representar.


ƒ breaks: un número, un vector, un carácter o una función que indica
el número de barras: breaks = "Sturges".
ƒ freq: si es TRUE se muestran las frecuencias y si es FALSE la
densidad de probabilidad: freq = NULL.
ƒ include.lowest: si es TRUE y breaks es un vector, se mostrará el va-
lor del break en la primera barra: include.lowest = TRUE.
ƒ right: si es TRUE los intervalos se cierran por la derecha: right =
TRUE.
ƒ density: densidad de las líneas de sombreado: density = NULL.
ƒ angle: ángulo de las líneas de sombreado: angle = 45.
ƒ col: color de relleno de las barras: col = NULL.
ƒ border: color de los bordes. NA es sin borde: border = NULL.
ƒ plot: si es FALSE no se representa el gráfico y muestra los datos:
plot = TRUE.
ƒ labels: si es TRUE se muestran los valores de las densidades encima
de las barras. También se puede especificar un carácter o un vector
con caracteres: labels = FALSE.

Se pueden usar todos los argumentos generales.

Otro tipo de histograma es el gráfico de frecuencia de puntos de la función


«dotplot()» del paquete “epicalc” (Chongsuvivatwong, 2012). Las instrucciones
están en el archivo II.13.R y como ejemplo de nuevo usaremos datos morfomé-
tricos de peces que están el archivo Morfología.csv.
Con la función «dotplot()» es preferible guardar los datos con el nombre
«.data» para que funcionen bien los argumentos que se dejan en modo auto-
mático. Con la función «rainbow()» se define una paleta de 4 colores, ya que
los grupos a representar son 4 familias. Con el «bin» se puede definir el número
de puntos a representar o dejarlo en modo automático. El argumento «by» es
una variable que define los diferentes grupos, en este caso las diferentes familias
de peces. Con «xmin» y «xmax» se pueden especificar los límites inferior y su-
perior del eje x, los cuales también se pueden dejar en modo automático. El ar-
gumento «time.step» puede ser un carácter del tipo "year", "week", "sec", etc.,
y «time.format» otro carácter que define el formato de tiempo del tipo
"%H:%M", "%Y", etc. Por último, con «cex.X.axis» y «cex.Y.axis» se define el
tamaño de las marcas de los ejes.

¾ require(epicalc)
¾ .data<-read.csv2("Morfología.csv",header=TRUE,encoding="latin1")
¾ attach(.data)
¾ color<-rainbow(4)
¾ dotplot(M12, bin="auto", by=Familia, xmin = 0, xmax = 1, time.format =
NULL, time.step = NULL, pch = 18, dot.col = color, main = "Distribución
de la variable M12 por familias", ylab = "auto", cex.X.axis = 1, cex.Y.axis =
1)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
64

Distribución de la variable M12 por familias

phyraenidae

Sparidae

Cichlidae

Characidae

0 0.2 0.4 0.6 0.8 1

II.8. Diagrama de tallo y hojas

El diagrama de tallo y hojas (Stem-and-Leaf Diagram) permite obtener si-


multáneamente una distribución de frecuencias de la variable y su representación
gráfica. El gráfico es similar a un histograma y, por lo tanto, es adecuado para
representar variables continuas, ya que permite visualizar la distribución de la
variable sin perder de vista los valores individuales de los datos. Se representa
mediante caracteres –por lo que no necesita un dispositivo gráfico– y contiene en
el mismo gráfico información sobre los valores de la variable. Tiene más informa-
ción que el histograma, aunque la calidad del gráfico es inferior.
Para construir el gráfico se ordenan los valores de menor a mayor, y para
cada valor se separa el último dígito de la derecha, con el que se formarán las
“hojas”, a la derecha de la línea vertical, y los restantes dígitos forman el “tallo”,
a la izquierda de la línea vertical.
Veamos un ejemplo con los datos del archivo Morfología.csv, utilizando la
función «stem()» del paquete básico “graphics”. Las instrucciones están en el
archivo II.14.R
GRÁFICOS BÁSICOS
65

En el ejemplo se representa la variable M12, habiendo seleccionado previa-


mente el grupo de elementos correspondiente a la familia Sparidae.

¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding="latin1")
¾ datos1 <- subset(datos, Familia == "Sparidae")
¾ stem(datos1$M12)

El resultado que se muestra aparece en la consola o ventana de resultados, y


no en una ventana de gráficos:

The decimal point is 2 digit(s) to the left of the


42 | 6
43 |
44 |
45 | 7
46 | 589
47 | 11457889
48 | 345677888999
49 | 0011223344455566788888
50 | 000111222222333344444555556666666666677777888888999
51 | 00000111112222222233444555556666777788889999
52 | 000000001111122223333344444555555666666666777777788999
53 | 0001111122222333444444445555555666666677788999999
54 | 00011122333333444455556667788888899
55 | 011122222333334444555566778889999
56 | 00000111223333333444556777899
57 | 2224444666777889
58 | 0012668
59 | 457
60 |
61 |
62 | 7

Como se muestra en los resultados, los valores del tallo deben leerse con la
coma desplazada dos lugares a la izquierda (62 es 0,62). El aspecto general del
gráfico es similar al histograma, pero ahora es posible reconstruir los valores de
la variable a partir del gráfico, ordenados de menor a mayor, tomando el tallo y
cada una de las hojas: 0,627, 0,597, 0,595, 0,594, 0,588, 0,586, 0,586, 0,582,
etc.

II.9. Gráficos de barras

El gráfico de barras se utiliza para variables cuantitativas discretas y variables


cualitativas. La función «barplot()» permite representar barras simples, barras
agrupadas, o barras apiladas.
Para realizar estos tipos de gráficos, partiremos del archivo que usamos en el
ejemplo anterior Morfología.csv, es decir, medidas morfológicas de una serie de
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
66

peces clasificados en orden, familia, género y especie. El objetivo es representar


los valores de distintas variables por familias. Las instrucciones están en el ar-
chivo II.15.R.
En primer lugar, seleccionamos solamente la variable M2 para crear un gráfico
de barras simples. La única función importante, que no hayamos visto hasta
ahora en esta sección, es «tapply()», que usamos para obtener los valores
promedio de M2 por familias.

¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding= "latin1")
¾ attach(datos)
¾ barplot(tapply(M2,Familia,mean),ylim=c(0,0.16),ylab="Longitud",font.lab=
2, font.axis=2, main="M2", font.main=2)

M2
0.15
0.10
Longitud

0.05
0.00

Characidae Cichlidae Sparidae Sphyraenidae

En los gráficos de barras, nos podría interesar en muchos casos representar


barras de error o desviación estándar en el eje y. Para realizar esto no existe
ninguna función predefinida que actúe directamente sobre la función
«barplot()». Existen funciones como «errbar()» en el paquete “Hmisc” (Harrell,
2012) o la función «plotCI()» en el paquete “gplots” (Warnes, 2012b) –esta
última más comúnmente utilizada para representar intervalos de confianza– que
pueden actuar sobre otras funciones gráficas. Por lo tanto, la mejor forma de
hacerlo es crear una función definida por el usuario.
Existen muchas formas de hacerlo. Podemos, por ejemplo, utilizar un código
muy simple disponible libremente en http://monkeysuncle.stanford.edu. Modifi-
caremos ligeramente este código, para que las desviaciones o errores se mues-
tren sólo por encima de las barras y lo utilizaremos en el ejemplo de barras sim-
ples y agrupadas. En el caso de las barras simples es necesario añadir algunos
GRÁFICOS BÁSICOS
67

detalles al código mostrado anteriormente. Destacamos que es necesario crear


un objeto, «ejeX», que nos muestre los valores del eje x sobre los que se en-
cuentran las barras (paso 1), ya que estos valores los adjudica la función
«barplot()» sin que nosotros los conozcamos. Creamos también en el paso 1 un
objeto para los valores del eje y, «valores», además de un vector, «dvest», con
las desviaciones estándar, en el paso 2.

¾ valores<-tapply(M2,Familia,mean)
¾ ejeX<-barplot(valores, ylim=c(0,0.16), ylab="Longitud", font.lab=2,
font.axis=2, main="M2",font.main=2)
¾ dvest<-tapply(M2,Familia,sd)
¾ error.bar <- function(x, y, upper, lower, length=0.1,...)
{
if(length(x) != length(y) | length(y) !=length(lower) | length(lower)
!= length(upper))
stop("vectors must be same length")
arrows(x,y+upper, x, y-lower, angle=90, code=3, length=length, ...)
}
¾ error.bar(ejeX,valores,upper=dvest,lower=rep(0,length=length(dvest)))

M2
0.15
0.10
Longitud

0.05
0.00

Characidae Cichlidae Sparidae Sphyraenidae

Ahora, representaremos los valores promedio de una serie de variables (M2,


M3, M4 y M5) para cada familia, mediante un gráfico de barras agrupadas. Las
instrucciones están en el archivo II.16.R. La función «aggregate()» permite
obtener los valores medios de cada una de las variables (M2, M3, M4 y M5), y
con el argumento «by» se crea una lista donde se pueden indicar las variables de
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
68

agrupación; en este ejemplo se utiliza únicamente familia. Dentro de la función


«barplot()», debemos indicar que el argumento «beside» tenga valor «TRUE».
De no ser así, se generaría un gráfico de barras apiladas, como veremos poste-
riormente.

¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding= "latin1")
¾ datos2<-datos[,c("Familia","M2","M3","M4","M5")]
¾ datos2M<-aggregate(datos2[,c("M2","M3","M4","M5")],by=list(datos2$
Familia),mean)
¾ datos2M<-datos2M[,-1]
¾ rownames(datos2M)<- c("Characidae", "Cichlidae", "Sparidae",
"Sphyraenidae")
¾ datos2M<-as.matrix(datos2M)
¾ barplot(t(datos2M),beside=TRUE,ylim=c(0,0.15),main="Morfología",ylab=
"Longitud",font.main=2,font.axis=2,font.lab=2,col=1:4)
¾ legend("topleft",colnames(datos2M), bty="n", fill=c("black","red","green",
"blue"))
Morfología

M2
0.14

M3
M4
M5
0.12
0.10
Longitud

0.08
0.06
0.04
0.02
0.00

Characidae Cichlidae Sparidae Sphyraenidae

Al igual que hicimos anteriormente, es posible incorporar barras de desviación


en el gráfico.

#Paso 1. Se representa el gráfico


¾ datos<-read.csv2("Morfología.csv",header=TRUE)
¾ datos2<-datos[,c("Familia","M2","M3","M4","M5")]
¾ datos2M<-aggregate(datos2[ , c("M2", "M3", "M4", "M5")], by=
list(datos2$Familia),mean)
GRÁFICOS BÁSICOS
69

¾ datos2M<-datos2M[,-1]
¾ rownames(datos2M)<-c("Characidae", "Cichlidae", "Sparidae",
"Sphyraenidae")
¾ datos2M<-as.matrix(datos2M)
¾ ejeX<-barplot(t(datos2M), beside=TRUE, ylim=c(0,0.16), main=
"Morfología", ylab="Longitud", font.main=2, font.axis=2, font.lab=2,
col=1:4)
¾ legend("topleft",colnames(datos2M),bty="n",fill=c("black","red","green",
"blue"))

#Paso 2. Se añaden las desviaciones


¾ datos2Mdvest<-aggregate(datos2[ , c("M2", "M3", "M4", "M5")], by=
list(datos2$Familia),sd)
¾ datos2Mdvest<-datos2Mdvest[,-1]
¾ datos2Mdvest<-as.matrix(datos2Mdvest)
¾ error.bar <- function(x, y, upper, lower, length=0.1,...){
if(length(x) != length(y) | length(y) !=length(lower) | length(lower)
!= length(upper))
stop("vectors must be same length")
arrows(x,y+upper, x, y-lower, angle=90, code=3, length=length, ...)}
¾ error.bar(ejeX,t(datos2M),upper=t(datos2Mdvest),lower=rep(0,length=
length(datos2Mdvest)))

Morfología

M2
0.15

M3
M4
M5
0.10
Longitud

0.05
0.00

Characidae Cichlidae Sparidae Sphyraenidae


GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
70

Por último, simplemente dejando el valor por defecto del argumento


«beside» en el gráfico sin dispersiones, obtendríamos un gráfico de barras api-
ladas. Las instrucciones están en el script II.17.R.

¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding= "latin1")
¾ attach(datos)
¾ datos2<-datos[,c("Familia","M2","M3","M4","M5")]
¾ datos2M<-aggregate(datos2[,c("M2","M3","M4","M5")],by=list(datos2$
Familia), mean)
¾ datos2M<-datos2M[,-1]
¾ rownames(datos2M)<-c("Characidae", "Cichlidae", "Sparidae",
"Sphyraenidae")
¾ datos2M<-as.matrix(datos2M)
¾ barplot(t(datos2M),ylim=c(0,0.4),main="Morfología",ylab="Longitud",font.
main=2,font.axis=2,font.lab=2,col=1:4)
¾ legend("topleft",colnames(datos2M),bty="n",fill=c("black","red","green",
"blue"))

Morfología
0.4

M2
M3
M4
M5
0.3
Longitud

0.2
0.1
0.0

Characidae Cichlidae Sparidae Sphyraenidae


GRÁFICOS BÁSICOS
71

Función barplot (paquete graphics)

ƒ height: un vector o matriz con los valores de las barras.


ƒ width: grosor de las barras: width = 1.
ƒ space: espacio entre barras: space = NULL.
ƒ names.arg: vector con los nombres que se pondrán debajo de las ba-
rras: names.arg = NULL.
ƒ legend.text: si su valor es TRUE se utilizan las etiquetas de las filas
del archivo como leyenda. También puede ser un vector con nombres.
Solo es útil si height es una matriz: legend.text = NULL.
ƒ beside: si su valor es TRUE se ponen unas barras al lado de las otras
y si su valor es FALSE se ponen apiladas: beside = FALSE.
ƒ horiz: barras horizontales si es TRUE: horiz = FALSE.
ƒ density: densidad del sombreado de las barras: density = NULL.
ƒ angle: ángulo de las líneas de sombreado: angle = 45.
ƒ border: color de los bordes de las barras. NA es sin borde.
ƒ xpd: si es TRUE se permite que las barras salgan de la región del
gráfico: xpd = TRUE.
ƒ axes: si es TRUE se muestran las etiquetas del eje y: axes=TRUE.
ƒ axisnames: si es TRUE se muestra el otro eje con sus etiquetas:
axisnames = TRUE.
ƒ cex.axis: tamaño de las etiquetas del eje y: cex.axis =
par("cex.axis").
ƒ cex.names: tamaño de las etiquetas de las barras: cex.names =
par("cex.axis").
ƒ inside: si es TRUE se resaltan las líneas que dividen las barras adya-
centes. Solo se utiliza si space = 0: inside = TRUE.
ƒ axis.lty: tipo de línea de las marcas que hay debajo de las barras:
axis.lty = 0.
ƒ offset: vector indicando cuanto se separan las barras del eje x:
offset = 0.
ƒ args.legend: listado adicional de argumentos para la leyenda:
args.legend = NULL.

Se pueden usar todos los argumentos generales.

En el script II.18.R se utiliza la función «barp()» del paquete “plotrix”


(Lemon, 2012). En la primera parte del script se calculan las medias por familia
de varias medidas morfológicas (M2, M3, M4 y M5). Posteriormente al archivo
creado con las medias se le quita la primera columna y se crea «datos2». A esta
matriz de datos se le añaden las etiquetas de las columnas con la función
«colnames()», quedando la matriz de datos como se muestra a continuación:
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
72

En la función «barp()», con el argumento «names.arg» se definen las eti-


quetas del eje x, que en este caso son las etiquetas de las columnas de la matriz
de datos. El paquete “grDevices”, el cual viene por defecto cuando se instala R,
permite utilizar los colores de forma más cómoda: usaremos «rainbow(4)» para
definir los colores de relleno de las barras. El número 4 es debido a que hay
cuatro familias de peces en los datos. Con «cylindrical=TRUE» se puede espe-
cificar que las barras sean cilíndricas y con «shadow=TRUE» que tengan som-
bra. Con «staxx=TRUE» y «staxy=TRUE» se puede hacer que las etiquetas de
los ejes x e y no se pongan al mismo nivel en vertical, lo cual es útil en el caso
de etiquetas grandes que se solapan.

¾ library(plotrix)
¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding= "latin1")
¾ attach(datos)
¾ datos1<-aggregate(datos[ ,c("M2", "M3", "M4", "M5")], by = list(Familia),
mean)
¾ datos2<-datos1[,-1]
¾ datos3<-t(datos2)
¾ colnames(datos3)<-c("Characidae","Cichlidae","Sparidae","Sphyraenidae")
¾ datos3
¾ barp(datos3,names.arg=colnames(datos3), cex.axis=1.2, col=rainbow(4),
cylindrical=TRUE, shadow=TRUE, staxx=FALSE, staxy=FALSE,
legend.lab= c("M2","M3","M4","M5"), legend.pos=list(x=0.7,y=0.12),
xlab="", ylab="", border=TRUE)
¾ mtext("Familias",1,line=2.8, font=2, cex=1.6)
¾ mtext("Longitud",2,line=2.6, font=2, cex=1.6)

M2
M3
M4
M5
0.1
Longitud
0.05
0

Characidae Cichlidae Sparidae Sphyraenidae


Familias
GRÁFICOS BÁSICOS
73

II.10. Gráficos circulares

En el script II.19.R hay tres ejemplos de gráfico circular o de sectores, que


representa las frecuencias de una variable mediante la amplitud de un sector
circular. Aunque se suele utilizar con variables cualitativas, también es útil para
representar variables cuantitativas. Se utiliza el archivo Población.csv, que
contiene datos de la estructura de la población de hombres y mujeres de España
en diferentes años.
En el primer gráfico se representa la estructura de edad de las mujeres que
había en España en el año 1991. La función que se utiliza es «pie()». El argu-
mento «sep="\n"» permite saltar una línea en el título del gráfico. Con
«clockwise» se puede indicar si los sectores del gráfico van cambiando en el
sentido de las agujas del reloj o a la inversa. Con «init.angle» se especifica el
ángulo donde empieza el primer sector, que por defecto es cero. Por último, con
«radius» se define el tamaño del círculo.

¾ Datos<-read.csv2("Población.csv", header=TRUE, encoding="latin1")


¾ attach(Datos)
¾ pie(M.1991, labels=Edad, main = paste("Estructura de edad de", sep="\n",
"mujeres españolas en 1991"), cex.main=1.55, clockwise=FALSE, init.angle
= 0, radius = 1)

Estructura de edad de
mujeres españolas en 1991
15 a 19
20 a 24

10 a 14

25 a 29

5a9

30 a 34
<5

> 85
35 a 39 80 a 84

75 a 79

40 a 44 70 a 74

65 a 69
45 a 49

50 a 54 60 a 64
55 a 59
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
74

Función pie (paquete graphics)

ƒ x: vector o variable con los valores a representar.


ƒ labels: vector o variable con las etiquetas.
ƒ edges: el círculo es en realidad un polígono, y edges es el número de
lados: edges = 200.
ƒ radius: tamaño del círculo en una escala de -1 a 1: radius = 0.8.
ƒ clockwise: valor lógico que define si las secciones avanzan en el
mismo sentido o contrario de las agujas del reloj: clockwise =
FALSE.
ƒ init.angle: ángulo donde se inicia la primera sección: init.angle =
if(clockwise) 90 else 0.
ƒ density: densidad de las líneas de sombreado: density = NULL.
ƒ angle: ángulo de las líneas de sombreado: angle = 45.
ƒ border: color de los bordes. NA es sin borde: border = NULL.

Se pueden usar todos los argumentos generales.

En el segundo gráfico se utiliza la función «pie3D()» también del paquete


“plotrix” (Lemon, 2012). En primer lugar se transpone la matriz con la función
«t()» seleccionando solamente las filas 2 a 5 de la matriz original. Posterior-
mente, con «colnames()» se asignan a la nueva matriz las etiquetas que había
en la primera columna de la matriz original, es decir, las clases de edad. El nuevo
archivo queda de la siguiente forma:

¾ library(plotrix)
¾ Datos1<-as.data.frame(t(Datos[,2:5]))
¾ colnames(Datos1)<-(Datos[1:18,1])
¾ Datos1

En la función «pie3D()», el argumento «explode» especifica cuanto se se-


paran los sectores. Con «height» y «tetha» se define la altura y el ángulo de
inclinación de los sectores. Con «start» se indica el ángulo en que comienza el
primer sector.

¾ pielabels<-c("Mujeres\n en 1900","Hombres\n en 1900","Mujeres\n en


1991","Hombres\n en 1991")
GRÁFICOS BÁSICOS
75

¾ pie3D(Datos1[,18], edges=100, explode=0.1, radius=0.87, height=0.3,


theta=0.5, start=0, labelcol="black", labelcex=1.2, main = "", cex.main=
1.55, labels=pielabels)
¾ text(0, 0.75, paste("Personas mayores de 85 años", sep="\n", "en diferentes
años"), font=2, cex=1.6)

Personas mayores de 85 años


en diferentes años
Mujeres
en 1991
Hombres
en 1900
Mujeres
en 1900

Hombres
en 1991

En el tercer y último gráfico del script, se utiliza la función «fan.plot()» del


paquete “plotrix” (Lemon, 2012). En primer lugar definimos una paleta de colo-
res con la función «terrain.colors()» y asignamos el valor 18, ya que es el
número de clases de edad. Con el argumento «max.span» se indica la amplitud,
en radianes, que ocupa el gráfico completo. Con «label.radius» se indica cuanto
se separan las etiquetas del gráfico. Con «radius» se define el tamaño del
gráfico.

¾ library(plotrix)
¾ color<-terrain.colors(18)
¾ fan.plot(H.1900, labels=Edad, max.span=6, col=color, label.radius=1.2,
radius=1, edges=100, main = "Estructura de edad de hombres españoles en
1900")

En el gráfico, el número de individuos de cada clase de edad se muestra por


medio del tamaño de cada uno de los sectores del gráfico, es decir, aquellas cla-
ses de edad con más individuos tienen un sector del círculo de mayor tamaño.
Además las clases se ordenan por frecuencia, de menor a mayor, de tal forma
que la clase con menos individuos es la de hombres mayores de 85 años y la que
tiene más individuos es la de los niños de menos de 5 años. Si dos clases tuvie-
sen el mismo número de individuos entonces se solaparían, ya que el tamaño de
ambos sectores sería igual.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
76

Estructura de edad de hombres españoles en 1900


40 a 44 35 a 39
30 a 34
50 a 54
25 a 29
45 a 49

20 a 24

55 a 59
15 a 19

60 a 64

10 a 14

65 a 69

70 a 74

75 a 79 5a9
80 a 84
> 85 <5

La función «dotcircle()» del paquete “ade4” (Chessel y col., 2012) permite


representar puntos en un círculo. Se utilizan de nuevo los datos del archivo
Población.csv y las instrucciones están en el script II.20.R. El radio del círculo
viene determinado por el valor máximo de la serie de datos. El argumento
«labels» define la variable que se usará como etiqueta. Con «clabel» y «cleg»
se especifica el tamaño de las etiquetas y de los rangos de la variable. Con
«alpha0» se define el ángulo polar del primer radio. Por último, para los títulos
usamos el argumento «ltext» del paquete “lattice” (Sarkar, 2012).

¾ library(lattice)
¾ library(ade4)
¾ Datos<-read.csv2("Población.csv",header=TRUE,encoding= "latin1")
¾ attach(Datos)
¾ windows(15,7)
¾ par(mfrow=c(2,2))
¾ dotcircle(M.1900,labels=Edad,clabel=1,cleg=1.5,alpha0=2)
¾ ltext(x = 120, y =20,labels = "Mujeres en 1900",cex = 1.5,font=2)
¾ dotcircle(M.1991,labels=Edad,clabel=1,cleg=1.5,alpha0=2)
¾ ltext(x = 800, y =20,labels = "Mujeres en 1991",cex = 1.5,font=2)
¾ dotcircle(H.1900,labels=Edad,clabel=1,cleg=1.5,alpha0=2)
¾ ltext(x = 120, y =340,labels = "Hombres en 1900",cex = 1.5,font=2)
¾ dotcircle(H.1991,labels=Edad,clabel=1,cleg=1.5,alpha0=2)
¾ ltext(x = 800, y =340,labels = "Hombres en 1991",cex = 1.5,font=2)
GRÁFICOS BÁSICOS
77

Mujeres en 1900 Mujeres en 1991

<5

<5
5a9

5a9
5

5
>8

>8
14

14
1200000 1800000

a
84

84
10

10
a

a
80

80
a 19 a 19
15 15
79 a 79 a
75 75

24 24
20 a 20 a
70 a 74 0 70 a 74 2e+05

1200000 0 0 1200000 1800000 2e+05 2e+05 1800000


25 a 29 25 a 29

69
65 a 0 69
65 a 2e+05

30 30
a 34 a 34
60 60
64 a 64 a

35

35
a

a
55

55
39

39
a

a
1200000 1800000
59

59
40

40
50 a

50 a
a

a
45 a 49

45 a 49
44

44
54

54
<5

<5
5a9

5a9
Hombres en 1900 Hombres en 1991
5

5
>8

>8
14

14
1200000 2e+06

a
84

84
10

10
a

a
80

80
19 19
a a
15 15
79 a 79 a
75 75

24 24
20 a 20 a
70 a 74 0 70 a 74 0

1200000 0 0 1200000 2e+06 0 0 2e+06


25 a 29 25 a 29

69
65 a 0 69
65 a 0

30 30
a 34 a 34
60 60
a a
64 64
35

35
a

a
55

55
39

39
a

a
1200000 2e+06
59

59
40

40
50 a

50 a
a

a
45 a 49

45 a 49
44

44
54

54
Función dotcircle (paquete ade4)

ƒ z: vector, variable o conjunto de datos a representar.


ƒ alpha0: ángulo polar donde se coloca el primer eje: alpha0 = pi/2.
ƒ labels: vector o variable con las etiquetas de los ángulos: labels =
names(z).
ƒ xlim: límites de círculo: xlim = range(pretty(z)).
ƒ clabel: tamaño de letra de las etiquetas de los ángulos: clabel = 1.
ƒ cleg: tamaño de letra de los rangos de la variable: cleg = 1.

II.11. Gráficos de puntos

El gráfico de puntos es similar al diagrama de barras, y representa un punto


(en lugar de una barra) cuya altura es proporcional al valor de la variable que se
representa. Las instrucciones están en el archivo II.21.R y se usan de nuevo los
datos del archivo Población.csv. Se representa en este caso la estructura de
edad de los hombres en España en los años 1900 y 1991.
La función que se utiliza es «dotchart()». Al final se añade una leyenda, que
ubicamos arriba a la derecha con «topright», y con el argumento «bty="n"» se
indica que no tenga borde.

¾ Datos<-read.csv2("Población.csv", header=TRUE, encoding="latin1")


¾ attach(Datos)
¾ dotchart(H.1991, labels=Edad, xlim=c(0,2000000), main = paste
("Estructura de edad de", sep="\n","hombres españoles en 1900 y 1991"),
cex.main = 1.8, pch = 15, xlab ="Nº de hombres", cex.lab=1.6, font.lab=2)
¾ mtext("Clases de edad en años",2,line=2.4, font=2, cex=1.6)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
78

¾ par(new=TRUE)
¾ dotchart(H.1900,labels=Edad, xlim=c(0,2000000))
¾ legend("topright", c("1900", "1991"), bty="n", pch = c(1,15))

Estructura de edad de
hombres españoles en 1900 y 1991
> 85 1900
1991
80 a 84
75 a 79
70 a 74
Clases de edad en años

65 a 69
60 a 64
55 a 59
50 a 54
45 a 49
40 a 44
35 a 39
30 a 34
25 a 29
20 a 24
15 a 19
10 a 14
5a9
<5

0 500000 1000000 1500000 2000000

Nº de hombres

II.12. Gráficos ternarios

Se utilizan para representar simultáneamente tres variables con suma cons-


tante. Este tipo de gráficos se puede hacer con la función «triangle.plot()» del
paquete “ade4” (Chessel y col., 2012). En este ejemplo usaremos también la
función «grid_legend()», que requiere tener instalado el paquete “vcd” (Meyer
y col., 2012). Las instrucciones están en el archivo II.22.R. Los datos están en
el archivo Pigmentos.csv y consisten en la cantidad de diferentes pigmentos
que tienen tres algas fitoplanctónicas.
En el primer gráfico se selecciona la especie T.suecica y se representan los
pigmentos que están en las columnas 2, 3 y 5. Es necesario seleccionar 3 varia-
bles y automáticamente los datos se transforman en proporciones cuya suma es
1. El argumento «scale=TRUE» permite que el gráfico ajuste de forma automá-
tica la escala de los ejes a los datos. El triángulo pequeño muestra la posición del
GRÁFICOS BÁSICOS
79

gráfico representado en el triángulo completo. Con «cpoint» se define el tamaño


de los símbolos. Con «sub» se puede poner un título al gráfico y, con «possub»
y «csub» se define la posición y tamaño de letra del título, respectivamente.

¾ library(ade4)
¾ library(vcd)
¾ datos<-read.csv2("Pigmentos.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ windows(11,7)
¾ par(mfrow = c(2,2))
¾ triangle.plot(datos[Especie=="T. suecica",c(2,3,5)], scale =TRUE, cpoint=3,
sub="T. suecica", possub = "topright", csub=2)

En el segundo gráfico se utilizan todas las especies y hemos cambiado los pig-
mentos, ahora son las variables 3, 4 y 5 de la matriz de datos. En este caso
«scale=FALSE» para poder definir los límites de los ejes del gráfico con «min3»
y «max3». Como hay tres especies, en vez de los símbolos se usa el nombre de
las especies con el argumento «label» y el tamaño de esta leyenda se define con
«clabel». La zona sombreada del triángulo pequeño muestra como el rango de
los ejes ha cambiado.

¾ triangle.plot(datos[,c(3,4,5)],scale =FALSE, cpoint=3, sub="% Pigmentos",


possub = "topright",csub=2, min3=c(0,0,0.6), max3=c(0.6,0.6,1), label=
Especie, clabel=1)

En el tercer gráfico se quita el triángulo pequeño con «show.position=


FALSE» y «addmean=TRUE» permite mostrar el valor medio de las tres
variables para todo el conjunto de datos.

¾ triangle.plot(datos[,c(3,4,5)],scale =TRUE, cpoint=3, sub="% Pigmentos",


possub = "topright", csub=2, min3=c(0,0,0.6), max3=c(0.6,0.6,1),
show.position=FALSE, addmean=TRUE)

En el último gráfico se muestra como poner diferentes símbolos a cada espe-


cie y una leyenda. Para ello es necesario representar por separado cada especie
y luego con «points()» se cambia el color y el tamaño de los símbolos. La fun-
ción «grid_legend()» permite añadir una leyenda.

¾ G1 <-triangle.plot(datos[Especie=="T. suecica", c(3,4,5)], scale =TRUE,


cpoint=3, sub="", possub = "topleft", csub=2, min3=c(0,0,0.6),
max3=c(0.6,.6,1), show.position=FALSE)
¾ points(G1 , pch=16, col="blue", cex=2)
¾ par(new=TRUE)
¾ G2 <-triangle.plot(datos[Especie=="Chlorella sp.", c(3,4,5)], scale =TRUE,
cpoint=3, sub="", possub = "topleft", csub=2, min3=c(0,0,0.6),
max3=c(0.6,.6,1),show.position=FALSE)
¾ points(G2 , pch=16, col="green", cex=2)
¾ par(new=TRUE)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
80

¾ G3 <-triangle.plot(datos[Especie=="Ch. autotrophica", c(3,4,5)], scale =


TRUE, cpoint = 3, sub="", possub = "topleft", csub=2, min3=c(0,0,0.6),
max3=c(0.6,.6,1),show.position=FALSE)
¾ points(G3 , pch=16, col="red", cex=2)
¾ grid_legend(0.85, 0.45, pch=c(16,16,16), col = c("blue","green","red"), c("T.
suecica", "Chlorella sp.", "Ch. autotrophica"), title = "Algas", gp = gpar
(fontface=3, fontsize=12))

T. suecica
0.2 0.7 0 1

Ch.autotrophica
Ch.
Ch. autotrophica
autotrophica

NEOXANTINA LUTEINA VIOLOXANTINA Chlorella LUTEINA


Chlorellasp.
sp.
Chlorellasp.
Chlorella sp.

T. suecica
T. suecica
T.T.suecica
suecica
0.5 0.4 0.4 T. suecica 0.6
0.1 VIOLOXANTINA 0.4 0 ZEAXANTINA 0.4

Algas
% Pigmentos T. suecica
0 1 0 1 Chlorella sp.
Ch. autotrophica

0.158
VIOLOXANTINA LUTEINA VIOLOXANTINA LUTEINA
0.74

0.4 0.6 0.4 0.6


0 0.102
ZEAXANTINA 0.4 0 ZEAXANTINA 0.4

Función triangle.plot (paquete ade4)

ƒ ta: data frame donde hay que especificar las tres variables a repre-
sentar.
ƒ label: variable con las etiquetas de los puntos.
ƒ clabel: tamaño de letra de las etiquetas: clabel = 0.
ƒ cpoint: tamaño de los puntos: cpoint = 1.
ƒ draw.line*: si es TRUE se pinta la trama de líneas interiores:
draw.line = TRUE.
ƒ addaxes: si es TRUE se pintan los ejes principales: addaxes =
FALSE.
ƒ addmean: si es TRUE se pinta la media de cada eje: addmean =
FALSE.
ƒ labeltriangle: si es TRUE se muestran los nombres de las variables:
labeltriangle = TRUE.
ƒ sub: título del gráfico.
ƒ csub: tamaño de letra del título.
GRÁFICOS BÁSICOS
81

Función triangle.plot (Continuación)

ƒ possub: posición del título con las opciones: "topleft", "topright",


"bottomleft" o "bottomright": possub = "topright".
ƒ show.position*: si es TRUE se representa la posición del triángulo
dentro del triángulo completo: show.position = TRUE.
ƒ scale*: si es TRUE se ajusta automáticamente la escala de los ejes:
scale = TRUE.
ƒ min3 y max3: vectores con formato c(x, y, z) que indican el mínimo
y el máximo de los ejes si scale es FALSE: min3 = NULL y max3 =
NULL.
ƒ box: si es TRUE se pinta un marco: box = FALSE.

Los argumentos con * también son de la función triangle.biplot().

En el gráfico del script II.23.R se muestra un ejemplo de la función


«triangle.biplot()», que es también del paquete “ade4” (Chessel y col., 2012).
Esta función permite representar dos matrices. En el script se importan los datos
del archivo Pigmentos1.csv, con los mismos pigmentos y especies de algas
fitoplanctónicas, pero en otras condiciones diferentes de cultivo. La única diferen-
cia es que hay que definir dos matrices, cada una con tres variables. Las flechas
nos indican el cambio que se ha producido al cambiar de medio de cultivo.

¾ library(ade4)
¾ datos<-read.csv2("Pigmentos.csv",header=TRUE,encoding="latin1")
¾ datos1<-read.csv2("Pigmentos1.csv",header=TRUE,encoding="latin1")
¾ triangle.biplot(datos[datos$Especie=="T. suecica", c(2,3,5)], datos1
[datos1$Especie== "T. suecica",c(2,3,5)], show.position=T, scale=T)

0.2 0.7

NEOXANTINA LUTEINA

3
12

0.5 0.4
0.1 VIOLOXANTINA 0.4
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
82

El gráfico ternario también se puede hacer con la función «ternaryplot()», la


cual necesita tener instalado el paquete “vcd” (Meyer y col., 2012). Las
instrucciones están en el archivo II.24.R y usaremos los mismos datos del ar-
chivo Pigmentos.csv. El argumento «scale» permite definir si los datos se
transforman a una escala de 1 ó de 100. El argumento «dimnames_position»
define la posición de las leyendas de los ejes. Con «grid_color» se especifica el
relleno del triángulo, el cual es «grey60» en el primero y «transparent» en los
siguientes, para que no tape los símbolos de los gráficos anteriores. Con
«labels_color» y «labels» se especifica el color y la posición de la numeración
de los ejes, ésta última teniendo las otras opciones de «inside» y «none». Por
último, con «newpage» se define si se crea un nuevo gráfico o se añaden los
símbolos al anterior. En este gráfico no es posible cambiar los límites de los ejes.

¾ library(vcd)
¾ datos<-read.csv2("Pigmentos.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ ternaryplot(datos[Especie=="T. suecica",c(2,3,5)],scale=100,pch=c(15), col
= "blue", dimnames_position = "edge", main="Porcentaje pigmentos", bg =
"grey60", grid_color="black", labels_color="black", labels=c("outside"))
¾ ternaryplot(datos[Especie=="Chlorella sp.",c(2,3,5)],scale=100,pch=c(16),
col="green",grid=FALSE,dimnames_position = "edge", bg="transparent",
main="Porcentaje pigmentos", labels=c("outside"), newpage = FALSE)
¾ ternaryplot(datos[Especie=="Ch. autotrophica",c(2,3,5)], scale=100,pch=
c(17),col="red",grid=FALSE,dimnames_position="edge",bg= "transparent",
main="Porcentaje pigmentos", labels = c("outside"), newpage = FALSE)
¾ grid_legend(0.8, 0.75, pch=c(15,16,17), col=c("blue","green", "red"), c("T.
suecica", "Chlorella sp.", "Ch. autotrophica"),title = "Algas", gp = gpar
(fontface=3, fontsize=12))

Porcentaje pigmentos

Algas
T. suecica
Chlorella sp.
Ch. autotrophica
20

80
INA

40

NE
T

OX
AN

60
AN
X
LO

TI N
VIO

A
60

40
80

20
80

60

40

20

LUTEINA
GRÁFICOS BÁSICOS
83

Función ternaryplot (paquete vcd)

ƒ x: data frame donde hay que especificar las tres variables a represen-
tar.
ƒ scale: los valores se ponen en una escala de 1 ó de 100: scale = 1.
ƒ dimnames: se puede especificar una variable que se usa para las le-
yendas de los ejes: dimnames = NULL.
ƒ dimnames_position: posición de las leyendas de los ejes, donde las
opciones son "corner","edge" o "none".
ƒ dimnames_color: color de las leyendas de los ejes: dimnames_
color = "black".
ƒ id: etiquetas opcionales que se pueden mostrar al lado de los símbo-
los: id = NULL.
ƒ id_color: color de las etiquetas anteriores: id_color = "black".
ƒ id_just: vector con 1 o 2 términos indicando la justificación de las
etiquetas anteriores: id_just = c("center", "center").
ƒ coordinates: si es TRUE se muestran las coordenadas de los puntos:
coordinates = FALSE.
ƒ grid: si es TRUE se muestra la trama interior de líneas: grid = TRUE.
ƒ grid_color: especifica el color de la trama: grid_color = "gray".
ƒ labels: posición de la numeración de los ejes, la cual puede ser
"inside", "outside" o "none".
ƒ labels_color: color de la numeración de los ejes: labels_color =
"darkgray".
ƒ prop_size: si es TRUE el tamaño de los símbolos es proporcional a la
suma de las tres variables: prop_size = FALSE.
ƒ newpage: si es FALSE no se crea un nuevo gráfico y, por tanto, se
añaden los símbolos al anterior gráfico ya creado: newpage = TRUE.

II.13. Gráficos de contornos y superficies

Los gráficos de contornos son fáciles de realizar en R si disponemos de los


datos adecuados. Hay varias funciones en el paquete “graphics” como
«image()», «contour()» y «filled.contour()» que nos permiten realizar este
tipo de gráficos. La función «contour()» permite hacer mapas topográficos. En
el archivo Batimetría.csv hay datos de profundidades y de alturas de islas en
una zona del océano donde hay fosas abisales, que fueron obtenidos de la página
web http://rda.ucar.edu/datasets/ds759.2/. Las instrucciones están en el archivo
II.25.R. Se utiliza la función de interpolación «interp()», presente en el pa-
quete “akima” (Akima, 1978: Akima, 1996; Akima y col., 2012), por lo que es
necesario instalarlo. El argumento «type="n"» indica que no se represente
ningún marcador en el eje. El argumento «pty="m"» indica que la región del
gráfico sea la máxima posible cuando se amplía la pantalla, como se muestra en
el gráfico. El argumento «fg="blue"» modifica el color del marco, líneas y texto
del gráfico.

¾ require(akima)
¾ par(fg=”blue”)
¾ Datos<-read.csv2("Batimetría.csv", header=TRUE, encoding="latin1")
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
84

¾ attach(Datos)
¾ input<-interp(Datos$Longitud, Datos$Latitud, Datos$Profundidad)
¾ par(pty = "m",fg="blue")
¾ plot(x = 0, y = 0,type = "n", xlim = c(130,150), ylim = c(33,35), xlab =
"Longitud", ylab = "Latitud", cex.lab=1.7, font.lab = 2, cex.axis = 1.6)
¾ contour(input, lty = "solid", add = TRUE, vfont = c("sans serif", "plain"),
labcex=1.2)
¾ title("Batimetría y Altimetría entre 33º N a 35ºN y 130ºE a 150ºE", font = 2,
cex.main=2)
Batimetría y Altimetría entre 33º N a 35ºN y 130ºE a 150ºE
35.0
34.5
Latitud
34.0
33.5
33.0

130 135 140 145 150


Longitud

Si se realiza un pequeño cambio y se especifica «pty= "s"», la región del


gráfico es cuadrada, como se muestra a continuación, y no se hace rectangular
cuando se amplía la ventana, como en el caso anterior. Si además se pone
«fg="black"», se observa como ahora el gráfico es en negro en vez de azul.
GRÁFICOS BÁSICOS
85

Función contour (paquete graphics)

ƒ x, y, z: x e y son las coordenadas, y z la variable a representar.


ƒ nlevels: si levels es NULL define el número de líneas de contorno:
nlevels = 10.
ƒ levels: vector numérico con los niveles de los contornos que se
representan. Por ejemplo, levels=c(20,300) solamente representa los
niveles 20 y 300: levels = pretty(zlim, nlevels).
ƒ labels: etiqueta de las líneas de contorno: labels = NULL.
ƒ zlim: como xlim e ylim especifica los límites de la variable z.
ƒ labcex: tamaño de la letra de las etiquetas de las líneas de contorno:
labcex = 0.6.
ƒ drawlabels: si es FALSE no se ponen las etiquetas de los contornos:
drawlabels = TRUE.
ƒ method: se especifica donde se colocan las etiquetas de los contor-
nos: "simple", "edge" o "flattest": method = "flattest".
ƒ vfont: vector con dos términos: tipo y estilo de letra.
ƒ axes: si es TRUE se pintan todos los ejes: axes = TRUE.

Se pueden usar todos los argumentos generales.

Veamos otro ejemplo con «filled.contour()». Las instrucciones están en el


archivo II.26.R. En el archivo Riqueza.csv hay datos de número de especies
para diferentes latitudes y longitudes. Para este tipo de funciones, primero te-
nemos que crear un objeto dividido en niveles con un intervalo regular, y con
valores crecientes de las variables x e y. Si no disponemos de esos datos, como
es nuestro caso, debemos generarlos. Para eso nos sirve la función «interp()»,
presente en el paquete “akima” (Akima, 1978: Akima, 1996; Akima y col.,
2012). Una vez que poseemos este objeto, es muy sencillo el uso de la función
gráfica «filled.contour()» o similares. Sólo es importante tener en cuenta que
la instrucción «interp()» no admite celdas vacías. Para poder ver los valores
bajos del eje z, a veces es conveniente poner valores cero de z. Una escala de
grises se puede ver con el argumento «col=grey.colors(33, start=1, end=0,
gamma=1)». Con el argumento «plot.axes» se especifican los intervalos de los
ejes. Con «axis» se especifica el intervalo y el número de marcas en cada uno
de los ejes. Con «key.title» se indica el título del gráfico. Por último, con
«key.axes» se especifica el rango e intervalos de la barra de colores de la le-
yenda.

¾ require(akima)
¾ datos<-read.csv2("Riqueza.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ input<-interp(Longitud.Oeste, Latitud.Sur,Riqueza.especies, duplicate=
"mean")
¾ filled.contour(input,xlab="Longitud", ylab="Latitud", main="Riqueza de
especies",font.lab=2, plot.axes = {
axis(1, seq(50, 70, by = 5))
axis(2, seq(0, 20, by = 2))}, key.title = title(main= "Número\nespecies",
cex.main=1.1), key.axes = axis(4, seq(0, 35, by = 5)))
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
86

Número
Riqueza de especies
especies

18 35

16
30

14

25
12
Latitud

10
20

15
6

4 10

2
5

50 55 60 65

Longitud

Función filled.contour (paquete graphics)

ƒ x, y, z: x e y son las coordenadas, y z la variable a representar.


ƒ zlim: como xlim e ylim especifica los límites de la variable z.
ƒ levels: vector numérico con los niveles de los contornos que se
representan. Por ejemplo, levels=c(20,300) solamente representa los
niveles 20 y 300.
ƒ nlevels: si levels es NULL especifica el número de líneas de contorno:
nlevels = 20.
ƒ labels: etiqueta de las líneas de contorno.
ƒ color.palette: función con los colores del gráfico.
ƒ plot.axes: define los intervalos de los ejes.
ƒ key.title: título de la leyenda del gradiente de colores.
ƒ key.axes: permite modificar los intervalos y límites del gradiente de
colores.
ƒ frame.plot: si es TRUE se pinta un marco: frame.plot = axes.

Se pueden usar todos los argumentos generales.


GRÁFICOS BÁSICOS
87

II.14. Gráficos tridimensionales

Otra función gráfica interesante es «persp()», la cual permite realizar gráfi-


cos en tres dimensiones. Las instrucciones para este ejemplo están en el archivo
II.27.R. Los datos que se utilizan, que están en el archivo Altimetría1.csv, son
de altimetría y batimetría; desde el Golfo de Omán hasta la estepa Siberiana, en
concreto para una latitud desde 23º10´N hasta 61º5´N y una longitud desde
61ºE hasta 117º30´E. Cada celda son 5 segundos.
Con la función «windows()» se especifica que se cree una nueva ventana
con un tamaño específico de alto y ancho, para así poder ver el gráfico más
grande. Después de leer los datos, la instrucción «as.matrix» los convierte en
una matriz. Como el archivo solo tiene datos de altura y profundidad (coorde-
nada z), es necesario definir las coordenadas x (latitud) e y (longitud). Se multi-
plica por 100 para que el espacio sea mayor entre coordenadas y quede más
claro el gráfico. La instrucción «scale=FALSE» hace que tengan el mismo ta-
maño los ejes z, x e y, lo cual permite que se mantenga la proporción entre los
ejes. La instrucción «box=TRUE» representa un marco. Las flechas en cada eje
representan el orden de los datos en el archivo. La latitud en el archivo va desde
61º5´N (primera fila) a 23º10´N (última fila) y, por tanto, la flecha nos indica de
mayor a menor latitud. La longitud en el archivo va desde entre 61ºE (primera
columna) a 117º30´E (última columna) y, por tanto, la flecha nos indica de me-
nor a mayor longitud.

¾ Datos<-read.csv2("Altimetría1.csv", header=TRUE, encoding="latin1")


¾ windows(w=15.5,h=9.5)
¾ z<-as.matrix(Datos)
¾ x <- 100 * (1:nrow(z))
¾ y <- 100 * (1:ncol(z))
¾ persp(x, y, z, theta = 120, phi = 20, scale = FALSE, box=TRUE, zlab=
"Metros", xlab="Latitud", ylab="Longitud", cex.lab=2)
¾ title("Latitud 23º25´N a 61º5´N y Longitud 61ºE a 117º30´E", font=2,
cex.main = 2)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
88

En el siguiente gráfico, pequeñas modificaciones pueden dar lugar a cambios


importantes en el formato. Con la instrucción «phi» se puede cambiar el ángulo
de visión. La instrucción «theta» permite cambiar la orientación del gráfico; se
observa como ahora se ve de frente la latitud, e incluso se puede observar la
zona del Golfo de Omán donde hay profundidades superiores a 2.000 metros.
El argumento «border=NA» elimina el borde, dándole ese aspecto más uni-
forme. La instrucción «shade» permite dar sombras. Los valores de sombra cer-
canos a 1 producen sombreados similares a un modelo de fuente de luz puntual y
valores cercanos a 0 no producen sombra. Valores en el rango de 0,5 a 0,75
proporcionan una aproximación a la iluminación diurna. Por último, la instrucción
«ticktype="detailed"» pone intervalos en los ejes del gráfico con sus co-
rrespondientes valores.
Es necesario recordar que los valores de latitud y longitud van en una escala
que no es la real, ya que simplemente muestran el número de fila y columna de
cada celda en la matriz de datos, multiplicado por 100. En el siguiente ejemplo
veremos como realizar gráficos con coordenadas reales.

¾ windows(w=15.5, h=9.5)
¾ persp(x, y, z, theta = 20, phi = 20, scale = FALSE, zlab="Metros", xlab=
"Latitud", ylab="Longitud", cex.lab=2, box=TRUE, border=NA, shade= 0.5,
ticktype="detailed")
¾ title("Latitud 23º15´N a 61º5´N y Longitud 61ºE a 117º30´E", font = 2,
cex.main = 2)
GRÁFICOS BÁSICOS
89

Función persp (paquete graphics)

ƒ x, y, z: x e y son las coordenadas, y z la variable a representar.


ƒ nlevels: si levels es NULL especifica el número de líneas de contorno.
ƒ zlim: como xlim e ylim especifica los límites de la variable z.
ƒ theta: ángulo de orientación del gráfico: theta = 0.
ƒ phi: ángulo de visión: phi = 15.
ƒ r: distancia desde el punto de visión al centro del gráfico. Da una idea
de profundidad: r = sqrt(3).
ƒ d: valores menores que 1 aumentan la perspectiva y mayores que 1
la disminuyen: d = 1.
ƒ scale: si es FALSE hace que se mantengan las proporciones entre los
ejes: scale = TRUE.
ƒ expand: factor de expansión del eje z: expand = 1.
ƒ ltheta y lphi: orientación y ángulo de visión del sombreado: ltheta =
-135 y lphi = 0.
ƒ shade: permite dar sombras: shade = NA.
ƒ box: si es TRUE se pinta un marco: box =TRUE.
ƒ nticks: número de marcas en los ejes. No funciona si
ticktype=”simple”: nticks = 5.
ƒ ticktype: "simple" dibuja una flecha en la dirección de crecimiento de
la variable y "detailed" marcas normales: ticktype = "simple".

Se pueden usar todos los argumentos generales.

En el gráfico 3 se utiliza la función «wireframe()» del paquete “lattice”


(Sarkar, 2008; 2012). Se usa un área más restringida, en concreto de 23ºN a
26ºN de latitud y una longitud de 70ºE a 85ºE, cuyos datos están en el archivo
Altimetría2.csv. Con los argumentos «shade» y «light.source» se hace el
efecto de sombreado de colores. Como el rango de longitud es 5 veces mayor
que el de latitud, con «aspect» se hace que el eje de la longitud sea 5 veces
superior al eje de la latitud. Las modificaciones en las leyendas de los ejes se
deben introducir para cada eje por separado en una lista. Por ejemplo, en el caso
del eje z se especifica que «rot=90», con lo cual se le da una rotación de 90º a
la leyenda de ese eje. Las etiquetas y formato de las marcas de los ejes se deben
introducir en el argumento «scales» y también dentro de una lista, pudiéndose
hacer especificaciones para cada eje. Por ejemplo, para el eje z se especifica que
no se pinten las flechas «arrows=FALSE». Con «ltext» es posible introducir
textos.

¾ library(lattice)
¾ Datos<-read.csv2("Altimetría2.csv", header=TRUE, encoding="latin1")
¾ z<-as.matrix(Datos)
¾ wireframe(z, shade = TRUE, aspect = c(1.5,1,0.3), light.source = c(10,0,10),
zlab=list("Metros",cex=1.2,font=2,rot=90), xlab=list("Latitud", cex=1.2,
font=2), ylab=list("Longitud",cex=1.2,font=2), scales=list (z=list (arrows=
FALSE)), page = function(...) {
ltext(x = 0.47, y = 0.15,labels = "70ºE",cex = 1.2,font=2)
ltext(x = 0.15, y = 0.40,labels = "85ºE",cex = 1.2,font=2)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
90

ltext(x = 0.57, y = 0.15,labels = "23ºN",cex = 1.2,font=2)


ltext(x = 0.85, y = 0.29,labels = "26ºN",cex = 1.2,font=2)
})

1000

800
Metros

600

400

200

0
85ºE

26ºN
Longitud

70ºE 23ºN Latitud

Función wireframe (paquete lattice)

ƒ x: matriz con los datos a representar.


ƒ data: opcionalmente se puede especificar la matriz con los datos.
ƒ zlab: título del eje z con el mismo formato que xlab e ylab.
ƒ aspect: especifica la proporción que tienen los ejes z, x e y entre
ellos.
ƒ zlim: como xlim e ylim especifica los límites de la variable z.
ƒ row.values y column.values: vectores opcionales que permiten
definir la trama del gráfico, donde x es la matriz. Tanto row.values
como column.values deben tener la misma longitud que el número de
filas y columnas de la matriz x, respectivamente.

Permite el uso de otros argumentos del paquete “lattice” como:


allow.multiple, outer, auto.key, prepanel, strip, groups, xlab, xlim, ylab,
ylim, drop.unused.levels, lattice.options, scales, etc., los cuales se descri-
bieron en el cuadro de la función bwplot().
GRÁFICOS BÁSICOS
91

Como se mencionó anteriormente, también es posible realizar este tipo de re-


presentaciones con matrices que tengan las tres coordenadas z, x e y. Por ejem-
plo, usando los mismos datos del archivo Batimetría.csv y con las instrucciones
que están en el archivo II.28.R, se obtiene el gráfico que se muestra a conti-
nuación. En este caso se usa «scale=TRUE» y, por tanto, se le da el mismo
tamaño a los tres ejes, es decir, no se permite que los ejes tengan el tamaño en
función de su rango de valores. Debido a que uno de los ejes (al-
tura/profundidad, eje z) tiene un rango mucho mayor que los otros dos, no es
conveniente usar la opción «scale=FALSE». El argumento «family="serif"»
define el tipo de letra del gráfico.

¾ require(akima)
¾ par(family="serif")
¾ Datos<-read.csv2("Batimetría.csv", header=TRUE, encoding="latin1")
¾ attach(Datos)
¾ windows(w=11,h=9)
¾ input<-interp(Datos$Longitud, Datos$Latitud, Datos$Profundidad)
¾ persp(input, theta = 20, phi = 20, scale = TRUE, family="sans", zlab =
"Metros", xlab = "Latitud", ylab="Longitud", cex.lab=2, box=TRUE,
border=NA, shade=0.5, ticktype="detailed")
¾ title("Batimetría y Altimetría entre 33ºN a 35ºN y 130ºE a 150ºE", font = 2,
cex.main=2)

Batimetría y Altimetría entre 33ºN a 35ºN y 130ºE a 150ºE

-2000
Metros

-4000

35.0
-6000
34.5
d
Longitu

34.0
-8000

130
135 33.5

140
Latit
ud 145
33.0
150

La función «persp()» también permite representar funciones tridimensiona-


les. En el archivo II.29.R están las instrucciones para representar diferentes
funciones gráficas. La instrucción «seq()» crea una secuencia, en este ejemplo
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
92

de -1 a 1 dividida en 50 intervalos. La instrucción «outer()» estima los valores


de la coordenada z usando la función que se especifique y en base a los valores x
e y definidos anteriormente. Con «fig=c(x1,x2,y1,y2)» se puede definir la
posición relativa en el panel de cada una de las gráficas, en una escala de 0 a 1.
Con «fin=c(ancho,alto)» también se podría definir la posición pero la unidades
serían en pulgadas.

¾ sx <- 50; sy <- 50


¾ x <- seq(-1, 1, length = sx); y <- seq(-1, 1, length = sy)
¾ z <- outer(x, y, function(x,y) x^2 + y^2 + 1)
¾ par(fig=c(0,0.6,0.4,1))
¾ persp(x, y, z, col = "green", theta = 120, cex.lab=2)
¾ z <- outer(x, y, function(x,y) x^2 - y^2)
¾ par(new=T,fig=c(0.4,1,0.4,1))
¾ persp(x, y, z, col = "blue", theta = 120, cex.lab=2)
¾ z <- outer(x, y, function(x,y) x^3 - y^2)
¾ par(new=T,fig=c(0,0.6,0,0.6))
¾ persp(x, y, z, col = "red", theta = 120, cex.lab=2)
¾ z <- outer(x, y, function(x,y) x^3 + y^3)
¾ par(new=T,fig=c(0.4,1,0,0.6))
¾ persp(x, y, z, col = "grey", theta = 120, cex.lab=2)
z

z
x

y y
z
z

y y

Por último, en el archivo II.30.R están las instrucciones para representar


gráficos tridimensionales con la función «cloud()» del paquete “lattice” (Sarkar,
2008; 2012). En este script también usaremos la función «grid_legend()» del
paquete “vcd” (Meyer y col., 2012), que permite poner leyendas de un modo
más fácil que los argumentos «key» y «auto.key» que usa la función «cloud()»
para leyendas. Los datos, que están en el archivo Aminoácidos.csv, correspon-
GRÁFICOS BÁSICOS
93

den al porcentaje de aminoácidos de varias especies de rotíferos que habitan el


parque Nacional de Doñana (España).
En «cloud()» se ponen las variables de los ejes z, x e y. Como se ha comen-
tado varias veces, en las funciones del paquete “lattice” (Sarkar, 2008; 2012) las
modificaciones de las leyendas de los ejes, títulos o subtítulos, deben incluirse
dentro del propio argumento por medio de una lista, como por ejemplo se
muestra en este caso para «zlab», «xlab» e «ylab». Es interesante mencionar
que para dar la vuelta a la numeración del eje y se ha especificado
«ylim=c(10,0)». Con «screen» se controla el ángulo de rotación de los ejes. Si
se quisiera poner características diferentes para cada uno de los ejes, de nuevo
sería en formato de lista para cada eje. El argumento «distance» permite definir
la distancia de las leyendas a los ejes.
En la función «grid_legend()» con el argumento «frame=FALSE» se indica
que no se pinte un marco en la leyenda y «vgap» define el espacio entre filas. El
tipo y tamaño de letra se modifica con el argumento «gp=gpar()».

¾ library(lattice)
¾ library(vcd)
¾ Datos<-read.csv2("Aminoácidos.csv", header=TRUE, encoding="latin1")
¾ attach(Datos)
¾ cloud(ASP ~ SER * GLU, data = Datos, cex = 1.2, pch=c(15,16,17),
col=c("green","blue","red"), groups = Especie, zlab=list("Aspartato (%)",
cex=1.2, font=2, rot=90), ylab=list("Glutámico (%)", cex=1.2, font=2, rot=-
50), xlab=list("Serina (%)",cex=1.2,font=2, rot=15),zlim=c(4,10),
xlim=c(10,18), ylim=c(10,0), screen = list(z = 20, x = -70, y = 10), scales =
list(arrows=FALSE,distance=0.8))
¾ grid_legend(0.82, 0.46, pch=c(15,16,17), col = c("green","blue","red"),
frame = FALSE, c("B. angularis", "B. calyciflorus", "B. plicatilis"), title =
"Rotíferos", hgap=10,vgap=0.5, gp=gpar(fontface=3, fontsize=12))

10

9
Aspartato (%)

6
Rotíferos
B. angularis
5
B. calyciflorus
B. plicatilis
4
0
2
G

4
lu

6 18
m

16
ic

8 14
o

)
(%

12
10 a (%
Serin
10
)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
94

Función cloud (paquete lattice)

ƒ x: matriz de datos o fórmula con el formato z ~ x * y.


ƒ data: datos que se van a usar con otras variables que se pueden
utilizar para definir grupos, hacer selecciones con subset, etc.
ƒ at: rango para la barra de colores que se representa con drape.
ƒ drape: si es TRUE se representa una barra con la escala de colores:
drape = FALSE.
ƒ pretty: si es TRUE se calculan automáticamente los puntos de corte
de la barra de colores: pretty = FALSE.
ƒ arrows: si es TRUE los ejes se ponen como flechas: arrows = TRUE.
ƒ colorkey: permite poner una barra continua o una lista de colores.
ƒ col.regions: vector de colores de la barra que se crea si
drape=TRUE.
ƒ alpha.regions: valor numérico en un rango de 0 a 1 con el grado de
transparencia de los colores de la barra que se crea si drape=TRUE.

Los otros argumentos: allow.multiple, aspect, outer, auto.key, prepanel,


etc., son comunes a la mayoría de las funciones del paquete “lattice” y se
explicaron en los cuadros de la funciones bwplot() y/o wireframe().

Función grid_legend (paquete vcd)

ƒ x e y: posición de la leyenda.
ƒ hgap: espacio horizontal entre símbolos y etiquetas: hgap =
unit(0.5, "lines").
ƒ vgap: espacio vertical entre símbolos y etiquetas: vgap = unit(0.3,
"lines").
ƒ default_units: término que indica las unidades de la leyenda:
default_units = "lines".
ƒ gp: objeto de la clase gpar() para modificar el tipo y estilo del texto
en la leyenda.
ƒ draw: si es FALSE no se muestra la leyenda: draw = TRUE.

II.15. Configuración de márgenes y ejes adicionales

En el ejemplo se usarán series temporales para mostrar como se pueden in-


cluir varios ejes y en el gráfico para representar variables cuyas escalas son muy
diferentes. Las instrucciones están en el archivo II.31.R. Se trata de una serie
temporal de medidas mensuales, de dos años de duración, realizadas en una
laguna. Las variables medidas son: eclosión promedio de larvas de mosquito por
metro cuadrado, materia orgánica particulada en mgl-1 y temperatura media del
agua en el momento del muestreo. Representaremos un eje y distinto para cada
variable. Los datos están en el archivo Mosquitos.csv.
En primer lugar debemos establecer un tamaño para los márgenes externos
con la instrucción «par(oma)» dejando espacio suficiente para todos los ejes,
especialmente del lado derecho. El argumento «par(mex)», al ser menor que 1,
permite que la figura se pueda pegar más a los bordes del marco. El argumento
GRÁFICOS BÁSICOS
95

«bg="grey98"» permite especificar el color de fondo del área donde se pondrán


los gráficos. Después creamos los sucesivos gráficos, con la particularidad de que
utilizamos el argumento «new=TRUE» antes de cada uno de los gráficos que
representarán cada variable en un eje distinto.
En la función «plot()» con el argumento «yaxs="i"», en vez del valor por
defecto «yaxs="r"», se define que se representen exactamente los límites del
eje y que se especifican en la función «ylim=c(0,65)» y que no se deje un mar-
gen mayor, es decir, en este caso que el valor 0 esté en el extremo inferior y el
valor 65 en el extremo superior del eje y. Se podría hacer lo mismo para el eje x
con el argumento «xaxs». La función «plot.default()», que tiene los mismos
argumentos que la función explicada anteriormente «plot()», permite usar el
argumento «ann=FALSE» que especifica que no se muestren las leyendas de los
ejes ni los títulos de estos nuevos gráficos. En los nuevos gráficos, indicamos que
el eje y no se represente «yaxt="n"». Ese eje lo dibujaremos después con la
función «axis()», indicando el margen (4 significa a la derecha). En el segundo
caso (eje para POM) indicaremos que el eje lo represente en el margen exterior
(argumento «outer=TRUE»), y en la línea 4. El argumento «adj» de la función
«title()» permite definir la alineación del texto (en este caso es 0,5, es decir,
centrado). También se añade una leyenda, en la cual indicamos que se ubique
arriba a la izquierda «topleft». Los argumentos en «pch», «lty» y «lwd» indican
el tipo de símbolos, el tipo de líneas y el grosor de las líneas, respectivamente,
de cada una de las tres variables. Con «rug()» se representa una línea vertical
roja que divide el estudio en dos periodos. Con «box(which="outer")» se pinta
un marco exterior. Al final los argumentos de lectura «cra» y «din» informan
sobre el tamaño del área donde se muestran los gráficos en píxeles y en pulga-
das, respectivamente.

¾ datos<-read.csv2("Mosquitos.csv", header=TRUE, encoding="latin1")


¾ attach(datos)
¾ par(oma=c(1,1,1,9), bg="grey98")
¾ par(mex = 0.6)
¾ plot(Mes,Mosquitos, type="b", lty=1, lwd=2, ylim=c(0,65), font.lab=2,
yaxs="i")
¾ par(new=TRUE)
¾ plot.default(Mes,Temp,ylim=c(0,30), ann=FALSE ,yaxt="n",type="l",lty=1,
yaxs="i")
¾ axis(4)
¾ mtext("Temperatura",4,line=3,font=2)
¾ par(new=TRUE)
¾ plot.default(Mes, POM, ylim=c(0,6), ann=FALSE, yaxt="n", type="l",
lty=3, lwd = 2, yaxs="i")
¾ axis(4,line=4,outer=TRUE)
¾ mtext("POM",4,line=9,font=2)
¾ title("Eclosión de larvas de mosquito", cex=2, font=2, adj=0.5)
¾ legend("topleft", c("Mosquitos", "Temperatura", "POM"), bty="n", pch =
c(21,NA,NA), lty=c(1,1,3), lwd=c(2,1,2))
¾ rug(12,5,ticksize=1,side=3, lwd=3, col="red")
¾ box(which=”outer”)
¾ par("cra","din")
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
96

Eclosión de larvas de mosquito

30

6
Mosquitos
Temperatura
60 POM

25

5
50

20

4
40

Temperatura
Mosquitos

POM
15

3
30

10

2
20

1
10
0

0
5 10 15 20
Mes

II.16. Formas especiales

Otro aspecto interesante relativo al formato de los gráficos es la posibilidad de


añadir elementos como polígonos y flechas, o texto en los márgenes. Para esto,
utilizaremos como ejemplo un plano en el que se muestran las isoclinas de un
modelo de competencia interespecífica de Lotka–Volterra. Las instrucciones están
en el archivo II.32.R.
En primer lugar crearemos un panel gráfico con los márgenes externos un
poco mayores de lo habitual, para dejar sitio al texto marginal. Para esto utiliza-
mos la función «par()», que permite ajustar parámetros gráficos, y modificamos
el argumento «oma», que indica los valores de cada margen mediante un vec-
tor. Después creamos un gráfico usando la función «plot()», etiquetando los
ejes en blanco. Además, no queremos que se representen los valores de las
coordenadas en los ejes y, para ello, utilizamos los argumentos «xaxt» y «yaxt»
con valor «"n"».

¾ par(oma=c(3,3,3,3))
¾ plot(0,0,xlim=c(0,1),ylim=c(0,1),xlab="",ylab="",xaxt="n",yaxt="n",type=
"n",main="Isoclinas de crecimiento 0",font.main=2)
Ahora, mediante la función «mtext()» añadiremos texto a los márgenes.
Dentro del paréntesis indicamos, en primer lugar, el texto que deseamos escribir.
En este caso se trata de texto con expresiones matemáticas. Ya hemos visto
anteriormente un ejemplo similar. Además indicamos el margen en el que de-
seamos escribir el texto (1 indica inferior, 2 indica izquierdo), la línea (contando
GRÁFICOS BÁSICOS
97

desde el recuadro del gráfico) en la que se desea añadir el texto, y con el argu-
mento «at», la coordenada del gráfico a la altura de la cual queremos escribir el
texto. Para localizar las coordenadas más adecuadas, resulta útil la función
«locator()», que ya hemos visto, y que nos proporciona las coordenadas de
cualquier punto que marquemos en el gráfico. El argumento «las», por último,
indica mediante un código la orientación del texto que escribiremos.

¾ mtext(expression(K[1]),2,1,at=0.76,las=1)
¾ mtext(expression(frac(K[2],alpha[12])),2,1,at=0.53,las=1)
¾ mtext(expression(K[2]),1,1,at=0.78,las=1)
¾ mtext(expression(frac(K[1],alpha[21])),1,2,at=0.5,las=1)
¾ mtext(expression(N[1]),2,1,at=1,las=1)
¾ mtext(expression(N[2]),1,1,at=1,las=1)

A continuación nos interesa pintar en diferentes colores las distintas regiones


del gráfico delimitadas por estas isoclinas. Para esto podemos utilizar la función
«polygon()», que nos permite dibujar un polígono y colorearlo o rellenarlo con
diferentes tramas. Dibujaremos un polígono para cada región. A esta función es
necesario indicarle las coordenadas de cada vértice, lo cual se puede hacer de
diferente forma según el caso. Aquí, para definir bien los límites de cada polí-
gono, cuando estos estén definidos por las líneas de las isoclinas, es bueno mar-
car con «locator()» encima de las isoclinas. Cuando dibujemos el polígono éstas
desaparecerán, ocultas por el límite del polígono. Luego se pueden volver a di-
bujar y los polígonos quedarán perfectamente delimitados, sin espacios en
blanco. Además de las coordenadas, la función «polygon()» tiene más argu-
mentos: en este caso definimos diferentes colores de relleno, sin trama, y no
queremos dibujar bordes.

¾ polygon(x=c(-0.038,-0.038,1.039,1.039,0.78,0.255),y=c(0.753,1.038,1.038,
-0.039,-0.039,0.325),col="gray88",border=NA)
¾ polygon(x=c(-0.038,-0.038,0.255),y=c(0.525,0.751,0.325),col="gray77",
border=NA)
¾ polygon(x=c(0.255,0.78,0.494),y=c(0.325,-0.039,-0.039),col="gray77",
border=NA)
¾ polygon(x=c(-0.038,-0.038,0.255,0.494),y=c(-0.039,0.525,0.325,-0.039),
col="gray66",border=NA)

Se representan las isoclinas de crecimiento 0, que definen las regiones del


plano en las cuales se observa coexistencia, o dominancia de una u otra especie.

¾ abline(0.5,-0.7); abline(0.7,-1.5)
Nos interesa dibujar flechas que indiquen la dirección de la resultante a la que
tienden las densidades de población en cada región. En este caso todas tienden,
si están más o menos centradas, al punto de equilibrio estable definido por el
cruce de ambas isoclinas. Las flechas se dibujan con la función «arrows()», a la
que debemos indicar las coordenadas de inicio y de fin. Además le indicamos el
tamaño de la punta de la flecha, y también un grosor de línea determinado.

¾ arrows(0.04,0.08,x1=0.15,y1=0.2,length=0.1,lwd=3)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
98

¾ arrows(-0.009,0.6,x1=0.075,y1=0.51,length=0.1,lwd=3)
¾ arrows(0.57,0.015,x1=0.48,y1=0.1,length=0.1,lwd=3)
¾ arrows(0.53,0.63,x1=0.4,y1=0.48,length=0.1,lwd=3)

Con la función «arctext()» del paquete “plotrix” (Lemon, 2012) se puede es-
cribir el texto en curva. El argumento «center» especifica las coordenadas x e y
que se tomarán como centro del texto. Con «radius» se especifica el radio de la
circunferencia. El argumento «start» define donde se comienza a escribir en
radianes. Con «stretch» se define el espacio entre letras en el texto y con
«middle» la posición del centro del texto en radianes.

¾ library(plotrix)
¾ arctext("Punto de equilibrio",center=c(0.26,0.32), radius=0.075, start=pi/2,
stretch=1.25, middle=pi/2, cex=1)

También es posible hacer flechas en círculos con la función «selfarrow()» del


paquete “diagram” (Soetaert, 2012). Hay que especificar las coordenadas de
origen con «pos». Con «path» se define la posición del círculo: «R» (derecha),
«L» (izquierda), «U» (arriba) y «D» (abajo). Con «arr.pos» se especifica la posi-
ción relativa de la punta de la flecha (de 0 a 1) y con «arr.type» el tipo de punta
de flecha («simple», «triangle», «curved», «circle», «ellipse» o «T»). El argu-
mento «curve» define el tamaño relativo de la curva.

¾ library(diagram)
¾ selfarrow(c(0.14,0.32), path = "R", arr.pos = 0.2,lty= 1, lwd=5, lcol="red",
arr.col="blue", arr.type="curved", curve = c(0.12, 0.12),)

Isoclinas de crecimiento 0

N1

K1

K2
D 12
P un
i l ib rio

to d e

equ

K1
K2 N2
D 21
GRÁFICOS BÁSICOS
99

II.17. Gráficos combinados

En el archivo II.33.R están las instrucciones para ver un ejemplo de cómo


combinar diferentes tipos de gráficos. Los datos que se usarán, que están en el
archivo Población.csv, son la estructura de edad de la población española,
hombres y mujeres, de los años 1900 y 1991.
Después de importar los datos y cargarlos en la memoria, se asignan las va-
riables que queremos representar a los objetos «x» e «y»; en este caso se utili-
zan los datos del año 1900. Se calculan los máximos y mínimos para saber los
límites de los ejes en los gráficos.
A continuación, con la instrucción «matrix()», se crea un matriz de 2x2 con
las posiciones donde se colocarán las figuras conforme se vayan creando.
Con «layout()» se divide la pantalla en el número de columnas y filas que
deseamos y el valor z nos indica la posición de cada una de las figuras.
Con «par(mar)» se definen los márgenes de cada uno de los gráficos. Si en
vez de líneas se quiere dar los márgenes en pulgadas, se debe usar «par(mai)».
En primer lugar se crea un gráfico de dispersión que representa el número de
mujeres frente al número de hombres, para cada clase de edad.
Posteriormente se crean dos gráficos de barras con la función «barplot()».
Dentro de esta función el argumento «names.arg» permite identificar la variable
que se usará para las etiquetas que se ponen en la base de las barras, con
«las=2» se especifica que se pongan en posición vertical y con «axes=TRUE»
que se dibujen los ejes. En el último gráfico, que representa la estructura de
edad de los hombres, se indica con «horiz=TRUE» que las barras son horizon-
tales y no verticales.

¾ Datos<-read.csv2("Población.csv", header=TRUE, encoding="latin1")


¾ attach(Datos)
¾ x<-M.1900
¾ y<-H.1900
¾ maxx<-max(x)
¾ maxy<-max(y)
¾ z<-matrix(c(2,0,1,3),2,2,byrow=TRUE)
¾ z
¾ layout(z,widths=c(3,1), heights=c(1,3), respect=TRUE)
¾ par(mar=c(5,5,1,1))
¾ plot(x, y, xlim = c(0,maxx), ylim = c(0,maxy), xlab= "Nº mujeres", ylab=
"Nº > hombres", cex.lab=1.5, pch=15)
¾ text(200000,1e6,"1900", cex=2, font=2)
¾ par(mar=c(3,5,1,1))
¾ barplot(x, ylim = c(0,maxx), axes= TRUE, names.arg = Edad, las=2)
¾ par(mar=c(5,3,1,1))
¾ barplot(y,xlim=c(0,maxy),axes=TRUE,names.arg=Edad,horiz=TRUE,las=2)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
100

1e+06
8e+05
6e+05
4e+05
2e+05
0e+00
<5
5a9
10 a 14
15 a 19
20 a 24
25 a 29
30 a 34
35 a 39
40 a 44
45 a 49
50 a 54
55 a 59
60 a 64
65 a 69
70 a 74
75 a 79
80 a 84
> 85
1900 > 85
1e+06

80 a 84
75 a 79
70 a 74
8e+05

65 a 69
60 a 64
55 a 59
Nº hombres

50 a 54
6e+05

45 a 49
40 a 44
35 a 39
4e+05

30 a 34
25 a 29
20 a 24
2e+05

15 a 19
10 a 14
5a9
0e+00

<5
0e+00
2e+05
4e+05
6e+05
8e+05
1e+06
0e+00 2e+05 4e+05 6e+05 8e+05 1e+06

Nº mujeres

II.18. Gráficos dentro de gráficos

Con las instrucciones «par(new=T,omd=c(x1,x2,y1,y2))» es posible insertar


fácilmente gráficos dentro de otros gráficos. Los valores x1, x2, y1 e y2 solo pue-
den ser entre 0 y 1, e indican la posición relativa de la figura dentro del panel. El
argumento «par(omi=c(x1,x2, y1,y2))» indica lo mismo pero en pulgadas. Por
ejemplo, usando de nuevo los datos de la longitud estándar y base de la aleta
dorsal de varias especies de peces de la familia Carangidae, que están en el ar-
chivo Carangidae.csv, con las instrucciones del script II.34.R, se representa la
relación entre dos variables y luego se inserta un histograma de cada una para
averiguar si la distribución es Normal.

¾ Datos<-read.csv2("Carangidae.csv", header=TRUE, encoding="latin1")


¾ attach(Datos)
¾ plot(Longitud, Dorsal, xlim=c(0,700), ylim=c(0,400), xlab="Longitud
estándar (mm)", cex.lab=1.6, font.lab=2, ylab="Base aleta dorsal (mm)",
main="Especies de la familia Carangidae",cex.main=2.0, font.main=2)
¾ par(new=T, omd=c(0,0.6,0.55,1))
GRÁFICOS BÁSICOS
101

¾ hist(Dorsal, breaks = length(Longitud), main="", xlim=c(0,400), xlab="",


ylab="", cex.lab=1, font.lab =1,freq=FALSE, yaxt="n")
¾ lines(density(Dorsal,na.rm=TRUE),lwd=2,col="red")
¾ mtext("Base aleta dorsal (cm)",1,line=2,font=2)
¾ par(new=T, omd=c(0.39,0.99,0.1,0.55))
¾ hist(Longitud, breaks=length(Longitud), main="", xlim=c(0,800), xlab="",
ylab= "", cex.lab=1,font.lab =1,freq=FALSE, yaxt="n")
¾ lines(density(Longitud,na.rm=TRUE),lwd=2,col="red")
¾ mtext("Longitud estándar (cm)",1,line=2,font=2)

Especies de la familia Carangidae


400
Base aleta dorsal (mm)
300

0 100 200 300 400


Base aleta dorsal (cm)
200
100

0 200 400 600 800


Longitud estándar (cm)
0

0 100 200 300 400 500 600 700

Longitud estándar (mm)


Otra opción específica para insertar gráficos dentro de otros gráficos es la
función «subplot()» del paquete “Hmisc” (Harrell, 2012). Las instrucciones
están en el script II.35.R y los datos, que están en el archivo Tempera-
tura.csv, corresponden a datos de temperatura en un lago tomados cada media
hora durante varios meses.
En la primera parte del script, con la función «aggregate()» se obtienen los
valores medios de la temperatura para cada día. Posteriormente, con la función
«order()» se ordenan los datos por fechas y con «format="%d/%m/%Y"»
se especifica el formato de fecha que hay en la matriz de datos. A la matriz
creada se le añaden las etiquetas de las columnas con «colnames()» y luego se
elimina la primera columna que se crea automáticamente con la instrucción
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
102

«rownames(datos2)<-NULL», quedando la matriz de datos como se muestra a


continuación.

¾ library(Hmisc)
¾ datos<-read.csv2("Temperatura.csv", header=TRUE, encoding="latin1")
¾ datos<-na.exclude(datos)
¾ attach(datos)
¾ datos1<-aggregate(datos[ , c("Temperatura")], na.rm=TRUE, by=
list(Fecha=Fecha), mean)
¾ datos2<-datos1[order(as.Date(datos1$Fecha, format = "%d/%m/%Y")),]
¾ colnames(datos2)<-c("Fecha","Temperatura")
¾ rownames(datos2)<-NULL
¾ datos2

En la siguiente parte del script se genera el gráfico principal donde se repre-


senta solamente la temperatura media diaria del archivo «datos2» creado ante-
riormente, sin especificar el eje x. El argumento «xaxt="n"» indica que no se
representen los intervalos del eje x. Con la función «axis()» añadimos un eje x,
indicado por el valor 1, y con «seq(0, 50, by=10)» se define que las marcas en
el eje x sean de 0 a 50 a intervalos de 10 días. Con «labels» se especifican los
nombres de las etiquetas de las marcas.

¾ windows(11,7)
¾ plot(datos2$Temperatura, type="b", pch=16, col="blue", cex=1.5, xaxt="n",
cex.main=1.6, xlab="Días",cex.lab=2, cex.axis=1.5, ylab="", main=
"Temperatura media diaria en el lago Yahuarkaka (Leticia, Amazonas)")
¾ mtext("Temperatura",2, line=2.5,cex=2)
¾ axis(1, at=seq(0,50,by=10), labels=c("19/3/2006", "29/3/2006", "8/4/2006",
"18/4/2006", "28/4/2006", "8/5/2006"), cex.axis=1.5)

Finalmente, se generan 3 gráficos con la función «subplot()», cada uno de


los cuales representa el ciclo diario de temperatura en diferentes días. Para ello
se selecciona previamente el día y luego dentro de la función «subplot()» se
genera cada uno de los gráficos con «plot()». Dentro de «subplot()» se especi-
fican las coordenadas donde se ubica el gráfico interno con «x» e «y». Con
«size» se indica el tamaño del gráfico interior y los argumentos «vadj» y
«hadj» permiten definir el ajuste vertical y horizontal del gráfico, respectiva-
mente. Un valor 0 significa que se ajusta a la izquierda y 1 a la derecha en
«hadj». El valor 0 significa abajo y 1 arriba en el caso de «vadj». Por tanto, un
valor de 0,5 es centrado en ambos casos.
GRÁFICOS BÁSICOS
103

¾ G1<-datos[Fecha=="29/03/2006",]
¾ subplot(plot(G1$Hora,G1$Temperatura,type="b",pch=17, col="red", cex=1,
ylab="", xlab="",bty="l",cex.axis=1,xaxp=c(0,30,5)), x=10, y=27.35,
size=c(1.5,1.5), vadj=0.5, hadj=0.5)
¾ text(10, 26.55, "Hora del día")
¾ text(2.4, 27.3, "Temperatura",srt=90)
¾ G2<-datos[Fecha=="25/04/2006",]
¾ subplot(plot(G2$Hora,G2$Temperatura,type="b",pch=17, col="red", cex=1,
ylab="", xlab="",bty="l",cex.axis=1,xaxp=c(0,30,5)), x=37, y=28.9,
size=c(1.5,1.5), vadj=0.5, hadj=0.5)
¾ text(37, 28.1, "Hora del día")
¾ text(29.4, 28.85, "Temperatura",srt=90)
¾ G3<-datos[Fecha=="09/05/2006",]
¾ subplot(plot(G3$Hora,G3$Temperatura,type="b",pch=17, col="red", cex=1,
ylab="", xlab="", bty="l", cex.axis=1,xaxp=c(0,30,5)), x=51, y=28,
size=c(1.5,1.5), vadj=0.5, hadj=0.5)
¾ text(51, 27.2, "Hora del día")
¾ text(43.4, 27.95," Temperatura",srt=90)

Temperatura media diaria en el lago Yahuarkaka (Leticia, Amazonas)


27.2 27.6 28.0
29.0

Temperatura
28.5
Temperatura

26.2 26.6 27.0

0 6 12 18
Temperatura
28.0

Hora del día


30.5
27.5

Temperatura
29.5

0 6 12 18
Hora del día
27.0

28.5

0 6 12 18
26.5

Hora del día

19/3/2006 29/3/2006 8/4/2006 18/4/2006 28/4/2006 8/5/2006


Días

II.19. Ampliación de un área dentro de un gráfico

La función «zoomInPlot()» del paquete “plotrix” (Lemon, 2012) permite


ampliar un rango de valores dentro de un gráfico. Como ejemplo usaremos los
datos, que están en el archivo Clima.csv, de temperatura del agua y del aire, y
la intensidad del viento de este a oeste (Viento.X) y de sur a norte (Viento.Y) a
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
104

42º norte y 10º oeste, desde 1925 hasta 1997. Las instrucciones están en el
script II.36.R.
Después de cargar el paquete e importar los datos, con la función
«zoomInPlot()» se representa la relación entre las temperaturas del agua y del
aire. Los argumentos «rxlim» y «rylim» definen el rango de datos que se am-
plia, en este ejemplo de 12 a 14 ºC. Con «xend» se define donde finalizan las
proyecciones que señalan el comienzo del gráfico ampliado. Si se pone
«xend=NA» las proyecciones finalizan justo donde comienza el eje x del gráfico
ampliado. Con los argumentos «zoomtitle» y «titlepos» se especifica el título y
su posición en el panel gráfico, respectivamente.

¾ library(plotrix)
¾ datos<-read.csv2("Clima.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ zoomInPlot(Temperatura.agua,Temperatura.aire, xlim=c(10,20), ylim=c(10,
20), rxlim=c(12,14), rylim=c(12,14), xend=NA, xlab="Temperatura del
agua (ºC)", ylab="Temperatura del aire (ºC)", zoomtitle="Ampliación en el
rango de 12 a 14 ºC", titlepos=11.3, pch=2, col="blue")
Ampliación en el rango de 12 a 14 ºC
14.0
20
18

13.5
Temperatura del aire (ºC)

Temperatura del aire (ºC)


16

13.0
14

12.5
12

12.0
10

10 12 14 16 18 20 12.0 12.5 13.0 13.5 14.0

Temperatura del agua (ºC) Temperatura del agua (ºC)

II.20. Gráficos con intervalos en los ejes

Las funciones «gap.plot()», «gap.barplot()» y «gap.boxplot()» del pa-


quete “plotrix” (Lemon, 2012) permiten incluir saltos en la escala de los ejes de
los gráficos de puntos, de barras y de cajas, respectivamente. Las instrucciones
GRÁFICOS BÁSICOS
105

están en el script II.37.R y como ejemplo se usan datos de metales en sedi-


mentos a distintas profundidades del lago Yahuarkaka (Leticia, Colombia), que
están en el archivo Sedimentos.csv (Cotes, 2011).
El argumento «gap» permite incluir todos los intervalos que se deseen; en
este caso no se representan los valores en el eje y en los intervalos 51-99 y
151-199 cm de profundidad. Al ejecutar el script sale un mensaje de aviso de
que hay datos que no se representan debido a los intervalos que se han seleccio-
nado. Con «gap.axis» se define en que eje se realiza el intervalo. Con «bgcol»
y «breakcol» se definen los colores de relleno y del marco del intervalo,
respectivamente. Con «brw» se define el tamaño relativo del intervalo. Por
último, con «ytics» y «xtics» se especifica qué marcas de los ejes se muestran.

¾ library(plotrix)
¾ datos<-read.csv2("Sedimentos.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ gap.plot(Al,Profundidad, gap=c(51,99,151,199), gap.axis="y", type="b",
lty=2, pch=16, col="red", bgcol="blue", breakcol="white", brw=0.1,
xlab="Concentración del metal", ylab = "Profundidad (cm)", ytics=c(0,50,
150,250,300), xtics = c(0,20,40,60,80,100), xlim=c(0,100), cex.lab=1.7)
¾ gap.plot(Cr, Profundidad, gap=c(51,99,151,199), gap.axis="y", type="b",
lty=1, pch=17, col="green", bgcol="blue", breakcol="white", brw=0.1,
xlab="Concentración del metal", ylab = "Profundidad (cm)", ytics=c(0,50,
150,250,300),xtics=c(0,20,40,60,80,100),xlim=c(0,100),cex.lab=1.7, add=T)
¾ legend("topleft",c("Aluminio","Cromo"),pch=c(16,17),col=c("red","green"))

Aluminio
Cromo
300
Profundidad (cm)
250
150
50
0

0 20 40 60 80 100

Concentración del metal


GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
106

II.21. Paquetes que permiten realizar varios tipos


de gráficos básicos

Hay algunos paquetes en R que tienen un formato de ventanas, con diferen-


tes menús, que permiten realizar algunos de los gráficos mostrados anterior-
mente.

II.21.1. R COMMANDER

R commander es una Interfaz Gráfica de Usuario (GUI) que facilita considera-


blemente el uso de R. Contiene un menú que permite –de forma similar a otros
programas estadísticos– realizar de modo sencillo la mayoría de las operaciones
estadísticas habituales, y separa las instrucciones y resultados en dos ventanas
diferentes.
Para utilizar R Commander hay que instalar el paquete “Rcmdr” (Fox 2005;
2007; Fox y col., 2012). En general, al mismo tiempo se instalan automática-
mente todos los paquetes dependientes o complementarios necesarios para un
funcionamiento correcto. Normalmente cuando se arranca por primera vez ins-
tala más paquetes, que son necesarios para que funcione.
Los diseñadores de R Commander trataron de incluir en él todas las técnicas
contenidas en un curso básico de Estadística, añadiendo posteriormente algunas
otras técnicas de uso común, pero después han preferido mantener su estructura
simple en lugar de seguir añadiendo técnicas en un menú crecientemente com-
plejo que intente cubrir todos los métodos.
Posteriormente han surgido nuevos paquetes que se incorporan como opcio-
nes de menú complementarias o extensiones de R Commander, de gran utilidad
para usuarios que reclaman técnicas específicas en el menú, los cuales solo de-
ben instalar el paquete adicional (plug-in package) de su interés, como por
ejemplo “FactoMineR” (véase Guisande y col., 2011). La mayoría de los paquetes
plug-in de R Commander empiezan por “RcmdrPlugin.”, como por ejemplo
“RcmdrPlugin.MAd” para Meta-análisis, “RcmdrPlugin.epack” para series tempo-
rales, “RcmdrPlugin.qual” para control de calidad, “RcmdrPlugin.survival” para
análisis de supervivencia, o “RcmdrPlugin.DoE” para diseño de experimentos
industriales.
Las opciones de menú de R Commander conducen en general a cuadros de
diálogo que permiten incorporar a las instrucciones todas las variables y opciones
necesarias en cada aplicación, de manera que el usuario de R no necesita cono-
cer ni utilizar el lenguaje de programación. La estructura de los cuadros de diá-
logo es simple y clara, y a menudo no necesita explicación alguna. Habitual-
mente incluye un botón de ayuda que remite a la documentación de R sobre la
función que se quiere utilizar.
La principal ventaja de R Commander es que el usuario puede realizar casi to-
das las operaciones estadísticas de tratamiento de datos sin conocer en absoluto
el complejo lenguaje de programación. R Commander se encarga de construir las
órdenes a partir del menú, como lo hacen otros programas estadísticos (SPSS,
Statística, SAS, etc.). Incluso para aquellos que conocen a fondo el lenguaje de R
resulta a menudo más cómodo y rápido utilizar R Commander.
Las limitaciones de R Commander consisten en que muchas técnicas estadísti-
cas no están en el menú (solo las más habituales), y que algunas opciones de las
técnicas incluidas no se pueden aplicar desde el menú. El conocimiento del len-
guaje de programación de R permite multiplicar la potencia estadística y mejorar
GRÁFICOS BÁSICOS
107

los resultados y su presentación, para lo cual se pueden modificar conveniente-


mente las órdenes generadas inicialmente por R Commander.
Para iniciar R Commander tecleamos –recuerde que en R siempre es necesa-
rio respetar las mayúsculas– la instrucción siguiente en la consola de R (RGui):

¾ library(Rcmdr)

También es posible iniciar R Commander en el menú «Paquetes» Ö «Cargar


paquete…», y en la ventana que aparece se selecciona «Rcmdr».
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
108

Cuando se utiliza el menú de R Commander, el programa genera las instruc-


ciones adecuadas, que se muestran en la «Ventana de instrucciones». También
aparecen las instrucciones junto con los resultados producidos en la «Ventana de
resultados». El usuario puede acceder a cualquiera de ellas para observar, copiar
resultados o instrucciones, o modificar y ejecutar de nuevo cualquier instrucción
(con el botón «Ejecutar»), de un modo mucho más interactivo que con el RGui.
Es más, cualquier instrucción o conjunto de instrucciones que podamos construir
en RGui puede ser también generalmente realizada en la ventana de instruccio-
nes de R Commander.
La separación de instrucciones y resultados en ventanas diferentes es muy
conveniente para una mejor organización de todos los elementos de la aplicación
estadística. Además R Commander muestra una tercera ventana de «Mensajes»,
en la que advierte de cualquier error o problema en la aplicación. Los mensajes
se numeran correlativamente, y pueden ser borrados en cualquier momento para
evitar confusión e identificar más claramente los mensajes nuevos.
Veamos el siguiente ejemplo, cuyas instrucciones las introducimos en la
«Ventana de instrucciones». Después de seleccionarlo todo y pulsar Ejecutar
aparecen las instrucciones junto con los resultados producidos en la «Ventana de
resultados». El gráfico aparece en la ventana principal de R.

¾ #Ejemplo de archivo de instrucciones (Script)


¾ #Introducir los datos en R desde una instrucción
¾ X<-c(34,47,56,3,78,36,56,23,14)
¾ Y<-c(36,41,55,4,75,38,58,21,16)
¾ #Gráfico que relaciona ambas variables
¾ plot(X,Y)

Antes de poder utilizar el menú para realizar algún gráfico es necesario cargar
los datos como se muestra en la siguiente ventana. La opción «Nuevo conjunto
de datos», sirve para introducir un conjunto de datos directamente (esto es útil
cuando el conjunto de datos es pequeño); también se puede «Cargar un con-
junto de datos» en formato R; «Fusionar conjuntos de datos»; «Importar datos»
desde archivo de texto o portapapeles, o desde otros programas estadísticos
(SPSS, Minitab, STATA….), o desde Excel, Access o dBase.
GRÁFICOS BÁSICOS
109

También se puede seleccionar el «Conjunto de datos activo», o «Modificar las


variables del conjunto de datos activo» (recodificar, calcular una nueva variable,
tipificar, convertir, segmentar, reordenar, renombrar, eliminar, ...). Las instruc-
ciones se ejecutan sobre el conjunto de datos activo. Cuando existen varios, lo
cual es muy habitual, debe definirse cuál es el activo para que el menú de R
Commander se refiera siempre a él. Por ejemplo, supongamos que tenemos dos
series de datos, vamos a «Datos» Ö «Conjunto de datos activo» Ö «Seleccionar
conjunto de datos activo…», y en la ventana que aparece se selecciona la serie
de datos con la que se quiera trabajar.

A modo de ejemplo vamos a utilizar datos de pigmentos de algas que están


en el archivo PigAlgas.xls. Lo mejor para R Commander es usar archivos de
Excel 2003 (extensión “xls”). En el menú se selecciona «Datos» Ö «Importar
datos» Ö «desde conjunto de datos Excel, Access o dBase».
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
110

Aparece un pequeño cuadro de diálogo para introducir el nombre del conjunto


de datos, en el que dejamos el nombre por defecto «Datos» y pulsamos
«Aceptar». Posteriormente aparecen los archivos del directorio de trabajo, en el
que elegimos PigAlgas.xls y pulsamos «Abrir».

En R Commander pulsamos en «Visualizar conjunto de datos». Es importante


inspeccionar los datos y comprobar que no existan líneas vacías, que contienen
exclusivamente el código <NA>. Si existen estas líneas, hay que eliminarlas.

En lo que se refiere al menú de gráficos, hay varios tipos que son los más
básicos y de uso más frecuente: secuencial (para series temporales), histograma
(para variables continuas), de tallo y hojas, diagrama de cajas, diagrama de dis-
persión (para ver la relación entre dos variables cuantitativas), gráfica de líneas,
de barras, de sectores (para variables cualitativas), gráficos 3D, etc. Vamos a
hacer un ejemplo con un diagrama de caja.
GRÁFICOS BÁSICOS
111

En la nueva ventana se selecciona la variable «Chlorophyll.a.epimer» y pulsa-


mos en «Gráfica por grupos…».

Se selecciona «Especies» y después de pulsar «Aceptar» dos veces se obtiene


el gráfico.

El gráfico es sencillo, y ya se vió anteriomente que se puede mejorar su pre-


sentación, por ejemplo poniendo colores a las barras. Para ello sería necesario
introducir las instrucciones sobre el código que aparece en la ventana superior de
R Commander y, después de seleccionar las instrucciones, pulsar el botón
«Ejecutar» o ctrl-R.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
112

0.05
0.04
Chlorophyll.a.epimer

0.03
0.02
0.01
0.00

Cianofíceas Clorofíceas Criptofíceas Diatomeas Dinofíceas

Especies

II.21.2. GrapheR

El paquete “GrapheR” (Hervé, 2011; 2012) es una interfaz que permite al


usuario dibujar gráficos sin tener conocimientos de R y que usa la plataforma
GUI. Se pueden hacer seis tipos de gráfico: histogramas, de caja, barras, circu-
lares, curvas y gráficos de dispersión. Una vez instalado el paquete y seleccio-
nado el directorio de trabajo, para poder usar el paquete hay que introducir las
siguientes instrucciones en la ventana principal de GUI:

¾ library(GrapheR)
¾ run.GrapheR()
GRÁFICOS BÁSICOS
113

En la ventana que aparece, al pulsar el botón «data» se accede al menú


donde se puede indicar el tipo y características del archivo de datos que vamos a
importar. En este caso se especifica que es un archivo de tipo csv, con los deci-
males separados por comas y las columnas por semicolon.

Después de pulsar «Load» abrimos el archivo Clima España.csv, que con-


tiene datos climáticos de diferentes ciudades de España. Como se observa en la
ventana, es posible realizar diferentes modificaciones en los datos una vez car-
gados y también obtener información básica de cada una de las variables como
el mínimo, máximo, la media, etc.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
114

Vamos a representar dos gráficos y, para ello, pulsamos el botón «window»


donde obtenemos la siguiente ventana en la que seleccionamos dos gráficos en
dos filas. Hay que pulsar «OK» para que se haga efectiva la orden.

Posteriormente, pulsamos en el botón «Draw a scatter plot» y representamos


la temperatura máxima frente a la mínima, seleccionando «Ciudad» como factor
opcional y marcando las tres ciudades. En el menú se observa que es posible
modificar el color y tamaño de los símbolos, la leyenda de los ejes, el título del
gráfico, etc.
GRÁFICOS BÁSICOS
115

Una vez hemos acabado de introducir las modificaciones para obtener el for-
mato deseado, se pulsa en el botón «DRAW» para obtener el gráfico, el cual
aparece en una ventana creada. Es posible hacer cualquier modificación y volver
a pulsar «DRAW» para obtener el nuevo gráfico. Es importante tener claro en
que posición lo queremos dentro de la ventana, si arriba o abajo antes de reali-
zar el segundo gráfico, ya que todos los parámetros introducidos para realizar
este gráfico de dispersión se pierden al iniciar al cuadro de diálogo del siguiente.
Para hacer el segundo gráfico pulsamos «Draw a bar plot». En la nueva ven-
tana introducimos las variables a representar: «T.Media» y el factor «Ciudad».
Posteriormente podemos introducir el título, la leyenda de los ejes, cambiar el
tamaño de la leyenda, el color y trama de las barras, el color de los bordes de la
barras, el tipo de error de las barras (en este ejemplo se selecciona la desviación
estándar), etc. Los límites del eje se han puesto de 0 «Lower limit:» a 36 «Upper
limit:», para dejar espacio arriba para poder añadir posteriormente texto. Al
igual que antes pulsamos el botón «DRAW» para obtener el gráfico.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
116

Si se pulsa en el botón «p-val», aparece una ventana adicional que permite


añadir texto para comparar dos o más barras. En el ejemplo hemos aplicado
previamente una prueba estadística de comparación de grupos, y añadiremos al
gráfico el valor p calculado, que indica si existe o no diferencia significativa en la
temperatura media entre ciudades. Introducimos el texto que deseamos incluir
«p = 0,309» y después de pulsar en «Select», se pulsa en el gráfico con el ratón
en las dos barras a comparar, en el primer caso entre las ciudades de Huelva y
Mallorca. Luego se repite el proceso, es decir, se pone de nuevo otro texto «p <
0,001» y al pulsar «Select», se marca con el ratón las ciudades de Palma de Ma-
llorca y Vigo, entre las que hay diferencias significativas en la temperatura me-
dia.

Se obtiene el segundo gráfico, que se muestra a continuación junto con el


primer gráfico de dispersión. En el gráfico de barras es posible que dé un aviso
de error si no se hubiese dejado espacio suficiente por arriba en el eje y. En ese
caso se puede hacer cualquier modificación en el gráfico, pulsar en el botón
«DRAW», y de nuevo se intenta hacer el proceso de seleccionar las barras para
añadir el texto. Sin embargo, es muy importante tener en cuenta lo mencionado
anteriormente, si pulsamos el botón «DRAW» otra vez podemos perder el gráfico
realizado de dispersión. Lógicamente en el caso de estar trabajando con un solo
gráfico y no tener una ventana con varios gráficos, no hay problema en pulsar
«DRAW» tantas veces como se quiera hasta obtener el gráfico deseado.
GRÁFICOS BÁSICOS
117

Temperaturas máxima y mínima en ciudades de España


Temperatura mínima (ºC)
40
Huelva
30 Palma de Mallorca
Vigo
20
10
0

0 10 20 30 40

Temperatura máxima (ºC)

Temperatura media en ciudades de España


Temperatura media (ºC)

p =0,309
30

p < 0,001
20
5 10
0

Huelva Palma de Mallorca Vigo

II.22. Representaciones interactivas para páginas


web

La Aplicación de Interface de Programación (API) de visualización de Google


permite realizar representaciones dinámicas, las cuales se pueden incorporar a
páginas web. El paquete “googleVis” (Gesmann y de Castillo, 2011; 2012) pro-
porciona una interfaz entre R y la API de visualización de Google. Es necesario
tener conexión a internet.

II.22.1. GRÁFICOS

En el archivo Banco mundial.csv hay datos obtenidos de la página web


http://datos.bancomundial.org/, donde se puede observar el porcentaje de po-
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
118

blación y de desempleados para diferentes edades, así como la población total y


el número de mujeres, en diferentes regiones del mundo. Las instrucciones están
en el script II.38.R.
La función «gvisMotion()» del paquete “googleVis” (Gesmann y de Castillo,
2011; 2012) prepara objetos que luego pueden ser representados en forma de
gráficos dinámicos en páginas web. Con el argumento «idvar» se especifica la
variable de identificación, en este caso las diferentes regiones. Con «timevar»
se define la variable que contiene la información de tiempo. Existe otro argu-
mento «date.format="%Y/%m/%d"», que permite definir el formato del
tiempo, en el caso de que no fueran años.

¾ library(googleVis)
¾ datos<-read.csv2("Banco mundial.csv",header=TRUE,encoding="latin1")
¾ G <- gvisMotionChart(datos, idvar = "Region", timevar = "Year")
¾ plot(G)

En la gráfica que se obtiene hay diferentes opciones, las cuales se explican


sobre la propia gráfica. Es posible también seleccionar una zona con el ratón y
entonces se obtendrá una ampliación. Aparecerá una pantalla a la derecha donde
de nuevo es posible reducir. En las siguientes representaciones se cambia de
gráfico y se seleccionan diferentes regiones

Escala logarítmica Diferentes gráficos Variable indicadora


o lineal del color

Variable indicadora
del tamaño

Selección
variable eje y Selección de
variable

Si alguna
variable está
seleccionada,
se sigue su
ruta en la
animación
Escala logarítmica
o lineal
Herramientas
avanzadas

Play para Cursor para ver Selección


animación diferentes años variable eje x
Velocidad de
animación
GRÁFICOS BÁSICOS
119
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
120

La función «gvisAnnotatedTimeLine()» del paquete “googleVis” (Gesmann


y de Castillo, 2011; 2012) permite representar series temporales. En el archivo
Mareas.csv hay datos del ángulo entre el sol y la luna, y la diferencia en metros
entre pleamar y bajamar, para 42º 8´Norte y 14º 13´Oeste, del 1/1/2004 al
14/3/2004. Las instrucciones están en el script II.39.R.
En el argumento «datevar» se introduce la variable que tiene los datos de las
fechas. En «numvar» la variable a representar. En «idvar» se podría poner una
variable identificativa, de tal forma que habría tantas series temporales como
grupos tuviese esa variable. El argumento «titlevar» permite poner una variable
con eventos, que en este ejemplo son las diferentes fases de la luna. Con el
argumento «options» es posible introducir modificaciones en el gráfico, las cua-
les se pueden consultar en el menú de ayuda de la función.

¾ library(googleVis)
¾ datos<-read.csv2("Mareas.csv",header=TRUE,encoding=
"latin1",fill=TRUE)
¾ G2 <- gvisAnnotatedTimeLine(datos, datevar="Fecha", numvar=
"Angulo.Sol.Luna", idvar= "", titlevar="Fase", options=
list(displayAnnotations=TRUE, legendPosition='newRow', width=1000,
height=500))
¾ plot(G2)

II.22.2. TABLAS

Las tablas se realizan con la función «gvisTable()» del paquete “googleVis”


(Gesmann y de Castillo, 2011; 2012). En el script II.40.R se muestra como ge-
nerar tablas interactivas para páginas de internet usando de nuevo el archivo de
Banco mundial.csv.
GRÁFICOS BÁSICOS
121

En la función «gvisTable()», con el argumento «options» es posible intro-


ducir modificaciones en la tabla, las cuales se pueden consultar en el menú de
ayuda de la función.

¾ T <- gvisTable(datos,options = list(width = 1000, height = 500, page=


"enable"))
¾ plot(T)

II.22.3. COMBINACIÓN DE REPRESENTACIONES

La función «gvisMerge()» del paquete “googleVis” (Gesmann y de Castillo,


2011; 2012) permite combinar gráficos, tablas y/o mapas en una sola pantalla.
Los mapas interactivos los estudiaremos en el Capítulo IV, y en este apartado
realizaremos la integración de gráficos y tablas utilizando los datos del archivo
Banco mundial.csv del ejemplo anterior. Las instrucciones están en el archivo
II.41.R.
Después de generar el gráfico y la tabla, como se explicó anteriormente, am-
bos se integran en un mismo dispositivo con «gvisMerge()». El argumento
«horizontal=FALSE» significa que se pongan en la misma columna, en dife-
rentes filas.

¾ library(googleVis)
¾ datos<-read.csv2("Banco mundial.csv",header=TRUE,encoding="latin1")
¾ G <- gvisMotionChart(datos, idvar = "Region", timevar = "Year")
¾ T <- gvisTable(datos,options = list(width = 500, height = 250, page=
"enable"))
¾ GT <- gvisMerge(G, T, horizontal = FALSE)
¾ plot(GT)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
122
CAPÍTULO III

GRÁFICOS AVANZADOS

III.1. Gráficos demográficos

La estructura de edad de una población se puede representar con la función


«pyramid.plot()» del paquete “plotrix” (Lemon, 2012). Las instrucciones están
en el script III.1.R y se usan de nuevo los datos del archivo Población.csv. Se
representa el porcentaje de hombres y mujeres españolas, junto con el de hom-
bres y mujeres extranjeros, los cuales son datos publicados por el Instituto Na-
cional de Estadística de España (www.ine.es).
Después de cargar el paquete e importar los datos, se calcula el porcentaje de
hombres y mujeres españoles y extranjeros en 1991. En el primer gráfico se
representa la población de españoles y en el segundo, que está superpuesto al
primero, la población de extranjeros. El argumento «gap» es para establecer el
espacio entre la pirámide de hombres y la de mujeres. Con el argumento lógico
«show.values=T» se especifica que se muestren los valores de las barras y con
«ndig» se define el número de decimales. Por último, en el segundo gráfico hay
que especificar «add=T» para que se pinte sobre el anterior y no sea un gráfico
nuevo.

¾ library(plotrix)
¾ Datos<-read.csv2("Población.csv", header=TRUE, encoding="latin1")
¾ attach(Datos)
¾ s<-sum(H.1991) + sum(M.1991) + sum(HE.1991) + sum(ME.1991)
¾ M1991<-M.1991*100/s; H1991<-H.1991*100/s
¾ ME1991<-ME.1991*100/s; HE1991<-HE.1991*100/s
¾ pyramid.plot(H1991,M1991,labels=Edad, main="Población española y
extranjera en 1991",lxcol="blue", rxcol="pink", labelcex=1.2, unit="%",
gap=1, show.values = T, top.labels=c("Hombres","Edad","Mujeres"), ndig=
1, xlim=c(5,5))
¾ pyramid.plot(HE1991,ME1991,lxcol="red", rxcol="red", labelcex=0, gap=1,
show.values=F, ndig=2, xlim=c(5,5), add=T)
¾ legend(3.5,19, c("Hombres", "Mujeres", "Extranjeros"), bty="n", pch =
c(15,15,15), col=c("blue","pink","red"))

123
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
124

Población española y extranjera en España en 1991


Hombres Edad Mujeres
0.3 0.7 Hombres
> 85
Mujeres
0.6 80 a 84 1 Extranjeros
0.9 75 a 79 1.5
1.3 70 a 74 1.8
1.9 65 a 69 2.3
2.3 60 a 64 2.5
2.5 55 a 59 2.6
2.2 50 a 54 2.3
2.5 45 a 49 2.5
2.7 40 a 44 2.8
2.9 35 a 39 2.9
3.3 30 a 34 3.3
3.6 25 a 29 3.5
3.8 20 a 24 3.6
3.9 15 a 19 3.7
3.6 10 a 14 3.4
2.9 5a9 2.7
2.4 <5 2.2

4 3 2 1 0 0 1 2 3 4
% %

Función pyramid.plot (paquete plotrix)

ƒ lx y rx: conjunto de datos izquierdo y derecho, que pueden ser


vectores, matrices o data frames.
ƒ labels: etiquetas de las barras: labels = NA.
ƒ top.labels: títulos de los dos conjuntos de datos y de la variable en el
centro: top.labels= c("Male", "Age", "Female").
ƒ laxlab y raxlab: etiquetas opcionales para los ejes: laxlab=NULL y
raxlab=NULL.
ƒ unit: título con las unidades del gráfico: unit= "%".
ƒ lxcol y rxcol: color de las barras izquierda y derecha: lxcol =
rainbow(length(labels)) y rxcol = rainbow(length(labels)).
ƒ gap: espacio entre ambos conjuntos de barras: gap = 1.
ƒ ppmar: márgenes del gráfico: ppmar=c(4,2,4,2).
ƒ labelcex: tamaño de las etiquetas: labelcex=1.
ƒ show.values: si es TRUE se ponen etiquetas en las barras:
show.values = FALSE.
ƒ ndig: decimales de las etiquetas: ndig = 1.

Se pueden usar los argumentos generales main, add y xlim.


GRÁFICOS AVANZADOS
125

III.2. Gráficos de burbujas

Este tipo de gráficos se puede realizar con la función «size_n_color()» del


paquete “plotrix” (Lemon, 2012). Las instrucciones están en el script III.2.R.
Como ejemplo se usan unos datos, que están en el archivo AARotíferos.csv, de
abundancia y concentración de aminoácidos por individuo, de la especie de rotí-
fero Brachionus angularis, en lagunas del parque Nacional de Doñana (España).
En el gráfico la abundancia de los individuos se representa con el tamaño de
los círculos, y el gradiente de colores dentro de los círculos representa la con-
centración de aminoácidos. La escala de la variable que se representa con los
tamaños de los círculos (en este caso la abundancia), debe tener un rango simi-
lar a la escala de la variable del eje x (en este caso temperatura). Por ello, en
primer lugar la variable abundancia se divide por 10. Con la función
«color.scale()» se define el gradiente de color dentro de los círculos y la función
de la matriz de datos que se usa para los cálculos. El último número puede ser 0
(escala de verdes) ó 1 (escala de azules). Si solamente se quisiera representar la
variable abundancia y no la concentración de aminoácidos, con el argumento
«col» se definiría el color de los círculos y no sería necesario «color.scale()»,
ya que todos los círculos tendrían el mismo color. Los argumentos «xat» e «yat»
sirven para ubicar las marcas y etiquetas de los ejes. La leyenda del tamaño de
los círculos se representa con las funciones «points()» y «text()» que ya se
explicaron en el Capítulo II. La leyenda del gradiente de colores se representa
con la función «color.legend()», en la cual se especifican las coordenadas de
los extremos del rectángulo (cuatro coordenadas), los límites de la secuencia de
colores y el intervalo, si se representa en posición vertical «gradient="y"» u
horizontal «gradient="x"», y donde se ubican las etiquetas del gradiente; a la
derecha con «align="rb"» o a la izquierda con «align="lt"». Con el argumento
«rect.col» se pone el mismo intervalo para la secuencia de colores y el mismo
gradiente de colores que se usó en la función «size_n_color()» con el argu-
mento «color.scale».

¾ library(plotrix)
¾ Datos<-read.csv2("AARotíferos.csv", header=TRUE, encoding="latin1")
¾ attach(Datos)
¾ Ab<-Datos$Abundancia/10
¾ size_n_color(Temperatura, Conductividad, Ab, cex.main= 1.6, color.scale
(AA,c(0.8,0),c(0.8,1),1), pch=16, xlab="", ylab="", main="Abundancia y
concentración de aminoácidos", xat=seq(20,35,by=5), yat=seq(0,2,by=0.5),
xlim = c(20,35), ylim=c(0,2))
¾ points(21,1.9,cex=10);text(22,1.9,"100 Individuos por litro",cex=1.2, pos=4)
¾ points(21,1.685,cex=2.5);text(22.8,1.685," 25",cex=1.2)
¾ points(21,1.580,cex=1);text(22.8,1.58," 10",cex=1.2)
¾ color.legend(20,0,21,0.50,seq(4500,6500,by=500),gradient="y",align="rb",
rect.col=color.scale(seq(4500,6500,by=500),c(0.8,0),c(0.8,1),1))
¾ text(23.8,0.28,"Picomoles", cex=1.2)
¾ text(23.8,0.195,substitute("individuo"^-1),cex=1.2)
¾ mtext(expression(paste("Conductividad (mScm"^-2,")")), 2, line=2.4, font =
1, cex=1.4)
¾ mtext(expression(paste("Temperatura (ºC)")), 1, line=2.8, font = 1, cex=1.4)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
126

Abundancia y concentración de aminoácidos

2.0
100 Individuos por litro

25
10
Conductividad (mScm )

1.5
2

1.0

0.5
6500
6000
5500 Picomoles 1
5000 individuo
4500
0.0

20 25 30 35
Temperatura (ºC)

Función size_n_color (paquete plotrix)

ƒ x, y, size: variables x e y, más la variable que indica el tamaño de los


círculos.
ƒ xat e yat: especifica donde se colocan las marcas y etiquetas de los
ejes.
ƒ xaxlab y yaxlab: etiquetas de las marcas de los ejes:
xaxlab=NULL, yaxlab=NULL.
ƒ xcex e ycex: tamaño de las etiquetas de las marcas de los ejes:
xcex=1, ycex=1.
ƒ xlas e ylas: orientación de las etiquetas de las marcas de los ejes:
xlas=0, ylas=1.
ƒ xgrid e ygrid: trama interior de ambos ejes: xgrid=FALSE,
ygrid=TRUE.
ƒ boxit: si es TRUE se dibuja un marco: boxit=TRUE.

Se pueden usar los argumentos generales pch, add, col, main, xlab e
ylab.
GRÁFICOS AVANZADOS
127

Otra función interesante para realizar estos gráficos de burbuja, porque es


muy fácil de usar, aunque tiene el problema de que no da mucho margen para
introducir modificaciones en las leyendas de ejes, tamaños, etc., es
«ggally_points()» del paquete “GGally” (Schloerke, 2012). Las instrucciones
están en el script III.3.R. Como ejemplo se usan de nuevo los datos de
abundancia y concentración de aminoácidos por individuo, de la especie de rotí-
fero Brachionus angularis en varias lagunas del parque Nacional de Doñana (Es-
paña), los cuales están en el archivo AARotíferos.csv.
En el argumento «aes_string» se define cuales son las variables x e y. En
ese mismo argumento también se especifica cual es la variable que define el gra-
diente de color «color» y cual es la que define el tamaño de los círculos «size».
Para tapar las leyendas en inglés es necesario usar la función «polygon()» y
luego poner leyendas nuevas con la función «mtext()».

¾ library(GGally)
¾ datos<-read.csv2("AARotíferos.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ ggally_points(datos, aes_string(x = "Temperatura", y = "Conductividad",
color = "AA", size = "Abundancia"))

1.4

1.2 AA
5000
5500
6000
1.0 6500
Conductividad

Abundancia
0
0.8
20
40
60
0.6 80
100

0.4

24 26 28 30 32
Temperatura

Función ggally_points (paquete GGally)

ƒ data: data frame con los datos


ƒ mapping: composición definiendo las variables de los ejes x e y, el
rango de colores y el tamaño de los círculos.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
128

III.3. Gráficos de escalera

Este gráfico muestra una secuencia de incrementos y cambios en el total me-


diante una serie de barras enlazadas. Se puede realizar con la función
«staircase.plot()» del paquete “plotrix” (Lemon, 2012). Las instrucciones están
en el script III.4.R. El ejemplo muestra como se pierde la biomasa desde los
productores primarios hasta los secundarios, debido a las pérdidas en el con-
sumo, asimilación y respiración.
Es posible importar los datos desde un archivo, pero en este caso se utilizan
vectores: el que define los valores de las barras «datos», el vector lógico que de-
fine si los datos son totales o una reducción «totals» y las etiquetas de las barras
«labels». El argumento «halfwidth» especifica el ancho de las barras. Con
«total.col» se define el color de las barras de los datos que son «TRUE» y con
«in.col» de los datos que son «FALSE» en la variable «totals». El argumento
«bg.col» es el color del fondo del gráfico. Con «direction» se define la orienta-
ción de las barras utilizando los puntos cardinales: "n" de abajo a arriba (hacia el
norte), "s" de arriba a abajo, "e" de izquierda a derecha y "w" de derecha a iz-
quierda. El argumento lógico «display.height» especifica si se muestran los
valores de las barras. Por último, «stagger» es un argumento lógico que permite
escalonar las etiquetas de las barras en caso de solapamiento.

¾ library(plotrix)
¾ datos<-c(100,-20,-25,-30,25)
¾ totals<-c(TRUE,FALSE,FALSE,FALSE,TRUE)
¾ labels<-c("Producción primaria","Eficiencia de consumo","Eficiencia de
asimilación", "Eficiencia de producción", "Producción secundaria")
¾ staircase.plot(datos, totals, labels, halfwidth=0.3, main="Transferencia
biomasa de productores primarios a secundarios", total.col="gray",
inc.col=2:4, bg.col = "#eeeebb", direction="s", display.height=T, stagger=F)

Transferencia biomasa de productores primarios a secundarios

Producción primaria 100

Eficiencia de consumo -20

Eficiencia de asimilación -25

Eficiencia de producción -30

Producción secundaria 25
GRÁFICOS AVANZADOS
129

Función staircase.plot (paquete plotrix)

ƒ heights: vector numérico, matriz o data frame con al menos 2 colum-


nas.
ƒ totals: vector lógico ó variable con 0/1 indicando si los heights
anteriores son totales (TRUE) o una reducción (FALSE): totals = NA.
ƒ labels: etiquetas de las barras: labels = NULL.
ƒ halfwidth: ancho de las barras: halfwidth = 0.3.
ƒ mar: márgenes del gráfico: mar = NA.
ƒ total.col: color de las barras que son TRUE en totals: total.col =
"blue".
ƒ inc.col: color de las barras que son FALSE en totals: inc.col = NA.
ƒ bg.col: color de fondo del gráfico: bg.col = NA.
ƒ direction: orientación de las barras: "n" horizontales de abajo/arriba,
"s" horizontales de arriba/ abajo, "e" verticales de izquierda/derecha y
"w" verticales de derecha/izquierda: direction = "e".
ƒ display.height: si es TRUE se muestran los valores de las barras:
display.height = TRUE.
ƒ stagger: si es TRUE se escalonan las etiquetas para evitar
solapamientos: stagger = FALSE.

Se pueden usar los argumentos generales cex, las y main.

III.4. Diagramas de flujo

La función «plotweb()» del paquete “diagram” (Soetaert, 2012) permite rea-


lizar este tipo de gráficos. Las instrucciones están en el script III.5.R. Los datos
son de un estudio de flujo de carbono en un lago (Stone y Berman, 1993), que
están en el archivo Carbono.csv.
Después de importar los datos y guardarlos en memoria, con la función
«is.na()» las celdas en blanco en el archivo se rellenan con ceros. El argumento
«lab.size» es para definir el tamaño de las etiquetas de los nodos. Con «sub»
se puede poner un subtítulo. Con el argumento «val=F» se especifica que no se
muestre la leyenda con los valores de cada flujo. Con «budget=T» se especifica
que se muestre la leyenda con la suma de los flujos que entran a cada nodo. En
el diagrama, los círculos muestran flujos dentro del mismo nodo. Con
«nullflow=c(5,500)» se indica que no se pone flecha a los flujos comprendidos
entre ese rango de valores.

¾ library(diagram)
¾ datos<-read.csv2("Carbono.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ datos[is.na(datos)]<-0
¾ plotweb(datos, main = "Flujo de carbono en una cadena trófica", sub ="",
lab.size = 1, val=F, arr.col="red", budget=T, bud.title="Flujos de entrada",
bud.size=0.6, length=0.15, nullflow=c(5,500))
¾ text(1.5,0.932, expression(paste("mg C m"^"-2","d"^"-1")))
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
130

Flujos de entrada
Detrítico : 392 Flujo de carbono en una cadena trófica
Sedimentación : 1092
-2 -1
Ciliados : 93 mg C m d
Flagelados : 44
Bacterias : < 2.22e-16
Pirrof itas : < 2.22e-16
No.Pirrof itas : < 2.22e-16
Rotíf eros : 46
Cladóceros : 103
Copépodos : < 2.22e-16
Peces
Peces : 93
Copépodos Detrítico

Cladóceros Sedimentación

Rotíferos Ciliados

No.Pirrofitas Flagelados

Pirrofitas Bacterias

170
5

Función plotweb (paquete diagram)

ƒ flowmat: data frame o matriz con los datos, donde los flujos van
desde la fila a la columna.
ƒ names: vector de texto con los nombres de los nodos. Si es NULL se
usan los nombres de las variables de la matriz o data frame: names
= NULL.
ƒ lab.size: tamaño relativo de las etiquetas de los nodos: lab.size =
1.5.
ƒ fig.size: si add es FALSE, indica el tamaño relativo del diagrama:
fig.size = 1.3.
ƒ sub: si add es FALSE, subtítulo arriba del diagrama.
ƒ sub2: si add es FALSE, subtítulo debajo del diagrama.
GRÁFICOS AVANZADOS
131

Función plotweb (Continuación)

ƒ nullflow: un valor numérico o un vector con dos valores numéricos.


En el caso de un número, no se pone flecha a aquellos flujos menores
que el número. En el caso de un vector con dos números, no se pone
flecha a los flujos comprendidos entre ese rango: nullflow = NULL.
ƒ minflow y maxflow: valores de flujo para el grosor mínimo y
máximo de las flechas. Si no se indica se toman los valores mínimo y
máximo: minflow = NULL y maxflow = NULL.
ƒ legend: si es TRUE se pone una leyenda con los valores máximo y
mínimo de los flujos.
ƒ leg.digit: número de dígitos de la leyenda: leg.digit = 5.
ƒ leg.title: título de la leyenda.
ƒ arr.col: color de las flechas: arr.col = "black".
ƒ val: si es TRUE se pone una leyenda con los valores de cada flujo.
ƒ val.digit, val.size, val.col, val.title y val.ncol: número de dígitos,
tamaño de los números, color, título de la leyenda y número de co-
lumnas de los valores de los flujos: val = FALSE, val.digit = 5,
val.size = 0.6, val.col = "red", val.title = NULL y val.ncol = 1.
ƒ budget: si es TRUE se suman los flujos entrantes y salientes de cada
nodo: budget = FALSE.
ƒ bud.digit, bud.size, bud.title y bud.ncol: número de dígitos, ta-
maño de los números, título de la leyenda y número de columnas de
la leyenda con la suma de los flujos. bud.digit = 5, bud.size = 0.6,
bud.title = "budget" y bud.ncol = 1.
ƒ maxarrow y minarrow: máximo y mínimo grosor de las flechas, res-
pectivamente: maxarrow = 10 y minarrow = 1.
ƒ length: longitud de las puntas de la flecha: length = 0.1.
ƒ dcirc: si es 0 no se pintan los flujos de un compartimento a sí mismo:
dcirc = 1.2.

Se pueden usar los argumentos generales add, main, log, bty y mar.

III.5. Gráficos de telarañas

Este tipo de gráficos se puede representar con la función «radial.plot()» del


paquete “plotrix” (Lemon, 2012). Las instrucciones están en el script III.6.R y
como ejemplo se usan datos de metales en sedimentos a distintas profundida-
des, que están en el archivo Metales.csv.
El argumento «rp.type» define si se pone en forma de polígono "p", en for-
mar radial "r" o con símbolos "s". Con «radlab» se especifica si se rotan las
etiquetas. Con «label.prop» se define cuanto se separan las etiquetas del
gráfico. El argumento «show.grid.labels» define la posición de los números de
la escala de los ejes. Con «grid.col» y «grid.bg» se definen los colores de la
trama interior y si «rp.type="p"» el color del polígono, respectivamente. Por
último, «add=T» hace que el gráfico se dibuje sobre el anterior y no sea uno
nuevo.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
132

¾ library(plotrix)
¾ Datos<-read.csv2("Metales.csv", header=TRUE, encoding="latin1")
¾ attach(Datos)
¾ radial.plot(Datos[,2], labels=Metal, rp.type="p", main="Metales en
sedimentos (ppm)", line.col="red", show.grid=T, lwd=2, lty=1,
radial.lim=c(0,70), radlab=F, label.prop=1.1, show.grid.labels=2, grid.col=
"grey", grid.bg="transparent")
¾ radial.plot(Datos[,3],labels=Metal,rp.type="p",line.col="blue",show.grid=T,
lwd=2, radial.lim=c(0,70),label.prop=1.1,show.grid.labels=2, add=T)
¾ radial.plot(Datos[,4],labels=Metal,rp.type="p",line.col="green",show.grid=
T, lwd = 2, radial.lim=c(0,70),label.prop=1.1,show.grid.labels=2, add=T)
¾ radial.plot(Datos[,5],labels=Metal,rp.type="p",line.col="orange",show.grid=
T, lwd=2, radial.lim=c(0,70), label.prop=1.1,show.grid.labels=2, add=T)
¾ legend("topleft", c("1 cm", "50 cm", "100 cm", "200 cm"), bty="y", pch =
c(15,15,15,15), col=c("red", "blue","green","orange"))

Metales en sedimentos (ppm)


Ni
1 cm
50 cm
100 cm Co
200 cm

Cu

70 60 50 40 30 20 10 0 Cr

Ga

Al

Pb
GRÁFICOS AVANZADOS
133

Función radial.plot (paquete plotrix)

ƒ lengths: vector numérico o matriz. Si es una matriz, las filas se


consideran vectores independientes.
ƒ radial.pos: vector numérico, variable o matriz, con las posiciones en
radianes: radial.pos=NULL.
ƒ labels: etiquetas de las variables.
ƒ label.pos: posición de las etiquetas en radianes: label.pos=NULL.
ƒ radlab: si es TRUE se rotan las etiquetas: radlab= FALSE.
ƒ start: posición de inicio de la primera variable: start=0.
ƒ clockwise: define si las variables van en el sentido o en contra de las
agujas del reloj: clockwise=FALSE.
ƒ rp.type: define si se pinta un polígono "p", radios "r" o símbolos "s":
rp.type="r".
ƒ label.prop: define la separación de las etiquetas: label.prop=1.15.
ƒ line.col: color de las líneas.
ƒ mar: define los márgenes del gráfico. mar=c(2,2,3,2).
ƒ show.grid: si es TRUE se muestra la trama interior de líneas circula-
res: show.grid=TRUE.
ƒ show.grid.labels: se especifica la posición de los números de la es-
cala: show.grid.labels =4.
ƒ show.radial.grid: si es TRUE se muestra la trama interior de radios:
show.radial.grid= TRUE.
ƒ show.centroid: si es TRUE se muestran los centroides:
show.centroid=FALSE.
ƒ grid.col y grid.bg: definen los colores de la trama interior y si
rp.type=”p” el color del relleno de la trama interior: grid.col =
"gray" y grid.bg = "transparent".
ƒ grid.left: si es TRUE se colocan las etiquetas de la trama en el lado
izquierdo: grid.left=FALSE.
ƒ grid.unit: descripción de las unidades: grid.unit= NULL.
ƒ points.symbols y points.col: símbolos con el formato pch y su co-
lor: point.symbols=NULL y point.col=NULL.
ƒ radial.lim y radial.labels: límites y etiqueta de la trama radial:
radial.lim= NULL y radial.labels=NULL.
ƒ poly.col: color de relleno si se representan polígonos; NA para no
rellenar con color: poly.col = NULL.

Se pueden usar los argumentos generales lty, lwd, main, add, xlab e ylab.

III.6. Diagrama de eventos

Este gráfico muestra la evolución de una serie de eventos en el tiempo. Se


realiza con la función «event.chart()» del paquete “Hmisc” (Dubin y col., 1997;
Lee y col., 2000; Dubin y col., 2001; Harrell, 2010). Las instrucciones están en el
script III.7.R. También es necesario el paquete “chron” (James, 2012) para con-
vertir fechas a días julianos, es decir, el número de días que han pasado desde
una determinada fecha que se toma como referencia.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
134

Como ejemplo se utilizan datos de la fecha de nacimiento y las fechas en las


que accedieron a la enseñanza primaria, secundaria, universidad y trabajo dife-
rentes hombres y mujeres. En el script están las instrucciones para trabajar con
días julianos y con fechas (día/mes/año). En el archivo Trabajo.csv los datos
están en formato d/m/año y en el archivo TrabajoJ.csv en días julianos. En el
archivo de datos es conveniente poner primero las variables que sirven como
etiquetas, por ejemplo en este caso el sexo, y luego todas las variables que sean
fechas, en este caso fecha de nacimiento y las fechas de acceso a la primaria,
secundaria, universidad y al trabajo.
En el caso del script para el formato de datos no juliano, después de cargar
los paquetes, al importar los datos es necesario pasar las variables de factor a
carácter con el argumento «colClasses="character"», porque la función
«event.chart()» trabaja con este tipo de datos.

¾ library(chron)
¾ library(Hmisc)
¾ datos<-read.csv2("Trabajo.csv", header=TRUE, encoding= "latin1",
colClasses = "character")

Posteriormente, se transforman las fechas a días julianos. Para ello se utiliza


la función «dates()» del paquete “chron”. Es necesario definir la columna pri-
mera «c1» y última «c2» que tienen las variables con las fechas de los eventos,
en este caso de la 2 a la 6. Con la función «options()» se especifica la fecha que
se considera como referencia para el cálculo de los días julianos, en este caso
1/1/1940. Después de calcular los días julianos con la función «dates()», se
pasan a datos numéricos con la función «as.numeric()». La nueva matriz
creada se guarda en «datos1».

¾ c1<-2
¾ c2<-6
¾ h<-c1+1
¾ options(chron.origin = c(day=1, month=1, year=1940))
¾ datos1<-as.numeric(dates(datos[,c1],format = c(dates = "d/m/y")))
¾ for (i in h:c2){
¾ x<-as.numeric(if (datos[,i]=="NA") x<-datos[,i] else dates(datos[,i], format
= c(dates = "d/m/y")))
datos1<-cbind(datos1,x)
}
En las siguientes instrucciones se anexan con «cbind()» las columnas del ar-
chivo original que no eran fechas de eventos al archivo creado con los días, es
decir, se anexa la variable sexo, y se colocan los encabezados del archivo original
con la función «colnames()».

¾ datos2<-cbind(datos[,1],datos1)
¾ colnames(datos2)<-colnames(datos)

Por último, se realiza el gráfico con la función «event.chart()». Con «y.var»


se especifica la variable que se usa para escalar el eje y, en este caso los días
que han pasado desde 1/1/1940 hasta la fecha de nacimiento de la persona. Con
GRÁFICOS AVANZADOS
135

«subset.c» se eligen las variables con eventos a representar. El argumento


«line.by» especifica la variable en función de la cual se pondrán diferentes líneas
a cada grupo de esa variable, en este caso para diferenciar hombres de mujeres.
Con «legend.location="i"» se especifica que la posición de la leyenda sea in-
terior. En el argumento «legend.point.text» se pone el texto de la leyenda de
los diferentes eventos y en «legend.line.text» el texto de la leyenda de los di-
ferentes grupos de la variable especificada en «line.by». Con
«legend.point.at» y «legend.line.at» se definen las posiciones de la leyenda
de los eventos y la de las líneas. Con «date.orig» se especifica la fecha de refe-
rencia, en este caso 1/1/1940.

¾ event.chart(datos2, y.var="Nacimiento", subset.c=c("Nacimiento",


"Primaria", "Secundaria", "Universidad", "Trabajo"), x.lab = "Fecha",
y.lab="Días hasta nacimiento desde fecha referencia 01/01/1940",
titl="Acceso a los estudios y al trabajo", point.pch=c(15,16,17,18,19),
point.col = rep(10,5), line.by = "Sexo", line.lty=c(1,3), line.lwd = rep(1,2),
line.col = rep(1,2), point.cex = rep(1.5,5), legend.plot =TRUE,
legend.location="i", legend.cex=1.3, legend.point.text = c("Nacimiento",
"Primaria", "Secundaria", "Universidad", "Trabajo"), legend.point.at =
list(c(500, 8000), c(15000, 10600)), legend.bty= "o", legend.line.at =
list(c(17000, 25000), c(4000, 2000)), legend.line.text=c("Hombres",
"Mujeres"), date.orig = c(1, 1, 1940), y.var.type="n")

Acceso a los estudios y al trabajo


14000

Nacimiento
Días hasta nacimiento desde fecha referencia 01/01/1940

Primaria
Secundaria
12000

Universidad
Trabajo
10000
8000
6000
4000

Hombres
Mujeres
2000

9/30/42 6/17/59 3/2/76 11/17/92 8/4/09

Fecha
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
136

El siguiente gráfico utiliza el archivo TrabajoJ.csv que tiene los datos en días
julianos. La variación con el anterior es que con «y.var.type="d"» se define que
el eje y sea en días julianos desde la fecha de referencia, con «x.reference
="Nacimiento"» se define que la variable x sea el nacimiento, con
«x.julian=T» que el eje x se muestre en días julianos y con «x.scale=365» los
días julianos se pasan a años en el eje x.

¾ datos<-read.csv2("TrabajoJ.csv",header=TRUE, encoding= "latin1")


¾ event.chart(datos, y.var="Nacimiento", subset.c=c("Nacimiento",
"Primaria", "Secundaria", "Universidad", "Trabajo"), x.lab = "Ead hasta el
evento", y.lab="Fecha de nacimiento", titl="Acceso a los estudios y al
trabajo", point.pch=c(15,16,17,18,19), point.col=rep(10,5), line.by="Sexo",
line.lty=c(1,3), line.lwd=rep(1,2), line.col=rep(1,2), point.cex=rep(1.5,5),
legend.plot=TRUE, legend.location="i", legend.cex= 1.3, legend.point.text=
c("Nacimiento", "Primaria", "Secundaria", "Universidad", "Trabajo"),
legend.point.at = list(c(21.9, 32), c(5000, 800)), legend.bty="o",
legend.line.at = list(c(21.9, 32), c(7100, 5200)), legend.line.text=
c("Hombres", "Mujeres"), date.orig = c(1, 1, 1940), y.var.type= "d",
x.reference="Nacimiento", x.julian=T, x.scale=365)

Acceso a los estudios y al trabajo


4/2/80
11/16/70
Fecha de nacimiento

7/1/61

Hombres
Mujeres
2/15/52

Nacimiento
Primaria
Secundaria
Universidad
9/30/42

Trabajo

0 5 10 15 20 25 30

Edad hasta el evento


GRÁFICOS AVANZADOS
137

Función event.chart (paquete Hmisc)

ƒ data: matriz o data frame con los datos.


ƒ subset.r y subset.c: selección de unas filas o columnas de la matriz
original, respectivamente.
ƒ sort.by: variable en base a la que ordenar los datos. Por defecto es
NA, y se ordenan por el orden de fila.
ƒ sort.ascending: si es TRUE el orden es ascendente: sort.ascending
= TRUE.
ƒ sort.na.last: si es TRUE los valores NA se ponen en la última posi-
ción: sort.na.last = TRUE.
ƒ sort.after.subset: en el supuesto de que se seleccionen determina-
das filas con subset.r, si es FALSE la ordenación de los datos se hará
antes de las selección de las filas: sort.after.subset = TRUE.
ƒ y.var: variable que se usa para escalar el eje y. En caso de no poner
nada, se deja el mismo espacio entre datos: y.var = NA.
ƒ y.var.type: tipo de variable con la que se escala el eje y: "d" es una
fecha y "n" es numérica: y.var.type = "n".
ƒ y.jitter: si es TRUE, en el caso de existir solapamiento en el eje y, se
separarían los datos: y.jitter = FALSE.
ƒ y.jitter.factor: valor numérico de desplazamiento en el eje y si
y.jitter = TRUE: y.jitter.factor = 1.
ƒ y.renum: si es FALSE y se ha realizado una selección de filas, éstas
aparecerán en y con el número de fila que tienen en la matriz de da-
tos: y.renum = FALSE.
ƒ NA.rm: si es TRUE los valores NA no se tendrán en cuenta: NA.rm =
FALSE.
ƒ x.reference: variable temporal que se usa en el eje x: x.reference
= NA.
ƒ now: fecha que se usará como valor máximo en el eje y en el dia-
grama de Goldman. Para hacer un diagrama de Goldman hay que de-
finir una variable en x.reference y debe ser y.var=x.reference: now =
max(data[, subset.c], na.rm = TRUE).
ƒ now.line: si es TRUE y se ha seleccionado un diagrama de Goldman,
éste será cuadrado y dibujará una recta con pendiente -1: now.line
= FALSE.
ƒ now.line.lty, now.line.lwd y now.line.col: tipo, grosor y color de la
línea now.line: now.line.lty = 2, now.line.lwd = 1 y now.line.col
= 1.
ƒ date.orig: en caso de usar días julianos, es la fecha que se considera
como origen: date.orig = c(1, 1, 1960).
ƒ titl: título principal del diagrama: titl = "Event Chart".
ƒ y.idlabels: variable con las etiquetas del eje y: y.idlabels = NA.
ƒ y.axis: argumento lógico para las etiquetas del eje y: si es "auto" se
ponen automáticamente y si es "custom" las especifica el usuario:
y.axis = "auto".
ƒ y.axis.custom.at y y.axis.custom.labels: en el caso de que y.axis=
"custom", se especifica con un vector la posición y las etiquetas del
eje y, respectivamente: y.axis.custom.at = NA e y.axis.custom.
labels = NA.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
138

Función event.chart (Continuación)

ƒ y.julian: si es FALSE se ponen fechas en vez de días julianos en el eje


ƒ y. Para utilizarlo debe ser y.var.type="d" e y.axis="custom": y.julian
= FALSE.
ƒ y.lim.extend: un vector con dos números que indica el incremento en
los extremos del eje y: y.lim.extend = c(0, 0).
ƒ y.lab: leyenda del eje y.
ƒ x.axis.all: si es FALSE los límites del eje x se basan en los datos
seleccionados con subset.r, si es TRUE en todos los datos: x.axis.all
= TRUE.
ƒ x.axis: etiquetas del eje x, si es "auto" se ponen automáticamente y
si es "custom" las especifica el usuario: x.axis = "auto".
ƒ x.axis.custom.at y x.axis.custom.labels: en el caso de que x.axis=
"custom", se especifica con un vector la posición y las etiquetas del
eje x, respectivamente: x.axis.custom.at = NA y x.axis.custom.
labels = NA.
ƒ x.julian: si es FALSE se ponen fechas en vez de días julianos en el eje
x. Para utilizarlo deber ser x.axis="auto". Si se pone una variable en
x.reference debe ser TRUE: x.julian = FALSE.
ƒ x.lim.extend: un vector con dos números que indica el incremento en
los extremos del eje x: x.lim.extend = c(0, 0).
ƒ x.scale: factor de multiplicación para el eje x. Por ejemplo, si la es-
cala está en días y el factor es 365, pasaría a estar en años: x.scale
= 1.
ƒ x.lab: leyenda del eje x: x.lab = ifelse(x.julian, "Follow-up
Time", "Study Date").
ƒ line.by: variable en función de la cual se pondrían diferentes líneas a
cada grupo de esa variable: line.by = NA.
ƒ line.lty, line.lwd y line.col: vectores con el tipo, grosor y color de
las líneas, respectivamente, si se define una variable en line.by. Los
vectores deben tener tantos números como grupos en la variable:
line.lty = 1, line.lwd = 1 y line.col = 1.
ƒ line.add: una matriz 2xk con k = número de pares de segmentos de
línea adicionales para agregar. Por ejemplo, para dibujar trazos que
conecten los eventos 1-2 y 2-3, un argumento line.add adecuado sería
la matriz (c ('first.event', 'second.event', 'second.event', 'third.event'),
2, 2). Un segmento de línea se establecería entre first.event y
second.event, y un segmento de la segunda línea se establecería en-
tre second.event y third.event. Diferentes tipos de línea, grosores y
colores se especifican con los argumentos que vienen a continuación:
line.add = NA.
ƒ line.add.lty, line.add.lwd y line.add.col: vectores con el tipo, gro-
sor y color de las líneas, respectivamente, si se define una matriz en
line.add: line.add.lty = NA, line.add.lwd = NA y line.add.col =
NA.
ƒ point.pch, point.cex y point.col: tipo, tamaño y color de los símbo-
los: point.pch = 1:length(subset.c), point.cex = rep(0.6,
length(subset.c)) y point.col = rep(1, length(subset.c)).
GRÁFICOS AVANZADOS
139

Función event.chart (Continuación)

ƒ point.cex.mult: valor numérico en función del cual se escala el ta-


maño de los símbolos. Por ejemplo, point.cex.mult=0.00007:
point.cex.mult = 1.
ƒ point.cex.mult.var: variable en función de la cual se escala el ta-
maño de los símbolos con el valor definido en el argumento anterior.
Por ejemplo, si point.cex.mult.var="Nacimiento", todos los símbolos
se escalan en función de las fechas de nacimiento de las personas:
point.cex.mult.var = NA.
ƒ extra.points.no.mult: vector con el nombre de las variables que no
se tienen en cuenta para la escala definida en point.cex.mult:
extra.points.no.mult = rep(NA, length (subset.c)).
ƒ legend.plot: si es TRUE se muestra la leyenda: legend.plot =
FALSE.
ƒ legend.location: posición de la leyenda: "i" interior, "o" exterior y "l"
usa la opción locator: legend.location = "o".
ƒ legend.titl y legend.titl.cex: texto y tamaño de letra de la leyenda:
legend.titl = titl y legend.titl.cex = 3.
ƒ legend.titl.line: posición de la leyenda utilizando la escala de mtext:
legend.titl.line = 1.
ƒ legend.point.at, legend.point.pch, legend.point.text y
legend.cex: posición, tipo de símbolos, etiquetas de los diferentes
eventos y tamaño de la etiquetas en la leyenda: legend.point.at =
list(x = c(5, 95), y = c(95, 30)), legend.point.pch = point.pch,
legend.point.text = ifelse(rep(is.data.frame(data), length
(subset.c)), names(data[, subset.c]), subset.c) y legend.cex =
2.5.
ƒ legend.bty: si es "o" se pone un marco a la leyenda y si es "n" no se
pone marco: legend.bty = "n".
ƒ legend.line.at, legend.line.text y legend.line.lwd: posición, eti-
quetas del texto y grosor de las líneas de la leyenda de los diferentes
grupos de la variable especificada en line.by: legend.line.at = list(x
= c(5, 95), y = c(20, 5)), legend.line.text = names(table
(as.character(data[, line.by]), exclude = c("", "NA"))) y
legend.line.lwd = line.lwd.
ƒ legend.loc.num: número que se usa para el argumento de localiza-
ción cuando legend.location = "l": 1 significa que solamente se define
el borde superior izquierdo del cuadro de la leyenda, 2 significa que el
usuario define el borde superior izquierdo y el borde inferior derecho
de la leyenda. Si se especifica variable en line.by hay que hacerlo para
las dos leyendas: legend.loc.num = 1.

Se puede usar el argumento general pch.

III.7. Matrices de gráficos

Este tipo de gráficos permiten representar todas las variables, unas con otras,
de un conjunto de datos. Es necesario tener instalado el paquete “lattice”
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
140

(Sarkar, 2008; Sarkar, 2012). Las instrucciones están en el archivo III.8.R. En


este ejemplo usaremos los datos de clorofila, afloramiento, temperatura y nu-
trientes de diferentes zonas costeras del mundo, los cuales están en el archivo
Producción primaria.csv.
Después de cargar la librería e importar los datos, se seleccionan solamente
las variables clorofila y los tres nutrientes. Se utiliza la función «pairs()», en la
cual simplemente hay que especificar el conjunto de datos que contiene las va-
riables a representar, que debe ser una matriz o un data frame.

¾ library(lattice)
¾ datos<-read.csv2("Producción primaria.csv", header = TRUE, encoding =
"latin1")
¾ datos1<-datos[,c("Clorofila","Fosfato","Nitrato","Silicato")]
¾ pairs(datos1,main="Clorofila y nutrientes",cex.main=2, cex=1.5, pch=15,
cex.labels = 2.8)

Clorofila y nutrientes
0.5 1.0 1.5 2 4 6 8 10

4
3
Clorofila

2
1
0
1.5

Fosfato
1.0
0.5

14
2 4 6 8 10

Nitrato
10
8

Silicato
6
4
2

0 1 2 3 4 2 4 6 8 10 14

La diferencia del segundo gráfico con el anterior es que se le añaden colores a


los puntos. Es necesario el paquete “vcd” (Meyer y col., 2012) para usar la fun-
ción «grid_legend()» y poner la leyenda. El argumento «frame=FALSE» es
para que no represente el marco de la leyenda. Es necesario poner las cuatro
leyendas de las columnas por separado. El argumento «unclass» transforma el
factor «Area» (una lista de categorías) en un listado de 1, 2, 3 y 4.
GRÁFICOS AVANZADOS
141

¾ library(vcd)
¾ pairs(datos1, pch=21, bg=c("red","blue","cyan","yellow") [unclass(datos
$Area)], cex=1.8)
¾ grid_legend(0.2, 0.99, pch=c(19), col=c("red"),c("Benguela"), title="",
frame= FALSE)
¾ grid_legend(0.4, 0.99, pch=c(19), col=c("blue"),c("California"),title="",
frame = FALSE)
¾ grid_legend(0.6, 0.99, pch=c(19), col=c("cyan"),c("Humbolt"), title="",
frame =FALSE)
¾ grid_legend(0.8, 0.99, pch=c(19), col=c("yellow"),c("Humbolt"), title="",
frame=FALSE)

Benguela California Humbolt Mauritania


0.5 1.0 1.5 2 4 6 8 10

4
3
Clorofila

2
1
0
1.5
1.0

Fosfato
0.5

14
8 10

Nitrato
4 6
2
10
8

Silicato
6
4
2

0 1 2 3 4 2 4 6 8 10 14

En el tercer gráfico se combinan gráficos de barras, que muestran la distribu-


ción de las distintas variables, con gráficos de dispersión. Es necesario tener
instalados los paquetes “MASS” (Ripley y col., 2012), “ellipse” (Murdoch, 2009) y
“SciViews” (Grosjean, 2012). El gráfico se barras se hace con la función
«panel.hist()» del paquete “SciViews”. Otras funciones de este paquete son
«panel.boxplot()», «panel.density()» y «panel.qqnorm()».
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
142

Con los argumentos «diag.panel», «lower.panel» y «upper.panel» es po-


sible definir gráficos diferentes en la diagonal, por debajo, y por encima de la
diagonal, respectivamente. En la diagonal se representan los histogramas que
muestran las frecuencias de las variables, lo cual se ha definido con una función
y se ha asignado a «panel.hist» En los gráficos inferiores se muestran los mode-
los de regresión suavizada y en los que están por encima de la diagonal el mo-
delo de regresión lineal. Para poder hacer esta figura con otro tipo de datos,
simplemente hay que sustituir en el script «datos1» por la matriz con la que se
trabaje.

¾ library(SciViews)
¾ panel.hist <- function(x, ...)
{
usr <- par("usr"); on.exit(par(usr))
par(usr = c(usr[1:2], 0, 1.5)); h <- hist(x, plot = FALSE)
breaks <- h$breaks; nB <- length(breaks)
y <- h$counts; y <- y/max(y)
rect(breaks[-nB], 0, breaks[-1], y, col="cyan", ...)
}
¾ pairs(datos1, main="Clorofila y nutrientes",cex.main=2, lower.panel=
panel.smooth, upper.panel=panel.reg, cex = 1.2, pch=24, bg="light blue",
diag.panel = panel.hist, cex.labels = 2, font.labels=2)

Clorofila y nutrientes
0.5 1.0 1.5 2 4 6 8 10 4

Clorofila
3
2
1
0

Fosfato
1.5
1.0
0.5

14

Nitrato
2 4 6 8 10

Silicato
10
8
6
4
2

0 1 2 3 4 2 4 6 8 10 14
GRÁFICOS AVANZADOS
143

Función pairs (paquete graphics)

ƒ x: matriz o data frame donde están las variables que se van a repre-
sentar o una fórmula del tipo ~ x + y + z.
ƒ data: data frame donde están las variables, en el caso de usar una
fórmula.
ƒ labels: nombre de las variables.
ƒ panel: función donde se especifican las características del panel
gráfico: points, lines, panel.boxplot, panel.hist, panel.density, panel.
qqnorm, etc.: panel = points.
ƒ lower.panel: función específica para definir las características del pa-
nel gráfico inferior, por debajo de la diagonal: lower.panel = panel.
ƒ upper.panel: función específica para definir las características del pa-
nel gráfico superior: upper.panel = panel.
ƒ diag.panel: función específica para definir las características de la
diagonal como por ejemplo poner histogramas diag.panel =
panel.hist: diag.panel = NULL.
ƒ label.pos: valor numérico con la posición en la diagonal de las etique-
tas de las variables representadas: label.pos = 0.5 + has.diag/3.
ƒ cex.labels: tamaño de letra de las etiquetas de la diagonal: cex.
labels = NULL.
ƒ font.labels: estilo de letra de las etiquetas de la diagonal: font.
labels = 1.
ƒ row1attop: si es TRUE la diagonal va de izquierda a derecha y si es
FALSE va de derecha a izquierda: row1attop = TRUE.
ƒ gap: distancia entre los gráficos interiores en líneas de margen: gap
= 1.

Contenidos del argumento diag.panel (paquete SciViews)

panel.boxplot(x, col = par("col"), box.col = "cornsilk", ...)


panel.density(x, adjust = 1, col = par("col"), lwd = par("lwd"), line.col
= col, line.lwd = lwd, ...)
panel.hist(x, breaks = "Sturges", hist.col = "cornsilk", hist.border =
NULL, hist.density = NULL, hist.angle = 45, ...)
panel.qqnorm(x, pch = par("pch"), col = par("col"), bg = par("bg"), cex
= par("cex"), lwd = par("lwd"), qq.pch = pch, qq.col = col, qq.bg = bg,
qq.cex = cex, qqline.col = qq.col, qqline.lwd = lwd, ...)

ƒ x: variable o vector numérico.


ƒ col: color de los símbolos.
ƒ box.col: color de relleno en boxplots: box.col = "cornsilk".
ƒ adjust: grosor de banda en density: adjust = 1.
ƒ line.col: color de la línea.
ƒ line.lwd: grosor de la línea.
ƒ breaks: número de barras, el nombre del algoritmo o un vector con
los puntos de corte de las barras en el histograma: breaks =
"Sturges".
ƒ hist.col: color de relleno de las barras del histograma: hist.col =
"cornsilk".
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
144

Contenidos del argumento diag.panel (Continuación)

ƒ hist.border: color del borde de las barras en el histograma:


hist.border = NULL.
ƒ hist.density: densidad de las líneas de relleno de las barras en el
histograma.
ƒ hist.angle: ángulo de las líneas del relleno de las barras en el histo-
grama: hist.angle = 45.
ƒ pch, bg y cex: tipo de símbolo, color de relleno y tamaño de los
símbolos, respectivamente.
ƒ qq.pch: tipo de símbolo en los QQ-gráficos.
ƒ qq.col: color de los símbolos en los QQ-gráficos.
ƒ qq.bg: color de relleno de los símbolos en los QQ-gráficos.
ƒ qq.cex: tamaño de los símbolos en los QQ-gráficos.
ƒ qqline.col: color de las líneas en los QQ-gráficos.
ƒ qqline.lwd: grosor de las líneas en los QQ-gráficos.

Otra función que se puede utilizar para este tipo de gráficos es «splom()»,
que también requiere tener instalado el paquete “lattice” (Sarkar, 2012), se
muestra en el gráfico 4 y tiene un formato un poco diferente.

¾ datos2<-datos[,c("Temperatura","Fosfato","Nitrato","Silicato")]
¾ splom(~ datos2,main="Temperatura y nutrientes",cex.main=2, col= "black")

Temperatura y nutrientes

10 6 8 10

6 Silicato 6

4
2 4 6 2

14
8 10 12 14
12
10
8
Nitrato
6
4
0 2 4 6 2
0
1.0 1.5
1.5

1.0 Fosfato 1.0

0.5
0.5 1.0
20
16 18 20
18

16Temperatura 16

14
12 14 16
12
GRÁFICOS AVANZADOS
145

Esta misma función permite otro formato de representación (gráfico 5 en el


script), que se muestra a continuación, en el cual cada grupo, en este caso las
diferentes zonas costeras, se pone en una gráfica diferente. Es necesario indicar
los datos con los grupos, con «datos2|Area» en lugar de «datos2». El argumento
«pscales» permite ajustar el tamaño de las leyendas interiores de los ejes y
nombres de las variables. Con el argumento «between» se define el espacio que
se deja entre los gráficos, en los ejes x e y.

¾ splom(~datos2|Area, layout = c(2,2), pscales = 0, varnames = c("Temp",


"Fosfato","Nitrato","Silicato"), main="Temperatura y nutrientes", cex.main
= 1.8, between=list(x=0.5,y=0.5))

Temperatura y nutrientes
Humbolt Mauritania

Silicato Silicato

Nitrato Nitrato

Fosfato Fosfato

Temp Temp

Benguela California

Silicato Silicato

Nitrato Nitrato

Fosfato Fosfato

Temp Temp
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
146

Por último, en el gráfico 6 se muestra otra variante de este tipo de gráficas


con la función «xyplot()». Se seleccionan las áreas de Mauritania, Benguela y
California con la función «subset()». Las variables que se van a representar se
introducen por pares, y es posible especificar una variable de agrupación, de
nuevo las diferentes áreas. El argumento «auto.key» permite poner la leyenda
de los símbolos. Las modificaciones que se quieran realizar de las etiquetas y
formato de las divisiones de los ejes, se deben introducir con una lista en el ar-
gumento «scales». El argumento «aspect» define la proporción ancho/alto de
las figuras. El argumento «layout» es una lista de 2 ó 3 números que definen el
número de columnas, filas y páginas respectivamente.

¾ datos3<-subset(datos, Area %in% c("Mauritania", "Benguela","California"))


¾ xyplot( Clorofila + Fosfato ~ Nitrato + Silicato | Area, data = datos3, scales
= list(cex=c(1,1), font=2), layout = c(2, 2), auto.key = list(x = 0.6, y = 0.7,
corner = c(0, 0)), aspect=1)

Mauritania

3 Clorofila * Nitrato
Clorofila * Silicato
Fosfato * Nitrato
2 Fosfato * Silicato

1
Clorofila + Fosfato

0
Benguela California

0
2 4 6 8 10 12
Nitrato + Silicato
GRÁFICOS AVANZADOS
147

Función splom (paquete lattice)

ƒ x: data frame con las variables a representar o fórmula del tipo ~ x |


g1 * g2 *… donde x es el data frame o matriz de datos y g1, g2, … son
factores opcionales o variables de agrupación.
ƒ data: matriz con los datos.
ƒ between: define el espacio entre gráficos en el eje x y en el eje y:
between = list(x = 0.5, y = 0.5).
ƒ aspect: valor numérico que da el aspecto (relación ancho/alto) del
panel. A medida que el valor es más pequeño es más ancho que alto:
aspect = 1.
ƒ pscales: valor numérico o lista que permite modificar las etiquetas y
formato de las marcas de los ejes: pscales = 5.
ƒ varnames: carácter o expresión con los nombres de las variables.

Los otros argumentos: allow.multiple, aspect, outer, auto.key, panel,


prepanel, etc., son comunes a la mayoría de las funciones del paquete
“lattice” y se explicaron en los cuadros de la funciones bwplot(),
wireframe() y/o cloud() del Capítulo II.

Función xyplot (paquete lattice)

ƒ x: data frame con las variables a representar o fórmula del tipo y


~ x | g1 * g2 *... (o equivalente, y ~ x | g1 + g2 +...), indicando
que los gráficos con las variables x e y deben realizarse para los
grupos definidos en las variables g1, g2,...

Los otros argumentos: allow.multiple, aspect, outer, auto.key, panel,


prepanel, etc., son comunes a la mayoría de las funciones del paquete
“lattice” y se explicaron en los cuadros de las funciones bwplot(),
wireframe(), cloud() y/o splom().

III.8. Gráficos de matrices de correlaciones

La función «corrplot()» del paquete con el mismo nombre “corrplot” (Wei,


2012) es muy útil para representar matrices de correlaciones (Murdoch y Chow,
1996; Friendly, 2002). Las instrucciones están en el script III.9.R. Los datos,
que están en el archivo Morfología.csv, son medidas morfométricas de peces.
Después de importar los datos se selecciona solo un grupo de peces y las va-
riables que están en las columnas 5 a 25, que se guardan en «datos1». Es im-
portante seleccionar solamente variables numéricas para poder hacer las correla-
ciones. En «cor.mtest» se guarda una función que permite calcular correlaciones,
con la que solamente hay que indicar el objeto que tiene los datos, en este caso
«datos1». La función utiliza un nivel de confianza de 0,95 para los intervalos, que
se puede modificar.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
148

¾ library(corrplot)
¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ datos1 <- datos[Orden=="Perciformes",5:25]
¾ cor.mtest <- function(datos1, conf.level = 0.95){
datos1 <- as.matrix(datos1)
n <- ncol(datos1)
p.mat <- lowCI.mat <- uppCI.mat <- matrix(NA, n, n)
diag(p.mat) <- 0
diag(lowCI.mat) <- diag(uppCI.mat) <- 1
for(i in 1:(n-1)){
for(j in (i+1):n){
tmp <- cor.test(datos1[,i], datos1[,j], conf.level = conf.level)
p.mat[i,j] <- p.mat[j,i] <- tmp$p.value
lowCI.mat[i,j] <- lowCI.mat[j,i] <- tmp$conf.int[1]
uppCI.mat[i,j] <- uppCI.mat[j,i] <- tmp$conf.int[2]}}
return(list(p.mat, lowCI.mat, uppCI.mat))}

Con la función «cor()» se calculan todas las correlaciones entre las variables
y luego con la función creada «cor.mtest» se calculan las probabilidades los con-
trastes de nulidad. Con la función «corrplot()» hacemos el primer gráfico que
utiliza la matriz de correlaciones que se ha calculado anteriormente y se guardó
como «corr». El argumento «type» define si el gráfico es completo "full", solo la
mitad superior "upper" o la mitad inferior "lower", como en el primer caso. Con
«method» se define si se pone un símbolo o un número en cada correlación. En
el primer caso se ponen los coeficientes de correlación con «method=
"number"». Con «order» se especifica como ordenar las variables. Con
«addtextlabel» se define la posición de las etiquetas de las variables. El argu-
mento «p.mat» especifica cual es la matriz con los datos de las probabilidades,
que en este caso se guardaron anteriormente en «res1» y lo que hace en el
gráfico es poner una marca en aquellas correlaciones que no sean significativas
(en ese caso una cruz), con el nivel de significación utilizado para «res1». Con
«sig.level» podemos cambiar el nivel de significación, sin tener que volver a
calcular «res1». La segunda vez que se utiliza «corrplot()» se pone un valor de
«sig.level=0.001» para ver, por encima de la diagonal, las diferencias con el
gráfico anterior (por debajo de la diagonal); algunas correlaciones dejan de ser
significativas, ya que anteriormente el nivel de significación era 0,05. En este
gráfico superior el argumento «method="square"» y, por ello, se pintan cua-
drados y no las correlaciones.

¾ corr<-cor(datos1)
¾ res1<-cor.mtest(datos1,0.95)
¾ corrplot(corr, type="lower", method="number", order="original",
addtextlabel= "lt", p.mat = res1[[1]], sig.level=0.05)
¾ corrplot(corr,add=TRUE, method="square", order="original", type="upper",
addtextlabel="lt", p.mat = res1[[1]], sig.level=0.001)
¾ text(11,24, "Correlación entre variables morfométricas",cex=1.5)
GRÁFICOS AVANZADOS
149

Correlación entre variables morfométricas

M10

M11

M12

M13

M14

M15

M16

M17

M18

M19

M20

M21

M22
M2

M3

M4

M5

M6

M7

M8

M9
1
M2 100
M3 26 100
0.8
M4 52 68 100
M5 -14 28 42 100
0.6
M6 65 30 36 12 100
M7 42 55 57 45 80 100
M8 43 31 54 60 39 46 100 0.4

M9 43 20 27 21 49 44 61 100
M10 8 34 21 38 28 48 46 74 100 0.2

M11 20 78 81 58 34 67 49 29 43 100
M12 -11 67 58 53 -8 30 37 6 34 78 100 0
M13 24 78 79 52 26 57 54 31 42 93 84 100
M14 -12 -26 -13 -19 -40 -44 -15 -28 -31 -31 -3 -10100 -0.2
M15 -22 60 46 52 -1 36 24 -7 23 75 84 70 -13100
M16 -2 69 55 57 27 60 38 18 41 85 73 74 -55 85 100 -0.4
M17 -5 -41 -16 7 -20 -24 -6 -11 -25 -35 -37 -34 20 -47 -45100
M18 29 67 59 44 28 48 69 43 48 71 65 77 -21 56 66 -34100 -0.6
M19 33 50 43 42 32 43 64 41 47 51 46 52 -35 45 58 -30 80 100
M20 12 60 73 61 20 53 46 15 29 82 73 81 -12 60 63 -14 50 34 100
-0.8
M21 21 59 47 51 37 55 58 35 47 65 52 59 -50 59 77 -36 81 86 44 100
M22 -11 60 39 44 20 50 19 7 34 71 65 57 -57 82 93 -54 50 49 48 67 100
-1

El segundo gráfico se hace completo «type="full"», se ponen círculos


«method=circle», se ordenan las variables en función del primer factor de un
Análisis de Componentes Principales «order="FPC"» y con «outline= T» se
especifica que se ponga un borde a los símbolos. Al final con «res1[3]» se
muestran las correlaciones.

¾ corrplot(corr, type="full", method="circle", order="FPC", addtextlabel="lt",


p.mat = res1[[1]], sig.level=0.01, outline=T)
¾ text(11,24, "Correlación entre variables morfométricas", cex=1.5)
¾ res1[3]
Correlación entre variables morfométricas
M10

M19

M18

M21

M11

M13

M20

M16

M22

M12

M15

M14

M17
M2

M9

M6

M8

M7

M4

M3

M5

1
M2

M9
0.8
M6
M8

M10
0.6

M7

M19 0.4

M4

M18 0.2

M21

M3 0
M11

M13 -0.2
M5

M20
-0.4
M16

M22
-0.6
M12

M15
-0.8
M14

M17
-1
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
150

Función corrplot (paquete corrplot)

ƒ corr: matriz de correlaciones.


ƒ method: define si se pone un símbolo ("circle", "square", "color",
"shade", "ellipse" o "pie") o un número en cada correlación
("number"): method = "circle”.
ƒ type: especifica si se pinta todo el gráfico "full", la parte inferior
"lower" o la parte superior "upper": type = "full".
ƒ title: título del gráfico: title = "".
ƒ diag: si es TRUE se representa la diagonal: diag = TRUE.
ƒ outline: especifica si se pinta el borde del símbolo: outline = FALSE.
ƒ addgrid.col: color de la trama: addgrid.col = "gray".
ƒ order: orden de las variables: "original", "alphabet", en función de la
primera componente principal "FPC" y orden de clasificación jerárquica
si order = "hclust": order = "original".
ƒ hclust.method: método del dendograma si order = "hclust":
hclust.method = "complete".
ƒ addrect: número de rectángulos de dendograma si order = "hclust":
addrect = NULL.
ƒ rect.col y rect.lwd: color y grosor de las líneas de los rectángulos si
order = "hclust", respectivamente: rect.col ="black" y rect.lwd =
2.
ƒ addtextlabel: posición de las etiquetas de las variables donde "lt" es
arriba/izquierda, "ld" es izquierda/diagonal, "td" arriba/diagonal, "d"
es diagonal y "no" no se muestran las etiquetas: addtextlabel = "lt".
ƒ tl.cex, tl.col y tl.offset: tamaño, color y separación de las etiquetas
de las variables, respectivamente: tl.cex = 1, tl.col = "red" y
tl.offset = 0.4.
ƒ addcolorlabel: posición donde representa la barra con el rango de
colores de las correlaciones: "right", "bottom" o "no": addcolorlabel
= "right".
ƒ cl.length, cl.cex, cl.ratio, cl.align.text y cl.offset: número de eti-
quetas, tamaño de las etiquetas, proporción de la barra con respecto
al gráfico, alineación de las etiquetas (izquierda "l", centro "c" o dere-
cha "r") y separación de las etiquetas en la barra de correlaciones,
respectivamente: cl.length = 11, cl.cex = 0.8, cl.ratio = 0.15,
cl.align.text= "c" y cl.offset =0.5.
ƒ addshade: si method="shade" con "all" todas las correlaciones se
sombrean, con "positive" las positivas y con "negative" las negativas:
addshade = "negative".
ƒ shade.lwd y shade.col: grosor y color de la línea de sombra, res-
pectivamente: shade.lwd = 1 y shade.col = "white".
ƒ p.mat: matriz con los valores de probabilidad. Si es NULL, los argu-
mentos sig.level, insig, pch, pch.col, pch.cex no se utilizan: p.mat =
NULL.
ƒ sig.level: nivel de significación que se utiliza para definir que correla-
ciones se marcan como no significativas en el gráfico. Si valor de
probabilidad en p.mat es mayor que sig.level, la correlación se señala
como no significativa: sig.level = 0.05.
ƒ insig: método para señalar las correlaciones no significativas: con un
símbolo "pch", se dejan en blanco "blank" o no se hace nada "no":
insig = "pch".
GRÁFICOS AVANZADOS
151

Función corrplot (Continuación)

ƒ pch, pch.col y pch.cex: tipo, color y tamaño del símbolo que se


pone si la correlación es no significativa: pch = 4, pch.col = "black"
y pch.cex = 3.
ƒ plotCI: modo de representar el intervalo de confianza que puede ser
"no", "square", "circle" o "rect": plotCI = "no".
ƒ lowCI.mat y uppCI.mat: matrices con los valores inferiores y supe-
riores del intervalo de confianza: lowCI.mat = NULL y uppCI.mat =
NULL.

Se pueden usar los argumentos generales mar, add y col.

La función «SplomT()» del paquete “cwhmisc” (Hoffmann, 2012) hace una


representación semejante, pero añade el diagrama de dispersión para cada par
de variables. Las instrucciones están el script III.10.R. Se usa es mismo ejem-
plo de antes con medidas morfométricas de peces, cuyos datos están en el ar-
chivo Morfología.csv.
Después de importar los datos se selecciona solo la familia de peces
Sphyraenidae y las variables que están en las columnas 5 a 15, que se guardan
en «datos1». Con el argumento «hist="b"» se especifica que el gráfico de la
diagonal sea un histograma y la curva de densidad de los datos. Con «cex.diag»
y «h.diag» se define el tamaño y la posición vertical de las etiquetas que mues-
tran las variables en la diagonal. Con «cex.diag» se define el color de las barras
del histograma. Con «colYonX» y «colXonY» se definen los colores de la línea
de suavizado que se representa para las variables x e y, respectivamente.

¾ library(cwhmisc)
¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ datos1 <- datos[Familia=="Sphyraenidae",5:15]
¾ SplomT(datos1, mainL = "Familia Sphyraenidae", xlabL="Variables
morfométricas", hist="b", cex.diag = 0.6, h.diag=0.4, hist.col="green",
colYonX = "red", colXonY = "blue")

Función SplomT (paquete cwhmist)

ƒ data: data frame con las variables a correlacionar.


ƒ mainL: título del gráfico.
ƒ xlabL: leyenda del eje x.
ƒ hist: tipo de gráfico de la diagonal: "h" es histograma, "d" es curva
de densidad y "b" son ambos gráficos: hist = "h".
ƒ hist.col: color de las barras del histograma.
ƒ cex.diag: tamaño de las etiquetas que muestran las variables en la
diagonal: cex.diag = 1.
ƒ h.diag: posición vertical de las etiquetas que muestran las variables
en la diagonal: h.diag=0.4.
ƒ adjust: factor de ajuste de suavizado en la curva de densidad:
adjust = 1.
ƒ colYonX y colXonY: color de la línea de suavizado para la variable y
sobre x, y de x sobre y: colYonX = "red" y colXonY = "blue".
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
152

Familia Sphyraenidae

M2 -0.41 0.41 0.37 -0.23 -0.38 0.69 -0.49 -0.49 0.4 -0.07

M3 -0.71 -0.23 0.69 0.54 -0.46 0.66 0.58 -0.52 -0.19

M4 0.17 -0.76 -0.69 0.49 -0.82 -0.79 0.72 0.24

M5 0.65 -0.12 -0.36


-0.02 -0.06 -0.06 -0.03

M6 0.78 -0.24 0.83 0.79 -0.58 -0.4

M7 -0.39 0.88 0.93 -0.57 -0.38

M8 -0.41 -0.43 0.33 -0.16

M9 0.97 -0.75 -0.38

M10 -0.72 -0.38

M11 0.24

M12

III.9. Diagramas de Venn y Euler

Estos diagramas se usan para mostrar gráficamente la agrupación entre con-


juntos, representando cada conjunto mediante un círculo o una elipse. La posi-
ción relativa en el plano de tales círculos muestra la relación entre los conjuntos.
Se puede usar la función «venneuler()» del paquete “venneuler” y, para su
correcto funcionamiento, quizás sea necesario instalar tambien el paquete
“rJava” (Urbanek, 2012), si no lo hace automáticamente. Las instrucciones están
en el script III.11.R.
La forma más fácil de realizar el diagrama es como se muestra a continua-
ción. Simplemente hay que definir en un vector, el tamaño relativo de los con-
juntos, por ejemplo «A=0.1», y el grado de solapamiento ente cada uno de ellos,
por ejemplo «"C&D"=0.4».
Debido a que el dispositivo (device) de exportación a la pantalla
«windows()» a veces no reconoce la semi-transparencia, si se exporta el
GRÁFICOS AVANZADOS
153

gráfico a la pantalla, como hacemos siempre por defecto, luego al copiar como
metafile o bitmap y pegarlo en otro sitio, no se verá el gráfico debido al problema
de la semi-transparencia. Por ello, en este caso se especifica que se exporte a
otro dispositivo, en concreto a un archivo png, del cual se puede importar el
gráfico posteriormente desde cualquier otro programa (véase el Capítulo I para
más información sobre los tipos de dispositivos de exportación de gráficos).

¾ library(venneuler)
¾ vd <- venneuler(c(A=0.1, B=0.5, C=1.1, D=3.4, "A&B"=0, "A&C"=0.1,
"B&C"=0.5, "C&D"=0.4))
¾ png(filename="Venn y Euler.png", units="px", width = 1200, height = 1200,
pointsize=24)
¾ plot(vd,main="Diagrama de Venn y Euler",cex.main=2.2)
¾ dev.off()

III.10. Gráficos de variables cualitativas en función


de variables cuantitativas

La función «plot.freqMAP()» del paquete “freq.MAP” (Payami y col. 2009;


McCulloch, 2012) permite representar frecuencias en función de una variable
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
154

cuantitativa, y comparar la razón de ventajas (odds ratio) para ver si existen


diferencias significativas. Las instrucciones están en el script III.12.R.
El ejemplo, el cual está en el archivo Color.csv, contiene datos del color del
cuerpo (rojo y azul) y del pico (rojo y azul), y la combinación de ambos en lo que
se define como patrón de color, de dos especies de aves.
Después de cargar los paquetes e importar los datos, con la función
«write.dbf()» del paquete “foreign” (DebRoy y Bivand, 2012), se graban los da-
tos en otro archivo con extensión dbf para pasar las variables que son factor a
carácter. Posteriormente con la función «read.dbf()» se vuelve a cargar ese
archivo con extensión dbf y se guarda como «datos1».
Con la función «freqMAP()» se convierten los datos en un objeto con la es-
tructura que requiere la función «plot.freqMAP()». Se hace un objeto para la
especie 1 «fm.Sp1» y otro para la especie 2 «fm.Sp2», usando la variable cuali-
tativa patrón de color, que combina color del cuerpo y del pico, y la cuantitativa
latitud. En el primer panel gráfico se evalúan las diferencias en el patrón de co-
lor, es decir, la combinación de color del cuerpo y del pico a lo largo de diferen-
tes latitudes.
En la función «plot.freqMAP()», el argumento lógico «show.p.value.
legend» define si se ponen en una leyenda los niveles de significación emplea-
dos. El método utiliza un procedimiento bayesiano para estimar los parámetros
de la distribución multinomial, que luego le sirve para encontrar los límites de
confianza y valores p mediante un algoritmo que utiliza técnicas de remuestreo
(bootstrap), es decir, genera un número elevado de muestras aleatorias (apa-
rentemente 100.000) y calcula con ellas los límites y valores p. Con «type» se
define el tipo de gráfico que puede ser "freq" o "or". El argumento
«p.value.bar.alpha» es un vector con dos valores que son las probabilidades de
corte que se usan para contrastar la significanción y se muestran en las barras
inferiores. En este ejemplo se representan tres grupos: CuerpoAPicoR,
CuerpoRPicoA y CuerpoRPicoR.

¾ library(foreign); library(freqMAP)
¾ datos<-read.csv2("Color.csv",header=TRUE,encoding= "latin1")
¾ write.dbf(datos, "Color.dbf", factor2char = TRUE, max_nchar = 254)
¾ datos1<-read.dbf("Color.dbf",as.is=TRUE)
¾ attach(datos1)
¾ fm.Sp1 <- freqMAP(datos1[Especie=="Sp1",c("Lat","Patrón")], x=seq(0,20,
by=5), x.label="Latitud",hw=5)
¾ fm.Sp2 <- freqMAP(datos1[Especie=="Sp2",c("Lat","Patrón")], x=seq(0,20,
by =5), x.label="Latitud",hw=5)
¾ windows(9,12)
¾ plot.freqMAP(fm.Sp1, fm.Sp2, legend=c("Especie 1", "Especie 2"),
show.p.value.legend=TRUE, type="freq", p.value.bar.alpha = c(0.05, 0.01),
cex=2, cex.axis=1.6, cex.lab= 1.6, cex.main =2, pch.x=17, pch.y=16,
cex.legend=1.5)

El panel gráfico que se obtiene muestra que hay diferencias entre las dos es-
pecies en el gradiente latitudinal, en el patrón de color cuerpo azul/pico rojo, y
en el patrón cuerpo rojo/pico azul. Sin embargo, la proporción de individuos fue
igual (sin diferencia estadísticamente significativa) lo largo del gradiente latitudi-
nal en el patrón cuerpo rojo/pico rojo.
GRÁFICOS AVANZADOS
155

"CuerpoAPicoR"

Especie 1

0.8
Freq. Especie 2
0.4

p < 0.05
p < 0.01
0.0

0 5 10 15 20
Latitud

"CuerpoRPicoA"
0.0 0.2 0.4 0.6 0.8

Especie 1
Especie 2
Freq.

p < 0.05
p < 0.01

0 5 10 15 20
Latitud

"CuerpoRPicoR"
0.8

Especie 1
Especie 2
0.6
Freq.
0.4
0.2

p < 0.05
p < 0.01
0.0

0 5 10 15 20
Latitud

Si en el script anterior se usa «type="or"» en vez de «type="freq"» se ob-


tiene el segundo panel gráfico en el que se representan las OR (odds ratio o
razón de predominios) para cada par de categorías de la variable de recuento,
comparando las dos especies. Hay que eliminar también el argumento «legend»
ya que no se utiliza cuando «type="or"». Así, en el primer gráfico del panel se
muestra la relación de predominios entre las categorías cuerpo rojo/pico azul y
cuerpo azul/pico rojo entre la especie 1 y la especie 2. Un valor OR > 1 indica
que en la especie 1 predomina la primera categoría sobre la segunda (cuerpo
rojo/pico azul sobre cuerpo azul/pico rojo) en mayor medida que en la especie 2.
El trazo gris claro (nivel de significación 0,05) u oscuro (nivel de significación
0,01) en la parte baja del gráfico muestra que la OR es significativamente dis-
tinta de 1 y, por lo tanto, el patrón de colores está relacionado con la especie,
para algunos valores de la variable continua, en este caso la latitud, pero no para
otros. Las líneas continuas de color rojo muestran los límites de confianza para
la OR, que ayudan a interpretar los resultados. Cuando el valor OR=1, el trazo
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
156

grueso horizontal está dentro del intervalo, podemos aceptar que el patrón de
colores de cuerpo y pico no está relacionado con la especie.

"CuerpoRPicoA" vs. "CuerpoAPicoR"


1e+02
OR

p < 0.05
1e-02

p < 0.01

0 5 10 15 20
Latitud

"CuerpoRPicoR" vs. "CuerpoAPicoR"


1e+02
OR

p < 0.05
1e-02

p < 0.01

0 5 10 15 20
Latitud

"CuerpoRPicoR" vs. "CuerpoRPicoA"


1e+02
OR

p < 0.05
1e-02

p < 0.01

0 5 10 15 20
Latitud

En el tercer panel gráfico se cuantifican los cambios considerando los colores


de cuerpo y pico por separado, de nuevo a lo largo del gradiente latitudinal. En
primer lugar se estructura la matriz de datos de tal forma que las variables color
del cuerpo y color del pico se ponen en una sola variable que se denomina
«Patrones» y ese nuevo conjunto de datos se asigna a «datos2».

¾ datos2 <- rbind(cbind(datos1[,c("Lon", "Lat", "Especie")], Patrones =


Cuerpo, stringsAsFactors= FALSE), cbind(datos1[,c("Lon", "Lat",
"Especie")], Patrones= Pico, stringsAsFactors=FALSE))
¾ attach(datos2)
GRÁFICOS AVANZADOS
157

¾ fm1.Sp1 <- freqMAP(datos2[Especie=="Sp1",c("Lon","Patrones")],


x=seq(0,20, by=5), x.label = "Latitud",hw=5)
¾ fm1.Sp2 <- freqMAP(datos2[Especie=="Sp2",c("Lon","Patrones")],
x=seq(0,20, by=5), x.label="Latitud",hw=5)
¾ windows(10,12)
¾ plot.freqMAP(fm1.Sp1,fm1.Sp2,legend=c("Especie 1","Especie 2"),
show.p.value.legend=FALSE, type="freq", p.value.bar.alpha = c(0.05, 0.01),
cex=2,cex.axis=1.6, cex.lab= 1.6, cex.main =2, pch.x=17, pch.y=16,
cex.legend=1.5)

Ahora no se observan diferencias significativas en el color del pico o del


cuerpo entre las dos especies. Por lo tanto, es la combinación de colores del
cuerpo y pico lo que cambia entre especies en el gradiente latitudinal y no los
colores por separado.

"CuerpoA"
0.4

Especie 1
Freq.
0.2

Especie 2
0.0

0 5 10 15 20
Latitud

"CuerpoR"
0.5

Especie 1
Freq.

Especie 2
0.2

0 5 10 15 20
Latitud

"PicoA"

Especie 1
0.4
Freq.

Especie 2
0.1

0 5 10 15 20
Latitud

"PicoR"
0.4

Especie 1
Freq.

Especie 2
0.1

0 5 10 15 20
Latitud
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
158

Función plot.freqMAP (paquete freq.MAP)

ƒ x,y: objetos freqMAP, generalmente obtenidos con la función


freqMAP().
ƒ legend: vector que puede tener dos caracteres con la leyenda de x e
y, que no se utiliza si type=”or”: legend = NULL.
ƒ show.p.value.legend: si es TRUE se muestran los valores p
bayesianos en una leyenda: show.p.value.legend = FALSE.
ƒ type: tipo de gráfico que puede ser "freq" o "or": type = "freq".
ƒ p.value.bar.alpha: un vector con dos valores que son las probabi-
lidades de corte que se usan para contrastar la significación y se
muestran en las barras inferiores: p.value.bar.alpha = c(0.05,
0.01).
ƒ p.value.bar.color: colores de las probabilidades que se muestran en
las barras inferiores: p.value.bar.color=c("gray90","darkgray").
ƒ pch.x: tipo de símbolo de x: pch.x=2.
ƒ lty.x: tipo de línea para los intervalos de confianza de x: lty.x=1.
ƒ lwd.x: grosor de línea para los intervalos de confianza de x:
lwd.x=1.
ƒ col.x: color de los símbolos de x: col.x="red".
ƒ pch.y: tipo de símbolo de y: pch.y=1.
ƒ lty.y: tipo de línea para los intervalos de confianza de y: lty.y=2.
ƒ lwd.y: grosor de línea para los intervalos de confianza de y:
lwd.y=1.
ƒ col.y: color de los símbolos de y: col.y="blue".
ƒ cex.legend: tamaño de texto de la leyenda: cex.legend=1.
ƒ layout.matrix: estructura del panel. Por ejemplo, si antes se pone la
función par(ask=TRUE), layout.matrix=c(1,1) graficaría solamente
una figura de cada vez, en vez de poner todas las figuras en la misma
ventana. En caso de no especificar nada, se muestran todas las figu-
ras en forma vertical: layout.matrix = NULL.

Se pueden usar los argumentos generales cex, cex.axis, cex.lab,


cex.main, xlim e ylim.

III.11. Distribuciones de variables cualitativas

La función «cd_plot()» permite representar como varía una variable cualita-


tiva en función de una variable cuantitativa. La función «spine()» también per-
mite ver la distribución de una variable cualitativa en base a cambios en una
cuantitativa, mostrando ésta en forma de intervalos. Ambas funciones están en
el paquete “vcd” (Meyer y col., 2012). Las instrucciones están en el archivo
III.13.R. Se usa el ejemplo del archivo Tabla de vida.csv, en el cual hay datos
de la edad a la que murieron mujeres y hombres en Vigo (España) en el año
2010.
Para el primer gráfico en la función «cd_plot()» se pone la fórmula con las
variables a representar, donde la primera variable es la categórica. Con el argu-
mento «bw» se especifican parámetros para la obtención de la función de densi-
dad y las distintas opciones disponibles se pueden consultar en la función
GRÁFICOS AVANZADOS
159

«density()». En la representación se observa como hasta los 78 años la propor-


ción de sexos es más o menos equilibrada pero, a partir de esa edad, mueren
más hombres que mujeres y el porcentaje de mujeres es claramente superior.

¾ library(vcd)
¾ datos<-(read.csv2("Tabla de vida.csv", header=TRUE, encoding= "latin1"))
¾ attach(datos)
¾ cd_plot(Sexo ~ Edad, data = datos, main="TABLA DE VIDA", bw = 3,
xlab="Edad (años)")
TABLA DE VIDA

0.8
Mujer

0.6
Sexo

0.4
Hombre

0.2

0
30 40 50 60 70 80 90 100

Edad (años)

Función cd_plot (paquete vcd)

ƒ x e y: variables a representar. También se puede poner una fórmula


del tipo y ~ x.
ƒ data: opcionalmente se puede indicar el data frame con los datos.
ƒ ylab_tol: valor numérico para separar etiquetas en el eje y si sola-
pan: ylab_tol = 0.05.
ƒ n: número de puntos espaciados equidistantemente para los cuales se
estima la densidad: n = 512.
ƒ bw: tipo de alisado en la estimación de la función de densidad. Las
distintas opciones disponibles se pueden consultar en el menú de
ayuda de la función density(): bw = "nrd0".
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
160

Función cd_plot (Continuación)

ƒ from y to: extremos izquierdo y derecho que limitan el rango para


calcular la densidad: from = NULL y to = NULL.
ƒ margins: márgenes del gráfico: margins = c(5.1, 4.1, 4.1, 3.1).
ƒ gp: parámetro que permite con la función gpar() modificar el patrón
de colores: gp = gpar().
ƒ newpage: si es TRUE es un gráfico nuevo que elimina cualquier otro
anterior: newpage = TRUE.
ƒ pop: si es TRUE las características de la ventana de visualización se
quitan después de crear el gráfico: pop = TRUE.

Se pueden usar los argumentos generales main, xlab e ylab.

En el segundo gráfico se usa la función «spine()», en la cual con el argu-


mento «break» se define el número de intervalos en la variable del eje x.

¾ spine(Sexo ~ Edad, data = datos, main="TABLA DE VIDA", xlab="Edad


(años)", breaks = 10)
TABLA DE VIDA

0.8
Mujer

0.6
Sexo

0.4
Hombre

0.2

0
20 50 60 70 80 90 100

Edad (años)
GRÁFICOS AVANZADOS
161

Función spine (paquete vcd)

ƒ x e y: variables a representar. También se puede poner una fórmula


del tipo y ~ x.
ƒ breaks: número de intervalos que se desea en la variable del eje x:
breaks = NULL.
ƒ off: desplazamiento vertical entre barras (en porcentaje): off =
NULL.
ƒ name: nombre del gráfico: name = "spineplot".

El resto de argumentos ylab_tol, margins, gp, newpage y pop se


explicaron en la función cd_plot(). Se pueden usar los argumentos
generales main, xlab, ylab e ylim.

III.12. Gráficos para tablas de contingencia

Otra función para variables cualitativas es «assoc()» del paquete “vcd”


(Meyer y col., 2003; Meyer y col., 2006; Meyer y col., 2012), que permite repre-
sentar tablas de contingencia 2xk. En el archivo Fumador.csv hay datos del
grado en que fuman hombres y mujeres, en diferentes centros de trabajo y en
función de sí los padres fumaban o no. Las instrucciones están en el archivo
III.14.R.
Después de importar los datos y cargarlos en memoria, con la función
«with()» se transforman en una tabla. Con esta función se puede poner el orden
que se desee en la tabla, independientemente del orden de las variables en los
datos.
Posteriormente se genera la tabla de contingencia con «margin.table()» en
la cual se ha seleccionado la variable que indica si los padres fuman (columna 3
en la tabla anteriormente creada) y el grado de fumador (columna 4 en la tabla
anteriormente creada).
En la función «assoc()» se introduce la tabla de contingencia, en este caso
«TC». El paquete “vcd” (Meyer y col., 2003; Meyer y col., 2006; Meyer y col.,
2012) tiene una forma particular de modificar la posición, tipo de letra, tamaño
de letra, etc. de los títulos y leyendas de los ejes. Por ejemplo, para modificar el
tipo y tamaño de letra del título, leyenda de las variables y leyenda de las cate-
gorías de las variables se usan los argumentos «main_gp», «gp_varnames» y
«gp_labels», respectivamente. En todos ellos se debe hacer con «gpar» si se
introducen varias modificaciones. La posición y rotación de los textos se modifica
con «labeling_args». Para la posición se utiliza «offset_» seguido de
«varnames» o «labels» si es para las leyendas de las variables o de las cate-
gorías de las variables, respectivamente. Para la rotación «rot_» y de nuevo
seguido de «varnames» o «labels».

¾ library(vcd)
¾ datos<-(read.csv2("Fumador.csv", header=TRUE, encoding="latin1"))
¾ attach(datos)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
162

¾ tabla<-with(datos, table(Sexo, Trabajo, Padres, Grado))


¾ TC <- margin.table(tabla, c(3, 4))
¾ assoc(TC,main = "RELACIÓN ENTRE GRADO FUMADOR Y PADRES
FUMADORES", main_gp=gpar(fontsize = 20, fontface = 2), gp_varnames =
gpar(fontsize = 20, fontface = 2), gp_labels=gpar(fontsize = 17, fontface =
2), labeling_args = list(offset_varnames = c(left = -0.5,top = -0.5),
offset_labels = c(top=-0.3), rot_labels = c(left=0)))

En el gráfico 1, las barras indican si la categoría está por debajo o por encima
de la media (línea discontinua). Se observa como el número de no fumadores en
los padres que no fuman es muy superior al de fumadores. Además se observa
que en todas las categorías que fuman, el número de individuos es menor en el
caso de padres no fumadores. Por tanto, parece ser que el hecho de que los pa-
dres no fumen favorece que tampoco fumen los hijos.

RELACIÓN ENTRE GRADO FUMADOR Y PADRES FUMADORES


Grado
1 a 10 cigarrillos 11 a 20 cigarrillos De 1 a 2 cajetillas Más de 2 cajetillas No fuma

No
Padres

Si

El grafico 2 es exactamente igual al anterior, con la simple modificación de


introducir el argumento «shade=TRUE». Con este argumento se consigue que
aparezcan los resultados de estadístico F2 de Pearson, y se sombrean las cate-
gorías que son significativamente diferentes. Se confirma que el número de no
fumadores es significativamente mayor en el grupo de padres no fumadores.

¾ assoc(TC, shade=TRUE, main = "RELACIÓN ENTRE GRADO


FUMADOR Y PADRES FUMADORES", main_gp=gpar(fontsize = 20,
fontface = 2), gp_varnames = gpar(fontsize = 20, fontface = 2),
gp_labels=gpar(fontsize = 17, fontface = 2), labeling_args =
list(offset_varnames = c(left = -0.5,top = -0.5), offset_labels = c(top=-0.3),
rot_labels = c(left=0)))
GRÁFICOS AVANZADOS
163

RELACIÓN ENTRE GRADO FUMADOR Y PADRES FUMADORES


Grado
1 a 10 cigarrillos 11 a 20 cigarrillos De 1 a 2 cajetillas Más de 2 cajetillas No fuma

Pearson
residuals:
5.26

4.00

No

2.00
Padres

0.00

-2.00

Si

-4.10
p-value =
2.4744e-11

En el gráfico 3 se comprueba la capacidad de la función «assoc()» para


representar tablas de contingencia 2xk, ya que se representan las tres variables:
si los padres fuman, el grado de fumador y los centros de trabajo. El único ar-
gumento nuevo es «tl_», el cual se resalta en negrita, y que define si se repre-
sentan o no las leyendas de variables «varnames» y/o de categorías «labels».

¾ assoc(aperm(tabla), expected = ~ (Grado + Padres) * Trabajo, main =


"RELACIÓN ENTRE GRADO FUMADOR, PADRES FUMADORES Y
CENTROS DE TRABAJO", main_gp=gpar(fontsize = 20, fontface = 2),
gp_varnames = gpar(fontsize = 20, fontface = 2), gp_labels=gpar(fontsize =
12, fontface = 2), labeling_args = list(just_labels = c(Grado = "left"),
offset_labels = c(right = 0.5), offset_varnames = c(right = 1.5,left=-0.5,top=-
0.5), rot_labels = c(right = 0), tl_varnames = c(Grado = TRUE)))
RELACIÓN ENTRE GRADO FUMADOR, PADRES FUMADORES Y CENTROS DE TRABAJO
Padres
No Si
Más de 2 cajetillas De 1 a 2 cajetillas 11 a 20 cigarrillos 1 a 10 cigarrillos

Centro 1
Centro 2 Pearson
Centro 3 residuals:
4.27
Centro 4
4.00

Centro 1
Centro 2
Centro 3
Centro 4

2.00
Centro 1
Centro 2
Trabajo

Centro 3
Grado

Centro 4

Centro 1
Centro 2
0.00
Centro 3

Centro 4

Centro 1
No fuma

Centro 2 -2.00

-2.42
Centro 3
p-value =
4.1155e-12
Centro 4

Hombre Mujer Hombre Mujer


GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
164

En el gráfico 4, se observa que con la función «mosaicplot()» del paquete


“graphics” es posible obtener una representación similar. Con el argumento
«type» se especifica el tipo de residuo que se quiere mostrar. Con «cex.axis»
se puede modificar el tamaño de las etiquetas de las variables. El argumento
«dir» es un vector que indica si se representa primero en vertical «"v"» u hori-
zontal «"h"». Con «off» se especifica el espacio entre los niveles del mosaico.

¾ par(cex.lab=1.5)
¾ mosaicplot(Padres ~ Grado, main="RELACIÓN ENTRE GRADO
FUMADOR Y PADRES FUMADORES", shade = TRUE, type="pearson",
cex.axis=0.8, dir=c("v","h"), off=c(5,15))

RELACIÓN ENTRE GRADO FUMADOR Y PADRES FUMADORES

No Si
1 a 10 cigarrillos

>4
2:4
11 a 20 cigarrillos

0:2
Más de 2 cajetillas De 1 a 2 cajetillas
Grado

-2:0
-4:-2
<-4
No fuma

Standardized
Residuals:

Padres
GRÁFICOS AVANZADOS
165

Función assoc (paquete vcd)

ƒ x: tabla de contingencia.
ƒ row_vars: vector con las variables de las filas: row_vars = NULL.
ƒ col_vars: vector con las variables de las columnas: col_vars =
NULL.
ƒ compress: si es TRUE el espacio entre filas y columnas es fijo:
compress = TRUE.
ƒ xlim e ylim: vector con el número de columnas y filas: xlim = NULL
e ylim = NULL.
ƒ spacing: función que define los espacios entre los elementos del
gráfico: spacing = spacing_conditional(sp = 0).
ƒ spacing_args: lista de argumentos para la función a colocar en
spacing: spacing_args = list().
ƒ split_vertical: si es TRUE se despliega la variable en columnas, si es
FALSE en filas : split_vertical = NULL.
ƒ keep_aspect_ratio: si es TRUE la razón de aspecto se mantiene
constante: keep_aspect_ratio = FALSE.
ƒ xscale e yspace: añade espacios adicionales entre los rectángulos:
xscale = 0.9 e yspace = unit(0.5, "lines").

Función mosaicplot (paquete graphics)

ƒ x: tabla de contingencia o fórmula.


ƒ sort: vector para ordenar las variables: sort = NULL.
ƒ off: vector indicando el porcentaje de separación entre los niveles del
mosaico: off = NULL.
ƒ dir: vector con el orden de orientación, primero vertical y luego hori-
zontal c("v", "h") o viceversa: dir = NULL.
ƒ color: vector con los colores para el sombreado: color = NULL.
ƒ shade: si es TRUE se ponen los valores de los residuos: shade =
FALSE.
ƒ margin: lista de vectores con los valores de los márgenes en un mo-
delo logarítmico: margin = NULL.
ƒ cex.axis: tamaño de letra de las etiquetas de las variables: cex.axis
= 0.66.
ƒ type: define el tipo de residuos: "pearson" (Chi cuadrado de Pearson),
"deviance" (razón de verosimilitud Chi cuadrado), o "FT" (residuos de
Freeman-Tukey).

III.13. Gráficos para grandes conjuntos de datos

Uno de los problemas que se plantea al realizar una gráfica cuando hay mu-
chos datos es que no es posible tener una idea de cuantos datos hay en las
zonas en las que hay solapamiento. El paquete “IDP.misc” (Locher y col., 2012)
tiene varias funciones para realizar diferentes tipos de gráficos específicos para
series con muchos datos.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
166

III.13.1. DISPERSIÓN

Se utiliza la función «iplot()» del paquete “IDP.misc” (Locher y col., 2012).


Las instrucciones están en el script III.15.R. Los datos, que están en el archivo
Clima.csv, son valores mensuales de temperatura del agua y del aire, y la in-
tensidad del viento de este a oeste (Viento.X) y de sur a norte (Viento.Y) a 42º
norte y 10º oeste, desde 1925 a 1997.
En primer lugar se representa un gráfico en el cual la barra de colores no
tiene una escala del número de datos que se solapan. En la función «iplot()», el
argumento «pixs» define el tamaño del píxel en mm y «d.main» la distancia del
título al gráfico. A la vez que se representa este primer gráfico, ya se calcula el
número máximo de datos que se solapan por píxel y se guarda en «zmax».

¾ library(IDPmisc)
¾ datos<-read.csv2("Clima.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ zmax<-iplot(Temperatura.agua,Temperatura.aire, pixs=3, d.main=1, xlab=
"Temperatura del agua (ºC)", ylab="Temperatura del aire (ºC)", cex.lab=1.5,
main="42º Norte 10º Oeste", cex.main=1.7)

En el siguiente gráfico, con el argumento «zmax=zmax» se define el máximo


valor en la escala de colores del número de datos que se solapan por píxel. Con
«border=T» se especifica que se represente un borde separando cada color en
la barra de colores.
GRÁFICOS AVANZADOS
167

¾ iplot(Temperatura.agua,Temperatura.aire,zmax=zmax, pixs=3, d.main=1,


xlab="Temperatura del agua (ºC)", ylab="Temperatura del aire (ºC)",
cex.lab=1.5,main="42º Norte 10º Oeste", cex.main=1.7, border=T)

III.13.2. MATRICES DE GRÁFICOS

Se utiliza la función «ipairs()» del paquete “IDP.misc” (Locher y col., 2012).


Las instrucciones están en el script III.16.R. Se utilizan de nuevo los datos
climáticos que están en el archivo Clima.csv.
Después de importar los datos se seleccionan las variables de temperatura y
viento, en las columnas 3 a 6. Al igual que antes, en primer lugar se representa
un gráfico en el cual la barra de colores no tiene una escala del número de datos
que se solapan.

¾ library(IDPmisc)
¾ datos<-read.csv2("Clima.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ datos1<-datos[ ,3:6]
¾ zmax <- ipairs(datos1, pixs=2, main="42º Norte 10º Oeste", d.main=1)
¾ ipairs(datos1, pixs=2, zmax=zmax, main="42º Norte 10º Oeste",d.main=1,
border=T)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
168
GRÁFICOS AVANZADOS
169

Funciones iplot e ipairs (paquete IDP.misc)

ƒ x, y: variables para los ejes x e y.


ƒ pixs: tamaño del píxel en mm: pixs = 1.
ƒ zmax: máximo número de puntos que se solapan por píxel: zmax =
NULL.
ƒ ztransf: función para transformar el número de puntos por pixel para
definir los colores: ztransf = function(x){x}.
ƒ colramp: escala de colores de la barra: colramp = IDPcolorRamp.
ƒ d.main: distancia vertical entre el título y el gráfico: d.main = 1.
ƒ legend: si es TRUE se muestra la barra de colores: legend = TRUE.
ƒ d.legend: distancia horizontal entre la leyenda y el borde derecho del
gráfico: d.legend = 1.
ƒ nlab.yaxis y nlab.xaxis: número de marcas de etiquetas en los ejes:
nlab.xaxis = 5 y nlab.yaxis = 5.
ƒ minL.axis: longitud mínima de las abreviaturas de los niveles del fac-
tor, que se utiliza para etiquetar los ejes: minL.axis = 3.
ƒ border: si es TRUE se pinta un borde separando cada color en la ba-
rra de colores: border = FALSE.

En el caso de la función ipairs() se pone una matriz o data frame en vez


de los valores de x e y, se utiliza nlab.axis en vez de nlab.yaxis y
nlab.xaxis y se añaden los siguientes argumentos:

ƒ lab.diag: etiquetas de las columnas de la matriz, que se ponen en la


diagonal.
ƒ cex.diag: tamaño de las etiquetas de la diagonal en relación al valor
de cex.

Se pueden usar los argumentos generales main, cex, cex.main, cex.lab,


cex.axis, xlab, ylab, las, tcl y mgp.

III.13.3. ESPECTROS

Los espectros suelen también tener muchos datos y a veces es necesario


identificar picos, lo cual se puede hacer con la función «peaks()» del paquete
“IDP.misc” (Locher y col., 2012). Las instrucciones están en el script III.17.R.
Los datos, que están en el archivo Espectro.csv, consisten en un cromatograma
usando HPLC de pigmentos de la especie Alexandrium minutum.
Después de importar los datos, en el primer gráfico se carga el paquete y se
seleccionan solamente aquellos pigmentos que tengan una absorbancia mayor de
0,0003 y menor de 0,01 y se guardan en «MS1». En la función «peaks()», el
argumento «minPH» define la absorbancia mínima, «minPW» la anchura
mínima y «thr» el umbral mínimo por debajo del cual la señal no se procesa.
Los textos que identifican cada uno de los picos se ponen con la función
«text()», en la cual las coordenadas que posicionan los textos se especifican
usando la información obtenida con la función «peaks()».
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
170

¾ datos<-read.csv2("Espectro.csv", header=TRUE, encoding="latin1")


¾ attach(datos)
¾ library(IDPmisc)
¾ MS1 <- (datos[Abs>0.0003&Abs<0.01,])
¾ Peaks <- peaks(MS1, minPH=0.0005, minPW=0.06, thr=0.0005)
¾ plot(Tiempo, Abs, type="l", xlab="Tiempo (minutos)", ylab="Absorbancia a
440 nm", cex.lab=1.5, ylim=c(0,0.01), cex.axis=1.3)
¾ points(Peaks,pch=21, bg="green", cex=1.5)
¾ text(Peaks[c(1,2,3,6),],labels=c(expression(paste("Chl ",c["2"])), "Peridina",
"Diadinoxantina", "Chl a"), pos=3, offset=0.6)
¾ text(Peaks[c(4,5),], labels = c("Diadinoxantina", "Dinoxantina"), pos=4,
offset=0.6)
¾ mtext(text = expression(paste("Pigmentos de ", italic("Alexandrium
minutum"))), cex=2.3, line=0.6)

Pigmentos de Alexandrium minutum


0.010
0.008

Chl a
Peridina
Absorbancia a 440 nm
0.006

Diadinoxantina
Chl c2
0.004
0.002

Diadinoxantina

Dinoxantina
0.000

0 10 20 30 40
Tiempo (minutos)

En el segundo gráfico se utiliza la función «DrawChromatogram()» del pa-


quete “OrgMassSpecR” (Dodder, 2012), la cual permite colorear los picos. El in-
conveniente que presenta esta función es que hay que especificar los intervalos
de tiempo de cada uno de los picos que se quiere colorear con el argumento
«range». Para poner un color a cada pico es necesario especificar el mismo
número de colores que de picos. En caso de poner solamente un color, todos los
picos tendrán el color especificado. Para poner los textos que indentifican cada
pico se utiliza la información obtenida con la función «peaks()» del paquete
mostrado anteriormente.
GRÁFICOS AVANZADOS
171

¾ library(OrgMassSpecR)
¾ DrawChromatogram(Tiempo, Abs, range = list(start = c(10.85, 13, 23.8, 24.5,
25.7, 33.2), stop = c(11.4, 14.5, 24.5, 25.5, 26.2, 34.5)), xlab="Tiempo
(minutos)", ylab="", color=c("green", "gold1", "goldenrod3", "goldenrod2",
"goldenrod1", "green"), main=expression(paste("Pigmentos de ",
italic("Alexandrium minutum"))), cex.main=2, cex.lab=1.3)
¾ mtext("Absorbancia a 440 nm",2, cex=1.3, line=3.2)
¾ text(Peaks[c(1,2,3,6),],labels=c(expression(paste("Chl ", c["2"])), "Peridina",
"Diadinoxantina", "Chl a"), pos=3, offset=0.6)
¾ text(Peaks[c(4,5),], labels=c("Diadinoxantina", "Dinoxantina"), pos=4,
offset=0.6)

Pigmentos de Alexandrium minutum

Chl a
0.008 Peridina
Absorbancia a 440 nm

0.006

Diadinoxantina
Chl c2

0.004

Diadinoxantina
0.002

Dinoxantina

0.000

0 10 20 30 40

Tiempo (minutos)

III.13.4. GRÁFICOS POLARES

Los datos climáticos o ambientales, en general, son a menudo series con mu-
chos datos, ya que se pueden tomar diariamente, incluso cada hora en muchos
casos.
Los datos que se usan en el ejemplo son de la Agencia Estatal de Meteorología
de España (http://www.aemet.es) y están en el archivo Clima España.csv. Son
valores medios diarios de temperatura (ºC) y velocidad del viento en m s-1, así
como la precipitación diaria en mm, la duración de la insolación en horas y las
presiones mínimas y máximas en hPa, en tres ciudades de España en los años
1990 y 2000. Los datos de temperatura, precipitación y presión por años, meses
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
172

o ciudades se pueden representar facilmente con el gráfico de telaraña mostrado


anteriormente. Los datos de intensidad y dirección del viento se representan
mejor con gráficos polares. Para ello, usaremos la función «polar.plot()» del
paquete “plotrix” (Lemon, 2012). Las instrucciones están en el script III.18.R.
Después de cargar el paquete e importar los datos, se realiza una selección de
los datos en cuatro data frames de tal forma que se coge solamente el año 1990,
las ciudades de Vigo y Huelva, y haciendo la diferenciación entre los meses de
Junio a Agosto (verano) y Diciembre a Enero (invierno). Posteriormente se reali-
zan cuatro gráficos con los cuatro data frames creados anteriormente.
En la función «polar.plot()» con el argumento «start=90» se define que el
primer eje comience a los 90º, y así de esta forma el norte queda hacia arriba en
el gráfico (0º). Con «clockwise» se puede indicar si los grados van cambiando
en el sentido de las agujas del reloj o a la inversa. Con «radial.lim» se definen
los límites de los radios.
Después del tercer gráfico se introduce la función «mtext()» para poner el
texto en el lado izquierdo. Con los argumentos «at» y «padj» se definen la posi-
ción en el gráfico donde queremos escribir el texto y el ajuste del texto perpen-
dicular a la dirección de lectura, respectivamente. De esta forma conseguimos
que el título quede centrado en el panel, entre los cuatro gráficos.

¾ library(plotrix)
¾ datos<-read.csv2("Clima España.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ datos1<-subset(datos[Año==1990 & Ciudad=="Vigo" & Mes %in%
c("6","7","8") ,])
¾ datos2<-subset(datos[Año==1990 & Ciudad=="Huelva" & Mes %in%
c("6","7","8"),])
¾ datos3<-subset(datos[Año==2000 & Ciudad=="Vigo"& Mes %in%
c("12","1","2"),])
¾ datos4<-subset(datos[Año==2000 & Ciudad=="Huelva" & Mes %in%
c("12","1","2"),])
¾ par(mfrow=c(2,2))
¾ polar.plot(datos1$Vel.Viento,datos1$Dir.Viento,main="Vigo (Junio, Julio y
Agosto)", start=90, clockwise=TRUE, lwd=3, line.col=4, radial.lim=c(0,8))
¾ polar.plot(datos2$Vel.Viento,datos2$Dir.Viento,main="Huelva (Junio, Julio
y Agosto)", start=90,clockwise=TRUE,lwd=3,line.col=4,radial.lim=c(0,8))
¾ polar.plot(datos3$Vel.Viento, datos3$Dir.Viento, main="Vigo (Diciembre,
Enero y Febrero)", start=90, clockwise=TRUE, lwd=3, line.col=4,
radial.lim= c(0,8))
¾ mtext(paste("Viento",sep="\n","m/s"), 3, 1, at=11.5, las=1, cex=1.7, font=2,
padj=-0.5)
¾ polar.plot(datos4$Vel.Viento,datos4$Dir.Viento, main="Huelva (Diciembre,
Enero y Febrero)", start=90, clockwise=TRUE, lwd=3, line.col=4,
radial.lim= c(0,8))
GRÁFICOS AVANZADOS
173

Vigo (Junio, Julio y Agosto) Huelva (Junio, Julio y Agosto)


0 0
340 20 340 20
320 40 320 40

300 60 300 60

280 80 280 80
0 2 4 6 8 0 2 4 6 8
260 100 260 100

240 120 240 120

220 140 220 140


200 180 160 Viento 200 180 160
m/s
Vigo (Diciembre, Enero y Febrero) Huelva (Diciembre, Enero y Febrero)
0 0
340 20 340 20
320 40 320 40

300 60 300 60

280 80 280 80
0 2 4 6 8 0 2 4 6 8
260 100 260 100

240 120 240 120

220 140 220 140


200 180 160 200 180 160

Función polar.plot (paquete plotrix)

ƒ lengths: vector numérico o variables a representar.


ƒ polar.pos: vector numérico con posiciones en un rango de 0 a 360º:
polar.pos=NULL.
ƒ labels: etiquetas en la periferia del círculo exterior.
ƒ label.pos: posición de las etiquetas en grados: label.pos=NULL.
ƒ start: posición de inicio de la primera variable: start = 0.
ƒ clockwise: si es TRUE los ángulos se incrementan en el sentido de las
agujas del reloj: clockwise=FALSE.
ƒ rp.type: define si se pinta un polígono "p", radios "r" o símbolos "s":
rp.type="r".

Se pueden usar también los argumentos de la función radial.plot().

III.14. Gráficos para pruebas aleatorias

Las pruebas aleatorias o pruebas permutacionales se basan en la asignación


aleatoria. El estadístico de contraste se obtiene de forma repetida para un
número elevado de permutaciones aleatorias de los datos experimentales
originales. La proporción de valores mayores o iguales al valor obtenido en el
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
174

experimento constituyen el valor p del contraste. Pueden ser uni, bi o


multivariados. La función «biv.test()» del paquete “adehabitat” (Calenge, 2012)
permite hacer pruebas aleatorias bivariadas. Las instrucciones están en el script
III.19.R. En el ejemplo se usan datos de medidas de diferentes peces, que
están en el archivo Morfología.csv, y se selecciona un grupo determinado.
Luego se comprueba si los individuos que están en el archivo Morfología1.csv
pertenecen a la población seleccionada, utilizando los valores de dos variables
para el contraste.
Después de cargar el paquete e importar los datos, se seleccionan los
individuos del género Pagellus. Es necesario crear un data frame con las
variables que se van a usar para determinar si el individuo pertenece a la
población, en este caso las variables M6 y M12. Posteriormente se importa el
archivo, donde están los individuos, tres casos, para los que queremos contrastar
si pertenecen a esa población. Con «length()» obtenemos información del
número de filas de este archivo que usaremos luego para delimitar el bucle. El
argumento «par(ask=T)» da la instrucción de que se pregunte antes de repre-
sentar el gráfico, por ello hay que ir pulsando enter para que vayan saliendo las
diferentes gráficas. En el bucle, en primer lugar se asigna el valor para «point»
que son los valores de M6 y M12 de cada uno de los tres casos que hay en el
archivo Morfología1.csv. En primer valor de «point» será el eje x y el segundo
valor el eje y en el gráfico. En la función «biv.test()» el argumento «point»
tiene los valores de las variables, en este ejemplo M6 y M12, del individuo que se
quiere comprobar si pertenece a la población. Con «points=T» se especifica que
se muestren los puntos en el diagrama de dispersión, que pertenecen en nuestro
ejemplo a los valores de M6 y M12 de las especies del género Pagellus. Con el
argumento «br» se define el número de barras del histograma.

¾ library(adehabitat)
¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding="latin1")
¾ datos1 <- datos[datos$Género=="Pagellus",]
¾ attach(datos1)
¾ dfxy <- data.frame(M6, M12)
¾ datos2<-read.csv2("Morfología1.csv",header=TRUE,encoding="latin1")
¾ attach(datos2)
¾ n<-length(M12)
¾ par(ask=T)
¾ for (i in 1:n){
point = c(datos2[i,"M6"], datos2[i,"M12"])
sub= paste("Género", sep="\n", datos2[i,"Género"])
biv.test(dfxy, point, points=TRUE, Pcol="red", col="lightblue", br=20,
sub=sub, side= "top")}

Se obtienen 3 gráficos. En todos ellos el gráfico de dispersión representa los


valores de las variables M6 y M12 de las especies seleccionadas del género
Pagellus, junto con el histograma y la función de densidad. En el primer caso,
que es un individuo del género Roeboides, se observa que sus valores de M6 y
M12, que se representan por el punto rojo, quedan por fuera de los valores de la
población y, por ello, el test concluye que el individuo no pertenece a la
población con una p < 0,05 para ambas variables. Es decir, no sería un individuo
del género Pagellus, como efectivamente es el caso ya que pertenece al género
GRÁFICOS AVANZADOS
175

Roeboides. En el gráfico dx es la separación entre lineas horizontales y dy la


separación entre líneas verticales de la trama interior del gráfico.

p = 0.012

Género
Roeboides

dx = 0.0048 p = 0.012
dy = 0.0048

El segundo individuo que pertenece al género Boops, la probabilidad es menor


de 0,005 en el caso de la variable M12 y, por tanto, se concluye que no
pertenece a la población de Pagellus.

p = 0.106

Género
Boops

dx = 0.0048 p = 0.035
dy = 0.0048

El tercer y último gráfico, cuyo individuo pertenece al género Pagellus, la


probabilidad es mayor de 0,05 para ambas variables y, por tanto, se concluye
que si pertenece a la población.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
176

p = 0.188

Género
Pagellus

dx = 0.0048 p = 0.494
dy = 0.0048

Función biv.test (paquete adehabitat)

ƒ dfxy: data frame con los valores de las dos variables.


ƒ point: valores de las dos variables anteriores para el individuo a
contrastar.
ƒ br: número de barras del histograma: br = 10.
ƒ points: si es TRUE se muestran los puntos de las coordenadas:
points = TRUE.
ƒ density: si es TRUE se muestra la curva de densidad en el histo-
grama: density = TRUE.
ƒ kernel: si es TRUE se muestra la función de densidad bivariada:
kernel = TRUE.
ƒ o.include: si es TRUE se incluye el origen en la figura: o.include =
FALSE.
ƒ Pcol: color del punto que muestra la posición en la figura del indivi-
duo que se está contrastando.
ƒ h: vector con el ancho de banda para los estimadores de densidad de
x e y.
ƒ side: define la posición de las leyendas dx (valor de la separación
entre líneas verticales) y dy (valor de la separación entre líneas
horizontales), que puede ser "top", "bottom" o "none".

La función «biv.plot()» tiene los mismos argumentos a excepción de


Pcol, ya que no se analiza la probabilidad de pertenencia a la población de
ningún individuo y, por ello, no se representa la posición del individuo en
la figura.

Se pueden usar los argumentos generales pch, cex y col.


GRÁFICOS AVANZADOS
177

III.15. Diagrama de Taylor

Este tipo de representación permite comparar modelos, por ejemplo varios


modelos de regresión, para determinar cual de ellos es más predictivo. Se utiliza
mucho con modelos climáticos. Para representarlo se puede utilizar la función
«taylor.diagram()» del paquete “plotrix” (Lemon, 2012). Las instrucciones
están en el script III.20.R. El ejemplo, que está en el archivo Modelos.csv,
consiste en los valores observados y las predicciones de cuatro modelos de la
temperatura mensual a lo largo del año.
En este caso es necesario explicar primero la gráfica antes de pasar a ver los
argumentos de la función. En el diagrama de Taylor los modelos se comparan en
base al coeficiente de correlación, la amplitud de su variación (desviación están-
dar) y el error cuadrático medio (RMS). El coeficiente de correlación se muestra
en el arco externo derecho del gráfico (valores de 0 a 1). Los arcos punteados
muestran los valores de la desviación estándar (valores de 0 a 10 en este ejem-
plo). El arco que no es punteado con un valor aproximado de 6,35, muestra la
desviación estándar de los valores observados y se usa como referencia. Por
último, los arcos que en este ejemplo tienen valores de 10 y 5, son los RMS.
El modelo mejor será aquel que tenga un coeficiente de correlación mayor, un
valor de RMS más pequeño y que su desviación estándar esté más cerca de la
desviación estándar de los valores observados, que en este ejemplo es la línea
que muestra la desviación estándar de 6,35. Por tanto, el modelo con el símbolo
naranja, el modelo 3, es el más predictivo.
En la función simplemente hay que poner la variable que tiene los valores ob-
servados y la variable que tiene los valores predichos. El argumento «pos.cor»
si es «TRUE» representa la gráfica solamente con los coeficientes de correlación
positivos. En la segunda gráfica del script se muestra como representar el dia-
grama con los valores negativos y positivos del coeficiente de correlación.
Con «show.gamma» se indica si representa los arcos de los RMS. El argu-
mento «sd.arcs» define si se representan los arcos de las desviaciones estándar.
El argumento «ref.sd» indica si se pinta el arco de la desviación estándar de los
valores observados que se usa como referencia. Con «pcex» se define el tamaño
de los símbolos.
Con «normalize» se especifica si se tipifican los datos, de tal forma que la
desviación estándar de los valores observados, que se usa como referencia,
tenga un valor de 1.
En el script se usa la función «polygon()» para tapar textos en inglés, que no
se pueden modifican, y reemplazarlos por textos en castellano con la función
«text()».

¾ library(plotrix)
¾ Datos<-read.csv2("Modelos.csv", header=TRUE, encoding="latin1")
¾ attach(Datos)
¾ taylor.diagram(Observado,Modelo1, main="Modelos de predicción de
temperatura", pos.cor=T, show.gamma=T, sd.arcs=T, ref.sd=T, pcex=2,
normalize=F, xlab= "Desviación estándar (ºC)", ylab="Desviación estándar
(ºC)")
¾ taylor.diagram(Observado,Modelo2, main="", pos.cor=T, show.gamma=T,
sd.arcs=T, ref.sd=T, pcex=2, normalize=F, xlab="",ylab="", add=T,
col="blue",pch=15)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
178

¾ taylor.diagram(Observado,Modelo3, main="", pos.cor=T, show.gamma=T,


sd.arcs=T, ref.sd=T, pcex=2, normalize=F, xlab= "", ylab="",add=T,
col="orange",pch=17)
¾ taylor.diagram(Observado,Modelo4, main="", pos.cor=T, show.gamma=T,
sd.arcs=T, ref.sd=T, pcex=2, normalize=F, xlab="", ylab="",add=T,
col="green",pch=18)
¾ polygon(x = c(7.7,8,10,10.4), y = c(8.8,11.2,9.2,8.1), col = "white", border =
NA)
¾ text(9,9.5,paste("Coeficiente de",sep="\n", "correlación"))

Modelos de predicción de temperatura


0.1 0.2
0.3
0.4
0.5
10

Coeficiente de
0.6
correlación
Correlation
10
0.7
8
Desviación estándar (ºC)

0.8
6

0.9
5
4

0.95
2

0.99
0

0 2 4 6 8 10

Desviación estándar (ºC)

El segundo gráfico es solamente con el modelo 1 y sirve para mostrar como


se hace si hay correlaciones negativas en los modelos. Para ello hay que cambiar
el argumento lógico «pos.cor» y ponerlo como «FALSE».

¾ par(cex=1.2)
¾ taylor.diagram(Observado, Modelo1, main="", pos.cor=F, show.gamma=F,
sd.arcs = T, ref.sd=T, pcex=2)
¾ polygon(x = c(-4,-4,4,4), y = c(12.05,13,13,12.05), col = "white", border =
NA)
¾ text(0,12.6,paste("Coeficiente de correlación"))
GRÁFICOS AVANZADOS
179

¾ polygon(x = c(-4,-4,4,4), y = c(-2,-0.7,-0.7,-2), col = "white", border = NA)


¾ text(0,-1,"Desviación estándar (ºC)",col="blue")
¾ text(0,-2,"Error cuadrático medio (RMS)",col="green4")

Coeficiente deCoefficient
Correlation correlación
0
-0.2 0.2
-0.4 0.4

-0.6 0.6

-0.8 0.8

-0.9 0.9

-0.95 0.95

17
16
15
14
12
-0.99 11 10 0.99
9
7.9
6.8
5.7
4.5
3.4 2.3
1.1
-1 1
11 8.5 5.7 2.8 0 2.8 5.7 8.5 11

Desviación
Standardestándar
Deviation (ºC)
Centered RMS Difference
Error cuadrático medio (RMS)

Función taylor.diagram (paquete plotrix)

ƒ ref: variable con los valores observados.


ƒ model: variable con los valores predichos por el modelo.
ƒ col: color de los símbolos.
ƒ pos.cor: si es TRUE representa la gráfica solamente con los coeficien-
tes de correlación positivos: pos.cor=TRUE.
ƒ show.gamma: indica si representa los arcos de los RMS.
show.gamma=TRUE.
ƒ ngamma: indica cuantos arcos RMS se representan: ngamma =3.
ƒ gamma.col: color de los arcos RMS: gamma.col=8.
ƒ sd.arcs: define si se representan los arcos de las desviaciones están-
dar: sd.arcs=0.
ƒ ref.sd: indica si se pinta el arco de la desviación estándar de los valo-
res observados que se usa como referencia: ref.sd=FALSE.
ƒ grad.corr.lines: permite poner las etiquetas de los coeficientes de
correlación: grad.corr.lines= c(0.2,0.4,0.6,0.8,0.9).
ƒ pcex: define el tamaño de los símbolos: pcex=1.
ƒ normalize: especifica si se tipifican los datos, de tal forma que la
desviación estándar de los valores observados, que se usa como
referencia, tenga un valor de 1: normalize=FALSE.

Se pueden usar los argumentos generales add, mar, main, pch, xlab e
ylab.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
180

III.16. Curvas de supervivencia y regresión de Cox

La variable de interés es a menudo el tiempo transcurrido hasta que ocurre un


evento: aparición de una enfermedad (o su curación), fallecimiento, avería de
una máquina, éxito deportivo, etc. El evento puede ser favorable o desfavorable,
y en los datos disponibles existirán casos que ya lo han alcanzado y otros que
no, en los cuales el tiempo no se ha completado y se trata de observaciones in-
completas (censuradas).
En cada instante se puede estimar la tasa de supervivencia, o porcentaje de
casos que no han alcanzado el evento para cualquier tiempo transcurrido. Su
representación gráfica es la curva de supervivencia, que generalmente muestra
el tiempo en el eje horizontal y la tasa de supervivencia o porcentaje de casos
que no han alcanzado el evento en el vertical.
Para la estimación de la curva de supervivencia se suele utilizar el método de
Kaplan-Meier, que calcula la tasa mediante una fórmula recursiva. En cada pe-
riodo la supervivencia se calcula como un cociente cuyo denominador es el
número de elementos expuestos al riesgo, siendo el numerador el mismo número
del que se han restado los elementos que alcanzaron el evento durante ese
tiempo; las tasas así obtenidas se van multiplicando sucesivamente en los dis-
tintos periodos.
Con R existen varios paquetes para obtener la función de supervivencia, de
los cuales el más básico es “survival” (Therneau, 2012), con las funciones
«Surv()», que construye un objeto de supervivencia a partir de los datos, y
«survfit()» que crea los valores de la curva.
Veremos un ejemplo, cuyos datos están en el archivo Adictos.csv, consis-
tente en 240 casos de pacientes de un centro de atención a drogo-dependientes.
Contiene tres variables: edad en el momento actual o en el fallecimiento,
fallecido que es si ha muerto o no (1/0), y adicto que puede ser si o no (1/0).
Los no adictos se han tomado de una muestra aleatoria en la misma zona
geográfica con una proporción similar de fallecidos. El objetivo es construir una
función de supervivencia para los adictos y otra para los no adictos, de forma
que podamos comparar ambas curvas. Las instrucciones están en el archivo
III.21.R

¾ library(survival)
¾ datos<-read.csv2("Adictos.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ fit <- survfit(Surv(edad, fallecido) ~ adicto, data = datos)
¾ fit
¾ plot(fit, lty = 2:3, col=c("green","red"),xlab="Edad", cex.lab=1.8)
¾ legend("topright", .8, c("NO ADICTO", "ADICTO"), lty = 2:3, col =
c("green","red"))
GRÁFICOS AVANZADOS
181

El objeto fit contiene información de interés. La mediana, edad superada por


la mitad de la población en cada grupo, es de 36 años en los adictos y 77 en los
no adictos. Se muestran también intervalos de confianza al 95% para ambas
medianas: (35 – 38) y (76 – 80).

1.0 NO ADICTO
ADICTO
0.8
0.6
0.4
0.2
0.0

0 20 40 60 80

Edad
Como se puede apreciar en el gráfico anterior, se representan dos curvas de
supervivencia (adictos y no adictos), ya que en la función «surfit()» se hace
depender la curva del carácter de adicto. En el eje horizontal se representa la
edad, y en el vertical la tasa de supervivencia. Para los adictos, la curva cae
rápidamente. A los 30 años de edad sobrevive el 80%, a los 40 años el 20%, y a
los 50 años de edad prácticamente el 0%. Entre los no adictos, estos porcentajes
de supervivencia son mucho más elevados: a los 70 años de edad sobrevive más
del 60% y a los 80 años más del 30%.
En la última parte del script se realiza una regresión de Cox, también cono-
cida como modelo de riesgos proporcionales. Se trata de un modelo similar al de
regresión logística, pero adaptado al caso en el que una de las variables explica-
tivas es el tiempo transcurrido hasta que ocurre un evento, por lo que suele
usarse para evaluar los riesgos en el análisis de supervivencia.
Para el cálculo de la regresión de Cox se puede utilizar la función «coxr()»
del paquete “coxrobust” (Bednarski, 1993; 2012). El argumento «f.weight»
permite definir el tipo de función de ponderación, la cual puede ser "linear",
"quadratic" (por defecto) o "exponential". Con «trunc» se especifica el nivel de
recorte para el estimador robusto. El argumento lógico «singular.ok» define
cómo manejar la colinealidad. Si es TRUE, el programa no incluirá en el modelo
las variables que son combinaciones lineales de variables anteriores. De existir
variables que muestren colinealidad, los coeficientes serán NA y la matriz de
varianzas contendrá ceros. Por último, el argumento lógico «model» define si la
variable de resultado debe incorporar los valores de la variable temporal y de las
variables explicativas. En este ejemplo solamente se evalúa el efecto de la
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
182

adicción o no adicción, pero es posible incluir en el modelo más variables, se-


paradas con el símbolo «+».

¾ cox <- coxr(Surv(edad, fallecido) ~ adicto, data = datos, f.weight =


"quadratic", trunc = 0.95, singular.ok = TRUE, model = FALSE)
¾ cox

Se estima el modelo de regresión mediante dos métodos: máxima verosimi-


litud parcial y método robusto. Éste último es menos sensible a las observaciones
atípicas o extremas, por lo que puede ser utilizado con carácter general, ya que
proporciona las estimaciones más prudentes y estables. De los resultados que se
presentan, el de mayor interés es exp(coef), que muestra la HR (hazard ratio),
equivalente en cierto modo a la OR (odds ratio) de la regresión logística
(Guisande y col., 2011). HR es un cociente o razón de dos tasas de riesgo
(hazard rate), tasas instantáneas que miden la probabilidad (en relación al inter-
valo de tiempo) de que se produzca el evento, condicionada a que no haya ocu-
rrido con anterioridad. El valor observado de 23,4 significa que el riesgo de falle-
cimiento es 23,4 veces mayor en los adictos que en los no adictos y, como se
trata de un promedio a lo largo del tiempo, debe asumirse que la relación entre
los riesgos de ambos grupos se mantiene de forma aproximada a lo largo del
tiempo, o supuesto de “riesgos proporcionales” habitual en la regresión de Cox.
El valor p, prácticamente igual a cero en nuestro ejemplo, sirve para rechazar la
hipótesis nula de que HR = 1, o que no existe diferencia en el riesgo de ambos
grupos. Finalmente el test de Wald, con su valor p prácticamente nulo, nos per-
mite afirmar que el modelo de regresión es significativo. Por tanto, la adicción
tiene una clara influencia negativa en la supervivencia.

III.17. Análisis de varianza

El análisis de varianza (ANOVA) es uno de los métodos más usados para con-
trastar la homogeneidad de variables (Guisande y col., 2011). Las funciones
«granova.1w()» y «granova.2w()» del paquete “granova” (Pruzek, 2012)
realizan una representación gráfica de un ANOVA de un factor y de dos factores,
respectivamente.
GRÁFICOS AVANZADOS
183

El ejemplo utiliza datos del índice de precios al consumo (IPC) de los alimen-
tos de los años 2011 y 2010, en las 19 regiones o comunidades autónomas de
España, publicados por el Instituto Nacional de Estadística (www.ine.es), los
cuales están en el archivo IPC.csv. El índice toma como base el año 2006, en el
que su valor es 100. Las instrucciones están en el script III.22.R.
El primer gráfico representa un ANOVA con dos factores. En la función
«granova.2w()» se especifica la variable dependiente (columna 3) y los facto-
res, que son la región (columna 1) y el año (columna 4). El argumento «fit» es-
pecifica si el ajuste de la superficie debe ser «"linear"» (opción por defecto),
«"quadratic"» o «"smooth"».

¾ require(granova)
¾ datos<-read.csv2("IPC.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ granova.2w(datos[, c(3, 1, 4)], fit="quadratic")

El gráfico muestra la variabilidad residual del IPC en sentido vertical, y se


trata de un gráfico activo: moviendo el ratón con el botón izquierdo pulsado se
cambia el punto de vista del observador. La bola de color gris indica la media de
cada casilla (combinación de niveles de los factores), y los dos ejes horizontales
representan los dos factores (año y región). La inclinación del plano de ajuste
muestra un índice creciente en el tiempo y también diferencias importantes entre
las regiones. En cada combinación de factores la variabilidad residual es aparen-
temente simétrica y equilibrada, lo que puede indicar un razonable cumplimiento
de la hipótesis de normalidad exigida por el método ANOVA.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
184

El segundo gráfico representa un ANOVA con un factor y más información que


el anterior. En la función «granova.1w()» con el argumento «data» se especi-
fica la variable dependiente y con «group» el factor. Con «h.rng» y «v.rng» se
definen las distancias horizontal y vertical entre los grupos del factor (más dis-
tancia a medida que los valores son más pequeños). Con «kx» se define el ta-
maño de las etiquetas. El argumento «size.line» define la posición vertical de los
números que indican el tamaño de los grupos y las etiquetas de los mismos.

¾ granova.1w(data=IPC, group=Región, h.rng=1, v.rng=0.15,kx=1.3,


size.line=-3.5,main="", ylab="IPC de alimentos", xlab="Coeficientes de
contraste basados en las medias y errores de los grupos")
Mancha

Castilla y León

4 Islas Canarias
Baleares

6 C. Valenciana
18 Extremadura

6 País Vasco
Castilla-La

16 Andalucía
2 Cantabria

8 Cataluña
2 Asturias
2 La Rioja
2 Navarra

6 Aragón
8 Galicia
2 Madrid

2 Murcia
2 Melilla

2 Ceuta
10 Islas

Group Sizes:
2

| | || | || | | | | | | | | | |
115.1

111.5
111.2
gm+sdw
IPC de alimentos

110.9
110.6

110.6
110.4

109.4
109.2
109.0
108.6

108.9
108.8

107.7
107.6
107.5
107.4
107.2
gm-sdw
106.7

106.8
106.6
104.3

MS-within
Group Means MS-between
Grand Mean F-statistic = 2.58
-2.07

-1.85

-1.43
-1.42
-1.38

-1.21
-1.12
-1.05

-0.89

0.14

0.32
0.33

0.55

0.80

1.80

1.99

2.29

2.59

2.85

Coeficientes de contraste basados en las medias y errores de los grupos

El gráfico muestra los distintos niveles del factor ordenados por el valor medio
de la variable (representado por un triángulo rojo) de izquierda a derecha. Las
comunidades de La Rioja o Navarra tienen los valores más bajos del IPC, y País
Vasco e Islas Canarias los más altos. Están espaciados en el gráfico de tal modo
que los valores medios o estimaciones del efecto del factor sobre la variable de-
pendiente forman una línea recta. En los márgenes del gráfico se muestran en la
parte superior las etiquetas de los niveles y el número de casos, en la inferior la
desviación del valor medio con respecto a la media general (o estimación del
efecto), y en la derecha la media de cada nivel. Para cada nivel del factor se
muestra la variabilidad residual en vertical, lo que permite apreciar la posible
existencia de distribución asimétrica o valores atípicos (no existen en nuestro
ejemplo), así como la homogeneidad de varianzas, o dispersión similar a lo largo
de todo el gráfico, para los distintos niveles del factor.
GRÁFICOS AVANZADOS
185

El gráfico permite entender como funciona el análisis de la varianza. Se com-


para la variabilidad debida al factor (variabilidad entre los valores medios de los
niveles), representada por el área del cuadrado rojo, con la variabilidad residual,
la que permanece dentro de cada nivel, representada por el área del cuadrado
azul. El cociente entre ambos cuadrados medios es el valor F del contraste, cuya
probabilidad o valor p nos permite decidir si existe o no un efecto significativo.
Cuanto más grande sea el cuadrado rojo en comparación con el azul, mayor será
el efecto del factor (comunidad autónoma) sobre la variable dependiente (índice
de precios).

Función granova.1w (paquete granova)

ƒ data: puede ser un data frame (conjunto de variables o columnas) o


un vector (es decir una variable). En el primer caso debe ponerse
group = NULL y las distintas columnas de data son los valores de la
variable dependiente para cada nivel del factor, siendo los grupos ne-
cesariamente de igual tamaño. Si data es un vector (es la variable de-
pendiente) debe añadirse un factor con distintos niveles en group, lo
que permite grupos de distinto tamaño.
ƒ group: variable que es el factor en el ANOVA: group = NULL.
ƒ dg: número de decimales: dg = 2.
ƒ h.rng: define la distancia horizontal entre grupos. A medida que es
más pequeño los grupos se separan más: h.rng = 1.25.
ƒ v.rng: define la distancia vertical entre puntos. A medida que es más
pequeño los puntos se separan más: v.rng = 0.2.
ƒ box: si es TRUE se pinta un marco: box = FALSE.
ƒ jj: define la separación horizontal entre puntos cuando se solapan: jj
= 1.
ƒ kx: tamaño de texto en las etiquetas: kx = 1.
ƒ px: tamaño de los números en los ejes: px = 1.
ƒ size.line: posición vertical de los números que indican el tamaño de
los grupos y las etiquetas de los mismos: size.line = -2.5.
ƒ top.dot: altura del límite superior de las líneas verticales punteadas:
top.dot = 0.15.
ƒ trmean: si es TRUE se señala la media acotada al 20% de cada grupo
(como una X) y muestra los valores en la ventana de salida: trmean
= FALSE.
ƒ resid: si es TRUE se representan los residuos en el margen derecho:
resid = FALSE.
ƒ dosqrs: si es TRUE se representan dos cuadrados con áreas
proporcionales a la varianza entre grupos (varianza explicada) y a la
varianza interna o intra-grupos (varianza residual): dosqrs = TRUE.
ƒ ident: si es TRUE pulsando con el ratón sobre cualquier punto, sale su
valor, lo cual permite identificar cada uno de los puntos. Con el botón
derecho del ratón se para esta instrucción: ident = FALSE.
ƒ pt.lab: se pueden especificar con un vector las etiquetas de los pun-
tos. Si es NULL se usan las etiquetas de fila o rownames (si existen) o
el número de caso: pt.lab = NULL.

Se pueden usar los argumentos generales main, xlab e ylab.


GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
186

III.18. Gráficos de diagnóstico en modelos lineales

Se trata de un conjunto de gráficos utilizados para valorar los supuestos


(Normalidad, homogeneidad e independencia) en los modelos lineales. Se pue-
den obtener fácilmente con la función «plot()». Las instrucciones están en el
script III.23.R. El ejemplo, cuyos datos están en el archivo ANCOVA.csv, son
datos de altura y peso de hombres y mujeres de diferentes países y ciudades. El
objetivo es determinar si existen diferencias en el peso de las mujeres entre las
diferentes ciudades, tomando la altura como covariable. Para ello realizamos un
análisis de covarianza y obtenemos los gráficos de diagnóstico.
Después de cargar los paquetes e importar los datos se seleccionan solamente
a las mujeres. Se realiza el ANCOVA y con los resultados se realizan los gráficos.
Con el argumento «which=1:6» se define que se representen los seis gráficos
de diagnóstico. Con el argumento «mfrow=c(3,2)» combinamos los seis gráfi-
cos en un único conjunto, con dos columnas y tres filas. Para representar cada
gráfico por separado, solo tenemos que utilizar «which=1» y anular la función
«par()»

¾ require(lawstat)
¾ require(e1071)
¾ require(car)
¾ require(nortest)
¾ require(multcomp)
¾ datos<-read.csv2("ANCOVA.csv",header=TRUE,encoding="latin1")
¾ datos1 <- datos[datos$Sexo=="Mujer",]
¾ attach(datos1)
¾ modelo <- lm(datos1$Peso.Kg ~ datos1$Altura.cm + factor(datos1$Ciudad))
¾ summary(modelo, type=3)
¾ par(mfrow=c(3,2), mar=c(3,5,3,3))
¾ plot (modelo, add.smooth=FALSE, which=1:6)
El gráfico 1 son los residuos frente a valores ajustados (residuals vs fitted).
Sirve para valorar la hipótesis de homogeneidad. La dispersión debe ser similar a
lo largo de todo el recorrido de valores ajustados.
El gráfico 2 es la Normal Q-Q. Representa los residuos en transformación
Normal. Si siguen una distribución Normal el gráfico debe ajustarse a una línea
recta (la diagonal), como en el ejemplo. Suele aceptarse una pequeña desviación
en los extremos.
El gráfico 3 es Scale-location. Representa la raíz cuadrada del residuo frente a
los valores ajustados. Se utiliza para diagnosticar problemas de homogeneidad.
El gráfico 4 es la distancia de Cook frente a número de caso. La distancia de
Cook mide el efecto global que ejerce sobre el ajuste la eliminación de cada caso
o fila. Sirve para identificar los casos (atípicos, outliers) con mayor influencia, los
datos a los que se debe prestar más atención. Se considera en general que un
valor de la distancia de Cook mayor que 1 debe ser estudiado -no hay ninguno
en nuestro ejemplo- y los valores más altos, correspondientes a los datos de las
filas 14 y 15, apenas llegan a 0,35.
GRÁFICOS AVANZADOS
187

Residuals vs Fitted Normal Q-Q


3 14 14
16 16
2

1
Standardized residuals
1
Residuals

0
-1

-1
-2
-3

15
15

-2
55 60 65 -2 -1 0 1 2

Scale-Location Cook's distance

0.00 0.05 0.10 0.15 0.20 0.25 0.30 0.35


1.4

15
15
14
1.2

16
Standardized residuals

1.0

Cook's distance
0.8

14
0.6

5
0.4
0.2
0.0

55 60 65 5 10 15 20

Residuals vs Leverage Cook's dist vs Leverage hii 1  hii


2 1.5 1 15
0.5
0.00 0.05 0.10 0.15 0.20 0.25 0.30

14

5
1
Standardized residuals

Cook's distance

0
0

14

5
-1

0.5
-2

15
Cook's distance 0

0.0 0.1 0.2 0.3 0.4 0.15 0.25 0.3 0.35 0.4 0.45

El gráfico 5 representa los residuos frente a valores del estadístico de influen-


cia (leverage). En el gráfico se muestran con líneas discontinuas los lugares co-
rrespondientes a iguales valores de la distancia de Cook (etiquetados con el valor
correspondiente); como norma general, los residuos deben estar distribuidos al
azar, sin mostrar una estructura o patrón. Si los valores de influencia son cons-
tantes, como ocurre a menudo con diseños equilibrados en el análisis de la va-
rianza, el gráfico utiliza combinaciones de los niveles de los factores (ordenados
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
188

por el valor ajustado) en lugar del estadístico de influencia, lo que permite valo-
rar la falta de homogeneidad, o diferente dispersión, en los distintos niveles de
los factores; la dispersión debe ser similar para todos los niveles de los factores.
El gráfico 6 es la distancia de Cook frente al estadístico de influencia
(leverage). El estadístico de influencia mide la distancia entre los valores de las
variables explicativas para cada caso y los valores medios de la muestra. Los
casos con mayor valor de ese estadístico pueden tener un efecto importante so-
bre la predicción de los valores de la variable dependiente. En el contexto del
análisis de la varianza los valores de influencia son típicamente pequeños. Este
gráfico, de interpretación compleja, se utiliza a menudo para descartar algunas
observaciones o algún patrón de covariables. Las líneas discontinuas que pasan
por el origen en el gráfico muestran los lugares que corresponden al error tipifi-
cado de igual magnitud (la magnitud aparece como etiqueta de cada línea). En
general debe prestarse atención a los puntos con mayores valores de distancia
de Cook, mayor valor de influencia, y mayor magnitud de error. En nuestro
ejemplo no existe ningún valor problemático, ya que todos ellos son pequeños.

III.19. Gráficos de medidas de riesgo de extinción

Se generan con la función «CSEGriskfigure()» del paquete “MARSS”


(Holmes y Ward, 2010; Holmes y col., 2012). Esta función elabora un panel con
seis gráficos, representando diferentes medidas utilizadas en Análisis de Viabili-
dad de Poblaciones (PVA). Como ejemplo utilizaremos un conjunto de datos de
descargas de sardina durante un periodo aproximado de 100 años que están en
el archivo Sardinas.csv. Las descargas de sardina en puerto es un buen indica-
dor de la densidad de la población (Guisande y col., 2001). Las instrucciones
están en el script III.24.R.
En la función «CSEGriskfigure()» el argumento «te=100» indica el número
de periodos de predicción. Con «threshold» se define el umbral de cuasi extin-
ción, el cual si es una fracción del total de la población actual se pone
«absolutethresh=FALSE».

¾ library(MARSS)
¾ datos<-read.csv2("Sardinas.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ CSEGriskfigure(datos, te=100, threshold=0.1, absolutethresh=FALSE)

El primer gráfico muestra los cambios en la población de la especie a lo largo


del tiempo. Se observa como durante los últimos 100 años los valores oscilan,
con una ligera tendencia decreciente.
El segundo gráfico es una función de distribución acumulada (CDF) de la va-
riable “tiempo hasta alcanzar el umbral de extinción”. Muestra la probabilidad de
que la especie representada alcance el valor umbral indicado de cuasi extinción
en un tiempo igual o inferior al representado. Se incluyen en el gráfico los inter-
valos de confianza al 90% y 75%. El umbral por defecto es el 10% (puede indi-
carse otro valor en la función). Por lo tanto, la probabilidad de que la sardina
alcance el umbral del 10% en los próximos 20 años se sitúa –de acuerdo con
estos datos- alrededor del 25%, y en los próximos 100 años por encima del
60%. El umbral del 10% se calcula sobre las capturas estimadas en el último
GRÁFICOS AVANZADOS
189

periodo de los datos disponibles y, en este caso, es de 336 unidades, como se


indica también en el gráfico.

u est = -0.014 (95% CIs -0.095 , 0.068 )


Q est = 0.16 Prob. to hit 336

1.0
95% CI

probability to hit threshold

0.8
75% CI
30000
Pop. Estimate

mean

0.6
0.4
10000

0.2
0.0
0

1905 1919 1933 1947 1961 1975 1989 0 20 40 60 80 100

time steps into future

PDF of time to threshold


Prob. of hitting threshold in 100 time steps
given it IS reached 1.0
0.015
probability to hit threshold

probability to hit threshold

0.8
0.010

0.6

90% threshold
0.4
0.005

0.2
0.000

0.0

0 100 200 300 400 500 200 300 400 500 600

time steps into future Number of ind. at Ne

time steps = 98
Sample projections
mu = -0.014 s2.p = 0.16
0.0

50%
2500000

-0.5
xe = log10(N0/Ne)

-1.0

90%
N

1000000

-1.5
-2.0

99%
0

0 20 40 60 80 100 20 40 60 80 100

time steps into the future Projection interval T time steps

El tercer gráfico es una función de densidad de probabilidad (PDF) de la varia-


ble anterior. En el ejemplo se muestra una función aproximadamente exponen-
cial, muy habitual en este tipo de datos, que indica una alta probabilidad de
extinción en los próximos 100 años.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
190

El cuarto gráfico muestra la probabilidad asociada a distintos valores de po-


blación al cabo del periodo de predicción (por defecto 100 periodos). Se muestra
con una línea roja vertical el umbral del 10% (es decir reducción del 90%). En el
ejemplo se comprueba que la probabilidad de que el número de sardinas des-
cargadas dentro de 100 años se sitúe entre 200 y 600, tiene probabilidades simi-
lares para los distintos valores.
El quinto gráfico muestra las estimaciones de la variable pronosticada para
todo el periodo de predicción. Representa -en diferentes colores- 10 proyecciones
simuladas de la evolución de la población, obtenidas a partir de las probabilida-
des estimadas previamente. El hecho de que las diferentes simulaciones sean
muy distintas entre sí, como en este ejemplo, indica la escasa fiabilidad de las
proyecciones a medio y largo plazo. Este gráfico es distinto en cada ejecución, ya
que se trata de simulaciones.
El último gráfico es la Incertidumbre Teórica Mínima (TMU). Muestra la incer-
tidumbre de las predicciones. En el eje horizontal se representa el periodo de
predicción, y en el vertical el umbral de extinción en escala logarítmica decimal (-
1 es el 10%; -2 el 1%). Un trazo horizontal muestra los umbrales de reducción
de la población del 50%, 90%, y 99%. Los diferentes tonos de gris en el gráfico
muestran los niveles de incertidumbre: cuanto más oscuro menos fiable es la
predicción. La zona más oscura corresponde a intervalos de confianza de ampli-
tud (error de estimación) superior a 0,80, y la más clara a valores de la probabi-
lidad de alcanzar el umbral inferiores a 0,05 o superiores a 0,95 (amplitud inter-
valo de confianza <5%). En el ejemplo, las estimaciones son fiables en un pe-
riodo inferior a 20 años, y tanto menos fiables dentro de este tiempo cuanto más
alto (menor pérdida) sea el umbral de extinción utilizado.

Función CSEGriskfigure (paquete MARSS)

ƒ data: matriz con dos columnas en la que el tiempo es la primera y la


otra columna es la abundancia de la especie.
ƒ te: periodo de predicción: te = 100.
ƒ threshold: umbral de extinción que puede ser un entero o una
fracción de la población: threshold = 0.1.
ƒ absolutethresh: si es TRUE se especifica que threshold es un
número entero: absolutethresh = FALSE.
ƒ CI.method: método para calcular el intervalo de confianza que puede
ser "hessian", "parametrc", "innovations" o "none": CI.method =
"hessian".
ƒ CI.sim: número de simulaciones en el cálculo de los intervalos de
confianza bootstrap: CI.sim = 1000.

III.20. Graficos para análisis multivariante

III.20.1. BIPLOT

En el análisis multivariante se trabaja con muchos tipos diferentes de varia-


bles y existen algunos gráficos útiles para estos casos. La función «biplot()» del
paquete “stats” permite representar dos matrices de datos en un solo gráfico y
GRÁFICOS AVANZADOS
191

es útil para análisis factoriales, de componentes principales, de correspondencias


y correlación canónica. Las instrucciones están en el script III.25.R. Los datos,
que están en el archivo Correspondencias.csv, son las puntuaciones de un
análisis de correspondencias realizado a una encuesta para estudiar la frecuencia
de cuatro marcas de automóvil (identificadas como A, B, C y D) en distintos paí-
ses europeos. Después de importar los datos y cargarlos en memoria, es nece-
sario especificar las dos variables a representar en el set de datos x y la dos va-
riables del set de datos y. Si se van a poner etiquetas a los datos, también es
conveniente especificar los datos que son etiquetas de los datos x y las que son
de los datos y.
El argumento lógico «var.axes» especifica si se pintan flechas en el grupo de
variables y. Con «col» se definen los colores de las variables x e y. Los argu-
mentos «xlabs» e «ylabs» sirven para definir las variables que se usaran como
etiquetas de los datos. Con «cex» se define el tamaño de las etiquetas. El argu-
mento «expand» es un coeficiente de la proporción entre las variables y con
respecto a las variables x. Por ejemplo, un valor de 2 significa que los ejes de las
variables y se expanden el doble que las variables x. Con «arrow.len» se define
el tamaño de la punta de las flechas de las variables y.

¾ Datos<-read.csv2("Correspondencias.csv", header=TRUE, encoding=


"latin1")
¾ attach(Datos)
¾ x<-Datos[1:14,2:3]; y<-Datos[15:18,2:3]
¾ EtiquetaX<-Datos[1:14,1]; EtiquetaY<-Datos[15:18,1]
¾ biplot(x,y,xlab="Dimensión 1",ylab="Dimensión 2",var.axes=T, col=
c("black","red"), xlabs= EtiquetaX, ylabs=EtiquetaY, cex=1, font.lab=2,
cex.lab=1.5,main="Análisis de correspondencias",font.main= 2, cex.main
=1.7, ylim=c(-1.6,0.6), xlim=c(-1.5,2), expand=1, arrow.len= 0.1)

Función biplot (paquete stats)

ƒ x: primer conjunto con dos variables a representar, generalmente


asociado a los casos.
ƒ y: segundo conjunto a representar, generalmente asociado a las
variables.
ƒ var.axes: si es TRUE el segundo conjunto se representa con flechas:
var.axes = TRUE.
ƒ col: vector con los dos colores de ambos conjunto de datos.
ƒ cex: tamaño de letra de las etiquetas.
ƒ xlabs: etiquetas del primer conjunto de datos: xlabs = NULL.
ƒ ylabs: etiquetas del segundo conjunto de datos: ylabs = NULL.
ƒ expand: coeficiente de expansión de las variables del conjunto de
datos y con respecto a las variables del conjunto x: expand = 1.
ƒ arrow.len: tamaño de la punta de las flechas de las variables del
conjunto y: arrow.len = 0.1.

Se pueden usar los argumentos generales xlim, ylim, main, sub, xlab e
ylab.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
192

Análisis de correspondencias
-2 -1 0 1 2 3

1.0
Grecia
Portugal
España
0.5

Serbia

0.5
A
Hungría
Suíza
Rep. Checa
Bélgica
0.0

0.0
B
Polonia
Dimensión 2

Finlandia
Noruega
C

-0.5
-0.5

Rusia

-1.0
-1.5
-1.0

-2.0
-1.5

Inglaterra

-2.5
D
Irlanda

-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5 2.0

Dimensión 1
III.20.2. ANÁLISIS DISCRIMINANTE

La función «scatterplot()» del paquete “car” (Fox y Weisberg, 2012) es tam-


bién útil para representar las salidas de análisis multivariante. En el archivo
Discriminante.csv están las puntuaciones de un análisis discriminante aplicado
a variables morfométricas de cuatro especies de serpientes. Las instrucciones
están en el script III.26.R.
Con el argumento lógico «reg.line=lm» se representaría una recta de regre-
sión lineal, aunque en este caso no se representa y se pone «reg.line= FALSE».
Con «smooth» se indica una curva de regresión no paramétrica, en cuyo caso
con «spread=T» se muestran los límites de confianza y el argumento «span»
define la amplitud. Con «grid» se puede indicar que se representen las cuadri-
culas interiores en el gráfico. Con «legend.coords» se indica la posición de la
leyenda. Con «legend.plot=FALSE» se omite la leyenda. Con «boxplots» se
puede representar en el margen un diagrama de cajas para "x", "y" o "xy". Con
«by.groups=TRUE» las regresiones y elipses se hacen para cada grupo. Con el
argumento «ellipse=TRUE» se dibuja una elipse para cada grupo.
GRÁFICOS AVANZADOS
193

¾ library(car)
¾ Datos<-read.csv2("Discriminante.csv", header=TRUE, encoding= "latin1")
¾ attach(Datos)
¾ scatterplot(Función.2~Función.1 | Especie, data=Datos, reg.line= FALSE,
smooth=F, spread=F, span=1, grid=F, legend.coords="bottomleft",
boxplots=F, by.groups=T, ellipse=T, font.lab=2, pch=c(15,16,17,18),
col=c("black","red","green","blue"), main= "Análisis discriminante",
font.main=2,cex.main=2, cex.lab=1.5, xlab="Función 1", ylab="Función 2")

Análisis discriminante
2
Función 2
0

Especie
-2

1
2
3
4
-4

-4 -2 0 2 4

Función 1

Función scatterplot (paquete car)

ƒ x, y: variables a representar o fórmula del tipo y ~ x o bien y ~ x |


z
ƒ data: data frame donde están las variables a representar.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
194

Función scatterplot (Continuación)

ƒ smooth: si es TRUE se traza una curva de regresión no paramétrica


para cada conjunto de datos: smooth=TRUE.
ƒ spread: si es TRUE y el anterior es TRUE, se pintan los intervalos de
la regresión no paramétrica: spread=!by.groups.
ƒ span: amplitud de la regresión no paramétrica. span=.5.
ƒ loess.threshold: suprime la regresión no paramétrica si el número
de datos es menor que el valor dado: loess.threshold=5.
ƒ reg.line: regresión lineal: reg.line=lm.
ƒ boxplots: si no se representa por grupos se puede representar un
diagrama de cajas en "x", "y" o "xy": boxplots=if (by.groups) ""
else "xy".
ƒ lwd: valor numérico del grosor de línea de las rectas de regresión,
curvas de regresión no paramétrica "lwd.smooth" e intervalos
"lwd.spread".
ƒ lty: tipo de línea de las rectas de regresión, curvas de regresión no
paramétrica "lty.smooth" e intervalos "lty.spread".
ƒ labels: vector con las etiquetas de los puntos.
ƒ id.method, id.n, id.cex, id.col: argumentos para las etiquetas de los
puntos: id.method = "mahal", id.n = if(id.method[1]==
"identify") length(x) else 0, id.cex = 1, id.col = palette()[1].
ƒ groups: una variable que indica los grupos a realizar.
ƒ by.groups: si es TRUE las regresiones y elipses se hacen para cada
grupo: by.groups=!missing(groups).
ƒ legend.title y legend.coords: título y coordenadas de la leyenda.
ƒ legend.plot: si es FALSE no se representa la leyenda.
ƒ ellipse: si es TRUE dibuja la elipses de concentración de los grupos:
ellipse=FALSE.
ƒ levels: niveles de significación para las elipses: levels=c(0.5, 0.95).
ƒ robust: si es TRUE se usa la función cov.trob para calcular el centro y
la matriz de covarianzas de las elipses: robust=TRUE.
ƒ legend.plot: si es TRUE se muestra una leyenda con los grupos:
legend.plot= !missing(groups).
ƒ reset.par: si es FALSE se pueden añadir parámetros gráficos, por
ejemplo líneas: reset.par=TRUE.
ƒ grid: si es TRUE se representan las cuadrículas interiores del gráfico:
grid=TRUE.

Se pueden usar los argumentos generales pch, col, las, log, cex, cex.axis,
cex.lab, cex.main, cex.sub, xlim, ylim, main, sub, xlab e ylab.

La función «candisc()» del paquete “candisc” (Friendly, 2007; Friendly y Fox,


2012) combina varios gráficos relacionados con el Análisis Discriminante. Como
ejemplo usaremos la abundancia de varios grupos de algas del fitoplancton que
aparecen en diferentes lagos del Neotrópico, cuyos datos están en el archivo
Fitoplancton.csv. Las instrucciones están en el script III.27.R.
En primer lugar se realiza un modelo de regresión lineal con la función
«lm()». Se introducen por un lado los grupos de algas y las concentraciones de
GRÁFICOS AVANZADOS
195

nutrientes y, por otro lado, el lago y el sitio de muestreo. El modelo obtenido se


introduce en la función «candisc()». En el primer gráfico solamente se repre-
senta la primera función discriminante canónica y, para ello, se especifica el ar-
gumento «ndim=1». Si se pusiera 2, se estaría indicando que se guarden las
dos primeras funciones discriminantes. Con el argumento «term» se indica la
variable de agrupación, en este ejemplo los diferentes lagos. Por último, con la
función «summary()» se puede obtener información sobre las medias, las pun-
tuaciones, etc., de cada uno de los ejes.

¾ library(candisc)
¾ datos<-read.csv2("Fitoplancton.csv",header=TRUE,encoding="latin1")
¾ datos<-na.exclude(datos)
¾ attach(datos)
¾ mod <- lm(cbind(Cianophyceae, Euglenophyceae, Clorophyceae,
Zygophyceae, Bacillariophyceae, Crysophyceae, Cryptophyceae,
Dinophyceae, Xanthophyceae, NO2, NO3, NH4, SiO2) ~ Lago+Area,
data=datos)
¾ can <- candisc(mod, term="Lago", data=datos, ndim=1)
¾ plot(can,titles.1d = c("Puntuación canónica", "Estructura"))
¾ summary(can, means = FALSE, scores = TRUE, coef = c("std"), digits = 2)

En el primer gráfico que se obtiene se observa que el primer eje canónico ab-
sorbe el 67,2% de la variación y que el lago de Tota se diferencia claramente del
resto de lagos. Los grupos taxonómicos que más diferencian el lago de Tota del
resto son las clorofitas y cianofitas.

Puntuación canónica Estructura


10

SiO2
NO2

NH4
5

NO3
Crysophyceae
Euglenophyceae

Dinophyceae
Can1 (67.2%)

Cryptophyceae
Bacillariophyceae

Xanthophyceae
Zygophyceae
0
-5

Cianophyceae

Clorophyceae
-10

Correo Fuquene Guatavita Iguaque Momil Purísima Sebastián Tarapoto Tota Yahuarcaca

Lago

Si en vez de Lago se pone Región en el modelo de regresión «lm()» y en la


función «candisc()», entonces se obtendría el siguiente gráfico, en el cual se
observa que la primera función discriminante absorbe el 80% de la varianza y
diferencia la región de los Andes de las otras dos regiones.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
196

Puntuación canónica Estructura


6

SiO2
NO2

NH4
4

NO3
2

Crysophyceae
Cryptophyceae
Euglenophyceae
Can1 (80%)

Xanthophyceae
Dinophyceae
Bacillariophyceae
Zygophyceae
0

Cianophyceae
-2

Clorophyceae
-4

Amazonas Andes Caribe

Región

En el segundo gráfico se representan varios ejes canónicos o funciones dis-


criminantes; en concreto se ha especificado que se guarden 4 ejes «ndim=4», y
podemos representar cualquier par de ellos, aunque en general los dos primeros
son los que permiten una mejor descripción al concentrar una mayor parte de la
variabilidad. El paquete “vcd” (Meyer y col., 2012) se utiliza para poner una le-
yenda con la función «grid_legend()», que ya se ha usado anteriormente en
varios ejemplos. Con la función «rep()» se asignan 10 colores, tantos como la-
gos, y se especifica posteriormente cuantos datos hay para cada color. Es nece-
sario tener en cuenta que como se han eliminado las filas donde falte algún caso
con la función «na.exclude()», hay que especificar el número de datos reales de
cada lago después de la exclusión. En concreto solamente se ha perdido un caso
del lago Fuquene. El proceso se repite para asignar símbolos a todos los lagos.
En el caso de no querer ningún símbolo se usaría el argumento «type="n"» en
vez de «pch» y «col» en la función «plot()». En la función «plot()» con
«which=c(2,3)» se especifica que se representen los ejes canónicos II y III.
Con el argumento «conf» se define el nivel de confianza, que viene representado
por un círculo para cada grupo en el gráfico; el nivel indica la probabilidad de que
un elemento de esa clase esté dentro del círculo. Los círculos separados, sin so-
lapamiento, indican clases bien definidas o identificables. Con «scale» se puede
modificar el espacio que ocupan las variables vector, en este ejemplo los grupos
de algas y nutrientes, en el gráfico.
GRÁFICOS AVANZADOS
197

¾ can <- candisc(mod, term="Lago",data=datos,ndim=4)


¾ library(vcd)
¾ col <- rep(c("red", "orange", "brown", "green", "yellow", "blue", "cyan",
"wheat", "lightblue", "skyblue"), c(9, 12, 24, 6, 6, 4, 15, 2, 4, 4))
¾ pch <- rep(c(1,2,5,6,7,15,16,17,18,19), c(9, 12, 24, 6, 6, 4, 15, 2, 4, 4))
¾ plot(can, which=c(2,3),col=col, pch=pch, conf = 0.95, var.col = "blue",
var.lwd =1, prefix = "Can", suffix=TRUE, scale=10)
¾ grid_legend(0.95, 0.7, pch=c(1,2,5,6,7,15,16,17,18,19), col = c("red",
"orange", "brown", "green", "yellow", "blue", "cyan", "wheat", "lightblue",
"skyblue"), frame = FALSE, c("Correo", "Tarapoto", "Yahuarcaca",
"Fuquene", "Guatavita", "Iguaque", "Tota", "Momil", "Sebastián",
"Purísima"), title = "LAGOS", hgap=10,vgap=0.5, gp=gpar(fontface=1,
fontsize=12))
4

Euglenophyceae LAGOS
Correo
Cryptophyceae
SiO2 Momil Tarapoto
+ Yahuarcaca
+ Yahuarcaca
2

Guatavita Fuquene

Tarapoto NO2
+
Zygophyceae
Guatavita
Tota
Cianophyceae + + Iguaque
0

Clorophyceae NH4
+ + Tota
Purísima
Correo
+
Crysophyceae
Fuquene Momil
Sebastián
Can3 (6%)

-2

Purísima
Dinophyceae
Xanthophyceae
Bacillariophyceae
-4

+
Iguaque
-6

+
Sebastián
NO3
-8

-10 -5 0 5 10

Can2 (16.6%)

En el tercer gráfico utilizaremos las funciones «heplot()» y «candiscList()»


del paquete “candisc” (Friendly, 2007; Friendly y Fox, 2012), con las cuales se
construyen elipses en el espacio discriminante canónico, que representan la va-
riabilidad correspondiente a las hipótesis y a los residuos del modelo lineal. La
diferencia entre las funciones «candiscList()» y «candisc()» es que la primera
realiza un análisis discriminante para todos los términos del modelo, mientras
que la segunda, como se vió anteriormente, se realiza solamente para el término
que se especifique. En la función «candiscList()» con «type» se especifica el
modo de descomposición o asignación de las sumas de cuadrados entre los dis-
tintos términos del modelo, como es habitual en el análisis de la varianza, que
puede ser II o III (no tiene ningún efecto si solo utilizamos un factor).
En la función «heplot()» con el argumento «fill» se puede especificar si se
rellenan o colorean las áreas de las elipses. Debido a que con la función
«candiscList()» se ha realizado un análisis canónico discriminante para todos
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
198

los términos del modelo de regresión lineal, si en «term» se pusiera «TRUE» se


mostrarían los gráficos para todos los términos, y poniendo «TRUE» en los argu-
mentos «ask» y «graphics» aparece una ventana en la que se puede seleccio-
nar el término a representar.

¾ canL <-candiscList(mod, type="II")


¾ heplot(canL, which = c(1,2), scale=16, var.col = "blue", var.lwd=1,
var.cex=1, prefix = "Can", suffix = TRUE, fill=TRUE, term="Lago",
ask=FALSE, graphics=FALSE)

En el gráfico la elipse de color verde representa la variabilidad de la hipótesis,


en este caso la variabilidad explicada por el lago, y la marrón la variabilidad resi-
dual. Se comparan los tamaños de ambas elipses, y se observa que el lago ex-
plica una gran parte de la variabilidad de las dos primeras funciones discrimi-
nantes.
También se muestran como vectores las diferentes variables dependientes, es
decir, las concentraciones de algas y variables de entorno, por lo que se puede
apreciar gráficamente la mayor o menor aportación de cada variable a las fun-
ciones discriminantes y, por lo tanto, al proceso de clasificación.
Por último, los distintos lagos, representados por puntos en el gráfico, pueden
asociarse a las diferentes variables. En el lago Tota predominan las especies
Cianophyceae y Clorophyceae y en el lago Sebastián son mayores las concen-
traciones de NO3 y SiO2.

En el cuarto gráfico se usa la función «heplot3d()», que permite visualizar las


elipses en el espacio discriminante canónico pero en 3D, rotando el gráfico con el
ratón. Al ser 3D, se ponen tres ejes «which=c(1,2,3)».

¾ heplot3d(canL, which = c(1,2,3), scale=16, term="Lago", ask=FALSE,


graphics=FALSE)
GRÁFICOS AVANZADOS
199

III.20.3. GGE BIPLOTS

Otra función interesante es «GGEBiplot()» del paquete “GGEBiplotGUI”


(Frutos, 2012). Yan y col. (2000) propusieron utilizar los efectos combinados de
genotipos (G) y de interacción genotipo-ambiente (IGA) en la evaluación del ren-
dimiento en cultivos de trigo, obteniéndose los gráficos denominados GGE biplot
que facilitan la identificación visual de los genotipos y los ambientes de evalua-
ción. Generalmente, los gráficos GGE biplot se confeccionan utilizando las dos
primeras componentes principales (CP1 y CP2), derivadas en este caso, de la
descomposición de los efectos combinados de G + IGA (Yan y Kang, 2003). La
primera componente CP1, cuando se encuentra altamente correlacionada con el
efecto principal de genotipo, representa la proporción del rendimiento que se
debe solo a las características del genotipo. La segunda componente CP2, repre-
senta la parte del rendimiento debida a la interacción genotipo-ambiente (Yan y
col., 2001). Los casos se representan por puntos, y las variables mediante fle-
chas o ejes. Esto permite conocer de forma aproximada, a partir del gráfico, los
valores de todas las variables para cada caso o punto representado, que serán
mayores si están hacia la parte mostrada por la punta de flecha, y menores, in-
cluso negativos, si están situadas en la dirección opuesta.
No es necesario un script porque la función trabaja con un menú de ventanas.
El ejemplo que vamos a analizar, cuyos datos están en el archivo Países.xls, se
trata de un conjunto de 57 países de Europa, África y América. Las variables
indican la esperanza de vida masculina y femenina al nacer (en años de vida),
las tasas de mortalidad, mortalidad infantil, natalidad, y fertilidad, el producto
interior bruto per cápita (en miles de dólares anuales) y la tasa de alfabetización
de hombres y mujeres (en porcentaje).
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
200

Si se trabaja con versiones anteriores a R-2.15.0, entonces en la ventana de


RGUI o en un archivo script se introducen las siguientes instrucciones para car-
gar el paquete y llamar a la función.

¾ library (GGEBiplotGUI)
¾ GGEBiplot()

Se obtienen las siguientes ventanas que permiten comenzar con el programa,


abrir el archivo con los datos (Países.xls, archivos Excel con extensión xls) y
seleccionar la hoja de trabajo dentro del archivo.

Si se trabaja con la versión R-2.15.0 o superior, entonces en la ventana de


RGUI o en un archivo script se introducen las siguientes instrucciones para car-
gar el paquete, los datos y llamar a la función. En este caso se trabaja con el
archivo PaísesGGB.csv, que son los mismos datos mencionados anteriormente,
pero en formato csv.

¾ library (GGEBiplotGUI)
¾ Datos<-read.csv2("PaísesGGB.csv", header=TRUE, encoding="latin1")
¾ GGEBiplot(Datos)
GRÁFICOS AVANZADOS
201

Posteriormente se obtiene la siguiente ventana que permite definir las carac-


terísticas de la representación. Es necesario elegir tres parámetros u opciones
gráficas: SVP, centrado y escalado:
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
202

Se puede elegir con SVP (singular value partitioning) si deseamos centrar la


atención –y mantener las relaciones de proporcionalidad– en los casos o filas
«JK-(Row Metric Preserving)», en las variables o columnas «GH-(Column Metric
preserving)» o ambas simultáneamente «HJ-(Dual Metric Preserving)» o «SQ-
Symmetrical». La elección dependerá de la aplicación concreta, y de si deseamos
visualizar y obtener conclusiones preferentemente relativas a casos o a variables.
La elección del SVP influirá en las distancias entre casos o entre variables, y no
afectará en general a las relaciones entre ambos. En este caso dejamos la opción
por defecto «GH-(Column Metric preserving)».

Se puede centrar el gráfico en el origen de las variables «Tester-Centered


G+GE» (en general la mejor opción), no centrar, o un centrado conjunto
«Double-Centered GE». En este caso también dejamos la opción por defecto
«Tester-Centered G+GE».

También podemos mantener los datos originales o tipificar dividiendo cada


variable por su desviación típica mediante la opción «Scaled (Divided) By». Divi-
dir por la desviación típica suele ser adecuado cuando las variables son hete-
rogéneas y los valores muy desequilibrados (por ejemplo algunas variables to-
man valores en el rango de milésimas o centésimas, y otras valores en millones
GRÁFICOS AVANZADOS
203

o miles, por efecto de las distintas unidades de medida). Como en nuestro caso
las variables son heterogéneas seleccionamos «Std Deviation (SD)».

El gráfico que se obtiene se muestra en la siguiente figura. A menudo las op-


ciones por defecto son adecuadas, pero una vez creado el gráfico, se pueden
modificar mediante la entrada de menú «Models». En general trataremos de con-
seguir el gráfico que nos permita visualizar mejor las relaciones entre casos y
variables, a menudo con fines exploratorios.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
204

Los biplots deben interpretarse en términos de distancias entre elementos y


orientación de los ejes. En el gráfico anterior, la variable PIB_cap toma valores
más altos para Dinamarca, Gran Bretaña, Holanda, y más bajos para los que
están en la dirección contraria, Botswana, Somalia, Nicaragua. Burkina Faso,
Somalia o Gambia se caracterizan por valores altos de natalidad, fertilidad y
mortalidad infantil, y bajos de esperanza de vida y tasas de alfabetización.
Uganda y República Centroafricana tienen altas tasas de mortalidad, pero el
grupo de países desarrollados (Holanda, Gran Bretaña, Dinamarca, etc.) también
se sitúan orientados hacia los valores altos de la tasa de mortalidad (la
proyección sobre el eje de mortalidad es similar a Zambia o Tanzania). Costa
Rica o Paraguay tienen valores bajos de PIB, y también valores bajos de mortali-
dad, y altos de esperanza de vida.
Además de los ejes 1 y 2, en el menú «Biplot» se puede seleccionar repre-
sentar otros ejes, como se muestra en la siguiente figura.

En el menú «Biplot», es de gran utilidad la opción «Biplot 3D», ya que se ob-


tiene un gráfico en otra ventana, que se muestra a continuación, el cual se puede
rotar con el ratón para tener una mejor visión de donde se ubican los diferentes
casos.
GRÁFICOS AVANZADOS
205

La entrada de menú «Biplot Tools» permite examinar una fila o caso


«Examine a Genotype», o bien una columna o variable «Examine an
Environment» por separado. Por ejemplo se selecciona España; el archivo de
datos debe estar ordenado previamente por las etiquetas de filas (nombre de los
países).
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
206

En el gráfico que se obtiene se muestran los dos ejes principales en color rojo.
La etiqueta del país (en este ejemplo, España) indica el sentido positivo del eje
principal. El segundo eje, perpendicular al primero, separa las variables que to-
man valores por encima de la media (del lado de la etiqueta: PIB, tasas de alfa-
betización, esperanza de vida) de las variables con valores por debajo de la me-
dia (mortalidad –próxima a la media-, mortalidad infantil, fertilidad, natalidad).
Por lo tanto, las variables se pueden ordenar de acuerdo con su importancia,
influencia, o adecuación. La distancia al eje principal, marcada con líneas pun-
teadas, no debe ser interpretada, ya que corresponde al segundo eje, que explica
una proporción mucho menor de variabilidad, y su significado es en general más
complejo. Si el caso (país) está situado cerca del origen de coordenadas (Brasil,
Bolivia), esta interpretación puede carecer de sentido y no debe ser utilizada.

Examine a Genotype
2.0

Mortalidad

PIB_cap
1.5
AXIS2 10.27 %

1.0
0.5

AlfabetM
España Mortin
AlfabetF
0.0

Fertilida
pVidaF
spVidaM
-0.5

Natalida

-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5

AXIS1 81.87 %

Las variables, representadas mediante vectores de color azul en el gráfico que


se obtiene con la opción «Relation among Environments», están más correlacio-
nadas entre sí cuanto más próximo a cero o a 180º sea el ángulo que forman. Si
el ángulo es pequeño la correlación es positiva (natalidad y fertilidad) y si es
grande negativa (mortalidad infantil y esperanza de vida). Si el ángulo es
próximo a 90º no están correlacionadas (mortalidad y PIB). Las variables con
vectores más grandes (en este caso prácticamente todas) son las que mejor dis-
criminan o distinguen entre casos, y las que están cerca del origen las que me-
nos diferencian los casos (países). No obstante el escalado mediante la desvia-
ción típica puede distorsionar esta interpretación. Si la variabilidad explicada por
los dos ejes (en este ejemplo 81,87% + 10,27%= 92,14%) fuese pequeña, por
ejemplo menor que el 50%, estas interpretaciones no serían válidas, y el biplot
en general deja de tener interés práctico.
GRÁFICOS AVANZADOS
207

Relationship among environments

4
Paraguay
Costa Rica
PanamaHonduras
Marruecos
Nicaragua
Venezuela
Mexico
Ecuador
El Salvador
Colombia
R.Dominicana
Chile Botswana
Guatemala
2

Cuba PeruSudáfrica
spVidaM Bolivia Natalida
pVidaF Argentina Senegal
Nigeria
KenyaLiberia
AXIS2 10.27 %

UruguayBrasil Camerún Somalia


Etiopia Fertilida
Barbados
0

AlfabetF Grecia Gambia Mortin


Portugal
AlfabetM Irlanda
Islandia
España Burkina Faso
Gabon
Holanda
Finlandia Zambia
-2

Noruega
Francia
Gran Bretaña
Italia
Suecia Tanzania
Haiti
Bélgica
Alemania Ruanda
Burundi
R.Centroafri
Suiza
Austria
Dinamarca
Uganda
-4

PIB_cap
Mortalidad
-6

-5 0 5

AXIS1 81.87 %

Utilizando la opción «Compare two Genotypes», se pueden relacionar entre sí


dos casos o filas de los datos (dos países) previamente elegidos. En el gráfico
aparece una línea uniendo los dos países, en el ejemplo Dinamarca y Paraguay,
junto con otra línea perpendicular que pasa por el origen. Esta última línea se-
para las variables: las que están del lado de cada país tienen valores más altos:
Dinamarca tiene mayor PIB, mortalidad, esperanza de vida y tasas de alfabetiza-
ción, Paraguay tiene mayor natalidad, fertilidad, y mortalidad infantil. Si ambos
países están del mismo lado de la recta de separación, el que está más cerca de
la línea es el que tiene valores más altos de las variables que se sitúan al otro
lado.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
208

Compare two Genotypes

4
CostaParaguay
Rica
Marruecos
Honduras
Panama Nicaragua
Venezuela
Mexico
Ecuador
El Salvador
Colombia
R.Dominicana
Chile Botswana
2 Guatemala
Cuba Peru
Sudáfrica
spVidaM Bolivia Natalida
pVidaF Argentina Senegal
Nigeria
Liberia
Kenya
BrasilCamerún
AXIS2 10.27 %

Uruguay Etiopia
Somalia Fertilida
Barbados
0

AlfabetF Grecia Gambia Mortin


AlfabetM Portugal
Irlanda
Islandia
España Burkina Faso
Gabon
Holanda
Finlandia Zambia
Tanzania
-2

Noruega
Francia
Gran Bretaña
Italia
Suecia Haiti
Bélgica
Alemania
Suiza Burundi
Ruanda
R.Centroafri
Austria
Dinamarca
Uganda
-4

PIB_cap
Mortalidad
-6

-5 0 5

AXIS1 81.87 %

En «Which Won Where/What», es posible trazar líneas entre los marcadores


de los casos más alejados del punto de origen (0,0), formando un polígono de
forma tal que contenga a los marcadores de los casos restantes. También se
dibujan desde el origen radios perpendiculares a los lados del polígono, que de-
limitan sectores. El caso ubicado en el vértice de cada sector es el que tiene el
mayor valor para las variables situadas en él. Por ejemplo en este caso Uganda y
la mortalidad, Dinamarca y el PIB_cap, etc. Esta herramienta es especialmente
útil para trabajar con el tipo de datos para los cuales se diseñaron en su origen
los GGE Biplots, es decir, para ver en que ambientes son más productivos los
diferentes genotipos.

Discrimitiveness vs. representativenss


4

Paraguay
Costa Rica
PanamaHonduras
Marruecos
Nicaragua
Venezuela
Mexico
Ecuador
Colombia
El Salvador
R.Dominicana
Chile Botswana
Guatemala
2

Cuba Peru Sudáfrica


spVidaM Bolivia Natalidad
spVidaF Argentina Senegal
Nigeria
KenyaLiberia
AXIS2 10.27 %

UruguayBrasil Camerún Somalia


Etiopia Fertilidad
Barbados
0

AlfabetF Mortinf
Grecia
Portugal Gambia
AlfabetM Irlanda
Islandia
España Burkina Faso
Gabon
Holanda
Finlandia Zambia
-2

Noruega
Francia
Gran Bretaña
Italia
Suecia Tanzania
Haiti
Bélgica
Alemania Ruanda
Burundi
R.Centroafri
Suiza
Austria
Dinamarca
Uganda
-4

PIB_cap
Mortalidad
-6

-5 0 5

AXIS1 81.87 %
GRÁFICOS AVANZADOS
209

En «Discrimitiveness vs representativeness» se representan todas las varia-


bles (columnas) considerando su capacidad para distinguir entre casos (discrimi-
nación) y su representatividad. Un pequeño circulito azul indica la variable me-
dia, y una línea azul une esa media con la “variable ideal”, en el centro, la que
supuestamente permite definir mejor los casos y es más representativa. Los
casos aparecen representados mediante etiquetas de color verde. Los círculos
concéntricos indican el alejamiento de cada variable de la situación ideal. Cuanto
más cerca del centro (variable ideal), más representativa y discriminante es una
variable. En este ejemplo no parece haber diferencias importantes entre varia-
bles, y todas ellas se alejan de forma muy similar de la “variable ideal”.

Discrimitiveness vs. representativenss


4

Paraguay
Costa Rica
Panama Marruecos
Honduras
Nicaragua
Venezuela
Mexico
Ecuador
Colombia
El Salvador
R.Dominicana
Chile Botswana
Guatemala
2

Cuba Peru Sudáfrica


spVidaM Bolivia Natalida
pVidaF Argentina Senegal
Nigeria
KenyaLiberia
AXIS2 10.27 %

UruguayBrasil Camerún Etiopia


Somalia Fertilida
Barbados
0

AlfabetF Grecia Gambia Mortin


Portugal
AlfabetM Irlanda
Islandia
España Burkina Faso
Gabon
Holanda
Finlandia Zambia
-2

Noruega
Francia
Gran Bretaña
Italia
Suecia Tanzania
Haiti
Bélgica
Alemania Burundi
Ruanda
R.Centroafri
Suiza
Austria
Dinamarca
Uganda
-4

PIB_cap
Mortalidad
-6

-5 0 5

AXIS1 81.87 %

En «Mean vs Stability» el gráfico representa las variables, indicando su media


(media de las dos primeras componentes principales) con un circulito azul. Un
primer eje verde pasa por esta variable media y por el origen del gráfico biplot.
Se representa también otro segundo eje de coordenadas perpendicular a esa
línea. Los casos se representan mediante su valor medio para todo el conjunto
de variables, de forma que se pueden ordenar de menor a mayor (a lo largo de
la línea verde en el sentido de la flecha) según su importancia relativa. Si el
punto que representa la variable media está cerca del origen de coordenadas,
eso indicará que tiene poco sentido o poco interés la ordenación de casos. El
alejamiento de cada caso en el sentido del segundo eje –es decir alejado del
primer eje verde- indica mayor variabilidad (a lo largo del conjunto de variables),
y, por lo tanto, menor estabilidad de los casos. Los casos con mayor efecto me-
dio y con mayor estabilidad se sitúan cerca del eje verde principal y en el sentido
de la flecha.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
210

Mean vs. Stability

CostaParaguay
Rica
0.5

Panama Honduras
Venezuela Marruecos
Nicaragua Natalida
spVidaM
pVidaF
Mexico
Ecuador
Colombia
El Salvador
R.Dominicana
Chile Botswana
Guatemala
Cuba PeruSudáfrica
Bolivia Senegal Fertilida
Argentina Nigeria
KenyaLiberia
Uruguay Brasil Camerún Etiopia
Somalia
Barbados
0.0

AlfabetF Grecia
Portugal Gambia
Irlanda
Islandia
España Burkina Faso Mortin
Gabon
AlfabetM
AXIS2 10.27 %

Holanda
Finlandia Zambia
Noruega
Francia
Gran Bretaña
Italia
Suecia Tanzania
Haiti
Ruanda
Burundi
-0.5

Bélgica
Alemania
Suiza
Austria R.Centroafri
Dinamarca
Uganda
-1.0
-1.5

PIB_cap

Mortalidad
-2.0

-1.5 -1.0 -0.5 0.0 0.5 1.0 1.5

AXIS1 81.87 %

En «Rank Environments/Genotypes» se pueden obtener los dos gráficos que


se muestran a continuación, que permiten ordenar las variables (environments)
o los países (genotypes) de acuerdo con criterios agregados. Estos criterios no
siempre tienen un significado adecuado o racional, y su interpretación dependerá
de la aplicación concreta. En la primera figura se ordenan las variables. La
“variable ideal” que se representa con una punta de flecha y una línea que la une
con el origen de coordenadas, es la variable que en teoría mejor explica las di-
ferencias entre filas o países con mayor discriminación y conservando al mismo
tiempo la mayor estabilidad y representatividad. En general, cuanto más cerca
estén las variables reales a esa variable ideal, mejor representan los aspectos
positivos, y cuanto más alejadas (para eso se representan los círculos concéntri-
cos) más se refieren a los aspectos negativos. En nuestro ejemplo, los aspectos
“deseables” están asociados a las variables “positivas” PIB –especialmente-, es-
peranza de vida y tasa de alfabetización, y los aspectos “indeseables” a las va-
riables “negativas” natalidad, mortalidad infantil y fertilidad, y a mitad de camino
entre ambos extremos la variable mortalidad.
El conjunto de variables utilizadas en este ejemplo definen globalmente el ni-
vel de desarrollo, y las variables positivas o negativas lo son en relación con esa
interpretación; así, una mortalidad elevada está asociada simultáneamente con
países subdesarrollados y países avanzados, ya que existen causas de mortalidad
relacionadas con altos niveles de desarrollo, lo que explica que la variable morta-
lidad no aparezca como claramente negativa.
GRÁFICOS AVANZADOS
211

Ranking Environments

4
2
spVidaM Natalida
AXIS2 10.27 % pVidaF
Fertilida
0 AlfabetF Mortin
AlfabetM
-2
-4

PIB_cap
Mortalidad
-6

-5 0 5

AXIS1 81.87 %

En la segunda figura se ordenan los países o filas (genotypes). Se comparan


de nuevo con el perfil ideal: el país ideal es el que tiene mejores resultados, y al
mismo tiempo mayor estabilidad o equilibrio. Cada país se puede comparar con
ese “país ideal”, de forma que cuanto más cerca esté, mejores serán los valores
de las variables que lo definen. Los círculos concéntricos ayudan a establecer las
distancias al perfil ideal con más precisión. En nuestro ejemplo los países más
próximos a la situación ideal son los del grupo de Dinamarca, Holanda o Gran
Bretaña. La línea verde perpendicular que pasa por el origen separa los países
(genotypes) con buena y mala situación en relación con el significado global del
conjunto de variables (en este ejemplo desarrollo económico-social).

Ranking Genotypes
4

Costa Paraguay
Rica
Marruecos
Honduras
Panama Nicaragua
Venezuela
Mexico
Ecuador
Colombia
El Salvador
R.Dominicana
Chile Botswana
Guatemala
2

Cuba Peru
Sudáfrica
spVidaM Bolivia Natalidad
spVidaF Senegal
Nigeria
Liberia
Kenya
Argentina Camerún
AXIS2 10.27 %

UruguayBrasil Etiopia
Somalia Fertilida
Barbados
0

AlfabetF
Grecia
Portugal Gambia Mortinf
AlfabetM Irlanda
Islandia
España Burkina Faso
Gabon
Holanda
Finlandia Zambia
Tanzania
-2

Noruega
Francia
Gran Bretaña
Italia
Suecia Haiti
Bélgica
Alemania
Suiza Burundi
Ruanda
R.Centroafri
Austria
Dinamarca
Uganda
-4

PIB_cap
Mortalidad
-6

-5 0 5

AXIS1 81.87 %
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
212

Por último, en «Format» se puede cambiar el título del gráfico y los colores de
fondo, de las etiquetas y del título.

III.20.4. GRÁFICOS COMBINANDO ANÁLISIS DE COMPO-


NENTES PRINCIPALES Y ANÁLISIS DISCRIMINANTE

La función «dapc()» del paquete “adegenet” (Jombart y col., 2010; Jombart,


2012) realiza en primer lugar un Análisis de Componentes Principales (PCA) y,
posteriormente, con los resultados del PCA realiza un Análisis Discriminante.
Ambos análisis se combinan en un solo gráfico. Es necesario el paquete “ade4”
(Chessel y col., 2012) para hacer el PCA.
El PCA permite transformar el conjunto de variables originales en otro con-
junto reducido de variables, las componentes, que conservan la mayor parte de
la información sobre la variabilidad de los datos, pero siendo pocas (a menudo 2)
permiten una representación gráfica de los elementos de la muestra que sería
inviable con las variables originales en su conjunto.
El Análisis Discriminante se utiliza para separar los elementos de la muestra
en grupos o clases conocidas. Al combinar ambos métodos se obtiene una des-
cripción gráfica más completa para el análisis de los datos, adecuada cuando
tenemos muchas variables correlacionadas entre sí y un criterio de clasificación
que queremos asociar a aquellas variables.
Como ejemplo se utilizan los datos del apartado anterior con variables de un
conjunto de 57 países de Europa, África y América. Las variables indican la espe-
ranza de vida masculina y femenina al nacer (en años de vida), las tasas de
mortalidad, mortalidad infantil, natalidad, y fertilidad, el producto interior bruto
per cápita (en miles de dólares anuales), y la tasa de alfabetización de hombres
GRÁFICOS AVANZADOS
213

y mujeres (en porcentaje). Los datos están en el archivo Países.csv y las ins-
trucciones en el script III.28.R.
En la función «dapc()» se definen las variables que se quieren analizar, en
este caso de la columna 3 a la 11. Con el argumento «grp» se especifica cual es
la variable que se utiliza como agrupación. Con «n.pca» y «n.da» se define el
número máximo de ejes que se guarda para el PCA y para el Análisis Discrimi-
nante, respectivamente.

¾ library(ade4)
¾ library(adegenet)
¾ datos<-read.csv2("Países.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ dapc1 <- dapc(datos[,3:11], grp=Continente, n.pca=60, n.da=30)
Con la instrucción «dapc1» se muestra la estructura de los resultados obteni-
dos, donde por ejemplo se observa que la contribución de cada variable original a
las componentes principales se puede ver con la instrucción «dapc1$var.contr»,
las puntuaciones del PCA se podrían ver con la instrucción «dapc1$pca.loadings»,
etc.

¾ dapc1
¾ dapc1$var.contr
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
214

A continuación, se realiza el gráfico combinado con la función


«scatter.dapc()», donde «dapc1» es el resultado generado con la función an-
terior. Los argumentos «xax» y «yax» definen que ejes se representan (por
defecto «xax=1» y «yax=2»). Con «solid» se especifica el grado de transpa-
rencia en una escala de 0 a 1 (0 indica máxima transparencia). Con «lab» se
indica un vector de etiquetas para los casos (países). Si se pone NULL se utilizan
los nombres de fila (x$tab, si existen) en el gráfico. Con los argumentos
«scree.da=F» y «scree.pca=F» se especifica que no se representen los gráfi-
cos de sedimentos (scree plot) con los autovalores o varianzas de los ejes del DA
y del PCA, respectivamente. Si los queremos representar indicaremos su posi-
ción con los argumentos «posi.pca» y «posi.da», y su tamaño relativo con res-
pecto al gráfico actual con «ratio.pca» y «ratio.da».
Por último, la función «text()» permite poner las etiquetas con los nombres
de los países a cada uno de los puntos, usando las coordenadas del PCA del eje I
«dapc1$ind.coord[,1]» y del eje II «dapc1$ind.coord[,2]». Con el argumento
«srt» se especifica el ángulo de la etiquetas.

¾ scatter.dapc(dapc1,xax=1, yax=2, col=c("red","blue","green"), bg="white",


solid=1, scree.da=F, scree.pca=F, legend=T, posi.leg="topright", cex.lab=2,
lab=NULL)
¾ par(new=T)
¾ text(dapc1$ind.coord[,1], dapc1$ind.coord[,2], labels=País, pos=4, str=0)

En el gráfico se muestran los elementos (países) formando grupos –definidos


por la clase (continente) a la que pertenecen– que se identifican por el color.
Para cada grupo se representa el centroide o punto medio, a partir del cual se
dibujan radios vectores a cada uno de los países. Un elipsoide de variabilidad
permite apreciar la forma de asociación de los elementos de cada clase (dentro
del elipsoide está el 95% de los elementos del grupo), y averiguar cuales son los
elementos que parecen diferenciarse del resto de su grupo.
Así, en el grupo de países americanos, Guatemala y Haití, los menos desarro-
llados del conjunto, parecen acercarse al conjunto africano; Tanzania, Senegal o
Uganda, entre los más pobres de este continente, se alejan de la media en sen-
tido opuesto, mientras Gabón, con importantes recursos petrolíferos, se acerca
ligeramente hacia el grupo europeo. Dentro de éste último grupo, algunos países
(Grecia, Portugal, Irlanda, España, por este orden) parecen anunciar dificultades
futuras en el desarrollo de la crisis que vendrá, con datos anticipados en más de
una década.
Las variables que mayor influencia tienen en esta agrupación son las de con-
tribución más alta: Tasa de natalidad, Tasa de mortalidad, y Esperanza de vida.
GRÁFICOS AVANZADOS
215

El hecho de que los países de cada clase (en este caso cada continente) se
agrupen formando conjuntos homogéneos y diferenciados a partir de las varia-
bles socioeconómicas (sin utilizar en ningún momento para la clasificación o para
el gráfico criterios geográficos) indica que el desarrollo económico se produce por
zonas, y que el avance de un país no es ajeno al de sus vecinos.
Por el contrario, si los grupos que se muestran en el gráfico estuvieran sola-
pados o mezclados, ello querría decir que el criterio de clasificación no está rela-
cionado, o lo está en escasa medida, con el conjunto de variables cuantitativas
utilizado en la aplicación del método.

Africa
América
Europa

Tanzania
Senegal
Uganda Botswana
Ruanda Gabon
Sudáfrica
Burkina Faso
Gambia
SomaliaMarruecos
R.Centroafri
Nigeria Suiza
Burundi
Camerún
Etiopia
Kenya
Liberia Islandia Dinamarca
Holanda
Francia
Austria
GranNoruega
Bretaña
Guatemala
Zambia SueciaAlemania
Bélgica
Haiti Irlanda Italia
Finlandia
Portugal
Grecia España

BoliviaPeru

El Salvador
Honduras
Nicaragua
Mexico
Brasil
Venezuela Barbados
Uruguay
Paraguay ChileArgentina
Ecuador
Colombia
Cuba
R.Dominicana
Panama
Costa Rica

Función dapc (paquete adegenet)

ƒ x: un data.frame, una matriz o un objeto del tipo genind con las


variables a representar, que tienen que ser cuantitativas.
ƒ grp: variable de agrupación.
ƒ n.pca y n.da: definen el número máximo de ejes que se guarda para
el PCA y para el Análisis Discriminante, respectivamente. Si es NULL la
selección es interactiva: n.pca=NULL y n.da=NULL.
ƒ center: si es TRUE las variables se centran a una media de cero:
center=TRUE.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
216

Función dapc (Continuación)

ƒ scale: si es TRUE se escalan las variables dividiendo por su desviación


típica estimada: scale=FALSE.
ƒ var.contrib: si es TRUE se guardan las contribuciones de cada varia-
ble original a las funciones discriminantes: var.contrib=TRUE.
ƒ pca.info: si es TRUE se guarda en los resultados la información del
PCA: pca.info=TRUE.
ƒ pca.select: carácter indicando el modo de selección de los ejes en el
PCA. Con "nbEig" el usuario define el número de ejes en el argumento
n.pca y con "percVar" se especifica que el criterio es alcanzar un de-
terminado porcentaje de varianza explicada que se define en el
argumento perc.pca: pca.select="nbEig".
ƒ perc.pca: porcentaje de varianza explicada por los ejes que sirve
para definir cuantos ejes del PCA se seleccionan: perc.pca=NULL.

III.21. Modelo de efectos principales aditivos e


interacción multiplicativa (AMMI)

Otro método que permite relacionar genotipo y ambiente es el modelo de


efectos principales aditivos e interacción multiplicativa (AMMI, Zobel y col., 1988;
Gauch y Zobel, 1988; 1996). Son necesarios los paquetes “agricolae” (de
Mendiburu, 2012) y “klaR” (Roever y col., 2012). El procedimiento AMMI consiste
en combinar las técnicas del análisis de varianza y el análisis de componentes
principales (PCA) en un solo modelo, donde el análisis de varianza permite estu-
diar los efectos principales de los genotipos y ambientes y los análisis de CP la
interacción GxA la cual es tratada de forma multivariada para su interpretación.
Como ejemplo se usarán los valores del rendimiento de grano (kg ha-1) de 16
híbridos de maíz evaluados en 6 ambientes diferentes (Alejos y col., 2006). Los
datos están en el archivo AMMI.csv y las instrucciones en el script III.29.R.
En la función «AMMI()» es necesario especificar qué variables son el am-
biente «ENV=», genotipo «GEN=», las réplicas «REP=» y la variable que se usa
para cuantificar las diferencias entre genotipos en los diferentes ambientes
«Y=», la cual en este ejemplo es el rendimiento del grano de maíz. Con el argu-
mento «number=FALSE» se especifica que no salgan números y se pongan los
códigos de cada uno de los genotipos.

¾ library(agricolae)
¾ library(klaR)
¾ datos<-read.csv2("AMMI.csv",header=TRUE,encoding="latin1")
¾ attach(datos)
¾ par(cex=1.1)
¾ model<- AMMI(ENV=Area, GEN=Genotipo, REP=Réplica, Y=
Rendimiento, graph="biplot", number=FALSE, xlim=c(-50,40))
Se obtienen los resultados de un ANOVA, el resumen del PCA y un gráfico
biplot. Para más detalles sobre ANOVA y PCA véase Guisande y col. (2011), y
para las conclusiones del trabajo véase Alejos y col. (2006).
GRÁFICOS AVANZADOS
217

PC % Yaritagua-1
FONAIAP-2004
1 37.2
2 26.9
20

HS-9
La Virgen HS-3G
FONAIAP-2002
D-3160
Yaritagua-2 SK-202
MTC-93225
X-1409BW
FONAIAP-104
D-2562 Las Velas
PC 2

HS-11

MTC-93224
HIMECA-3002 Camunare
TOCORÓN-370

HS-13
-20

HIMECA-2020

Guarabao
-40

-40 -20 0 20 40

PC 1

El gráfico biplot muestra la relación entre ambientes y genotipos. Se repre-


sentan las dos primeras componentes principales de la variable rendimiento a
través del conjunto de ambientes, y se acepta que hay interacción entre ambos
(ambiente y genotipo) cuando la variabilidad explicada por las dos primeras
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
218

componentes representadas supera el 50%, como en el ejemplo (37,2 + 26,9 =


64,1%). Los ambientes aparecen representados mediante flechas de color rojo, y
los genotipos en azul. Los ambientes próximos entre sí (La Virgen, Yaritagua 2)
son similares, y los genotipos próximos a ellos son los que se desarrollan más
favorablemente –con mayor rendimiento– en esos ambientes (FONAIAP-2004).
Para obtener el segundo gráfico simplemente se sustituye «graph="biplot"»
por «graph="triplot"» y se quitan los límites del eje x.

¾ model<- AMMI(ENV=Area, GEN=Genotipo, REP=Réplica, Y=


Rendimiento, graph="triplot", number=FALSE)

PC %

1 37.2
2 26.9
3 19.6

FONAIAP-2004

Yaritagua-2

PC2 PC3
Yaritagua-1
SK-202
D-2562
FONAIAP-2002HS-11
Las Velas La Virgen
HS-9
HS-3G MTC-93225
HIMECA-3002
FONAIAP-104
D-3160
TOCORÓN-370
X-1409BW

MTC-93224
Camunare
HIMECA-2020
HS-13

PC1
Guarabao

En el gráfico triplot se representan las tres primeras componentes principales


utilizando los ejes situados como lados de un triángulo equilátero. La primera
componente se mide hacia el vértice izquierdo (desde el lado opuesto), la se-
gunda hacia el vértice superior, y la tercera hacia el vértice derecho. La inter-
pretación es igual que en el gráfico anterior, buscando la asociación por proximi-
dad entre ambientes, entre genotipos, y entre ambientes y genotipos, aunque la
ventaja de este gráfico es que se conserva un mayor porcentaje de variabilidad
(83,7%) al emplear una componente más.
En la interpretación del gráfico no se debe olvidar que cada eje tiene una im-
portancia distinta, en proporción a la variabilidad explicada y, por lo tanto, las
distancias entre puntos deben matizarse de acuerdo con la dirección.
GRÁFICOS AVANZADOS
219

III.22. Gráficos de inferencia en coste/eficacia

El paquete “ICEinfer” (Obenchain, 2012) está dedicado al análisis y represen-


tación gráfica de relaciones de coste frente a eficacia o rendimiento, cuantificando
y modelizando la incertidumbre asociada a los datos obtenidos por muestreo, así
como otras posibles fuentes de incertidumbre (Obenchain y col., 1997:
Obenchain, 1999). La inferencia estadística se realiza mediante técnicas no pa-
ramétricas de remuestreo (bootstrap).
Este tipo de análisis se aplica a menudo en el ámbito de la medicina. Un
nuevo tratamiento, más costoso que el anterior, puede presentar una mayor
eficacia. Aquellos que deben financiar o pagar el servicio sanitario (como las em-
presas aseguradoras o los administradores de la sanidad pública) estarán quizás
preocupados por los aspectos de incremento de coste, y los pacientes y sus fami-
liares, o los médicos, lo estarán sobre todo por los aspectos de incremento de
eficacia. ¿Justifica un pequeño aumento de eficacia un elevado coste adicional?
Para visualizar esta relación entre las dos dimensiones del problema se suele
representar en el eje horizontal el aumento de eficacia y en el vertical el incre-
mento de coste (plano ICE).
El ejemplo consiste en un ensayo clínico doble-ciego aleatorizado en el que 91
pacientes con depresión grave recibieron un tratamiento nuevo (duloxetina) y 87
pacientes otro estándar (paroxetina). El archivo de datos tiene 178 casos y 3
variables: eficacia (idb), coste (ru) y tratamiento (dulx). No hay archivo de datos
ya que estos vienen en el paquete “ICEinfer”. Las instrucciones están en el script
III.30.R.
En el primer gráfico, con la función «ICEuncrt()» se generan muestras alea-
torias mediante remuestreo. Con el argumento «df» se indica el data frame con
las tres variables necesarias. El argumento «trtm» es para especificar la variable
tratamiento; el valor 1 indica el tratamiento nuevo (duloxetina) y el 0 la ausencia
de tratamiento o el tratamiento antiguo (paroxetina). Con el argumento «xeffe»
se especifica la variable con la información de la eficacia del tratamiento. Con
«ycost» se especifica la variable con el coste del tratamiento.
Con «lambda», cuyo valor por defecto es 1, se introduce el valor del coste
implícito (shadow price), o incremento de coste que la sociedad o los usuarios
aceptarán por una unidad de aumento de eficacia, y equivale a una tasa de sus-
titución. Con «R=25000» se especifica que se generen 25.000 muestras aleato-
rias mediante remuestreo. Por último, con el argumento «seed=0» se establece
el inicio del generador de números aleatorios.
Este análisis se guarda en «dpunc» y, posteriormente, se representa el gráfico
con la función «plot()».

¾ library(ICEinfer)
¾ data(dulxparx)
¾ dpunc <- ICEuncrt(df=dulxparx, trtm=dulx, xeffe=idb, ycost=ru, lambda=1,
R = 25000, seed = 0)
¾ plot(dpunc)

Las líneas horizontales y verticales en el medio de la figura indican el valor


medio de las diferencias en coste (eje y) y eficacia (eje x) del tratamiento nuevo
(trazo discontinuo) en relación con el antiguo (trazo continuo). La distribución
aleatoria generada mediante remuestreo permite estimar con intervalos de con-
fianza cualquier estadístico de interés. Se observa que la mayoría de los puntos
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
220

se sitúan en las posiciones correspondientes a menor coste (más abajo) y mayor


eficacia (más a la derecha) del tratamiento nuevo.

ICE Alias Uncertainty for Lambda = 1


20
10
Cost Difference

0
-10
-20

-20 0 20

Effectiveness Difference
Units = cost : Bootstrap Reps = 25000

La recta representada en diagonal en el plano ICE con trazo discontinuo tiene


pendiente lambda, y representa los puntos de igual preferencia o igual beneficio
neto BN (curva de indiferencia) y, como pasa por el origen, corresponde a un BN
nulo, es decir, las situaciones en las que el mayor rendimiento está compensado
exactamente por el incremento de coste.
Los puntos en la recta de igual BN muestran la disposición de los usuarios a
pagar más –WTP- por una mayor eficacia (hacia arriba a la derecha) o a aceptar
una eficacia menor –WTA- a cambio de un coste más bajo (abajo a la izquierda).
Un punto situado por debajo y a la derecha de la recta es siempre preferible a
otro por encima y a la izquierda, ya que indica menor coste por la misma eficacia
o mayor eficacia por el mismo coste. El valor de lambda debe estar razonable-
mente entre los límites (WTA, WTP), y una opción habitual es tomar la media
geométrica de ambos valores.
El primer objetivo es estimar la relación R= Incremento de Coste/Incremento
de Eficacia del nuevo medicamento en relación con el antiguo a partir de los da-
tos de la muestra. La posición de los puntos que representan ambas situaciones
(coste/eficacia antigua y nueva) nos permite visualizar la relación: si el nuevo
punto está a la derecha y por debajo del antiguo, eso indicará que el nuevo es
mejor. Por lo tanto, es posible utilizar el ángulo que forma la línea que une am-
bos puntos con la horizontal en sustitución de R. Esta transformación angular (R
por el ángulo) es más fácil de visualizar en el gráfico y presenta ventajas espe-
cialmente cuando el incremento de eficacia (el denominador) es muy pequeño,
GRÁFICOS AVANZADOS
221

ya que en ese caso el estimador de R es muy inestable. Naturalmente, los inter-


valos de confianza para la estimación de R se transforman en un ángulo a ambos
lados del eje o dirección estimada para R.
En la figura siguiente se muestra la estimación (línea punteada) de la relación
coste/eficacia junto con los ángulos que representan los límites de confianza (en
este caso el intervalo es muy grande, mayor que 180 grados).

¾ data(dpunc)
¾ dpwdg <- ICEwedge(dpunc, conf = 0.95)
¾ plot(dpwdg)

Wedge-Shaped ICE Region with Confidence = 95 %


20
10
Cost Difference

0
-10
-20

-10 -5 0 5 10

Effectiveness Difference
Units = cost ; lambda = 0.26 ; Angles = alibi

El segundo objetivo del análisis, más ambicioso, consiste en representar en el


gráfico las relaciones de preferencia coste/eficacia. En el caso más sencillo, si
suponemos que la tasa de sustitución lambda refleja realmente la situación de
equivalencia para cualquier punto del plano, podemos utilizar la recta con pen-
diente lambda que pasa por el origen como curva de indiferencia, como se indicó
anteriormente, y rectas paralelas a ésta para indicar distintos niveles de prefe-
rencia mayor (por debajo) o menor (por encima). El plano ICE quedaría de este
modo dividido en franjas por esas rectas paralelas con pendiente igual a lambda
–curvas de indiferencia- indicando preferencias crecientes de arriba abajo (o de
izquierda a derecha).
No obstante ese planteamiento no es realista. La relación de preferencia cam-
bia en las distintas zonas del plano y no es razonable considerar constante la
tasa de sustitución cualquiera que sea la posición en el plano. Se han utilizado
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
222

distintas expresiones para medir la preferencia en función de las coordenadas x e


y, de las cuales la que se expone a continuación -empleada por el paquete
“ICEinfer”- es una función general que parece cumplir razonablemente los dis-
tintos principios y axiomas establecidos sobre el concepto de preferencia (mo-
notonicidad, simetría, indiferencia, invariancia ante cambios de escala, etc.).

P(x, y) ~ (x2 + y2) (-)/2 {x - y}


 
El simbolo ~ significa “proporcional a”; {x - y} es igual a (x – y) multiplicado
por el signo (1 o -1) de x-y.
El parámetro  mide las “economías de escala”, o los cambios en la propor-
cionalidad de la preferencia cuando nos movemos a lo largo de los ejes. Las pre-
ferencias cambian proporcionalmente (=1), más que proporcionalmente (>1)
o menos que proporcionalmente (<1). Valores grandes de  harán que las cur-
vas se distancien cada vez menos entre sí al alejarse del origen en el centro del
gráfico. Valores de gamma distintos de la unidad harán que las curvas de
indiferencia se alejen de la linealidad (más distintas de la recta), aunque la forma
también depende de beta; valores de gamma < beta producen curvas de indife-
rencia –atípicas– cóncavas hacia el origen. El mapa con curvas de indiferencia
que son rectas paralelas equidistantes citado anteriormente se obtiene con beta
= gamma =1. Se utiliza también en los gráficos el cociente eta = gamma/beta.

¾ dpcol <- ICEcolor(dpwdg)


¾ plot(dpcol)

ICE Alibi Confidence Wedge with Preference Colors


10
5
0
Cost Difference

-5
-10
-15
-20

-20 -10 0 10 20

Effectiveness Difference
lambda = 0.26 , beta = 1 , gamma = 5.828 , eta = 5.828
GRÁFICOS AVANZADOS
223

Para cuantificar la incertidumbre –tanto estadística como económica– aso-


ciada a los diferentes parámetros (especialmente lambda), se puede utilizar la
distribución de preferencia económica, calculada mediante remuestreo, para los
puntos (x,y) del plano ICE que están dentro de los límites de confianza del 95%.
El histograma correspondiente, elaborado automáticamente por la función
«ICEcolor()», se muestra a continuación.

Economic Preference Distribution within ICE Wedge


8000
6000
Frequency

4000
2000
0

0 5 10

Preference Score

En este ejemplo se observa que predominan los valores bajos, con una distri-
bución claramente asimétrica. La mayoría de los usuarios se sitúan en las posi-
ciones –puntos en el plano– correspondientes a coste bajo y eficacia menor.
Por último, el gráfico 5 es un mapa completo de preferencias que se obtiene
con la función «ICEomega()».

¾ epm <- ICEomega(beta=0.8)


¾ require(lattice)
¾ plot(epm)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
224

ICE Economic Preference Map

40

30

5
20

10
Delta Cost

0 0

-10

-20
-5

-30

-40

-5 0 5

Delta Effectiveness (Cost Units)


lambda = 1 , beta = 0.8 , gamma= 4.663 , eta= 5.828

Esta representación permite apreciar los efectos sobre las curvas de indiferen-
cia, o de igual Beneficio Neto, de los cambios en el valor de lambda (coste total
implícito) y en otros parámetros del modelo (beta y gamma, que regulan la li-
nealidad y otras características de forma). Los distintos colores muestran las
situaciones de coste/eficacia que los usuarios consideran equivalentes. Los valo-
res de preferencia aumentan hacia el ángulo inferior derecho y disminuyen hacia
el superior izquierdo.
Si se utiliza el valor estándar lambda = 1, como en el ejemplo, se obtiene un
mapa en el que los puntos de la diagonal (x=y) tienen preferencia cero (la ven-
taja en eficacia se compensa con el aumento de coste) y, además, las curvas de
indiferencia son simétricas con respecto a esa diagonal.

III.23. Meta-análisis

Meta-análisis es una técnica estadística que permite combinar varios estudios


estadísticos en uno solo. Con ello se consigue construir estadísticos de resumen
que puedan sacar ventaja de la mayor potencia proporcionada por el tamaño de
muestra, necesariamente más grande, resultante de la agregación de las dife-
rentes muestras de todos los estudios. Este análisis es de especial interés en
GRÁFICOS AVANZADOS
225

medicina, donde es importante determinar si un determinado medicamento, un


compuesto, una terapia, etc., puede ser beneficioso o perjudicial para la salud y,
sobre todo, en aquellos casos en los cuales existe discrepancia entre los diferen-
tes estudios. Como se mencionó anteriormente, la ventaja del meta-análisis es
que permite combinar la información de todos los trabajos realizados.
Las representaciones que se utilizan más frecuentemente son el diagrama de
bosque y el diagrama de embudo.

III.23.1. DIAGRAMA DE BOSQUE

Para este tipo de gráfico se pueden usar las funciones «metabin()» y


«forest.meta()» del paquete “meta” (Schwarzer, 2012). Las instrucciones están
en el script III.31.R. Los datos, que están en el archivo Meta-análisis.csv, co-
rresponden a un estudio de Silagy y Ketteridge (1997) sobre el efecto que tiene
el consejo médico a la hora de dejar de fumar. En el archivo de datos, la variable
«n.evento» hace referencia al número de personas que dejaron el tabaco por
recomendación del médico, «N.evento» el número total de personas del grupo a
las que el médico recomendó dejar de fumar y, «n.control» y «N.control» son las
personas que dejaron de fumar y el total de personas que estaban en el grupo
control, a las que el médico no les recomendó dejar el tabaco, respectivamente.
Con esos datos se puede calcular para cada estudio la OR (Odds Ratio), que
muestra el efecto del consejo del médico de dejar de fumar. El meta-análisis
permite calcular una OR agregada, considerando la muestra total de todos los
estudios.
En la función «metabin()» hay que poner las variables que necesita la fun-
ción: «event.e» número de eventos a los que afecta el tratamiento en el grupo
experimental, «n.e» número total de observaciones en el grupo experimental,
«event.c» número de eventos a los que afecta el tratamiento en el grupo control
y «n.c» número total de observaciones en el grupo control. Con el argumento
«sm» se indica la medida utilizada para resumir la información: riesgo relativo
"RR", razón de ventajas (odds ratio) "OR", diferencia de riesgo "RD" o arcoseno
de la diferencia "AS". Con «method» se especifica el método de agrupación de
los casos: Mantel-Haenszel "MH", inverso de la varianza "Inverse" o método Peto
"Peto". Con «studlab» se puede incluir un vector opcional con etiquetas para
cada uno de los estudios. Con «print.CMH=TRUE» se indica que se muestre el
resultado del test Cochran-Mantel-Haenszel, que evalúa el efecto conjunto de
todos los estudios.
En la función «forest.meta()» con los argumentos «pooled.totals=T» y
«pooled.events=T» se especifica que se muestre el número total de observa-
ciones y eventos de todos los estudios. Con «leftcols» y «rightcols» se especi-
fica qué parámetros adicionales se muestran en el lado izquierdo y derecho del
diagrama, respectivamente, y con «leftlabs» y «rightlabs» se ponen las eti-
quetas de los parámetros anteriores (debe ser el mismo número de etiquetas
que parámetros en «leftcols» y «rightcols»). Los argumentos «lab.e» y
«lab.c» son leyendas del resumen de los datos del grupo experimental y del
grupo control, respectivamente. Con «addspace=FALSE» se indica que no se
deje una línea en blanco entre los títulos y la tabla con los datos de los estudios.
Por último, con «col.square» y «col.diamond» se definen los colores de los
símbolos (cuadrados) de cada estudio que muestran el tamaño de la muestra y
su valor de OR, y el de los símbolos (rombos) que indican el promedio de los
efectos fijos y aleatorios, respectivamente.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
226

¾ library(meta)
¾ datos<-read.csv2("Meta-análisis.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ meta <- metabin(event.e=n.evento, n.e=N.evento, event.c=n.control, n.c=
N.control, sm="OR", method="MH", studlab=paste(Estudio,Año),
print.CMH=TRUE)
¾ meta
¾ forest.meta(meta, text.fixed ="Modelo de efectos fijos",
text.random="Modelo de efectos aleatorios", pooled.totals=T,
pooled.events=T, xlab="Razón de ventajas (OR)", leftcols=c("studlab",
"event.e", "n.e", "event.c", "n.c"), leftlabs= c("Estudio", "Eventos", "Total",
"Eventos", "Total"), rightcols=c("effect", "ci", "w.fixed", "w.random"),
rightlabs=c("OR", "95%-CI", "W(fijo)", "W(aleatorio)"), lab.e=
"Experimental", lab.c="Control", hetlab= "Heterogeneidad: ", addspace=
FALSE, col.square="red", col.diamond= "blue", fs.xlab=14, ff.xlab=2)

En el test de Cochran-Mantel-Haenszel p < 0,001 y, por tanto, el número de


pacientes que dejan de fumar es diferente en el grupo experimental y en el de
control (véase Guisande y col., 2011 para más detalles sobre este test).

Experimental Control
Estudio Eventos Total Eventos Total OR 95% -CI W(fijo) W(aleatorio)
Porter 1972 5 101 4 90 1.12 [0.29; 4.30] 1.8% 2.3%
Rusell 1979 34 1031 8 1107 4.68 [2.16; 10.17] 3.4% 5.8%
Wilson 1982 21 106 11 105 2.11 [0.96; 4.63] 4.0% 5.7%
Stewart 1982 11 504 4 187 1.02 [0.32; 3.25] 2.6% 3.0%
Rusell 1983 43 761 35 659 1.07 [0.67; 1.69] 16.1% 11.7%
Jamrozik 1984 77 512 58 549 1.50 [1.04; 2.16] 21.7% 14.6%
McDowell 1985 12 85 11 78 1.00 [0.41; 2.42] 4.5% 4.7%
Page 1986 8 114 5 68 0.95 [0.30; 3.03] 2.7% 3.0%
Janz 1987 28 144 12 106 1.89 [0.91; 3.92] 5.1% 6.4%
Slama 1990 1 104 1 106 1.02 [0.06; 16.52] 0.4% 0.6%
Vetter 1990 34 237 20 234 1.79 [1.00; 3.22] 7.9% 8.7%
Demens 1990 15 292 5 292 3.11 [1.11; 8.67] 2.2% 3.7%
Wilson 1990 43 577 17 532 2.44 [1.37; 4.33] 7.5% 8.9%
Haug 1994 20 154 7 109 2.17 [0.89; 5.34] 3.2% 4.6%
Higashi 1995 53 468 35 489 1.66 [1.06; 2.59] 13.8% 12.0%
Slama 1995 42 2199 5 929 3.60 [1.42; 9.12] 3.1% 4.4%

Modelo de efectos fijos 447 7389 238 5640 1.76 [1.49; 2.08] 100% --
Modelo de efectos aleatorios 1.76 [1.42; 2.18] -- 100%
Heterogeneidad: I-squared=27.7%, tau-squared=0.0478, p=0.1451

0.1 0.5 1 2 10
Razón de ventajas (OR)

En el diagrama de bosque anterior se muestran las OR e intervalos de con-


fianza de los distintos estudios. El valor estimado se representa mediante un
cuadrado, y los límites de confianza son los extremos de cada línea horizontal.
Vemos como muchas líneas sobrepasan el valor 1 por la derecha, indicando que
la proporción de personas que dejan de fumar es mayor en el grupo experimen-
tal que fue aconsejado por el médico, que en el grupo control que no estaba in-
fluenciado por las recomendaciones del médico. El tamaño del cuadrado indica la
GRÁFICOS AVANZADOS
227

muestra utilizada: cuanto más grande es el cuadrado más representativo es el


estudio y, por lo tanto, más fiables sus conclusiones.
W es el peso o ponderación que corresponde a cada estudio en la obtención
de la OR promedio o de resumen. Su valor depende del método de agregación
utilizado, de los tamaños de muestra y del número de eventos en cada estudio.
Si los estudios utilizados en el meta-análisis son todos los estudios existentes
debemos utilizar el modelo de efectos fijos y, si se trata de una muestra de estu-
dios elegida al azar, el aleatorio. Cuando los estudios son muy heterogéneos, es
decir muy diferentes entre sí, es discutible que puedan agregarse en uno solo.
Por esa razón se utilizan diferentes medidas de heterogeneidad. Entre ellas están
Tau cuadrado, variabilidad entre estudios, o el estadístico I cuadrado, que mide
la proporción de la variabilidad total que es atribuible a la heterogeneidad entre
estudios, es decir, la variabilidad entre estudios dividida por la variabilidad total
= variabilidad entre estudios + variabilidad entre pacientes. Los autores del es-
tadístico I cuadrado (Higgins y col., 2003) proponen los valores de corte 25 y 75
para interpretar que la heterogeneidad es baja (menos de 25%), moderada
(25% - 75%) o alta (más de 75%). En nuestro ejemplo, 27,6% es moderada-
baja y, por consiguiente, no supone ningún problema.
La OR de resumen calculada con el meta-análisis, se representa mediante un
rombo en la parte inferior, siendo los extremos del rombo los límites de con-
fianza correspondientes. Observamos como el intervalo de confianza es mucho
más pequeño que cualquiera de los estudios individuales, lo que se debe al ma-
yor tamaño de la muestra agregada, y el hecho de que sea mayor de 1, en con-
creto 1,61 para los efectos fijos y 1,67 para los aleatorios, significa que el médico
influye positivamente a la hora de dejar el tabaco y, además, como mostró el
test de Cochran-Mantel-Haenszel, esta diferencia es significativa. El gráfico per-
mite, por lo tanto, apreciar los resultados y conclusiones de cada uno de los es-
tudios individuales y el resultado agregado conseguido con el meta-análisis.
El test de heterogeneidad muestra un p = 0,128, indicando que los diferentes
estudios son homogéneos. Si la probabilidad fuese < 0,05, esto indicaría que los
estudios no son homogéneos y las conclusiones del meta-análisis no serían váli-
das

Función metabin (paquete meta)

ƒ event.e: número de eventos en el grupo experimental.


ƒ n.e: número total de observaciones en el grupo experimental.
ƒ event.c: número de eventos en el grupo control.
ƒ n.c: número total de observaciones en el grupo control.
ƒ studlab: vector opcional donde se pueden incluir más etiquetas para
cada uno de los estudios.
ƒ data: data frame opcional con las cuatro variables necesarias:
data=NULL.
ƒ subset: vector opcional para seleccionar un grupo de datos:
subset=NULL.
ƒ method: método de agrupación de los estudios: Mantel-Haenszel
"MH", inverso de la varianza "Inverse" o método Peto "Peto":
method="MH".
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
228

Función metabin (Continuación)

ƒ sm: medida de resumen utilizada para resumir la información: riesgo


relativo "RR", razón de ventajas (odds ratio) "OR", diferencia de riesgo
"RD" o arcoseno de la diferencia "AS": sm="RR".
ƒ incr: valor numérico que se asigna a aquellos estudios en los que
algún grupo tiene un valor cero: incr=0.5.
ƒ allincr: si es FALSE el valor de incr solamente se añade a los grupos
con valores cero y no a todos los grupos: allincr=FALSE.
ƒ addincr: si es TRUE se añade el valor de incr a todos los grupos, aun-
que no exista ninguno con valor cero: addincr=FALSE.
ƒ allstudies: si es FALSE no se incluyen los estudios que tengan cero o
todos los eventos en ambos grupos. Solamente se aplica si sm es "RR"
o "OR": allstudies=FALSE.
ƒ MH.exact: si es TRUE, no se suma incr a todas las frecuencias de
estudios con recuento cero para los cálculos basados en el método de
Mantel-Haenszel: MH.exact=FALSE.
ƒ RR.cochrane: si es TRUE se añade 2*incr a n.e y n.c en los grupos
con frecuencia cero: RR.cochrane= FALSE.
ƒ level: nivel de confianza que se usa para calcular los intervalos de
cada uno de los estudios: level=0.95.
ƒ level.comb: el nivel de confianza que se usa para calcular los
intervalos del promedio de todos los estudios: level.comb=level.
ƒ comb.fixed: si es TRUE se aplica un modelo de efectos fijos:
comb.fixed=TRUE.
ƒ comb.random: si es TRUE se aplica un modelo de efectos aleatorios:
comb.random=TRUE.
ƒ title: título general del análisis: title="".
ƒ complab: título para especificar el tipo de comparación que se rea-
liza: complab="".
ƒ outclab: título para especificar el tipo de salida del análisis:
outclab="".
ƒ label.e: etiqueta para el grupo experimental: label.e=
"Experimental".
ƒ label.c: etiqueta para el grupo de control: label.c="Control".
ƒ byvar: vector opcional con información para agrupación. Debe tener
el mismo número de estudios que event.e.
ƒ bylab: texto con el nombre de la variable agrupación.
ƒ print.byvar: si es TRUE el nombre de la variable agrupación sale de-
lante del nombre de los grupos: print.byvar=TRUE.
ƒ print.CMH: si es TRUE se muestra el resultado del test Cochran-
Mantel-Haenszel, que evalua el efecto conjunto de todos los estudios:
print.CMH=FALSE.
ƒ warn: si es TRUE sale un mensaje de aviso si se añade el valor de
incr a algún análisis: warn=TRUE.
GRÁFICOS AVANZADOS
229

Función forest.meta (paquete meta)

ƒ x: objeto con el formato meta.


ƒ sortvar: vector adicional para ordenar los estudios que debe tener el
mismo número de elementos que x.
ƒ overall: si es TRUE se muestran los resúmenes de los valores
W(fixed) y W(random): overall=TRUE.
ƒ text.fixed: texto del modelo de efectos fijos: text.fixed="Fixed
effect model".
ƒ text.random: texto del modelo de efectos aleatorios:
text.random="Random effects model".
ƒ lty.fixed: tipo de línea del promedio del modelo de efectos fijos:
lty.fixed=2.
ƒ lty.random: tipo de línea del promedio del modelo de efectos aleato-
rios: lty.random=3.
ƒ text.fixed.w: texto para etiquetar las estimaciones promedio del mo-
delo de efectos fijos: text.fixed.w=text.fixed.
ƒ text.random.w: texto para etiquetar las estimaciones promedio del
modelo de efectos aleatorios: text.random.w=text.random.
ƒ pooled.totals: si es FALSE no se muestra el número total de
observaciones del conjunto de todos los estudios: pooled.totals=
comb.fixed|comb.random.
ƒ pooled.events: si es FALSE no se muestra el número total de even-
tos del conjunto de todos los estudios: pooled.events= FALSE.
ƒ xlab.pos: valor numérico indicando la posición central de la leyenda
del eje x: xlab.pos=ref.
ƒ allstudies: si es TRUE se incluyen en el gráfico también los estudios
para los que no fue posible estimar los efectos del tratamiento:
allstudies=TRUE.
ƒ weight: el tamaño de los símbolos indica el tamaño de muestra del
estudio si no se pone este argumento. Si se pone "same" todos los
símbolos son iguales y con "fixed" y "random" el tamaño de los
símbolos depende de los valores W(fixed) y W(random), respectiva-
mente.
ƒ pscale: se utiliza para cambiar la escala de las proporciones de los
objetos de tipo metaprop. Por ejemplo, pscale = 100 significa que las
proporciones se expresan por 100 observaciones: pscale=1.
ƒ ref: valor numérico indicando el valor de x donde pintar una línea de
referencia.
ƒ leftcols: parámetros que se muestran en el lado izquierdo del
diagrama: leftcols=c("studlab", "event.e", "n.e", "event.c",
"n.c").
ƒ rightcols: parámetros que se muestran en el lado derecho del
diagrama: rightcols=c("effect", "ci").
ƒ leftlabs y rightlabs: etiquetas de los parámetros anteriores.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
230

Función forest.meta (Continuación)

ƒ lab.e y lab.c: leyendas del resumen de los datos del grupo experi-
mental y del grupo control, respectivamente: lab.e= "Experimental"
y lab.c="Control".
ƒ lab.e.attach.to.col y lab.c.attach.to.col: se especifican las colum-
nas donde ubicar las etiquetas lab.e y lab.c, respectivamente.
ƒ at: vector numérico con la posición de las marcas del eje x:
at=NULL.
ƒ label: si es TRUE se muestran las etiquetas de las marcas anteriores:
label=TRUE.
ƒ col.i: color de los resultados del estudio individual y los límites de
confianza: col.i="black".
ƒ col.i.inside.square: color de los resultados del estudio individual y
los límites de confianza, si los límites de confianza están completa-
mente dentro de los cuadrados: col.i.inside.square= "white".
ƒ col.square: color de los símbolos que muestran el número de datos
de cada estudio: col.square="gray".
ƒ col.square.lines: color del borde de los símbolos que muestran el
número de datos de cada estudio: col.square.lines=col.square.
ƒ col.diamond: color de los rombos que representan los resultados de
los modelos de efectos fijos y efectos aleatorios: col.diamond=
"gray".
ƒ col.diamond.fixed: color de los rombos de las estimaciones de efec-
tos fijos: col.diamond.fixed=col.diamond.
ƒ col.diamond.random: color de los rombos de las estimaciones de
efectos aleatorios: col.diamond.random=col.diamond.
ƒ col.diamond.lines: color de las líneas exteriores de los rombos que
representan los resultados de los modelos de efectos fijos y efectos
aleatorios: col.diamond.lines="black".
ƒ col.diamond.fixed.lines: color de las líneas externas de los rombos
para la estimación de efectos fijos: col.diamond.fixed.lines=
col.diamond.lines.
ƒ col.diamond.random.lines: color de las líneas externas de los rom-
bos para la estimación de efectos aleatorios: col.diamond.
random.lines=col.diamond.lines.
ƒ col.by: color para imprimir la información en los subgrupos: col.by=
="darkgray".
ƒ print.I2: si es TRUE se muestra el estadístico I-cuadrado:
print.I2=TRUE.
ƒ print.tau2: si es TRUE se muestra el estadístico tau-cuadrado:
print.tau2=TRUE.
ƒ print.Q: si es TRUE se muestra el estadístico Q de heterogeneidad:
print.Q=FALSE.
ƒ print.p.val.Q: si es TRUE se muestra la probabilidad del estadístico
Q: print.pval.Q=TRUE.
GRÁFICOS AVANZADOS
231

Función forest.meta (Continuación)

ƒ hetstat: con solamente este argumento se puede definir que


estadísticos de los mencionados anteriormente se muestran:
hetstat=print.I2| print.tau2|print.Q|print.pval.Q.
ƒ hetlab: etiqueta de los índices de heterogeneidad hetlab=
"Heterogeneity: ".
ƒ fontsize: tamaño de texto (en puntos).
ƒ fs.heading: tamaño de texto de las leyendas de las columnas.
ƒ fs.fixed: tamaño de texto de los resultados del modelo de efectos fi-
jos.
ƒ fs.random: tamaño de texto de los resultados del modelo de efectos
aleatorios.
ƒ fs.study: tamaño de texto de los estudios individuales:
fs.study=fontsize.
ƒ fs.fixed.labels: tamaño de texto de las leyendas del modelo de efec-
tos fijos: fs.fixed.labels=fs.fixed.
ƒ fs.random.labels: tamaño de texto de las leyendas del modelo de
efectos aleatorios: fs.random.labels=fs.random.
ƒ fs.study.labels: tamaño de texto de las leyendas de los estudios
individuales: fs.study.labels=fs.study.
ƒ fs.hetstat: tamaño de texto de las medidas de heterogeneidad:
fs.hetstat=fontsize-2.
ƒ fs.axis: tamaño de texto de la escala del eje x: fs.axis=fontsize.
ƒ fs.xlab: tamaño de texto de la leyenda del eje x: fs.xlab=fontsize.
ƒ ff.heading: tipo de texto de las leyendas de las columnas:
ff.heading=fontsize.
ƒ ff.fixed: tipo de texto de los resultados del modelo de efectos fijos:
ff.fixed="bold".
ƒ ff.random: tipo de texto de los resultados del modelo de efectos
aleatorios: ff.random=ff.fixed.
ƒ ff.study: tipo de texto de los estudios individuales: ff.study=
"plain".
ƒ ff.fixed.labels: tipo de texto de las leyendas del modelo de efectos
fijos: ff.fixed.labels=ff.fixed.
ƒ ff.random.labels: tipo de texto de las leyendas del modelo de efec-
tos aleatorios: ff.random.labels=ff.random.
ƒ ff.fixed.labels: tipo de texto de las leyendas del modelo de efectos
fijos: ff.fixed.labels=ff.fixed.
ƒ ff.random.labels: tipo de texto de las leyendas del modelo de efec-
tos aleatorios: ff.random.labels=ff.random.
ƒ ff.study.labels: tipo de texto de las leyendas de los estudios indivi-
duales: ff.study.labels=ff.study.
ƒ ff.hetstat: tipo de texto de las medidas de heterogeneidad:
ff.hetstat="bold.italic".
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
232

Función forest.meta (Continuación)

ƒ ff.axis: tipo de texto de la escala eje x: ff.axis="plain".


ƒ ff.xlab: tipo de texto del la leyenda del eje x: ff.xlab="plain".
ƒ squaresize: valor numérico que define el tamaño de los símbolos
cuadrados: squaresize=0.8.
ƒ plotwidth: ancho del gráfico: plotwidth= unit(6, "cm").
ƒ colgap: espacio entre las columnas de la izquierda y derecha:
colgap= unit(2, "mm").
ƒ colgap.left: espacio entre las columnas de la izquierda: colgap.left=
colgap.
ƒ colgap.right: espacio entre las columnas de la derecha: colgap.
right=colgap.
ƒ colgap.forest: espacio entre las columnas adyacentes de la izquierda
y derecha con el gráfico: colgap.forest= colgap.
ƒ colgap.forest.left: espacio entre las columnas adyacentes de la iz-
quierda y el gráfico: colgap.forest.left= colgap.forest.
ƒ colgap.forest.right: espacio entre las columnas adyacentes de la
derecha y el gráfico: colgap.forest.right= colgap.forest.
ƒ just: justificación del texto con las opciones de "left", "right" o
"center": just="center".
ƒ addspace: si es TRUE se añade una línea en blanco para separar los
resultados de los estudios: addspace= TRUE.
ƒ new: si es TRUE el nuevo gráfico se añade al anterior: new=TRUE.
ƒ digits: número de decimales: digits=2.

Los argumentos byvar, bylab, print.byvar, studlab, level, level.comb,


comb.fixed y comb.random son iguales que en la función metabin().

También se pueden usar los argumentos generales xlim, xlab y lwd.

III.23.2. GRÁFICO DE L'ABBÉ

En el caso de que exista heterogeneidad en los estudios, el gráfico de L´Abbé


permite identificar cuales son los estudios responsables de esta heterogeneidad.
Se puede usar las funciones «metabin()» y «labbe.meta()» del paquete
“meta” (Schwarzer, 2012). Las instrucciones están en el script III.32.R. Los
datos, que están en el archivo Meta-análisis.csv, son del mismo ejemplo usado
en el apartado anterior de Silagy y Ketteridge (1997) sobre el efecto que tiene el
consejo médico a la hora de dejar de fumar.
La primera parte del script en la que se usa la función «metabin()» es igual
que la explicada en el apartado anterior. En la función «labbe.metabin()» los
argumentos son prácticamente iguales a la función «forest.meta()» explicada
también en el apartado anterior.

¾ library(meta)
¾ datos<-read.csv2("Meta-análisis.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
GRÁFICOS AVANZADOS
233

¾ meta <- metabin(event.e=n.evento, n.e=N.evento, event.c=n.control, n.c=


N.control, sm="OR", method="MH", studlab=paste(Estudio, Año),
print.CMH=TRUE)
¾ labbe.metabin(meta, xlab="Tasa de eventos (grupo control)", ylab="Tasa de
eventos (grupo experimental)", studlab=TRUE, xlim=c(-0.025,0.2), cex.lab=
1.3, cex.axis=1.2, main="Estudio de la influencia del médico\npara dejar de
fumar", cex.main=1.4, bg="green")
¾ abline(a=0,b=1)

Estudio de la influencia del médico


para dejar de fumar
0.20

Wilson 1982
Janz 1987
Tasa de eventos (grupo experimental)
0.15

Jamrozik 1984
Vetter 1990 McDowell 1985
Haug 1994

Higashi 1995
0.10

Wilson 1990
Page 1986

Rusell 1983
0.05

Demens 1990
Porter 1972

Rusell 1979
Stewart
Slama 1995 1982
Slama 1990
0.00

0.00 0.05 0.10 0.15 0.20

Tasa de eventos (grupo control)


El gráfico de L'Abbé ayuda a profundizar en el análisis de la presencia y cau-
sas de heterogeneidad en el meta-análisis. Se representa para cada estudio el
resultado en el grupo de tratamiento (eje y) frente al resultado en el grupo de
control (eje x), con una línea diagonal a 45º que divide al gráfico en dos partes:
a un lado quedan los estudios en los que fue favorable el grupo experimental, y
en el otro los estudios en los que fue favorable el grupo de control.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
234

En el ejemplo, por encima de la diagonal están los estudios en los que la pro-
porción de pacientes que dejaron de fumar gracias al consejo médico es mayor
que en el grupo de control. Los puntos se representan en tamaño variable en
función del tamaño de muestra y de la precisión de cada estimación, de modo
que los puntos más grandes son los estudios más representativos. Si los puntos
se agrupan en una zona estrecha, próxima a una línea recta, significa que los
resultados son homogéneos, y si están dispersos muestran heterogeneidad. Se
representa también la recta de ajuste a la nube de puntos (línea punteada), cuya
pendiente está relacionada con la OR conjunta. Es fácil identificar los estudios
más alejados del patrón mayoritario, es decir, de la recta de ajuste, que serían
los responsables de la heterogeneidad observada, cuando existe.

Función labbe.metabin (paquete meta)

ƒ x: objeto con el formato meta.


ƒ TE.fixed: vector numérico opcional especificando los valores de los
efectos combinados fijos: TE.fixed=x$TE.fixed.
ƒ TE.random: vector numérico opcional especificando los valores de los
efectos combinados aleatorios: TE.random=x$TE.random.
ƒ text: un vector de caracteres que se pone en vez de los símbolos.
ƒ cex: tamaño de los símbolos.
ƒ cex.studlab: tamaño de las etiquetas de los estudios: cex.studlab=
0.8.

Los argumentos comb.fixed, comb.random, lty.fixed, lty.random, sm,


weight y studlab son iguales que en la función forest.meta().

También se pueden usar los argumentos generales col, bg, xlim, ylim,
xlab, ylab, axes, pch y lwd.

III.23.3. DIAGRAMA DE EMBUDO

Otro problema que puede tener el meta-análisis es el sesgo en la publicación,


es decir, la publicación selectiva de los estudios en base a sus resultados. En
otras palabras, que se publiquen más los resultados que tienen una determinada
conclusión y menos los estudios en los cuales los resultados dan lugar a conclu-
siones diferentes. En algunos estudios se ha observado que si los resultados son
negativos, es decir, que no se observa un efecto, no se suelen publicar, ya que
se basa en la idea equivocada de que un no efecto no es noticia. También puede
ocurrir que no se publiquen los resultados que son desfavorables a la terapia
usada con un determinado fármaco.
El diagrama de embudo permite visualizar y evaluar el sesgo en la publicación
sobre un determinado tema. Las instrucciones están en el script III.33.R. Como
ejemplo usaremos de nuevo los datos del archivo Meta-análisis.csv, que co-
rresponden a un estudio de Silagy y Ketteridge (1997) sobre el efecto que tiene
el consejo médico a la hora de dejar de fumar.
La primera parte del script en la que se usa la función «metabin()» es igual
a como se explicó en el apartado del diagrama de bosque. Con la función
«metabias()» se realiza un test para evaluar la asimetría. El resultado es que
no hay sesgo, ya que la probabilidad es mayor que 0,05 (p = 0,928). En la fun-
ción «funnel.meta()», con el argumento «level» se define el nivel de confianza
GRÁFICOS AVANZADOS
235

del gráfico, con «contour.levels» los diferentes niveles de confianza para las
tramas que se muestran en el gráfico y con «col.contour» los colores de esas
tramas.

¾ library(meta)
¾ datos<-read.csv2("Meta-análisis.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ meta <- metabin(event.e=n.evento, n.e=N.evento, event.c=n.control, n.c=
N.control, sm="OR", method="MH", studlab=paste(Año), print.CMH=
TRUE)
¾ metabias(meta)
¾ color<-c("grey60", "grey80", "grey90")
¾ funnel.meta(meta, comb.fixed=TRUE, level=0.95, contour.levels=c(0.9,
0.95, 0.99), col.contour=color, studlab=TRUE, xlab="Razón de ventajas
(OR)", ylab="Error estándar", cex.lab=1.6, main="Sesgo en las
publicaciones", cex.main=1.8)
¾ legend(5, 0.1,c("0.1 > p > 0.05", "0.05 > p > 0.01", "< 0.01"), fill=color)

Sesgo en las publicaciones


0.0
0.2

1984
1983 1995
19901990
1987
0.4

1982 1979
1985 1994 1995
Error estándar

1990
0.6

1982
1986

1972
0.8
1.0
1.2
1.4

1990

0.1 0.2 0.5 1.0 2.0 5.0 10.0 20.0

Razón de ventajas (OR)


GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
236

El análisis para realizar el gráfico de embudo parte de la idea de que los estu-
dios negativos, que no muestran efecto, tienen menor probabilidad de ser publi-
cados. Si existe sesgo de publicación, que puede ocurrir preferentemente en los
estudios pequeños en los que hay mayor probabilidad de que se alteren los re-
sultados por azar, se tendería a publicar los que mostraran diferencias. En el
diagrama de embudo se representa el estimador de diferencias calculado en el
meta-análisis (razón de ventajas, riesgo relativo, etc.) para cada estudio, junto
con su error estándar. En el caso de no existir sesgo, los puntos se deberían
agrupar alrededor de un estimador central, y mostrarían tanta mayor dispersión
alrededor de este valor cuanto más pequeño fuera su tamaño, de modo que la
nube de puntos se distribuiría en forma de embudo invertido. Si hubiera sesgo de
publicación en el sentido descrito anteriormente, la nube de puntos se deformaría
y el embudo perdería su simetría. En la gráfica anterior se observa que la distri-
bución tiene forma de embudo, corroborando la ausencia de sesgo que también
mostró el test de asimetría.
En el gráfico se muestra, con líneas punteadas, el embudo al que se ajustan
los datos, centrado en la OR estimada. Si los puntos encajan razonablemente en
el embudo, sin asimetrías notables, significa que no existe evidencia de sesgo
(así ocurre en el ejemplo). También se muestran, con distintos tonos de gris, los
límites de confianza para los niveles indicados en el argumento
«contour.levels» (en este ejemplo 90%, 95% y 99%), basados en la hipótesis
nula de que no existe efecto (OR = 1), es decir centrados los embudos en el va-
lor 1. Los puntos que están fuera de los límites de confianza muestran los estu-
dios con efectos significativos para el nivel correspondiente.

Función funnel.meta (paquete meta)

ƒ x: objeto con el formato meta.


ƒ level: nivel de confianza que se usa en el gráfico.
ƒ contour.levels: vector numérico especificando los diferentes niveles
de confianza para las tramas que se muestran en el gráfico.
ƒ col.contour: colores de los contornos anteriores.

Los argumentos comb.fixed, comb.random, lty.fixed, lty.random, sm,


weight, studlab, cex.studlab, text y cex son iguales que en las funciones
forest.meta() y labbe.metabin().

También se pueden usar los argumentos generales col, bg, xlim, ylim,
xlab, ylab, axes, pch y lwd.

III.23.4. DIAGRAMA DE ANÁLISIS DE SENSIBILIDAD

En este diagrama se realiza un análisis de sensibilidad para determinar la


influencia de cada uno de los estudios en la estimación global del efecto y, por lo
tanto, la robustez o estabilidad de la medida final obtenida en el meta-análisis. El
método consiste en la repetición del meta-análisis tantas veces como estudios
seleccionados, de forma que cada vez se omite un estudio. Si los resultados de
los distintos meta-análisis son similares, es decir, el efecto tiene una misma
dirección, magnitud y significación estadística, se puede concluir que el resultado
del meta-análisis tiene solidez. El análisis de sensibilidad también se puede
utilizar para ver que ocurre cuando se eliminan estudios que no han sido
GRÁFICOS AVANZADOS
237

publicados, hay dudas sobre la calidad del estudio, etc. Las instrucciones están
en el script III.34.R. Como ejemplo usaremos de nuevo los datos del archivo
Meta-análisis.csv, que corresponden a un estudio de Silagy y Ketteridge (1997)
sobre el efecto que tiene el consejo médico a la hora de dejar de fumar.
La única función nueva es «metainf()» que permite realizar el análisis de
sensibilidad. El argumento «pooled» permite especificar si se realiza el modelo
de efectos fijos "fixed" o el aleatorio "random".

¾ library(meta)
¾ datos<-read.csv2("Meta-análisis.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ meta <- metabin(event.e=n.evento, n.e=N.evento, event.c=n.control, n.c=
N.control, sm="OR", method="MH", studlab=paste(Estudio,Año),
print.CMH= TRUE)
¾ meta1<-metainf(meta, pooled="random")
¾ forest.meta(meta1, text.random="Modelo de efectos aleatorios",
comb.random=TRUE, leftlabs=c("Estudio"), pooled.totals=F,
pooled.events=F, xlab="Razón de ventajas (OR)", fs.xlab=14,ff.xlab=2,
col.square="red", col.diamond="blue")

Estudio OR 95% -CI

Omitting Porter 1972 1.78 [1.43; 2.22]


Omitting Rusell 1979 1.62 [1.37; 1.93]
Omitting Wilson 1982 1.75 [1.39; 2.19]
Omitting Stewart 1982 1.79 [1.44; 2.23]
Omitting Rusell 1983 1.86 [1.52; 2.28]
Omitting Jamrozik 1984 1.82 [1.43; 2.31]
Omitting McDowell 1985 1.81 [1.46; 2.25]
Omitting Page 1986 1.80 [1.45; 2.23]
Omitting Janz 1987 1.76 [1.40; 2.21]
Omitting Slama 1990 1.77 [1.42; 2.21]
Omitting Vetter 1990 1.77 [1.40; 2.23]
Omitting Demens 1990 1.72 [1.39; 2.14]
Omitting Wilson 1990 1.71 [1.36; 2.13]
Omitting Haug 1994 1.75 [1.40; 2.19]
Omitting Higashi 1995 1.79 [1.40; 2.27]
Omitting Slama 1995 1.70 [1.38; 2.09]

Modelo de efectos aleatorios 1.76 [1.42; 2.18]

Razón de ventajas (OR)

III.23.5. DIAGRAMA DE META-ANÁLISIS ACUMULATIVO

En esta representación se van añadiendo los estudios conforme fueron


apareciendo, lo cual permite ver si existe solidez en la información y, si se llegó a
un equilibrio en el resultado, cuando se alcanzó este equilibrio. Aunque el orden
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
238

cronológico es el método más usado a la hora de ir añadiendo estudios al meta-


análisis, es posible usar cualquier otro orden. Las instrucciones están en el script
III.35.R y, continuando con el estudio de Silagy y Ketteridge (1997) sobre el
efecto que tiene el consejo médico a la hora de dejar de fumar, los datos están
en el archivo Meta-análisis.csv. La única función nueva es «metacum()», en
la cual de nuevo con el argumento «pooled» es posible especificar si se realiza
el modelo de efectos fijos "fixed" o el aleatorio "random".

¾ library(meta)
¾ datos<-read.csv2("Meta-análisis.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ meta <- metabin(event.e=n.evento, n.e=N.evento, event.c=n.control,
n.c=N.control, sm="OR", method="MH", studlab=paste(Estudio,Año),
print.CMH=TRUE)
¾ meta1<-metacum(meta, pooled="random")
¾ forest.meta(meta1, xlab="Razón de ventajas", text.random ="Modelo de
efectos aleatorios", fs.xlab=14, ff.xlab=2, col.square="red", col.diamond=
"blue", leftlabs=c("Estudio"))

Estudio OR 95% -CI

Adding Porter 1972 (k=1) 1.12 [0.29; 4.30]


Adding Rusell 1979 (k=2) 2.56 [0.64; 10.22]
Adding Wilson 1982 (k=3) 2.53 [1.19; 5.36]
Adding Stewart 1982 (k=4) 2.07 [1.02; 4.19]
Adding Rusell 1983 (k=5) 1.71 [0.91; 3.22]
Adding Jamrozik 1984 (k=6) 1.65 [1.07; 2.54]
Adding McDowell 1985 (k=7) 1.55 [1.05; 2.28]
Adding Page 1986 (k=8) 1.49 [1.04; 2.14]
Adding Janz 1987 (k=9) 1.53 [1.11; 2.11]
Adding Slama 1990 (k=10) 1.52 [1.12; 2.07]
Adding Vetter 1990 (k=11) 1.55 [1.19; 2.03]
Adding Demens 1990 (k=12) 1.62 [1.24; 2.11]
Adding Wilson 1990 (k=13) 1.69 [1.32; 2.18]
Adding Haug 1994 (k=14) 1.71 [1.35; 2.17]
Adding Higashi 1995 (k=15) 1.70 [1.38; 2.09]
Adding Slama 1995 (k=16) 1.76 [1.42; 2.18]

Modelo de efectos aleatorios 1.76 [1.42; 2.18]

0.75 1.5

Razón de ventajas

El gráfico muestra que a partir del año 1990, los sucesivos estudios realizados
no añadieron ninguna información, ya que el resultado del meta-análisis fue el
mismo.
GRÁFICOS AVANZADOS
239

III.24. Gráficos de clasificación

El objetivo de los métodos de clasificación es agrupar o clasificar a los ele-


mentos de una muestra de objetos descrito mediante variables, es decir, distri-
buirlos por categorías en función del parecido entre los elementos en base a las
variables que se utilicen. Existen diferentes tipos que veremos a continuación.

III.24.1. CLASIFICACIÓN JERÁRQUICA (DENDROGRAMA)

Es uno de los métodos más utilizados. Se obtiene una secuencia de particio-


nes (clasificaciones) organizada jerárquicamente, desde una única clase que
contiene a todos los elementos, hasta n clases, cada una de ellas con un solo
elemento. La secuencia puede ser representada gráficamente mediante un árbol
(dendrograma), que permite ver el proceso completo de clasificación desde su
inicio con cada elemento en una clase hasta el final con una única clase en la que
están todos los elementos de la muestra (Guisande y col., 2011). En el gráfico se
ven todas las particiones o clasificaciones obtenidas y su relación jerárquica.
Una función que se utiliza para realizar un dendrograma es «hclust()» y la
función «identify()» que permite resaltar zonas dentro del dendrograma. Ambas
funciones vienen con el paquete base. Las instrucciones están en el script
III.36.R y usaremos los datos de pigmentos de algas que están en el archivo
PigAlgas.csv.
En la función «hclust()», el primer argumento sirve para definir los datos y el
tipo de distancia ("euclidea", "manhattan", etc); con «method» se define el
método de aglomeración que puede ser alguna de las siguientes opciones:
"ward", "single", "complete", "average", "mcquitty", "median" o "centroid" (para
más detalles de lo que significa cada método véase Guisande y col., 2011).
Dentro de la función «plot()», con el argumento «hang» se puede definir si se
recortan las ramas terminales. Por ejemplo, con «hang=-1» se eliminarían las
últimas ramas del dendrograma. Con la función «polygon()» se resaltan los
diferentes grupos de algas con un marco. En el supuesto de no querer usar
«polygon()», con la función «identify()» es posible también resaltar una zona
del dendrograma. Se coloca el ratón en la zona que se quiere resaltar y al pulsar
el botón izquierdo del ratón se marca la zona. Con el botón derecho del ratón se
puede parar la función. Los argumentos «N» y «MAXCLUSTER» son para definir
el número máximo de clústeres que se quiere resaltar y el número máximo de
clústeres a resaltar en sentido vertical, respectivamente.

¾ datos<-read.csv2("PigAlgas.csv", header=TRUE, encoding="latin1")


¾ datos<-na.exclude(datos): attach(datos)
¾ hc<-hclust(dist(datos[,2:20], method="euclidea"), method="complete")
¾ plot(hc,label=datos[,1],hang=0.1, main="Pigmentos en algas",
ylab="Altura",xlab="", sub="")
¾ polygon(x=c(0.6,0.6,6.4,6.4),y=c(-1.4,1.3,1.3,-1.4),border="brown")
¾ polygon(x=c(6.6,6.6,11.4,11.4),y=c(-1.4,0.5,0.5,-1.4),border="yellow")
¾ polygon(x=c(11.6,11.6,15.4,15.4),y=c(-1.4,0.5,0.5,-1.4),border="red")
¾ polygon(x=c(15.6,15.6,19.4,19.4),y=c(-1.4,0.2,0.2,-1.4),border="blue")
¾ polygon(x=c(19.6,19.6,27.4,27.4),y=c(-1.4,0.65,0.65,-1.4),border="green")
¾ identify(hc, N=20, MAXCLUSTER=20)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
240

2.5
2.0
1.5
1.0 Pigmentos en algas
Altura

0.5

Diatomeas-S. c.
Diatomeas-Ch. g.
0.0

Diatomeas-Ch. g.
Diatomeas-S. c.

Dinofíceas-H. sp.
Dinofíceas-P. m.
Dinofíceas-H. sp.

Clorofíceas-N. sp.
Clorofíceas-N. sp.
Clorofíceas-D. sp.
Diatomeas-P. t.
Diatomeas-P. t.

Clorofíceas-D. sp.
Dinofíceas-A. m.
Dinofíceas-P. m.

Criptofíceas-C. sp.
Criptofíceas-C. sp.

Clorofíceas-Ch. sp.
Clorofíceas-Ch. sp.
Criptofíceas-R. b.
Criptofíceas-R. b.

Clorofíceas-Ch. a.
Clorofíceas-Ch. a.
Cianofíceas-C. sp.
Cianofíceas-C. sp.
Cianofíceas-S. sp.
Cianofíceas-S. sp.

Con las funciones «draw.dendrogram3d()» y «heatmap()» del paquete


“NeatMap” (Rajaram y Oono, 2012) es posible realizar dendrogramas tridimen-
sionales y “mapas de calor”, respectivamente. Las instrucciones están en el
script III.37.R y se usarán de nuevo los datos morfométricos de peces del ar-
chivo Morfología.csv.
En la primera parte del script se hacen las medias de todos los individuos a
nivel de género con la función «aggregate()». Luego se seleccionan las varia-
bles que se van a usar para agrupar los casos, en este caso de la columna 4 a la
19 y se transforman los datos en una matriz con «as.matrix()», para poste-
riormente asignar etiquetas a las variables, con la función «rownames()», que
permitan identificar los diferentes géneros de peces.

¾ library(NeatMap)
¾ datos<-read.csv2("Morfología.csv", header=TRUE, encoding="latin1")
¾ datos<-na.exclude(datos)
¾ attach(datos)
¾ datos1<-aggregate(datos[,5:31], na.rm=TRUE, by=list(Orden=Orden,
Familia=Familia, Género=Género), mean)
¾ datos2<-as.matrix(datos1[,4:19])
¾ rownames(datos2)<-datos1[,3]
GRÁFICOS AVANZADOS
241

Se puede hacer un dendrograma tridimensional con la función


«draw.dendrogram3d()» del paquete “NeatMap” (Rajaram y Oono, 2012).
Para ello obtenemos previamente coordenadas bidimensionales con la función
«nMDS()». El argumento «embed.dim» define la dimensión del espacio eucli-
deo en el que se pondrá el gráfico. Con «n.iters» se especifica el número de
iteraciones. El argumento «metric» especifica el tipo de distancia, que puede ser
"pearson" o "euclidean".
Una vez generado el dendrograma tridimensional podemos cambiar su ta-
maño de modo interactivo utilizando la rueda del ratón, y girarlo conveniente-
mente en el espacio tridimensional desplazando el ratón mientras mantenemos
pulsado el botón izquierdo.

¾ hc.MDS<-nMDS(datos2, embed.dim = 3, n.iters = 300, metric="euclidean")


¾ hc.CLUSTER<-hclust(dist(datos2,method="euclidea"), method="complete")
¾ draw.dendrogram3d(hc.CLUSTER,hc.MDS$x,labels=rownames(datos2),lab
el.size=0.5)

La función «heatmap()» del paquete “NeatMap” (Rajaram y Oono, 2012)


construye un “mapa de calor”, que muestra con distintos colores y tonos la in-
tensidad de la relación. Aplicado a una matriz de datos, con casos y variables
(filas y columnas), clasifica ambos simultáneamente elaborando un dendrograma
marginal para las filas y otro para las columnas, ordenados conjuntamente. Los
colores indican la intensidad de la relación o los valores de la variable represen-
tada, desde el blanco (máxima relación o valor más alto), pasando por el amari-
llo y naranja hasta el rojo intenso (mínimo valor), aunque estos colores por de-
fecto pueden ser modificados libremente por el usuario. El argumento «margin»
es un vector con 2 números que especifica los márgenes que se dejan para las
filas y las columnas.

¾ hv <- heatmap(datos2, margins=c(5,10), xlab ="Variables morfométricas",


ylab= "GÉNEROS", main = "Morfometría de peces")
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
242

Morfometría de peces

Aequidens
Biotodoma
Geophagus
Chaetobranchus
Diplodus
Archosargus
Tilapia
Oreochromis
Satanoperca
Cichlasoma
Astronotus
Caquetaia
Laetacara
Apistogramma
Pagellus

GÉNEROS
Spondyliosoma
Sarpa
Cichla
Cichla
Sparus
Pagrus
Calamus
Dentex
Lithognathus
Crenicichla
Boops
Sphyraena
Charax
Roeboides
Moenkhausia
Triportheus
Bryconops
Tetragonopterus
Ctenobrycon
Poptella
Symphysodon
Mesonauta
M3
M5
M17
M2
M4
M12
M13
M15
M14
M9
M7
M6
M8
M10
M16
M11

Variables morfométricas

En el ejemplo se observan los valores que toman todas las variables para
cada género de peces. Los valores en rojo son los más pequeños, y los de color
blanco los más grandes. En la morfología de los peces las variables que menos
influyen en la clasificación son M3, M5, M17, M2 y M4, que forman un grupo di-
ferenciado en el dendrograma de la parte superior (de columnas). Este grupo de
variables no permite distinguir las clases de peces, ya que toman valores bajos
para todas ellas, y la zona de color rojo forma un único rectángulo en la parte
izquierda del gráfico. La variable M14 distingue algunos grupos de peces, ya que
las zonas de color homogéneo o similar se corresponden razonablemente con
algunas clases identificadas en el dendrograma de la izquierda (de filas). Las
variables M11 o M16 también parecen contribuir a distinguir diferentes grupos.

III.24.2. CLASIFICACIÓN DE K-MEDIAS

Este método trata de encontrar la mejor partición posible del conjunto de ob-
jetos para un número dado de clases k (Guisande y col., 2011). Con este método
–a diferencia de la clasificación jerárquica– es necesario establecer a priori el
GRÁFICOS AVANZADOS
243

número de clases que debe tener la solución buscada. Se suele utilizar a conti-
nuación del método jerárquico, sirviendo éste primero para decidir el número de
clases que se desea obtener.
Sin embargo se pueden obtener distintas clasificaciones, con distinto número
de grupos, aplicando el método de forma repetida. El resultado puede depender
en algunos casos de los centros iniciales elegidos, aunque en general la solución
final es muy robusta frente a esta elección, y suele ser prácticamente indepen-
diente de los centros utilizados para iniciar el algoritmo.
Es adecuado para clasificar conjuntos de elementos muy numerosos (por
ejemplo con cientos de miles de objetos), con los cuales el método de clasifica-
ción jerárquica es inviable dadas las dificultades de cálculo.
En este caso es mejor realizar el análisis con R Commander (Fox, 2005;
2007). Se usaran los datos de pigmentos que vimos anteriormente en el dendro-
grama, que están en el archivo PigAlgas.xls, para así poder comparar ambos
métodos. Después de haber invocado al programa R y seleccionado el directorio
cargamos el paquete “Rcmdr” con la instrucción library(Rcmdr).

A continuación se selecciona «Datos» Ö «Importar datos» Ö «desde conjunto


de datos Excel, Access o dBase».

Aparece un pequeño cuadro de diálogo para introducir el nombre del conjunto


de datos, en el que dejamos el nombre por defecto «Datos» y pulsamos
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
244

«Aceptar». Posteriormente aparecen los archivos del directorio de trabajo, en el


que elegimos PigAlgas.xls y pulsamos «Abrir».

En R Commander pulsamos en «Visualizar conjunto de datos». Es importante


inspeccionar los datos y comprobar que no existan líneas, lo cual a veces ocurre
al final del archivo, que tengan celdas con el código <NA>. Si existen estas
líneas, hay que eliminarlas.

Para aplicar el método de clasificación k-medias elegimos en el menú principal


de R Commander las opciones «Estadísticos» Ö «Análisis dimensional» Ö
«Análisis de agrupación» Ö «Agrupación por k-medias…».

En la ventana de agrupación por k-medias seleccionamos en primer lugar las


variables que queremos utilizar, en este caso todos los pigmentos. Establecere-
mos el «Número de grupos:» (5), ya que estamos trabajando con los grupos de
algas: Diatomeas, Clorofíceas, Dinofíceas, Cianofíceas y Criptofíceas. En general
pondremos el número de grupos que esperamos encontrar. Se mantienen los
valores por defecto en el resto de los parámetros: «Número de semillas iniciales»
(10) e «Iteraciones máximas» (10). Dejaremos la marca en «Imprimir resumen
GRÁFICOS AVANZADOS
245

del grupo:» y «Gráfica doble de grupos», y marcamos «Asignar grupos al con-


junto de datos».

Las semillas iniciales se utilizan para determinar los centros iniciales aleato-
riamente. Cada una de las 10 utilizadas da origen a una clasificación diferente, lo
que permite valorar la influencia que tiene esta elección de centros iniciales so-
bre el resultado final. En general el efecto es nulo, y la clasificación obtenida es
la misma.
El número máximo de 10 iteraciones generalmente no se alcanza, ya que an-
tes de que eso ocurra suele repetirse la clasificación, con lo que finaliza el algo-
ritmo. Si no se alcanza la convergencia, generalmente porque no existe una cla-
sificación natural bien definida en la muestra, puede repetirse el método au-
mentando el número de iteraciones (por ejemplo 20).
Entre los resultados que se obtienen es importante la suma total de cuadra-
dos interna dentro de cada grupo (2,23) y la suma de cuadrados externa o entre
grupos: 26,4. Estos dos últimos resultados, las sumas interna y externa se utili-
zan para evaluar la clasificación resultante. Cuanto más pequeña sea la suma
interna comparada con la externa, mejor será el resultado, ya que la suma in-
terna mide la dispersión o distancia entre los elementos del mismo grupo, y la
externa mide la distancia entre grupos. Lo óptimo es un conjunto de grupos muy
homogéneos y muy separados entre sí.
El gráfico representa los elementos de los cinco grupos de algas, identificados
con el número de grupo (1 a 5), conjuntamente con las variables –en este caso
los pigmentos– en color rojo. La asignación de números a cada uno de los grupos
es arbitraria. La ventaja de este método con respecto al dendrograma, es que
permite ver cuales son las variables que tienen una mayor importancia en la
formación de los grupos, en este caso Peridina, Clorofila c2, Luteina y Fucoxan-
tina.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
246

-3 -2 -1 0 1 2 3

3
0.4 5
5

555
Peridin

2
Chlorophyll.c2
0.2

1
3
2
Diadinoxanthin
2
3
Comp.2

Alloxanthin
0.0

coxanthin Chlorophyll.a.epimer
Methyl.chlorophyllide.a
Chl.b.epir
ß.u.carotene
Chlorophyll.c1
Chlorophyll.a.alllomer
Dinoxanthin

0
3 3 ß.e.carotene
Violaxanthin
ß.ß.carotene2
33 X9..cis.neoxanthin
Zeaxanthin
Chlorophyll.b
4

-1
11
Lutein
-0.2

1
11

-2
-0.4

-3
-0.4 -0.2 0.0 0.2 0.4

Comp.1

Es posible añadir al gráfico biplot etiquetas de caso, con el nombre del grupo
de alga (o cualquier otra característica disponible en los datos). Para ello solo
tenemos que modificar en la ventana de instrucciones de R Commander la orden:

¾ biplot(princomp(model.matrix(~-1 + Alloxanthin + Chl.b.epir +


Chlorophyll.a.alllomer + Chlorophyll.a.epimer + Chlorophyll.b +
Chlorophyll.c1 + Chlorophyll.c2 + Diadinoxanthin + Dinoxanthin +
Fucoxanthin + Lutein + Methyl.chlorophyllide.a + Peridin + ß.e.carotene +
ß.ß.carotene + ß.u.carotene + Violaxanthin + X9..cis.neoxanthin +
Zeaxanthin, Datos)), xlabs = as.character(.cluster$cluster))

por

¾ biplot(princomp(model.matrix(~-1 + Alloxanthin + Chl.b.epir +


Chlorophyll.a.alllomer + Chlorophyll.a.epimer + Chlorophyll.b +
Chlorophyll.c1 + Chlorophyll.c2 + Diadinoxanthin + Dinoxanthin +
Fucoxanthin + Lutein + Methyl.chlorophyllide.a + Peridin + ß.e.carotene +
ß.ß.carotene + ß.u.carotene + Violaxanthin + X9..cis.neoxanthin +
Zeaxanthin, Datos)), xlabs = Datos[,1])

que ejecutaremos seleccionando la instrucción corregida completa y pulsando


después «Ejecutar».
GRÁFICOS AVANZADOS
247

-3 -2 -1 0 1 2 3

3
Dinofíceas

0.4
Dinofíceas

Dinofíceas
Peridin
Dinofíceas
Dinofíceas

2
Chlorophyll.c2
0.2

1
Diatomeas
Criptofíceas
Diadinoxanthin
Criptofíceas
Diatomeas
Comp.2

Alloxanthin
0.0

coxanthin Chlorophyll.a.epimer
Methyl.chlorophyllide.a
Chl.b.epir
ß.u.carotene
Chlorophyll.c1
Dinoxanthin
Chlorophyll.a.alllomer
Criptofíceas

0
atomeas
Diatomeas ß.e.carotene
Violaxanthin
ß.ß.carotene
Diatomeas
Diatomeas X9..cis.neoxanthin
Zeaxanthin
Chlorophyll.b
Cianofíceas

-1
Clorofíceas
Clorofíceas
Lutein
-0.2

Clorofíceas
Clorofíceas
Clorofíceas

-2
-0.4

-3
-0.4 -0.2 0.0 0.2 0.4

Comp.1

III.24.3. ÁRBOL DE CONSENSO

Dado un conjunto de árboles, se puede obtener un “árbol de consenso”, o


árbol medio, calculado como aquel que es más similar a todos los árboles del
conjunto inicial, o que tiene una menor distancia a todos ellos. Este procedi-
miento se utiliza para resumir en un solo árbol diversas clasificaciones. Existen
diferentes algoritmos y criterios de consenso. Como ejemplo se usarán los datos
de presencia y ausencia de pigmentos en diferentes especies de algas fito-
planctónicas, que están en el archivo Consenso.csv. Las instrucciones están en
el script III.38.R.
La función «consensus()» del paquete “agricolae” (de Mendiburu, 2012)
permite realizar árboles de consenso. A partir de un conjunto de datos realiza
una clasificación jerárquica, con su correspondiente dendrograma, y a continua-
ción repite el mismo proceso de clasificación para un número elevado de mues-
tras aleatorias –por defecto 500– obtenidas a partir de la muestra inicial me-
diante remuestreo (bootstrap). Con todos los árboles construidos, la función de-
termina finalmente el árbol de consenso, o árbol medio, y calcula la frecuencia
relativa de los miembros de grupo, o porcentaje de casos asignados a la misma
clase final a lo largo de todas las muestras aleatorias, que se puede interpretar
como un indicador de la estabilidad o robustez de las clases obtenidas en el árbol
de resumen: cuanto más próximos a 100 estén los valores, mejor es la clasifica-
ción obtenida. Es un requisito de la función que la matriz de datos tenga la co-
lumna de rownames. Por ello, en la primera parte del script se seleccionan las
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
248

variables, en este caso los pigmentos que van de la columna 3 a la 36. Luego se
le añade una columna rowname con el grupo al que pertenece, en este caso la
columna 1 de la matriz original.
En la función «consensus()», con el argumento «distance» se define el tipo
de distancia que se utiliza que puede ser: "euclidean", "maximum", "manhattan",
"canberra", "binary", "minkowski" o "gower". En este caso como los datos son de
presencia/ausencia se ha elegido "binary", pero en el caso de que no lo fueran
habría que elegir otro tipo de distancia. Con el argumento «method» se elige el
método de conglomeración a utilizar, que puede ser: "ward", "single",
"complete", "average", "mcquitty", "median", "centroid", "ward", "single",
"complete", "average", "mcquitty", "median" o "centroid". Las diferencias entre
los distintos tipos de distancias y métodos se pueden consultar en Guisande y
col. (2011). Con «nboot» se define el número de muestras bootstrap a utilizar;
por defecto es 500, que es un número adecuado en la mayoría de las aplicacio-
nes. Un valor más alto aumentará la precisión de las estimaciones, pero tardará
más tiempo en ejecutarse. Con «duplicate=TRUE», si encuentra elementos
repetidos utilizará la media de todos ellos y cuando es «duplicate=FALSE» uti-
liza todos los datos, sin controlar duplicados. Con «h» se define el tamaño de las
ramas terminales.

¾ library(agricolae)
¾ datos<-read.csv2("Consenso.csv", header=TRUE, encoding="latin1")
¾ datos<-na.exclude(datos)
¾ datos1<-as.matrix(datos[,3:36])
¾ rownames(datos1)<-datos[,1]
¾ output<-consensus(datos1, distance="binary", method="complete",
nboot=100, duplicate=F, h=0.1, cex.text=0.9, col.text="red", main="Árbol
consenso de algas en base a pigmentos", ylab="Altura", xlab="", sub="")
Árbol consenso de algas en base a pigmentos

100
0.8

94
0.6
0.4

100
81
15
83
Altura

23
0.2

17 60
56
81
Chlorophyceae

54 21 71 49
Chlorophyceae
0.0

61100 57 57 38 99 94 94 94 85 85 85 85 100 95 95 100100


Prymnesiophycea

Dynophyceae
Diatomeas
Chlorophyceae
Prymnesiophycea

Diatomeas
Diatomeas
Diatomeas
Diatomeas
Diatomeas
Diatomeas
Diatomeas
Diatomeas
Diatomeas

Diatomeas
Diatomeas
Dynophyceae
Dynophyceae
Dynophyceae

Dynophyceae
Dynophyceae
Dynophyceae
Prymnesiophycea
Prymnesiophycea
Prymnesiophycea

Chlorophyceae
Chlorophyceae
Chlorophyceae
Chlorophyceae
Chlorophyceae

Chlorophyceae
Chlorophyceae

Los números rojos en cada nodo indican el porcentaje de elementos de cada


clase que se mantienen en ella en las múltiples clasificaciones obtenidas por re-
muestreo. Se observan algunos porcentajes próximos al 100%, lo que indica una
clasificación muy fiable. El porcentaje del primer nodo siempre es 100, ya que
todos los elementos están en una sola clase para todas las muestras y, por
GRÁFICOS AVANZADOS
249

tanto, solamente deben interpretarse los siguientes nodos. La gran clase de la


izquierda, que contiene a las clorofitas/primnesofitas (separándolas de las diato-
meas/dinoflagelados) tiene también el 100%, aunque algunas de las diferentes
clases que se forman posteriormente dentro de este grupo tienen porcentajes
más bajos.

III.24.4. ÁRBOLES DE CLASIFICACIÓN Y REGRESIÓN:


CARTS

Los árboles de clasificación y regresión son un procedimiento no paramétrico


de predicción de una variable dependiente sobre la base de un conjunto de va-
riables independientes (Breiman y col., 1984). Su carácter no paramétrico hace
que no requiera ninguna hipótesis relativa a la distribución de las variables de-
pendientes e independientes, ni a la relación entre ellas y sus posibles
interacciones. La variable dependiente puede ser categórica (Árboles de Clasifi-
cación), como por ejemplo diferentes especies, rechazo a un tratamiento, pre-
sencia/ausencia de un cáncer, etc. La variable dependiente también puede ser
continua (Árboles de Regresión), como por ejemplo el índice de masa corporal, el
azúcar en sangre, etc. En ambos casos, Árboles de Clasificación y de Regresión
(CARTs), el objetivo es identificar las variables que mejor permiten identificar la
variable dependiente. Por ejemplo, determinar cuales son las características clíni-
cas, genéticas y/o ambientales que permiten predecir si una persona puede tener
un determinado cáncer, o ser propenso a un infarto, etc. Amigo y col. (2007)
aplicaron CARTs al índice de masa corporal (IMC) de niños y determinaron que la
madre, el consumo de lípidos y las horas de televisión el domingo, eran las va-
riables que mejor clasificaban a los niños en función de su IMC. Un análisis
CARTs consiste generalmente en tres pasos:

1. Construcción del árbol. En el árbol, el nodo raíz representa a toda la


población. Este nodo raíz se divide en dos subgrupos en base a la parti-
ción de una variable independiente o predictora. Los nodos hijos se divi-
den por medio de la partición de una variable, que puede ser la misma de
antes o una nueva. El proceso se repite sucesivamente hasta que se cum-
pla alguna condición de parada. Las divisiones se seleccionan de modo
que la “impureza” o heterogeneidad de los nodos hijos sea menor que la
del nodo padre. La función de impureza o criterio de partición es una me-
dida que permite determinar la calidad del nodo hijo, y decidir como se
realiza la partición de un nodo en sus dos nodos hijos. Existen diferentes
tipos de índices para cuantificar la impureza de las particiones (Breiman y
col., 1984).
2. Poda del árbol. El árbol que se ha construido generalmente está
sobreajustado, es decir, contiene gran cantidad de niveles y no necesa-
riamente una mayor complejidad significa una mejor clasificación. Imagi-
nemos que estamos trabajando con diferentes especies y se quiere de-
terminar cuales son las variables que permiten diferenciarlas mejor. El
árbol puede seguir dividiéndose en nodos hasta que el último individuo
sea clasificado, utilizando en cada paso un número mayor de variables y
un modelo más complejo hasta alcanzar un porcentaje cero de individuos
mal clasificados. Al aumentar la complejidad de un modelo siempre se
obtiene un mejor ajuste, pero a veces simplemente recogemos peculiari-
dades muy específicas de los datos, que no lo hacen útil para describir el
comportamiento de nuevos datos (datos de validación). La poda consiste
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
250

en, una vez construido el árbol, eliminar hacia atrás las particiones que no
representen un aumento considerable de la capacidad de predicción total.
3. Validación del árbol. Conforme se va podando se reduce la complejidad
del árbol pero el número de individuos mal clasificados puede aumentar.
El mejor árbol será aquel que tenga la proporción óptima entre la tasa de
mala clasificación (cociente entre las observaciones mal clasificadas y el
número total de observaciones) y la complejidad del árbol. La selección
del mejor árbol se realiza por validación. El procedimiento consiste en se-
parar una parte de la muestra, que no es utilizada para la construcción del
árbol, sino únicamente para la predicción, midiendose en ella el porcen-
taje de acierto. También se suele utilizar un método de validación cru-
zada, que consiste en dividir la muestra en varios grupos excluyentes
(normalmente 10 grupos) de aproximadamente igual tamaño, y hacer el
árbol dejando cada vez un grupo fuera, que es utilizado para la predicción
y medida del grado de acierto. El proceso se repite hasta usar todos los
grupos y se selecciona finalmente el árbol con la menor tasa agregada de
mala clasificación (media de los diez grupos).

Entre las diferentes funciones de R que permiten realizar CARTs usaremos


«rpart()» del paquete “rpart” (Therneau y Atkinson, 2012) y la función
«rpart.plot()» del paquete “rpart.plot” (Milborrow, 2012). El ejemplo utiliza
datos demográficos del año 2010 de las 19 regiones o comunidades autónomas
de España publicados por el Instituto Nacional de Estadística (www.ine.es), que
están en el archivo Demografía.csv. El objetivo es determinar si es posible cla-
sificar las diferentes regiones en función de las siguientes variables demográfi-
cas: nacimientos, mortalidad, mortalidad infantil (menores de 1 año), todas ellas
por cada 1000 habitantes, y el número medio de hijos por madre, edad media de
la madre cuando tiene su primer hijo, porcentaje medio de mujeres no casadas
con hijos, número de nacimientos por cada 1000 defunciones y la esperanza de
vida de hombres y mujeres. Las instrucciones están en el script III.39.R.
En la función «rpart()» se pone la fórmula con la variable dependiente, en
este caso las regiones, y las variables independientes o predictoras, que son to-
dos los indicadores demográficos. Con «method» se define el método de parti-
ción; como la variable dependiente es categórica, pondremos "class". Se puede
omitir el método, en cuyo caso la propia función decide el método más adecuado
en función del tipo de variable dependiente. Con el argumento «control», y me-
diante la función «rpart.control()», se pueden modificar aspectos importantes
del árbol. Con el argumento «minsplit» se especifica el número mínimo de ob-
servaciones que deben existir en un nodo para que se haga la partición, es decir,
conforme sea más pequeño el árbol tendrá más nodos. Con «minbucket» se
define el número mínimo de observaciones en un nodo terminal y, por tanto, al
igual que el argumento anterior, conforme es más pequeño se profundiza más en
el árbol, es decir, tiene más nodos y se hace más complejo. Con «cp» se con-
trola la complejidad y permite ahorrar tiempo en el proceso de poda. Es la
fracción (por defecto 0,01) en la que debe mejorar el indicador de ajuste para
que continúe la construcción del árbol. Si la mejora es menor que cp el proceso
se detiene. El usuario decide si quiere profundizar mucho y hacer el árbol muy
complejo (cp pequeño), o tener un árbol más simple (cp más grande). Con
«surrogatestyle» se controla el criterio para elegir la mejor variable suplente
para la partición en cada nodo. Si es 0 se utiliza la variable con el mayor número
de elementos clasificados correctamente, y si es 1 la que tiene el mayor porcen-
taje de elementos clasificados correctamente sobre el número de casos válidos
GRÁFICOS AVANZADOS
251

de esa variable; la primera opción penaliza a las variables que tienen valores
perdidos.
En la función «rpart.plot()» con el argumento «type» se selecciona el for-
mato del gráfico, es decir, el modo en que sale la información de las variables
seleccionadas en cada partición y las categorías predominantes en cada nodo.
Con el argumento «extra» se puede mostrar información adicional en los nodos,
como en este ejemplo, en el que le pedimos que muestre en cada nodo el
número de casos clasificados correctamente frente al total. Con «varlen=0» se
define que los textos de los nodos sean completos y no se corten. Con
«ycompress=TRUE» se especifica que cuando se solapan las etiquetas se des-
placen verticalmente para evitar este solapamiento.

¾ library(rpart)
¾ library(rpart.plot)
¾ datos<-read.csv2("Demografía.csv", header=TRUE, encoding="latin1")
¾ attach(datos)
¾ CART<- rpart(Región ~ Hijos.Madre + Edad.Madre +
Porcentaje.no.Casadas + Mortalidad + Mortalidad.Infantil +
Esperanza.de.vida.Hombres + Esperanza.de.vida.Mujeres + Natalidad +
Nacidos.Muertos, method="class", control=rpart.control(minsplit=2,
minbucket = 2, cp = 0.0001, surrogatestyle = 0))
¾ rpart.plot(CART, type=0, extra=2, varlen=0, ycompress = TRUE, main=
"Demografía en regiones de España", cex.main=2, cex=1.2)
Demografía en regiones de España

yes Esperanza.de.vida.Mujeres<84 no

Hijos.Madre<1.6 Nacidos.Muertos<1095

Ceuta
Edad.Madre<31 Esperanza.de.vida.Mujeres>=86 Porcentaje.no.Casadas<32
1/2

Andalucía Comunidad Valenciana Castilla y León Hijos.Madre>=1.2 Hijos.Madre>=1.5


Edad.Madre<31
8/8 1/2 8/9

Galicia Castilla-La Mancha La Rioja Cataluña


Hijos.Madre>=1.3 Hijos.Madre<1.2
4/5 4/5 1/2 4/5

Aragón Islas Canarias


Hijos.Madre<1.3 Edad.Madre<32
2/2 2/2

Castilla-La Mancha Cantabria Comunidad Valenciana País Vasco


1/3 1/2 1/3 2/2

Los números indican las provincias que han sido clasificadas correctamente y
el número total de provincias de cada región. Por ejemplo, en el grupo que pone
Castilla y León, hay 8 provincias de esta región de un total de 9 que hay en ese
grupo. En general se observa que muchas regiones se identifican bien. Por ejem-
plo, en Andalucía, Islas canarias, Aragón y País Vasco, todas las provincias de la
región están dentro de un mismo grupo. En Castilla y León, Galicia, Castilla La
Mancha y Cataluña, casi todas las provincias están en el mismo grupo. Esto
quiere decir que hay diferencias demográficas entre regiones en España, ya que
es posible identificar relativamente bien cada una de las regiones en base a estos
indicadores demográficos.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
252

La primera variable es la esperanza de vida de las mujeres, que separa un


grupo de regiones con mujeres que tienen una esperanza de vida menor o igual
a 84 años a la izquierda y mayor de 84 a la derecha. El número medio de hijos
por madre y la edad de la madre cuando tiene el primer hijo también son varia-
bles importantes ya que aparecen en muchos nodos. El número de nacidos por
cada 1000 defunciones también es una variable importante indicando que las
regiones crecen a ritmos diferentes. En el árbol se ha optado por no identificar de
forma correcta todos los casos, es decir, hay grupos terminales donde hay casos
de diferentes categorías, para no hacer el árbol muy complejo. Lo importante en
este ejemplo era ver si los indicadores demográficos diferencian a las regiones, y
cuales de estos indicadores son los más importantes para ello.

Función rpart.control (paquete rpart)

ƒ minsplit: número mínimo de observaciones que deben existir en un


nodo para que se haga la partición: minsplit = 20.
ƒ minbucket: número mínimo de observaciones en un nodo terminal:
minbucket = round(minsplit/3).
ƒ cp: parámetro de complejidad, o fracción en la que debe mejorar el
indicador de ajuste para que continúe la construcción del árbol. Si la
mejora es menor que cp el proceso se detiene. El usuario decide si
quiere profundizar mucho y hacer el árbol muy complejo (cp pe-
queño), o tener un árbol más simple (cp más grande): cp = 0.01.
ƒ maxcompete: indica el número de variables que se guardan de las
que no se eligieron, es decir, además de conocer la variable elegida
para la partición del nodo, también es útil conocer la variable que se
eligió en la posición segunda, tercera, etc.: maxcompete = 4.
ƒ maxsurrogate: número de variables alternativas o suplentes (y
divisiones) que se conservan con los resultados; por defecto es 5. Si
es cero se ahorra tiempo de cálculo, ya que aproximadamente la mi-
tad del tiempo se emplea en buscar divisiones alternativas:
maxsurrogate = 5.
ƒ usesurrogate: algunos casos pueden tener un valor perdido en la va-
riable elegida para la partición en un nodo determinado. La función
puede utilizar variables suplentes (surrogates) para resolver esos ca-
sos, para lo cual debemos poner el valor 1 o 2. Si el valor es 1 utiliza
suplentes, si es 2 el caso es asignado al grupo mayoritario cuando to-
das las variables suplentes tienen también valor perdido, y si es 0 no
utiliza variables suplentes (el caso se pierde), solo las muestra:
usesurrogate = 2.
ƒ xval: número de validaciones cruzadas: xval = 10.
ƒ surrogatestyle: controla el mecanismo para elegir las variables su-
plentes. Si es 0 se utiliza la variable con el mayor número de ele-
mentos clasificados correctamente, y si es 1 la que tiene el mayor
porcentaje de elementos clasificados correctamente sobre el número
de casos válidos de esa variable: surrogatestyle = 0.
ƒ maxdepth: define la profundidad del árbol, es decir, el número
máximo de niveles que se generan considerando el nodo raíz como ni-
vel cero: maxdepth = 30.
GRÁFICOS AVANZADOS
253

Función rpart (paquete rpart)

ƒ formula: variable dependiente y variables independientes con el for-


mato variable dependiente ~ variable independiente 1+variable in-
dependiente 2+….
ƒ data: opcionalmente se puede poner el data frame para interpretar
los nombres de las variables.
ƒ weights: opcionalmente se puede incluir una variable con pesos o
ponderaciones para los casos.
ƒ subset: permite realizar una selección de los datos.
ƒ na.action: especifica qué hacer con los valores perdidos. Por defecto
elimina todos los casos con valores perdidos de la variable depen-
diente, pero mantiene aquellos en los que uno o más predictores fal-
tan: na.action = na.rpart.
ƒ method: se define el método de partición que puede ser: "anova",
"poisson", "class" o "exp". Si el método no se especifica, la rutina
trata de hacer una suposición inteligente. Si la variable independiente
es del tipo supervivencia, entonces es "exp", si tiene 2 columnas el
método es "poisson", si es un factor entonces es "class", y en otras
situaciones es "anova"
ƒ model: si es TRUE se guarda una copia del modelo en los resultados:
model = FALSE.
ƒ x: si es TRUE se guarda una copia de las variables independientes en
los resultados: x = FALSE.
ƒ y: si es TRUE se guarda una copia de la variable dependiente en los
resultados: y = FALSE.
ƒ control: lista de opciones que controla el proceso de partición.
ƒ cost: vector de costes no negativos para todas las variables indepen-
dientes, que se puede añadir opcionalmente. La mejora en la división
se divide por el coste de la variable para decidir qué variable se uti-
liza, de forma que una variable con coste doble que otra necesita una
mejora doble para ser elegida. Por defecto es 1 para todas las varia-
bles.
ƒ parms: parámetros opcionales para la función de partición. En el caso
del análisis de varianza no hay parámetros. La partición por Poisson
tiene un solo parámetro, el coeficiente de variación de la distribución a
priori de las tasas, cuyo valor por defecto es 1. La partición exponen-
cial tiene el mismo parámetro de Poisson. Para la partición por clasifi-
cación, la lista puede contener cualquiera de las siguientes opciones:
el vector de probabilidades a priori (prior), la matriz de pérdidas (loss)
o el índice de la división (split). Las probabilidades a priori deben ser
positivas y sumar 1 (por defecto las frecuencias relativas). La matriz
de pérdida debe tener ceros en la diagonal y valores positivos fuera de
la diagonal (por defecto 1). El índice de partición puede ser "gini", que
es el que se usa por defecto, o "information".
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
254

Función rpart.plot (paquete rpart)

ƒ x: salida de la función rpart().


ƒ type: formato del gráfico: 0 muestra las variables que han sido
seleccionadas en cada partición y al final las categorías predominantes
en los nodos terminales, 1 es igual que la anterior pero además
muestra la categoría predominante en cada partición, 2 igual que 1
pero pone encima el nodo y debajo la variable responsable de la
partición, 3 la variable responsable de la partición se pone en ambas
ramas y, por último, 4 es igual que 3 pero se etiquetan los nodos, no
las ramas: type = 0.
ƒ extra: permite mostrar información adicional en los nodos: 0 sola-
mente muestra el grupo mayoritario en el nodo, 1 muestra el número
de casos de todas las categorías, 2 muestra el número de casos co-
rrectos frente al total, 3 muestra el número de casos incorrectos
frente al total, 4 muestra la probabilidad de todas las categorías, 5 es
igual que 4 pero no muestra la categoría que predomina en el nodo, 6
muestra la probabilidad de la segunda clase que predomina en el
nodo, 7 es igual que 6 pero no muestra la categoría que predomina en
el nodo, 8 muestra la probabilidad de la clase que predomina en el
nodo y, por último, 9 muestra la probabilidad relativa considerando
todas las observaciones: extra = 0.
ƒ under: solamente se aplica si type > 0. Si es TRUE la información ex-
tra de los nodos se pone fuera y no dentro del nodo: under = FALSE.
ƒ clip.right.labs: solamente se aplica si type es 3 ó 4. Si es TRUE sola-
mente se pone la variable en la rama izquierda y no en la derecha:
clip.right.labs = TRUE.
ƒ fallen.leaves: si es TRUE se ponen todos los nodos al fondo del árbol,
tipo dendrograma: fallen.leaves = FALSE.
ƒ branch: controla la forma de las ramas: 0 las ramas son en forma de
V y 1 son rectas: branch = if(fallen.leaves) 1 else .2.
ƒ uniform: si es TRUE la separación vertical entre nodos es uniforme:
uniform = TRUE.
ƒ digits: número de decimales: digits = 2.
ƒ varlen: define el número de caracteres de los textos: 0 utiliza el texto
completo, >0 los abrevia teniendo en cuenta el número que se indi-
que, y <0 recorta el texto de las variables teniendo en cuenta el
número que se indique al máximo posible para ajustar el tamaño:
varlen = -8.
ƒ cex: si es NULL calcula el tamaño de los textos automáticamente,
aunque se puede especificar un valor: cex = NULL.
ƒ tweak: es un factor de escala para aumentar el tamaño de los textos:
tweak = 1.
ƒ compress: si es TRUE deja el máximo espacio posible horizontal-
mente entre nodos, lo cual permite que los texto sean de mayor ta-
maño: compress = TRUE.
ƒ ycompress: si es TRUE, cuando se solapan los nodos se desplazan
verticalmente para evitar este solapamiento: ycompress = FALSE.
ƒ snip: si es TRUE se activa el ratón y permite podar el árbol pulsando
sobre cualquier nodo. Para finalizar se pulsa el botón derecho y se
selecciona «Parar»: snip = FALSE.
GRÁFICOS AVANZADOS
255

III.24.5. ÁRBOLES DE CLASIFICACIÓN Y REGRESIÓN


(CARTS) Y ANÁLISIS DE COMPONENTES PRINCIPALES

La función «mvpart()» del paquete “mvpart” (Therneau y Atkinson, 2012b)


construye árboles de regresión (MRT, multivariate regression trees). Los datos de
la variable respuesta deben tener formato de matriz (clase matrix) y las variables
explicativas formato de data frame. En la función, la relación entre unas y otras
se escribe del mismo modo que en los modelos de regresión.
Aplicaremos este método al conjunto de datos spider que vienen con el pa-
quete “mvpart”. Las doce primeras variables del conjunto de datos son las abun-
dancias de 12 especies de arañas en 25 lugares, y las seis siguientes son varia-
bles explicativas de entorno (hierbas, musgo, arena, etc.). Se trata de encontrar
una relación entre la distribución de las arañas y las variables ambientales. Las
instrucciones están en el script III.40.R.
El método realiza una clasificación de los lugares en grupos, de acuerdo con la
estructura de los valores de las variables dependientes (abundancia de las distin-
tas especies de arañas), utilizando las variables explicativas definidas en la
fórmula al aplicar la función «mvpart()».

¾ library(mvpart)
¾ data(spider)
¾ mvpart(data.matrix(spider[,1:12]) ~ herbs + reft + moss + sand + twigs +
water, data= spider)
arct.lute
pard.lugu
zora.spin
pard.nigr moss>=1.5 moss< 1.5
pard.pull
aulo.albi
troc.terr
alop.cune
pard.mont
alop.acce reft>=6.5 reft< 6.5 twigs>=1.5 twigs< 1.5
alop.fabr
arct.peri

185 : n=7 13 : n=2


373 : n=12 237 : n=7

Error : 0.569 CV Error : 0.718 SE : 0.156

Cada división en el árbol muestra la variable explicativa relevante y su valor


de corte. La primera división corresponde a «moss» menor que 1,5; la segunda
variable utilizada es «reft» y la tercera «twigs». Se forman claramente cuatro
clases o entornos distintos. Cada rama terminal del árbol tiene un diagrama de
barras asociado, indicando también el número de elementos (filas o lugares) de
cada clase. Esta orden de R utiliza tres colores (tres tonos de azul) que se repi-
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
256

ten cíclicamente para las barras del diagrama, lo que hace algo confusa la inter-
pretación (hubiera sido preferible utilizar colores distintos para cada barra). Las
barras muestran las frecuencias de las especies (el valor de las variables o co-
lumnas) en cada uno de los grupos o clases, y las clases definen, en este ejem-
plo, ambientes o entornos distintos. El diagrama de barras ayuda a establecer el
perfil de cada entorno. Se indica también el error residual del árbol, es decir, la
variabilidad no explicada por la clasificación, el error de validación cruzada y el
error típico o medio de ese tamaño de árbol.
En la siguiente instrucción se introduce el argumento «xv="pick"», que per-
mite obtener un gráfico con el error relativo y seleccionar sobre ese gráfico el
número de ramas que se desea tener en el árbol.

¾ mvpart(data.matrix(spider[,1:12])~ herbs + reft + moss + sand + twigs +


water, data= spider, xv="pick")

Size of tree

1 4 6 9 10
1.2
1.0
X-val Relative Error

0.8

Min + 1 SE
0.6
0.4

Inf 0.08 0.038 0.028 0.016

cp

El gráfico anterior muestra el error relativo (puntos y líneas verdes), siempre


decreciente a medida que aumenta la complejidad del árbol, y el error relativo
mediante validación cruzada (color azul), junto con las barras que indican inter-
GRÁFICOS AVANZADOS
257

valos de confianza. Aparecen destacados el valor mínimo del error con validación
cruzada (punto grueso rojo) y el mínimo en el margen de una desviación típica
(punto grueso naranja), que penaliza la complejidad del árbol y constituye ge-
neralmente la mejor opción, en este caso el árbol con cuatro ramas del diagrama
anterior. Con el ratón se selecciona el punto grueso naranja, que indica un árbol
con 4 nodos, que es el mismo que se mostró anteriormente y selecciona la fun-
ción de forma automática. Dado que se utiliza un procedimiento de estimación
basado en la simulación de un número elevado de muestras, el resultado puede
ser distinto en cada aplicación.
En la siguiente instrucción se introduce el argumento «pca=TRUE» para que,
además del árbol, se represente también el Análisis de Componentes Principales
(PCA).

¾ fit <- mvpart(data.matrix(spider[,1:12])~ herbs + reft + moss + sand + twigs


+ water, data= spider, pca=TRUE)
arct.lute
pard.lugu
zora.spin
pard.nigr moss>=1.5 moss< 1.5
pard.pull
aulo.albi
troc.terr
alop.cune
pard.mont
alop.acce reft>=6.5 reft< 6.5 twigs>=1.5 twigs< 1.5
alop.fabr
arct.peri

185 : n=7 13 : n=2


373 : n=12 237 : n=7

Error : 0.569 CV Error : 1.05 SE : 0.216

El gráfico anterior muestra de nuevo el árbol pero cada grupo lo identifica con
un círculo de un color diferente, lo cual permitirá localizar cada uno de estos gru-
pos en el PCA. Para que salga el segundo gráfico con el PCA es necesario pulsar
con el ratón sobre el gráfico.
En este gráfico biplot se observan las dos primeras componentes principales,
mediante un código de colores para cada grupo o clase en el árbol del diagrama
(punto grueso). Se representan las puntuaciones de las dos primeras compo-
nentes principales para cada lugar, y se puede observar cada clase mediante un
polígono cerrado con el color correspondiente. Podemos interpretar la mayor o
menor separación de las clases entre sí y su variabilidad interna. Un punto más
grueso identifica el punto medio de cada clase, y estos puntos medios están uni-
dos por trazos negros que reproducen el árbol de clasificación. Además se repre-
sentan como vectores las variables dependientes o de frecuencia, de modo que
es posible conocer a través del gráfico cuales son las especies predominantes en
cada grupo: pard.mont y alop.acce en la clase roja; pard.nigr y pard.pull en la
clase azul claro; troc.terr en la clase verde y en la clase azul oscuro.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
258

pard.mont

alop.acce
pard.nigr
pard.pull

alop.fabr

arct.peri
aulo.albi
arct.lute
alop.cune

zora.spin
Dim 2 21.26 % : [ 0.673 ]

troc.terr

pard.lugu
Dim 1 77.04 % : [ 0.759 ]

En la última instrucción se utiliza la función «rpart.pca()», en la cual con el


argumento «interact=TRUE» se puede representar el PCA para cada par de
componentes principales. Para ello solamente es necesario pulsar sucesivamente
el botón izquierdo del ratón para obtener de forma secuencial los pares de com-
ponentes aunque, en general, solamente suele tener interés práctico el primer
par. Para detener la secuencia se pulsa el botón derecho del ratón

¾ rpart.pca(fit, interact=TRUE, wgt.ave=TRUE)

alop.fabr
arct.peri pard.mont alop.cune
alop.acce pard.luguzora.spin
aulo.albi
pard.pull
troc.terr pard.nigr
arct.lute
Dim 3 1.7 % : [ 0.57 ]

Dim 1 77.04 % : [ 0.759 ]


GRÁFICOS AVANZADOS
259

Función mvpart (paquete mvpart)

ƒ form: variables respuesta con formato matriz y las variables explicati-


vas con formato de data frame.
ƒ data: opcionalmente se puede indicar la base de datos.
ƒ minauto: si es TRUE selecciona de forma automática el número
mínimo de casos que debe existir en un nodo para que se realice la
partición y el número mínimo de casos de los nodos terminales:
minauto = TRUE.
ƒ size: tamaño del árbol.
ƒ xv: se define como se selecciona el árbol por validación cruzada: con
"1se" se elige el mejor árbol dentro del margen de una desviación
típica del óptimo global, con "min" se elige el árbol óptimo, con "pick"
al pulsar con el ratón se elige el número de ramas y con "none" no se
realiza validación cruzada: xv = "1se".
ƒ xval: número de validaciones cruzadas o vector con las validaciones
cruzadas de cada grupo: xval = 10.
ƒ xvmult: número de validaciones cruzadas múltiples: xvmult = 0.
ƒ xvse: multiplicador del número de SEs usados cuando se selecciona
xv = "1se": xvse = 1.
ƒ snip: si es TRUE se realiza una poda interactiva del árbol: snip =
FALSE.
ƒ plot.add: si es TRUE se representa el árbol y, adicionalmente, tam-
bién se puede añadir texto: plot.add = TRUE.
ƒ text.add: si es TRUE se añade al árbol la salida de la función
text.rpart: text.add = TRUE.
ƒ digits: número de dígitos de las etiquetas: digits = 3.
ƒ margin: si por ejemplo se pone un margen de 0.1, hay un espacio
extra de un 10% alrededor del gráfico: margin = 0.
ƒ uniform: si es TRUE la longitud de las ramas del árbol es uniforme:
uniform = FALSE.
ƒ which: especifica donde ubicar las leyendas de los nodos: centrado
(1), izquierda (2), derecha (3) y ambos lados (4): which = 4.
ƒ use.n: si es TRUE se muestra el número de casos: use.n = TRUE.
ƒ all.leaves: si es TRUE se añade la información en todos los nodos:
all.leaves = FALSE.
ƒ bars: si es TRUE se añaden los gráficos de barras: bars = TRUE.
ƒ legend: si es TRUE se muestra la leyenda: legend=TRUE.
ƒ bord: si es TRUE se muestra un marco alrededor de los gráficos de
barras: bord = FALSE.
ƒ xadj, yadj: ajusta el tamaño de los gráficos de barras: xadj = 1 y
yadj = 1.
ƒ prn: si es TRUE se muestran detalles del árbol: prn = FALSE.
ƒ branch: ramas verticales (1) o inclinadas (0), en el árbol: branch =
1.
ƒ rsq: si es TRUE se muestra un gráfico con información del error y r2
de las particiones: rsq = FALSE.
ƒ pca: si es TRUE se muestra el PCA: pca = FALSE.
ƒ interact.pca: si es TRUE el PCA es interactivo: interact.pca =
FALSE.
ƒ keep.y: si es TRUE se muestra los valores del eje y: keep.y = TRUE.
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
260

III.24.6. ÁRBOLES DE INFERENCIA

Los árboles de inferencia condicional constituyen un método de clasificación


que trata de evitar los problemas asociados a los métodos no probabilísticos
(árboles de clasificación y regresión: CARTs) descritos con anterioridad, en espe-
cial el problema de sobreajuste y el sesgo de selección de variables hacia aque-
llas que presentan más opciones de corte. Para ello se introduce un enfoque es-
tadístico que permite utilizar la distribución de probabilidad de las medidas, y
establecer de este modo la significación estadística de las mejoras obtenidas en
cada paso del algoritmo.
La función «ctree()» del paquete “party” (Hothorn y col., 2004; 2006a;
2006b; Strobl y col., 2007; Hothorn y col., 2012) construye árboles de inferencia
condicional. En la función se indica como argumento una fórmula que relaciona
una variable dependiente (o más de una) con una o más variables explicativas.
El método utilizado consiste en comprobar primero si la variable dependiente
está relacionada con las explicativas, para lo que se aplica un test de indepen-
dencia. Si detecta dependencia, selecciona la variable explicativa con mayor aso-
ciación a la respuesta, medida con el valor p de un test para cada variable expli-
cativa, y a continuación realiza una clasificación binaria con esa variable, repi-
tiendo de forma recursiva los pasos anteriores para formar clases en las que los
valores de la variable dependiente sean distintos.
Vamos a ver diferentes ejemplos en los que se usarán modelos de regresión
lineal, regresión ordinal, clasificación de categorías y análisis de supervivencia.
Como ejemplo de modelos de regresión lineal usaremos los datos de clorofila,
afloramiento, temperatura y nutrientes de diferentes zonas costeras del mundo,
los cuales están en el archivo Producción primaria.csv. El objetivo es determi-
nar si algunas de las variables estudiadas explican las diferencias observadas en
producción primaria, cuantificada en términos de mg de clorofila m-3, entre las
diferentes áreas. Las instrucciones están en el script III.41.R.
Después de cargar el paquete e importar los datos, se seleccionan todos los
casos en los cuales hay datos de clorofila. Posteriormente se realiza el árbol de
inferencia con la función «ctree()», empleando la clorofila como variable depen-
diente. El segundo gráfico muestra la versatilidad de las funciones de paneles
que se explican en el último cuadro de este apartado. Los nodos intermedios se
pueden modificar con el argumento «inner_panel» y los nodos terminales con
«terminal_panel». Tanto los nodos intermedios como los terminales pueden
tener diferentes formatos dependiendo del tipo de variable dependiente, como
por ejemplo diagramas de cajas «node_boxplot», histogramas «node_hist»,
curvas de densidad «node_density», etc. Sin embargo, es importante tener en
cuenta que debe existir una concordancia entre el tipo de datos y el formato de
gráfico que se elija. Por ejemplo, en este caso para los nodos terminales se ha
escogido el diagrama de cajas, que es la opción que de forma automatizada elige
la función por el tipo de datos, pero si se prueba con otros formatos se observará
que a veces da un error de concordancia, porque no es capaz de ajustar los da-
tos a otros formatos de gráfico. Por último, al final del script se crea una tabla,
que muestra la media estimada de la variable dependiente (si fuese una variable
cualitativa o de clasificación mostraría el nivel o la clase más probable) para cada
área.

¾ library(party)
¾ datos<-read.csv2("Producción primaria.csv", header=TRUE, encoding=
"latin1")
GRÁFICOS AVANZADOS
261

¾ datos1<-subset(datos, !is.na(Clorofila))
¾ attach(datos1)
¾ prod <- ctree(Clorofila ~ ., data = datos1)
¾ plot(prod)
¾ plot(prod,inner_panel=node_inner(prod, fill="cyan", id=F), terminal_panel=
node_boxplot(prod,col = "black", fill="red",id=T))
¾ table(predict(prod), Area)

La interpretación del gráfico es similar a la de otros árboles de clasificación


vistos con anterioridad. Se observa la formación de clases, que con este método
se realiza buscando la mayor significación estadística en cada paso. La variable
más relevante es silicato, con valor de corte 8,31. En el segundo paso la variable
más significativa vuelve a ser silicato, ahora con valor de corte 6,89, y el proceso
de clasificación finaliza: No hay más variables con relación significativa con la
variable dependiente clorofila.
En los nodos finales se muestra el número de casos de cada grupo, y un dia-
grama de cajas, que permite apreciar (diferente altura y escaso solapamiento de
las cajas) como la variable dependiente, clorofila, tiene valores distintos en cada
clase: pequeños en la primera (entre 0 y 1), grandes en la tercera (entre 2 y 4),
con otra clase intermedia.

1
Silicato

<= 8.31 > 8.31

2
Silicato

<= 6.89 > 6.89

Node 3 (n = 15) Node 4 (n = 10) Node 5 (n = 11)

4 4 4

3 3 3

2 2 2

1 1 1

0 0 0
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
262

Silicato

<= 8.31 > 8.31

Silicato

<= 6.89 > 6.89

n = 15 n = 10 n = 11

4 4 4

3 3 3

2 2 2

1 1 1

0 0 0

La tabla de resultados muestra en cada fila el valor estimado para la variable


dependiente en cada rama final del árbol, y la distribución de frecuencias en cada
área. La clase 1, con valores bajos de clorofila, corresponde mayoritariamente a
Mauritania (zona en la que solo hay elementos de la clase 1); la clase 3, con
valores altos de clorofila, se relaciona con las áreas Benguela y Humboldt;
ningún elemento de esta clase tercera está en el área de California ni de Mauri-
tania. Por el árbol sabemos además que en la tercera clase los silicatos superan
el valor 8,31.

Como ejemplo de supervivencia usaremos los datos de un experimento con el


cladócero Daphnia sp., cuyos datos están en el archivo DaphniaSurv.csv. El
objetivo es determinar si el tipo de alimentación, el tipo de alimento y la con-
GRÁFICOS AVANZADOS
263

centración de alimento explican las diferencias observadas en la supervivencia de


esta especie en el tiempo. Las instrucciones están en el script III.42.R.
La función «Surv()» del paquete “survival”, crea un objeto de supervivencia
que puede ser utilizado para construir tablas o curvas de supervivencia mediante
el modelo de riesgos proporcionales (regresión de Cox, método de Kaplan-Meier,
etc.).
La función «ctree()», admite en su fórmula estos objetos de supervivencia
como dependientes de un conjunto de variables, realizando el árbol de clasifica-
ción con el procedimiento indicado anteriormente. En el gráfico se muestra el
proceso, y en los nodos terminales se representa la curva de supervivencia para
cada clase resultante.
La división en clases comienza con la variable Trat (tipo de alimento), con dos
niveles, y en segundo lugar Conc (concentración de alimento), también con dos
niveles, dando lugar finalmente a cuatro clases.

¾ library(party)
¾ library(survival)
¾ datos<-read.csv2("DaphniaSurv.csv",header=TRUE,encoding="latin1")
¾ datos1<-subset(datos, !is.na(Time))
¾ attach(datos1)
¾ surv<-ctree(Surv(Time, Status) ~ .,data = datos1)
¾ plot(surv)

El gráfico de supervivencia indica esperanzas de vida crecientes de izquierda a


derecha, con mayor duración de vida para el tipo de alimento con el alga
Scenedesmus frente al alimento sin Scenedesmus, y baja concentración frente a
alta concentración. Con alimento sin Scenedesmus y alta concentración, la super-
vivencia es prácticamente nula a las 100 horas, y con el alga Scenedesmus y
baja concentración la supervivencia es del 80% al cabo de 360 horas.

1
Trat
p < 0.001

NoScen Scen

2 5
Conc Conc
p = 0.029 p < 0.001

H L H L

Node 3 (n = 39) Node 4 (n = 40) Node 6 (n = 37) Node 7 (n = 36)


1 1 1 1

0.8 0.8 0.8 0.8

0.6 0.6 0.6 0.6

0.4 0.4 0.4 0.4

0.2 0.2 0.2 0.2

0 0 0 0
0 50 100 150 200 250 300 350 0 50 100 150 200 250 300 350 0 50 100 150 200 250 300 350 0 50 100 150 200 250 300 350
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
264

Como ejemplo de clasificación de categorías usaremos los datos de morfo-


metría que están en el archivo Morfología.csv. El objetivo es determinar si es
posible distinguir las familias de peces en base a las variables morfométricas. Las
instrucciones están en el script III.43.R.
Después de cargar los paquetes, se seleccionan solamente las variables mor-
fométricas con las que se va a trabajar para realizar el árbol de inferencia, de la
5 a la 31. El paquete “grDevices”, el cual viene por defecto cuando se instala R,
permite utilizar los colores de forma más cómoda, en concreto se usa
«rainbow(4)» para rellenar con los colores del arco iris las barras de los gráfi-
cos terminales. El número 4 es debido a que hay cuatro familias de peces en los
datos. El paquete ““vcd” (Meyer y col., 2012) se utiliza para poner una leyenda
con la función «grid_legend()». Esta leyenda es necesaria porque los nombres
de las familias se solapan con las etiquetas del eje x, en los gráficos terminales
de barras. Con el paquete “partykit” (Hothorn, 2012) es posible usar
«gp=gpar()», donde se puede modificar el tipo y estilo del texto. En concreto se
usa «fontsize=0» para que no pongan las etiquetas de las familias en el eje x.
Otra opción sería usar «fontsize=12» y luego recortar el marco de la figura una
vez pegado en cualquier otro programa, para así eliminar las etiquetas de las
familias en el eje x y no borrar las etiquetas con las frecuencias en el eje y. Esta
última opción es la que se muestra a continuación en el gráfico.

¾ library(party)
¾ library(grDevices)
¾ library(vcd)
¾ library(partykit)
¾ datos<-read.csv2("Morfología.csv",header=TRUE,encoding="latin1")
¾ datos1<-subset(datos, !is.na(Familia))
¾ attach(datos1)
¾ datos2<-datos1[,5:31]
¾ fam <- ctree(Familia ~ ., data = datos2)
¾ plot(fam,inner_panel=node_inner(fam, fill="cyan", id=F), terminal_panel=
node_barplot(fam, fill=rainbow(4),ylines=1.5, gp=gpar(fontsize=12), id=F))
¾ grid_legend(0.9, 0.85, pch=rep(15,4), col = rainbow(4), frame = FALSE,
c("Characidae", "Cichlidae", "Sparidae","Sphyraenidae"), title = "Familias",
hgap=10,vgap=0.5, gp=gpar(fontface=1, fontsize=18))

La tabla de predicciones muestra que prácticamente todos los individuos se


clasifican correctamente. Solamente un individuo de la familia Cichlidae es iden-
tificado erróneamente como Sparidae y, por lo tanto, es posible predecir con casi
un 100% de acierto (99,9%) a que familia pertenece cada individuo a partir de
sus características morfológicas.
GRÁFICOS AVANZADOS
265

El gráfico muestra que la variable M12 es muy importante, ya que permite


diferenciar las familias Characidae (valores menores de 0,2227) y Sphriraenidae
(valores entre 0,2227 y 0,3832). Las especies de las familias Sparidae y
Cichlidae no tienen ninguna variable que las diferencie de forma clara y, por ello,
para clasificar de forma correcta a casi todos los individuos es necesario emplear
varias variables.

M12
Familias
Characidae
<= 0.2227 > 0.2227
Cichlidae
Sparidae
M12
Sphyraenidae

<= 0.3832 > 0.3832

M24

<= 0.1776 > 0.1776

M25 M18

<= 0.2124 > 0.2124 <= 0.1079 > 0.1079

M24 M22 M20

<= 0.0661 > 0.0661 <= 0.1607 > 0.1607 <= 0.2126 > 0.2126

n = 335 n = 65 n=7 n = 29 n=7 n = 345 n = 16 n = 11 n = 198


1 1 1 1 1 1 1 1 1
0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8 0.8

0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6 0.6

0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.4


0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2

0 0 0 0 0 0 0 0 0

La función «mob()» del paquete “party” (Hothorn y col., 2004; 2006a;


2006b; Strobl y col., 2007; Hothorn y col., 2012) construye un árbol de inferen-
cia para una variable dependiente que es un modelo lineal, como el descrito en el
párrafo anterior, con respecto a un conjunto de variables independientes o expli-
cativas, en nuestro ejemplo todas las no utilizadas en el modelo lineal. Es decir,
el resultado del árbol es una clasificación jerárquica que tiene, en los nodos ter-
minales, un modelo ajustado a las condiciones particulares de cada clase, defini-
das por los valores de las variables explicativas significativas.
Como ejemplo usaremos el archivo Bostonhousing que tiene datos de un
censo de población realizado en Boston en 1970. Se trata de 506 casos (distri-
tos) y 13 variables: tasa de criminalidad, proporción de zonas residenciales, su-
perficie industrial, límite con el rio, concentración de óxido nítrico, habitaciones
por hogar (rm), viviendas en propiedad anterior a 1940 (age), distancias pon-
deradas a 5 centros de empleo, índice de accesibilidad a la autopista, tasa de
impuestos, relación alumno/profesor, transformación de la proporción de pobla-
ción de raza negra (b), proporción de pobres (lstat) y renta media de hogares
con vivienda en propiedad (medv). Las instrucciones están en el script III.44.R.
Después de cargar el paquete y el archivo de datos se realizan algunas
transformaciones previas: logaritmo de lstat y cuadrado de rm. También se cam-
bian los códigos de las clases de algunas de las variables. Por último, se cons-
truye el modelo lineal con la renta media de hogares con vivienda en propiedad
(medv) como variable dependiente, y la proporción de pobres (lstat) y habitacio-
nes por hogar (rm) como variables independientes, y el resto de variables se
utilizan para la construcción del árbol.

¾ library(party)
GRÁFICOS ESTADÍSTICOS Y MAPAS CON R
266

¾ data("BostonHousing", package = "mlbench")


¾ BostonHousing$lstat <- log(BostonHousing$lstat)
¾ BostonHousing$rm <- BostonHousing$rm^2
¾ BostonHousing$chas <- factor(BostonHousing$chas, levels = 0:1,labels =
c("no", "yes"))
¾ BostonHousing$rad <- factor(BostonHousing$rad, ordered = TRUE)
¾ fm <- mob(medv ~ lstat + rm | zn + indus + chas + nox + age + dis +
¾ rad + tax + crim + b + ptratio, control = mob_control(minsplit = 40),
¾ data = BostonHousing, model = linearModel)
¾ plot(fm)

1
tax
p < 0.001
d 432 ! 432
2
ptratio
p < 0.001
d 15.2 ! 15.2
4
ptratio
p < 0.001
d 19.6 ! 19.6
5
tax
p < 0.001
d 265 ! 265

Node 3 (n = 72) Node 6 (n = 63) Node 7 (n = 162) Node 8 (n = 56) Node 9 (n = 153)
54 54 54 54 54

1 1 1 1 1
0.3 3.9 0.3 3.9 0.3 3.9 0.3 3.9 0.3 3.9
54 54 54 54 54

1 1 1 1 1
6.3 83.5 6.3 83.5 6.3 83.5 6.3 83.5 6.3 83.5

En el gráfico anterior se observa como el modelo que intenta explicar la renta


media de los hogares en función de la proporción de pobres y el número medio
de habitaciones por hogar depende fundamentalmente de dos variables: la tasa
de impuestos al patrimonio (variable claramente relacionada con la renta), y la
GRÁFICOS AVANZADOS
267

relación alumnos/profesor (variable asociada al número de niños, y en conse-


cuencia al número de habitaciones).
En cada nodo terminal se muestra gráficamente el modelo, representando la
relación entre la variable dependiente (renta media de los hogares con vivienda
en propiedad) y cada una de las dos variables independientes: logaritmo de la
proporción de población pobre en la parte superior, y cuadrado del número de
habitaciones por hogar en la inferior. La relación con la primera es siempre ne-
gativa, y con la segunda siempre positiva, aunque el modelo cambia de forma
significativa en cada una de las 5 clases obtenidas.
Se puede observar por ejemplo, como la relación lineal entre la renta y el
número de habitaciones se va atenuando de izquierda a derecha, a medida que
aumenta el impuesto medio sobre el patrimonio y la relación alumnos/profesor,
de modo que en el tramo de impuestos más altos prácticamente desaparece la
relación lineal entre renta y número de habitaciones por hogar, de tal forma que
en esta última clase predomina la relación entre renta e impuesto, a diferencia
de las restantes en las que parece más clara la relación entre renta y alum-
nos/profesor. Como vemos se forman clases en las que el modelo lineal en sí
mismo es distinto, es decir, el criterio de clasificación es el modelo lineal.
En último lugar, como ejemplo de regresión ordinal usaremos los datos
mammoexp, incluidos en el paquete “party”. Estos datos contienen 412 observa-
ciones y 6 variables de un experimento sobre mamografía: ME es información
sobre si se ha realizado mamografía y cuando tiempo ha pasado desde la última
vez (nunca, en el último año, más de un año), SYMP es qué piensa sobre si no es
necesaria una mamografía cuando no tiene síntomas (totalmente de acuerdo, de
acuerdo, en desacuerdo, totalmente en desacuerdo), PB beneficio percibido
(suma de cinco variables en escala de 4 valores, cuanto más bajo indica mayor
beneficio percibido), HIST historial sobre si la madre o hija ha tenido cáncer de
mama (si, no), BSE es si le han enseñado autodiagnóstico (si, no), DECT si cree
que la mamografía puede detectar un cáncer de mama (no creo, puede ser, es-
toy segura).
El ejemplo se utiliza para mostrar como una variable ordinal (ME experiencia
en mamografía) puede ser también utilizada como criterio de clasificación con la
función «ctree()». La fórmula expresa la variable ME, experiencia en mamo-
grafía, como función de las restantes, y el árbol se construye, como en los ejem-
plos anteriores, buscando la variable explicativa más significativa en su relación
con ME. Las instrucciones están en el script III.45.R.

¾ library(party)
¾ data(mammoexp)
¾ mammoct <- ctree(ME ~ ., data = mammoexp)
¾ plot(mammoct)

El gráfico muestra tres grupos. En el primer grupo predominan las pacientes


que nunca han realizado una mamografía, grupo que se caracteriza por opinar
que no es necesaria si no se tienen síntomas. Los otros dos grupos, formados por
mujeres en desacuerdo con esa opinión, muestran diferentes frecuencias de la
variable dependiente ordinal, y están constituidos por aquellas mujeres que per-
ciben un mayor beneficio en la realización de mamografías (PB d 8) y las