Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
herramienta clave
en investigación
Carlos G. Redondo Figuero
Ciencias Experimentales
Textos Universitarios
EL PROGRAMA R,
HERRAMIENTA CLAVE EN INVESTIGACIÓN
Colección M ANUALES #54: Textos Universitarios 23
CONSEJO EDITORIAL
Textos Universitarios, nº 23
Ciencias Experimentales
Editorial
Universidad
Cantabria
Redondo Figuero, Carlos
El programa R, herramienta clave en investigación [Recurso electrónico] /
Carlos G. Redondo Figuero. – Santander : Editorial de la Universidad de Canta-
bria, 2017.
XIV, 410 p. : il. – (Manuales ; 54. Textos universitarios ; 23 )
ISBN 978-84-8102-808-9
004.438 R
311:004.6
santander, 2017
Hecho en España - Made in Spain
www.editorialuc.es
Índice general
1. El método cientı́fico 1
1.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. El Método Cientı́fico . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2.1. Hacer ciencia . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Fundamentos filosóficos . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.1. Los inductistas . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3.2. Los refutacionistas . . . . . . . . . . . . . . . . . . . . . . 4
1.4. Fases del Método Cientı́fico . . . . . . . . . . . . . . . . . . . . . 4
1.4.1. Pregunta de investigación . . . . . . . . . . . . . . . . . . 5
1.4.2. Búsqueda bibliográfica . . . . . . . . . . . . . . . . . . . . 6
1.4.3. Hipótesis y objetivos . . . . . . . . . . . . . . . . . . . . . 7
1.4.4. Experimento . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.4.5. Base de datos . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.4.6. Análisis estadı́stico . . . . . . . . . . . . . . . . . . . . . . 9
1.4.7. Publicación . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.5. La necesidad de investigación . . . . . . . . . . . . . . . . . . . . 10
1.6. Caracterı́sticas para ser un buen investigador . . . . . . . . . . . 11
1.7. Investigación de calidad . . . . . . . . . . . . . . . . . . . . . . . 12
I EL PROGRAMA R 15
2. El programa R 17
2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.2. Caracterı́sticas del sistema R . . . . . . . . . . . . . . . . . . . . . 19
2.3. Obtención de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4. Instalación de R y arranque del programa . . . . . . . . . . . . . 20
2.4.1. Instalación de R . . . . . . . . . . . . . . . . . . . . . . . . 20
2.4.2. Arranque de R . . . . . . . . . . . . . . . . . . . . . . . . 20
2.5. Funciones y paquetes en este capı́tulo . . . . . . . . . . . . . . . 23
4. Librerı́as en R 37
4.1. Paquetes instalados . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2. Instalación de un paquete . . . . . . . . . . . . . . . . . . . . . . 39
4.3. Actualización de un paquete . . . . . . . . . . . . . . . . . . . . . 39
4.4. Contenido de un paquete . . . . . . . . . . . . . . . . . . . . . . 40
4.4.1. Cabecera de un paquete . . . . . . . . . . . . . . . . . . . 40
4.4.2. ((Datasets)) de un paquete . . . . . . . . . . . . . . . . . . 41
4.4.3. Contenido de todo el paquete . . . . . . . . . . . . . . . . 41
4.5. Paquetes recomendados . . . . . . . . . . . . . . . . . . . . . . . 41
4.5.1. De tipo general . . . . . . . . . . . . . . . . . . . . . . . . 41
4.5.2. De tipo epidemiológico . . . . . . . . . . . . . . . . . . . 42
4.6. Task Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.7. Funciones en este capı́tulo . . . . . . . . . . . . . . . . . . . . . . 42
5. R calculadora cientı́fica 45
5.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2. Funciones básicas . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.3. Funciones avanzadas . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.1. De redondeo . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.3.2. Matemáticas generales . . . . . . . . . . . . . . . . . . . . 48
5.3.3. Trigonométricas . . . . . . . . . . . . . . . . . . . . . . . . 49
5.4. Funciones en este capı́tulo . . . . . . . . . . . . . . . . . . . . . . 50
6. El sistema de ayuda en R 53
6.1. Las funciones de ayuda . . . . . . . . . . . . . . . . . . . . . . . . 53
6.1.1. La función ((help())) o ((?)) . . . . . . . . . . . . . . . . . . 53
6.1.2. La función ((help.search())) . . . . . . . . . . . . . . . . . . 54
6.1.3. La función ((help.start())) . . . . . . . . . . . . . . . . . . . 55
6.1.4. La función ((apropos())) . . . . . . . . . . . . . . . . . . . . 56
6.1.5. La función ((example())) . . . . . . . . . . . . . . . . . . . 56
6.1.6. La función ((vignette())) . . . . . . . . . . . . . . . . . . . . 57
6.2. Otras funciones de ayuda . . . . . . . . . . . . . . . . . . . . . . 58
6.2.1. La función ((find())) . . . . . . . . . . . . . . . . . . . . . . 58
6.2.2. La función ((demo())) . . . . . . . . . . . . . . . . . . . . . 58
6.3. La función ((history())) . . . . . . . . . . . . . . . . . . . . . . . . 59
6.4. Funciones en este capı́tulo . . . . . . . . . . . . . . . . . . . . . . 59
II EL LENGUAJE R 61
7. Guı́a de estilo en R 63
7.1. Nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.1.1. Ficheros . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.1.2. Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
7.2. Sintaxis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
www.editorialuc.es
7.3. Escritura de código . . . . . . . . . . . . . . . . . . . . . . . . . . 65
7.4. Documentación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
9. Objetos 75
9.1. Nombre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
9.1.1. Palabras reservadas . . . . . . . . . . . . . . . . . . . . . 76
9.1.2. Palabras que deben ser evitadas . . . . . . . . . . . . . . 77
9.2. Memoria . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
9.3. Propiedades . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
9.3.1. Atributos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
9.3.2. Clase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
9.3.3. Dimensiones y Longitud . . . . . . . . . . . . . . . . . . . 81
9.3.4. Nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
9.3.5. Tipo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
9.3.6. Modo de almacenamiento . . . . . . . . . . . . . . . . . . 83
9.3.7. Estructura . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
9.4. Manipulación de objetos . . . . . . . . . . . . . . . . . . . . . . . 86
9.4.1. Creación . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
9.4.2. Coerción . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
9.4.3. Destrucción . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.5. Visibilidad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
9.6. Funciones y paquetes en este capı́tulo . . . . . . . . . . . . . . . 90
10. Vectores 93
10.1. Concepto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
10.1.1. Vectores atómicos . . . . . . . . . . . . . . . . . . . . . . . 94
10.1.2. Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
10.2. Creación de vectores . . . . . . . . . . . . . . . . . . . . . . . . . 94
10.2.1. Concatenación . . . . . . . . . . . . . . . . . . . . . . . . 96
10.2.2. Secuencias . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
10.2.3. Repeticiones . . . . . . . . . . . . . . . . . . . . . . . . . . 98
10.3. Tipos de vectores . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
10.3.1. Lógicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
10.3.2. Numéricos . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
10.3.3. Cadena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
10.3.4. Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
10.3.5. Elementos especiales . . . . . . . . . . . . . . . . . . . . . 104
10.4. Operaciones con vectores . . . . . . . . . . . . . . . . . . . . . . 106
10.4.1. Poner nombres . . . . . . . . . . . . . . . . . . . . . . . . 106
10.4.2. En vectores numéricos . . . . . . . . . . . . . . . . . . . . 106
www.editorialuc.es
14.2. Creación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
14.2.1. Función matrix() . . . . . . . . . . . . . . . . . . . . . . 151
14.2.2. Función dim() . . . . . . . . . . . . . . . . . . . . . . . . 152
14.2.3. Funciones cbind() y rbind() . . . . . . . . . . . . . . 153
14.3. Manejo de una matriz . . . . . . . . . . . . . . . . . . . . . . . . 154
14.3.1. Poner y quitar nombres . . . . . . . . . . . . . . . . . . . 154
14.3.2. Acceder a sus elementos . . . . . . . . . . . . . . . . . . . 156
14.3.3. Eliminar una fila o una columna . . . . . . . . . . . . . . 156
14.3.4. Extraer una submatriz . . . . . . . . . . . . . . . . . . . . 157
14.3.5. Funciones exploradoras en matrices . . . . . . . . . . . . 157
14.4. Cálculos en una matriz . . . . . . . . . . . . . . . . . . . . . . . . 160
14.5. Operaciones con matrices . . . . . . . . . . . . . . . . . . . . . . 162
14.5.1. Operaciones matemáticas elementales . . . . . . . . . . . 163
14.5.2. Multiplicación de dos vectores . . . . . . . . . . . . . . . 164
14.5.3. Multiplicación de una matriz por un vector . . . . . . . . 165
14.5.4. Multiplicación de dos matrices . . . . . . . . . . . . . . . 166
14.5.5. Matriz inversa . . . . . . . . . . . . . . . . . . . . . . . . . 167
14.5.6. Sistemas de ecuaciones lineales . . . . . . . . . . . . . . . 168
14.6. Funciones en este capı́tulo . . . . . . . . . . . . . . . . . . . . . . 168
www.editorialuc.es
20.2.5. Textos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
20.3. Funciones gráficas . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
20.4. Funciones gráficas de alto nivel . . . . . . . . . . . . . . . . . . . 221
20.4.1. Funciones para una variable . . . . . . . . . . . . . . . . 221
20.4.2. Funciones para dos variables . . . . . . . . . . . . . . . . 226
20.4.3. Funciones para más de dos variables . . . . . . . . . . . . 228
20.5. Funciones gráficas de bajo nivel . . . . . . . . . . . . . . . . . . . 240
20.5.1. Puntos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
20.5.2. Lı́neas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
20.5.3. Ejes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
20.5.4. Texto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
20.6. Funciones interactivas . . . . . . . . . . . . . . . . . . . . . . . . 244
20.6.1. Lectura de coordenadas . . . . . . . . . . . . . . . . . . . 244
20.6.2. Identificación de puntos . . . . . . . . . . . . . . . . . . . 244
20.7. Gráficos condicionales . . . . . . . . . . . . . . . . . . . . . . . . 244
20.8. Gráficos dinámicos . . . . . . . . . . . . . . . . . . . . . . . . . . 246
20.9. Matriz de correlaciones . . . . . . . . . . . . . . . . . . . . . . . . 246
20.10.Mapas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
20.11.Funciones y paquetes en este capı́tulo . . . . . . . . . . . . . . . 249
IV PROGRAMACIÓN 293
23. Scripts 295
23.1. Concepto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
23.2. Manejo de scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
23.2.1. Escritura . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
23.2.2. Grabación . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
23.2.3. Lectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
23.2.4. Ejecución del script . . . . . . . . . . . . . . . . . . . . . . 299
23.3. Funciones y paquetes en este capı́tulo . . . . . . . . . . . . . . . 300
www.editorialuc.es
28. Depuración de errores 353
28.1. Depuración de errores . . . . . . . . . . . . . . . . . . . . . . . . 353
28.1.1. La función debug() . . . . . . . . . . . . . . . . . . . . . 353
28.1.2. La función traceback() . . . . . . . . . . . . . . . . . . 355
28.2. Depuración en el entorno de RStudio . . . . . . . . . . . . . . . . 355
28.3. Funciones y paquetes en este capı́tulo . . . . . . . . . . . . . . . 356
El método cientı́fico
1.1. Introducción
1
Libros de Estadística en PDF | Statistics Books in PDF
2 CAPÍTULO 1. EL MÉTODO CIENTÍFICO
Figura 1.1: Padres del Método Cientı́fico: en el lado izquierdo, Tales de Mileto; en el
centro, Aristóteles y a la derecha, Alhazen.
www.editorialuc.es
Figura 1.2: Bucle de retroalimentación en el proceso de aprendizaje de la investigación,
modificado de Box et al 1978 [8]. El investigador observa la realidad a través de una
ventana imperfecta (tipo de estudio). Esto junto con datos conocidos le permite, me-
diante un proceso de inducción, aceptar su hipótesis previa, o modificarla y de nuevo
iniciar otro estudio mejor.
www.editorialuc.es
Figura 1.4: El Método Cientı́fico y sus diferentes fases. Partiendo de una pregunta
no resuelta, el investigador formula una hipótesis, elige un diseño y realiza el estudio,
obtiene datos de calidad que analiza y llega a unas conclusiones que debe publicar.
Ética. Aunque puesta en cuarto lugar, por su importancia debiera ser la pri-
mera [45]. No se puede ni se debe responder ninguna pregunta de in-
vestigación que no sea éticamente correcta [46], por lo que siempre hay
que tener en mente unos principios éticos básicos: (1) Autonomı́a o respe-
to a las personas, ya que ellas deben decidir por sı́ mismas, por lo que
una vez informadas de todo lo que se va a hacer (consentimiento infor-
mado) decidirán libremente si participan o no, y aquı́ hay que proteger
a los grupos especialmente vulnerables (mujeres embarazadas, ancianos,
niños, presos, discapacitados, etc.); (2) Justicia, que exige que todos los
seres humanos sean tratados con consideración y respeto pues tienen los
mismos derechos, por lo que no se deben seleccionar aquellos más dis-
ponibles o en situación de dependencia y, además, si hay posibilidad de
que surja un daño o perjuicio en la investigación, deberán estar cubiertos
obligatoriamente por un seguro; (3) Beneficencia, procurando el bien de
los sujetos sometidos a investigación y no exponiéndoles a riesgos inne-
cesarios; algunos autores distinguen (4) No maleficencia, es decir no hacer
daño a los sujetos, lo que exige entre otras cosas, la idoneidad del equi-
po investigador y la adecuación de los medios y centros. Por todo esto,
una de las obligaciones de todo investigador es acatar los principios éti-
cos de la Declaración de Helsinki, que se puede consultar en su página
web correspondiente: http://www.wma.net/es/30publications/
10policies/b3/.
www.editorialuc.es
Academia de la Lengua Española, es una suposición de una cosa posible o im-
posible para sacar de ella una consecuencia. Hipótesis es suposición, en con-
traposición a ((tesis)) (del griego θεσις) que significa conclusión o proposición
que se mantiene con razonamientos [4].
En primer lugar conviene declarar la hipótesis base del estudio. La hipóte-
sis se formula como lo que se supone que ocurre. Más adelante el estudio se
encargará de demostrar si la hipótesis es verdadera o no.
En segundo lugar describir los objetivos del estudio. El diseño del estudio
implica entre otras cosas el formular correctamente la pregunta en unos térmi-
nos (objetivos) claramente expuestos, que deben ser mensurables, compatibles
entre sı́ y alcanzables.
1.4.4. Experimento
Una vez declarada la hipótesis y establecidos los objetivos, habrá que di-
señar un experimento, o un estudio, que deberá estar plasmado en un Proyecto
de Investigación y que se realizará según se describa en el Manual Operativo.
Diseño experimental.
El diseño debe ser el adecuado para responder correctamente a los objetivos
propuestos, por lo tanto habrá que diseñar un experimento o tipo estudio en el
que se medirán una serie de variables en determinados sujetos.
Tipos de estudios. Fundamentalmente existen: a) los estudios observaciona-
les en los que el investigador se limita a observar lo que sucede, y esto lo puede
hacer analizando al mismo tiempo la causa y el efecto (estudios transversales),
o partiendo de la enfermedad busca hacia atrás la causa (estudios de casos y
controles), o puede partir de la causa y ver, en el tiempo, el desarrollo de la
enfermedad (estudios de cohortes); y b) los ensayos clı́nicos en los que el in-
vestigador no es un observador, sino que interviene en la exposición. Además
existen otros diseños menos utilizados.
Sujetos de experimentación. Hay que elegir a los individuos que partici-
parán en el estudio [48]. Conviene definir claramente qué caracterı́sticas deben
cumplir los sujetos que participarán en el estudio (criterios de inclusión), y de
éstos cuáles deberán eliminarse por diferentes causas (criterios de exclusión).
Variables. Hay que describir qué se va a medir: (variables independientes,
dependientes y de confusión) y en cuántos individuos (tamaño de la muestra).
Proyecto de investigación.
El proyecto de investigación sirve para estructurar el pensamiento del gru-
po investigador, en el sentido de explicitar claramente las razones de la investi-
gación, la hipótesis subyacente, los objetivos propuestos y cómo se va a trabajar
para conseguir estos objetivos. Además sirve para solicitar la ayuda económi-
ca (beca FIS o de otro tipo) que se pretende conseguir para poder desarrollar
el proyecto, ya que hoy en dı́a es imposible desarrollar ningún proyecto de in-
vestigación sin ayuda económica; por eso esta fase es muy importante que sea
elaborada con el máximo cuidado.
Este tipo de ayudas, como las becas FIS, tienen unas condiciones de obliga-
do cumplimiento: se deberá enviar en las fechas señaladas en la convocatoria
anual (las becas FIS se publican en el BOE), deben seguir un modelo estructu-
rado (que proporciona el propio FIS) y hay que adjuntar el currı́culum vitae
del investigador principal y de cada uno de los investigadores colaboradores
incluidos en el proyecto. El proyecto de investigación también deberá presen-
tarse al Comité Ético de Investigación Clı́nica correspondiente.
Manual Operativo.
Para pocas variables es posible utilizar una hoja de cálculo tipo Excel [50]
como base de datos, pero para investigaciones algo más complejas, o en las que
se quieran implementar diferentes mecanismos para evitar la introducción de
datos erróneos, es mucho más adecuado utilizar una base de datos tipo Access
[51], y para estudios de mucha más envergadura se utilizan bases de datos
www.editorialuc.es
De las bases de datos de escritorio, Access probablemente sea la más com-
pleta, y en un único fichero se almacenan tablas, consultas, formularios, infor-
mes y módulos. Permite al investigador programar y crear sus propias bases
de datos [52], dotándolas de mecanismos lógicos que impidan la introducción
de datos erróneos, y por tanto facilita la calidad de la investigación. Una parte
importante de los recursos en investigación se consumen en la consecución de
un fichero datos de calidad a partir de los datos recogidos inicialmente a fin de
evitar el sı́ndrome ((GIGO)), es decir ((garbage in, garbage out)).
Otros investigadores introducen los datos directamente en el programa es-
tadı́stico, que suele tener una forma similar a una hoja de cálculo, por ejemplo
SPSS [53]. Y otros almacenan los datos en un simple fichero de texto (sepa-
rando las columnas mediante comas o tabuladores, o en una posición fija) que
después será leı́do por algún paquete estadı́stico.
1.4.7. Publicación
Una vez concluida la investigación hay que redactar un informe (publica-
ción) con el fin de evitar que otros investigadores dediquen su tiempo, esfuer-
zos y recursos en algo que ya está resuelto y que, por tanto, debe pasar a en-
grosar el Cuerpo de Conocimientos Cientı́ficos. Es importante [59] seguir las
guı́as SAMPL [60], CONSORT [61], TREND [62] y STROBE [63].
www.editorialuc.es
vestigación que ha desarrollado sobre problemas clı́nicos y de salud pública,
desarrollada a lo largo de la historia. Pero la mayorı́a de las investigaciones
tienen errores que podrı́an evitarse y otros aspectos que podrı́an mejorarse. De
ahı́ la necesidad de formarse en Metodologı́a de la Investigación [67].
distinguir los matices que las diferencian; también habı́a sido dotado por la naturaleza
del deseo de investigar, paciencia para dudar, solidez en la meditación, lentitud para
afirmar, prontitud en la consideración de lo nuevo, esmero en la disposición y ordena-
miento de las cosas; soy, además, hombre que nunca me inclino hacia lo nuevo ni admiro
lo antiguo y que odio toda suerte de impostura. Por esto pensé que mi naturaleza poseı́a
una cierta familiaridad y relación con la verdad)).
Para investigar no se necesita un amplio conocimiento de técnicas expe-
rimentales, ni de procedimientos de laboratorio, ni de grandes conocimientos
estadı́sticos; se precisan unos conocimientos básicos, un lenguaje adecuado pa-
ra entenderse con los expertos en metodologı́a (estadı́sticos y epidemiólogos),
tiempo para pensar, sentido común e ilusión por la investigación [70].
El investigador, para descubrir nuevos hechos o ratificar otros conocidos,
necesita una herramienta de trabajo, un método regular sistemático y ordena-
do que, cuando se fundamenta en conocimientos cientı́ficos, adquiere el califi-
cativo de método cientı́fico [7].
Para el investigador novel elegir un buen mentor es fundamental [71–78],
aunque es un proceso difı́cil, tal y como afirman Hulley et al. [47].
En palabras textuales de estos autores:
Tabla 1.2: Some Research Practices that May Help Increase the Proportion of True
Research Findings [80].
www.editorialuc.es
Research Practices
• Investigación en colaboración a gran escala
• Adopción de una cultura de replicación de los estudios
• Registro (de los estudios, protocolos, códigos de análisis, bases de datos,
datos crudos y resultados)
• Compartir (datos, protocolos, materiales, software y otras herramien-
tas)
• Adopción de prácticas de reproducibilidad
• Containment of conflicted sponsors and authors
• Utilización de los métodos estadı́sticos más apropiados
• Estandarización de las definiciones y análisis
• Umbrales más rigurosos antes de declarar descubrimientos o éxitos
• Mejora de los estándares de diseño del estudio
• Mejora en la revisión por pares, en los informes y en la publicación
• Mayor entrenamiento cientı́fico en métodos y técnicas estadı́sticas
dad de errores estadı́sticos es que la mayorı́a de los análisis lo realizan personas con un
conocimiento inadecuado de los métodos estadı́sticos. Posteriormente son revisados por
personas que generalmente no tienen mayor conocimiento. Lamentablemente, muchas
investigaciones pueden beneficiar más a los investigadores que a los pacientes, especial-
mente cuando se llevan a cabo por una ridı́cula necesidad de carrera profesional)).
No conviene olvidar que más del 85 % de la investigación biomédica actual
es inútil [80–84] y a veces fraudulenta [85], que muchos investigadores no co-
nocen bien las técnicas estadı́sticas y que muchos revisores de revistas (incluso
prestigiosas) tampoco, por lo que es importante y urgente adoptar prácticas
que mejoren la calidad de la investigación, como las propuestas por J. P. A.
Ioannidis que se recogen en la Tabla 1.2.
PROBLEMAS
EL PROGRAMA R
El programa R
2.1. Introducción
Desde hace unos cuarenta años (1976), Richard A. Becker, John M. Cham-
bers y Allan R. Wilks (Figura 2.1), un grupo de matemáticos estadı́sticos y
programadores inventaron el lenguaje S1 en los laboratorios AT&T Bell (EE.
UU.), que rápidamente evolucionó, debido a su gran aceptación, y se convir-
tió en la base del programa comercial S-PLUS, que comenzó a revolucionar el
análisis estadı́stico [86]. De su trabajo derivaron libros conocidos como ((brown
book)) [87], ((blue book)) [88], ((white book)) [89] y otros libros [90, 91].
Figura 2.1: Los ((padres)) del lenguaje ((S)) (de izquierda a derecha: Richard A. Decker,
John M. Chambers y Allan R. Wilks)
Mas tarde, en 1990, Ross Ihaka y Robert Gentleman (Figura 2.2), de la uni-
versidad de Auckland (Nueva Zelanda), comenzaron a trabajar en un proyec-
to relacionado, que publicaron en 1996 [92]; ellos decidieron crear una versión
que permitiera el acceso gratuito a cualquier usuario sin tener que invertir im-
portantes medios económicos de los que muchas veces carece y que llamaron
R [93], probablemente por las dos iniciales de sus nombres. Robert Gentelman
ha derivado hacia ((Bioconductor)), un subproyecto de R dedicado a la bioin-
formática [94].
1 en palabras de Chambers, ((S is a language for programming with data.))
17
Libros de Estadística en PDF | Statistics Books in PDF
18 CAPÍTULO 2. EL PROGRAMA R
Figura 2.2: Los ((padres)) del sistema ((R)) (a la izquierda Ross Ihaka y a la derecha
Robert Gentelman
Desde 1999 es mantenido por el R Development Core Team (el núcleo duro
de R), con un número de miembros que ha ido ampliándose desde los 7 inicia-
les hasta los 19 existentes actualmente. R puede ser descargado desde CRAN
(Comprehensive R Archive Network2 ). Además, los programadores que lo deseen
pueden incorporar sus propios programas enriqueciendo el sistema, de forma
que hoy en dı́a (24jul2016) disponemos de 8 815 paquetes o colecciones de fun-
ciones3 de gran utilidad en la epidemiologı́a, estadı́stica espacial, análisis de
genes, etc.
R es un lenguaje de programación de ordenadores dotado de un número
elevadı́simo de funciones matemáticas y estadı́sticas y, sobre todo, gráficas. El
hecho de estar basado en un lenguaje formal de ordenadores es lo que le da su
tremenda flexibilidad y aunque otros sistemas presentan interfaces más sim-
ples (menús desplegables), en el futuro esta amigabilidad se convierte en un
estorbo; y como bien dice Dalgaard [95], la flexibilidad de R es algo deseable4 .
R sirve para aprender estadı́stica, para enseñarla y para investigar nuevas
técnicas estadı́sticas. Un buen modelo de aprendizaje de estadı́stica es poder
separar las ideas y conceptos del estudiante de los datos estadı́sticos. Es desea-
ble que el estudiante solicite un análisis, examine el resultado y pueda modifi-
car lo solicitado. Este feedback de examinar los resultados intermedios fuerza al
estudiante a pensar en lo que está haciendo y en su utilidad [96].
Aunque inicialmente se diseñó para realizar computación cientı́fica y gráfi-
ca, hoy en dı́a se utiliza para casi todo (proyecciones en mapas, resolver su-
dokus, crear colores, trabajar con imágenes, resolver ecuaciones diferenciales,
procesar datos del genoma, etc.) Actualmente R se ha convertido en la ((lingua
franca)) de la computación estadı́stica [97].
El investigador sanitario debe aprender a utilizar R, porque supera a los
2 http://cran.r-project.org/
3 packages
en la terminologı́a de R.
4 ((Althoughelementary statistics is often presented as a collection of fixed procedures, analysis of mo-
derately complex data requires ad hoc statistical model building, which makes the added flexibility of R
highly desirable)) Palabras de este autor, uno de los componentes del núcleo duro de R, en su libro
((Introductory Statistics with R))
www.editorialuc.es
Según Gentelman, uno de los padres de R, hay muy buenas razones para
preferir R sobre otros lenguajes, fundamentalmente por sus buenos algoritmos
estadı́sticos, la alta calidad de sus rutinas numéricas, la excelente integración
con herramientas de visualización de datos, la reproducibilidad y, sobre todo,
su gran capacidad de interactuar con otros lenguajes y de crear nuevas estruc-
turas de datos [94, 100].
Actualmente, R es el programa estadı́stico más utilizado en el mundo acadé-
mico y tiene una documentación amplı́sima, por lo que representa una oportu-
nidad para el investigador novel.
Aspectos destacables de R
• Paquete ((Open source)). Gratis. Accesible libremente.
• Está basado en el lenguaje S.
• Es multiplataforma (Windows, Mac, Linux, iPhone, web, etc).
• Puede analizar cualquier tipo de datos.
• Es ampliable.
• Muchos de las funciones que ofrece en sus diferentes paquetes aún no
están disponibles en los programas estadı́sticos comerciales.
• Es un lenguaje fácil de aprender.
• Tiene muchas posibilidades y capacidad de manejo de datos.
• Gráficos de alta calidad y abundantes herramientas para su manejo.
• Colección de herramientas para análisis de datos y estadı́stica muy ex-
tensa y coherente.
• Adecuado para modelos estadı́sticos lineales y no-lineales.
• Gran utilidad en bioinformática, proteómica y áreas afines que tienen
sus propios requerimientos de biocomputación [94, 105–109].
• Poderosas herramientas para procesar datos de microarrays [110–112].
• Sistema utilizado por los estadı́sticos para probar nuevos modelos de
investigación de la propia estadı́stica.
• Permite a los usuarios noveles crear sus propias funciones, etc.
• Aceptado por la FDA para análisis de ensayos clı́nicos [113].
2.3. Obtención de R
Vaya a la página web http://cran.r-project.org/ donde encontrará
que puede descargarse el programa de instalación en Linux, (Mac) OS X y Win-
dows (Figura 2.3). Seleccione la opción deseada y tras unos cuantos segundos
habrá descargado el ejecutable correspondiente.
2.4.1. Instalación de R
La instalación de R es muy sencilla y no presenta ninguna dificultad. Sim-
plemente vaya al directorio donde guardó el fichero que descargó, localı́celo
y pulse dos veces rápidamente con el ratón (botón izquierdo) y comenzará a
ejecutarse el programa de instalación.
2.4.2. Arranque de R
Una vez instalado, en el escritorio aparece su icono que al clicar en él arran-
ca el programa. En la pantalla aparece un texto que conviene leer (Figura 2.4), al
menos la primera vez, que le informa de la versión que está utilizando y le pro-
pone el uso de algunas funciones: license(), licence(), contributors(),
citation(), demo(), help(), help.start() que le aconsejo que explore.
www.editorialuc.es
Figura 2.4: Pantalla inicial tras arrancar R.
En primer lugar, borre la consola para dejarla en blanco (Figura 2.5). Esto se
hace desde el menú principal > Edit > Clear Console.
Figura 2.5: Pantalla ((en blanco)) preparada para empezar a trabajar con R.
Una vez llegados a este punto, ¡empiezan los problemas! para algunos usua-
rios: solo hay una pantalla en blanco con el prompt >, el indicador de dónde se
puede empezar a escribir algo. Los usuarios que vienen de otros programas con
menús desplegables, ventanas y más ventanas, echan en falta todas las pruebas
que pueden hacer con R. No se desespere, y comience a explorar algunas de
las funciones propuestas en la página inicial tras arrancar R.
> license()
@Manual{,
title = {R: A Language and Environment for Statistical Computing},
author = {{R Core Team}},
organization = {R Foundation for Statistical Computing},
address = {Vienna, Austria},
year = {2016},
url = {https://www.R-project.org/},
}
www.editorialuc.es
> # Se crean los tres primeros objetos
> objeto1 <- date() # tipo fecha
> objeto2 <- ’Mi primer encuentro con R’ # tipo cadena
> objeto3 <- TRUE # tipo lógico
Para salir del programa [117] se puede cerrar clicando en el botón [X] de la
esquina superior derecha, o ejecutando la función quit() o la más sencilla e
idéntica q(). Ambas originan una ventana de diálogo para confirmar lo que
queremos hacer. Sin contesta afirmativamente, o teclea q(’yes’), el programa
antes de salir genera dos ficheros en su directorio de trabajo: (1) .Rhistory
con todo lo que haya tecleado en la consola de R y (2) .Rdata con todos los
objetos del área de trabajo.
Con la función save.image() podrı́a haber realizado lo mismo.
#---------------------------------------------------------------
save.image(file = ".RData", version = NULL, ascii = FALSE,
compress = !ascii, safe = TRUE)
#---------------------------------------------------------------
#---------------------------------------------------------------
ls(name, pos = -1L, envir = as.environment(pos),
all.names = FALSE, pattern, sorted = TRUE)
#---------------------------------------------------------------
> ls()
[1] "objeto1" "objeto2" "objeto3"
Función Acción
Información sobre cómo citar
citation()
contributors() Autorı́a de un paquete
date() fecha actual
demo() Para ejecutar una demostración
Continúa en la página siguiente...
5 No se preocupe por no conocer aún qué es un objeto en R, en los próximos capı́tulos lo enten-
derá perfectamente.
Función Acción
hepl() Ayuda
help.start() Ayuda
licence() Licencia
license() Licencia
load() Lee el fichero ((Nombre.RData)) con datos graba-
dos previamente
ls() Listar objetos existentes en el área de trabajo
quit() Cerrar el programa
q() Cerrar el programa
save.image() Guardar los objetos del área de trabajo
search() Contenido en el entorno de trabajo (bases de datos,
listas o paquetes que se han sido conectados)
PROBLEMAS
Problema 1. Más que un problema, en este tema se le propone la siguiente tarea:
Instale en su ordenador personal de casa o del trabajo el programa R, ábrale (para
comprobar que está bien instalado) y ciérrele.
Problema 2. Compruebe que en su directorio de trabajo tiene dos ficheros: .Rhistory
y .Rdata.
Problema 3. Arranque R, vuelva a crear los tres objetos anteriores creados en esta
unidad y además creo otro objeto4 <- 4. Grábelo en un fichero con la función
save.image("MisDatos.RData"), salga de R y compruebe que en su directo-
rio de trabajo tiene un fichero llamado MisDatos.RData.
Problema 4. En una nueva sesión de R podrá leer estos datos almacenados en el
fichero MisDatos.RData con la función load("MisDatos.RData"). Hágalo
y compruebe que ahora tiene los cuatro objetos.
Problema 5. Compruebe que la fecha de su ordenador es la correcta.
Problema 6. ¿Qué versión de R tiene? (haga que aparezca en pantalla).
El entorno de programación
RStudio
25
Libros de Estadística en PDF | Statistics Books in PDF
26 CAPÍTULO 3. EL ENTORNO DE PROGRAMACIÓN RSTUDIO
Existen muchos IDE en el mercado: ESS, Eclipse, SciViews, JGR, TinnR, No-
tepad++, RGui. RStudio [118] es uno de los mejores [119], es gratis y se ac-
tualiza con frecuencia; por tanto, es el que vamos a utilizar en nuestro trabajo.
3.2. Instalación
3.2.1. Descarga
RStudio se descarga gratuitamente de su página web: http://www.rstudio.
org/download/. Para un usuario, hay que elegir la versión Desktop. Se des-
cargará un fichero que deberá ejecutar, aceptando las opciones que ofrece por
defecto y en unos minutos ya tiene RStudio en su ordenador.
Figura 3.1: Las tres ventanas del IDE cuando se entra por primera vez en RStudio .
www.editorialuc.es
El menú principal de RStudio ofrece muchas posibilidades (Figura 3.2)
Figura 3.3: Menú principal del IDE de RStudio con cuatro despliegues.
Figura 3.4: Menú principal del IDE de RStudio con cinco despliegues.
Es interesante que el lector explore el menú para irse haciendo una idea de
las importantes capacidades de RStudio (Figuras 3.3 y 3.4).
En cada uno de los menús desplegables encontrará opciones y también
combinaciones de teclas (((atajos))) que le permitirán sacar más provecho de to-
das las posibilidades que ofrece RStudio . También es importante que consulte
la página de ayuda https://support.rstudio.com/hc/en-us/categories/
200035113-Documentation de RStudio donde encontrará explicación a mu-
chas de las dudas que le puedan surgir mientras utiliza RStudio .
Figura 3.5: Las cuatro ventanas del IDE cuando se entra por segunda vez en
RStudio .
www.editorialuc.es
Completado automático (tab completion) de nombres de variables o de
funciones.
Un doble click en una función abre un visor con el código fuente en la ven-
tana ((Source)), como en la siguiente Figura 3.9.
Si el objeto es una base de datos (BdD) el browser la presenta en un formato
similar al de una hoja de cálculo para que pueda ser visualizada y editada
(Figura 3.10)
www.editorialuc.es
Esta ventana es más compleja, ya que está formada por varias pestañas:
Files. Esta pestaña permite ver el árbol de directorios y los ficheros que tene-
mos en nuestro directorio de trabajo (Figura 3.11).
Plots. En esta ventana se presentan los gráficos que se van generando durante
el trabajo estadı́stico (Figura 3.12).
www.editorialuc.es
cer un zoom y ası́ aparece en una ventana nueva el gráfico ((correcto)), ya
que el que aparece en la ventana ((Plots)) está adaptado a la configuración
de la ventana y la mayorı́a de las veces no es el adecuado. Se permiten
exportar los gráficos bajo diferentes formatos y, por supuesto, pulsando
es el pincel se puede borrar el gráfico.
Packages. En esta ventana se ven los paquetes que se tienen (Figura 3.13) ins-
talados, descargar e instalar más paquetes, actualizarlos, etc.
Esta es una ventana que debe conocer muy bien el usuario de RStudio ,
ya que en muchas ocasiones tendrá que instalar o actualizar paquetes.
3.4. Atajos
Facilita mucho la tarea de programación el uso de combinaciones de teclas
en vez del ratón (Tabla 3.1).
Rótulo1 Rótulo2
Ctrl + 1 Mueve el cursor a la ventana ((Source))
Ctrl + 2 Mueve el cursor a la ventana ((Console))
Ctrl + 3 Muestra el espacio de trabajo
Ctrl + 4 Muestra los datos
Ctrl + 5 Muestra el historial de comandos
Ctrl + 6 Muestra los ficheros
Ctrl + 7 Muestra los ((Plots))
Ctrl + 8 Muestra los paquetes
Ctrl + 9 Muestra la ayuda
Ctrl + L Borra y limpia ((Console))
Mediante el menú: Session > Set Working Directory > Choose Direc-
tory y ası́ aparece una ventana donde podemos seleccionar con el ratón
el directorio (carpeta o subcarpeta) de trabajo (Figura 3.15).
www.editorialuc.es
En la ventana ((Plots)), pestaña ((Files)), se selecciona en el árbol de direc-
torios, submenú ((More)), elegir ((Set As Working Directory)).
PROBLEMAS
Problema 1. Cree un directorio de trabajo en la carpeta ((Mis documentos)) con el
nombre ((Curso R)).
Problema 2. Abra RStudio y cree un fichero de código fuente ((Codigo fuente 1.R)).
Escriba unas lı́neas de comentario de cabecera de fichero. Escriba date(), ¿la fecha
que aparece en la ventana de la consola es la actual? Grabe este fichero de código.
Problema 3. Compruebe si aparece el fichero en la pestaña ((Files)) de la cuarta ven-
tana de RStudio .
Librerı́as en R
> search()
[1] ".GlobalEnv" "tools:rstudio" "package:stats"
[4] "package:graphics" "package:grDevices" "package:utils"
[7] "package:datasets" "package:methods" "Autoloads"
[10] "package:base"
37
Libros de Estadística en PDF | Statistics Books in PDF
38 CAPÍTULO 4. LIBRERÍAS EN R
Tabla 4.1: Paquetes instalados (en negrita los paquetes básicos y el resto son los reco-
mendados).
# Package Explanation
1 base The R Base Package
2 bitops Bitwise Operations
3 boot Bootstrap Functions (Originally by Angelo Canty for
S)
4 caTools Tools: moving window statistics, GIF, Base64, ROC
AUC, etc.
5 class Functions for Classification
6 cluster ”Finding Groups in Data”: Cluster Analysis Extended
Rousseeuw et al.
7 codetools Code Analysis Tools for R
9 compiler The R Compiler Package
10 datasets The R Datasets Package
11 foreign Read Data Stored by Minitab, S, SAS, SPSS, Stata, Sys-
tat, Weka, ...
12 dBase
13 graphics The R Graphics Package
14 grDevices The R Graphics Devices and Support for Colours
and Fonts
15 grid The Grid Graphics Package
16 gtools Various R Programming Tools
17 KernSmooth Functions for Kernel Smoothing Supporting Wand &
Jones (1995)
18 lattice Trellis Graphics for R
19 MASS Support Functions and Datasets for Venables and Ri-
pley’s MASS
20 Matrix Sparse and Dense Matrix Classes and Methods
21 methods Formal Methods and Classes
22 mgcv Mixed GAM Computation Vehicle with
GCV/AIC/REML Smoothness Estimation
23 nlme Linear and Nonlinear Mixed Effects Models
24 nnet Feed-Forward Neural Networks and Multinomial
Log-Linear Models
25 parallel Support for Parallel computation in R
26 rpart Recursive Partitioning and Regression Trees
27 spatial Functions for Kriging and Point Pattern Analysis
28 splines Regression Spline Functions and Classes
29 stats The R Stats Package
30 stats4 Statistical Functions using S4 Classes
31 survival Survival Analysis
32 tcltk Tcl/Tk Interface
33 tools Tools for Package Development
34 utils The R Utils Package
www.editorialuc.es
Figura 4.1: Paquetes instalados.
#---------------------------------------------------------------
packageDescription(pkg, lib.loc = NULL, fields = NULL,
drop = TRUE, encoding = "")
#---------------------------------------------------------------
> packageDescription(’Hmisc’)
Package: Hmisc
Version: 3.17-4
Date: 2016-05-02
Title: Harrell Miscellaneous
Author: Frank E Harrell Jr <f.harrell@vanderbilt.edu>,
with contributions from Charles Dupont and many
others.
Maintainer: Frank E Harrell Jr <f.harrell@vanderbilt.edu>
Depends: lattice, survival (>= 2.37-6), Formula, ggplot2
(>= 2.0)
Imports: methods, latticeExtra, cluster, rpart, nnet,
acepack, foreign, gtable, grid, gridExtra,
data.table
Suggests: chron, rms, mice, tables, knitr, ff, ffbase,
htmltools
Description: Contains many functions useful for data
analysis, high-level graphics, utility operations,
functions for computing sample size and power,
importing and annotating datasets, imputing missing
values, advanced table making, variable clustering,
character string manipulation, conversion of R
objects to LaTeX code, and recoding variables.
License: GPL (>= 2)
LazyLoad: Yes
URL: http://biostat.mc.vanderbilt.edu/Hmisc,
https://github.com/harrelfe/Hmisc
www.editorialuc.es
NeedsCompilation: yes
Packaged: 2016-05-02 14:10:51 UTC; harrelfe
Repository: CRAN
Date/Publication: 2016-05-02 17:28:19
Built: R 3.3.0; x86_64-apple-darwin13.4.0; 2016-05-05
16:21:13 UTC; unix
-- File: /Library/Frameworks/R.framework/Versions/3.3/Resources/l
ibrary/Hmisc/Meta/package.rds
#---------------------------------------------------------------
data(..., list = character(0), package = NULL, lib.loc = NULL,
verbose = getOption("verbose"), envir = .GlobalEnv)
#---------------------------------------------------------------
> data(package=’Hmisc’)
no data sets found
#---------------------------------------------------------------
help(topic, package = NULL, lib.loc = NULL,
verbose = getOption("verbose"),
try.all.packages = getOption("help.try.all.packages"),
help_type = getOption("help_type"))
#---------------------------------------------------------------
www.editorialuc.es
Función Acción
available.packages() Lista de todos los paquetes disponibles
ci.pd() Intervalo de confianza de la diferencia de dos
prop. indep.
clogistic() Regresión logı́stica condicional
data() datasets existentes
help() Ayuda y contenido de paquetes
install.packages() Instalar un paquete
installed.packages() Paquetes instalados
library() Paquetes existentes
packageDescription() Descripción del contenido de un paquete
packageStatus() Información sobre paquetes instalados y en
repositorios
ROC() Curvas ROC
search() Paquetes y datasets en el entorno de trabajo
twoby2() Análisis epidemiológico de tablas 2x2
update.packages() Actualizar paquetes
PROBLEMAS
Problema 1. ¿Cuántos datasets contiene la librerı́a MASS?
Problema 2. ¿En qué paquete está la función pyramid()?
Problema 3. ¿Para qué sirve la función followup.plot()?
Problema 4. Instale el paquete epicalc.
Problema 5. ¿Cuántos datasets hay en el paquete epicalc?
Problema 6. ¿En qué paquete está la función DOTplot()?
Problema 7. ¿Cuántos paquetes tiene instalados en su ordenador?
Problema 8. ¿Cuántos paquetes más podrı́a instalar en su ordenador? (Nota: De-
pendiendo de los instalados, la respuesta de cada uno puede ser diferente)
Problema 9. ¿Quién mantiene el paquete MASS? ¿Quién es el autor del paquete
ggplot2?
Figura 4.4: Task Views de Clı́nicalTrials (se presenta las primeras filas...).
R calculadora cientı́fica
5.1. Introducción
Utilizar R como una calculadora solo tiene utilidad en contadas ocasiones,
por ejemplo, cuando se necesita realizar un cálculo rápido sin tener que cargar
un fichero de órdenes (script). En ese caso se utilizarán algunas de las múltiples
funciones matemáticas incorporadas en el sistema R. Ya pasó la época en que
la estadı́stica se hacı́a ayudados de una calculadora cientı́fica (Figura 5.1).
a OP ERADOR b (5.1)
16
Ejemplo 5.1. Calcular: 1 + 13, 16 − 7, 14,0056 × 3,25, 2 y 73 .
45
Libros de Estadística en PDF | Statistics Books in PDF
46 CAPÍTULO 5. R CALCULADORA CIENTÍFICA
Operador Función
+ Suma
− Resta
∗ Multiplicación
/ División
ˆ Potenciación
%% Módulo o resto de una división
%/ % Cociente entero de una división
> 1 + 13 # suma
[1] 14
> 16 - 7 # resta
[1] 9
> 14.0056 * 3.25 # multiplicación
[1] 45.5182
> 16 / 2 # división
[1] 8
> 7 ˆ 3 # potencia
[1] 343
Ejemplo 5.2. Calcule el IMC de un sujeto que pesa 78 kg y mide 173 cm.
Como el IMC es el cociente entre el peso (en kg) y el cuadrado de la talla
(en m), se teclean estos y se obtiene que el IMC es 26.06168 kg · m−2 .
Recordará que dividendo (D) partido por el divisor (d) es igual al cociente
(C) más el resto (R):
D
=C +R (5.2)
d
en R, el cociente (parte entera de la división) es C = D %/ % d y el resto
(módulo) es R = D % % d.
> 11 / 4 # división
[1] 2.75
> 11 %/% 4 # cociente (parte entera)
[1] 2
> 11 %% 4 # resto (módulo)
[1] 3
El cálculo del módulo tiene utilidad para saber si un número es par (módulo
0 al dividir el número por dos) o impar (módulo 1 al dividir por 2); también
para conocer si un número x es múltiplo de otro y, en cuyo caso el módulo
valdrá 0.
www.editorialuc.es
Sı́, puesto que el módulo al dividir 54967 entre 11 es 0.
5.3.1. De redondeo
Las funciones de redondeo se utilizan para quitar, total o parcialmente, los
decimales. Quedan recogidas en la Tabla 5.2.
El redondeo puede ser hacia el menor entero superior con ceiling(), ha-
cia el mayor entero inferior con floor(), ir eliminando decimales parcialmen-
te con round() o totalmente con trunc(). También se puede dejar un núme-
ro de cifras significativas con signif(). La que más utilizaremos, sin ninguna
duda, será la de redondeo.
> log(x)
[1] 2.034181
> sqrt(x)
[1] 2.765138
> exp(x)
[1] 2092.233
> abs(x)
[1] 7.645987
2 Mosteller publicó en 1987 otra fórmula más sencilla para calcular la superficie corporal (m2 )
www.editorialuc.es
Operador Función
abs(a) Calcula el valor absoluto de a
choose(n,a) Combinaciones de n elementos tomados de a en a
exp(a) Elevación del número e a una determinada potencia (a)
expm1(a) Calcula ea − 1 de forma segura cuando |a| 1
factorial(a) Calcula a!
gamma(a) Calcula Γa
lgamma(a) Logaritmo neperiano de Γa
log(a) Logaritmo neperiano de a
log(a, n) Logaritmo de a en base n
log10(a) Logaritmo decimal de a (son los logaritmos comunes)
log1p(a) Calcula de forma segura ln(1 + a) cuando |a| 1
log2(a) Logaritmo de a en base 2
rnorm(a) Genera a números aleatorios de una distribución nor-
mal
runif(a) Genera a números aleatorios entre 0 y 1 de una distri-
bución uniforme
sqrt(a) Raı́z cuadrada de a
Ejemplo 5.8. Calcule la superficie corporal de una mujer que pesa 57.3 kg y
mide 164.5 cm empleando la fórmula de Du Bois y Du Bois [141].
Ejemplo 5.9. Calcule ahora con la fórmula de Mosteller [142]. ¿Son los resul-
tados bastante parecidos?
5.3.3. Trigonométricas
Las funciones trigonométricas (Tabla 5.4) aplican una función a un valor
(ecuación 5.4). La función trigonométrica solo tiene un argumento:
Operador Función
sin(a) seno de a en radianes
cos(a) coseno de a en radianes
tan(a) tangente de a en radianes
asin(a) arco cuyo seno es a
acos(a) arco cuyo coseno es a
atan(a) arco cuya tangente es a
Ejemplo 5.10. Suponga que quiere calcular el ángulo de Cobb [143] en una
radiografı́a (ver Figura 5.2) y no tiene a mano un goniómetro o un transporta-
dor de ángulos, pero tras trazar las lı́neas del ángulo ((B)) y una perpendicular
a una de ellas, quiere calcular el ángulo de la escoliosis de la curva lumbar.
Primero mide la longitud de estas dos últimas (36 y 2.1 cm respectivamen-
te). Sabe que la tangente de un ángulo es el cociente entre el cateto opuesto y
el adyacente. Por lo tanto, calculando el arco tangente tendremos el ángulo en
radianes, que posteriormente convertiremos en grados y redondearemos a 0
decimales.
Función Acción
abs(a) Calcula el valor absoluto de a
acos(a) arco cuyo coseno es a
acosh(a) arco cuyo coseno hiperbólico es a
asin(a) arco cuyo seno es a
asinh(a) arco cuyo seno hiperbólico es a
atan(a) arco cuya tangente es a
atanh(a) arco cuya tangente hiperbólica es a
ceiling(a) Menor entero mayor que a
choose(n,a) Combinaciones de n elementos tomados de a en a
Continúa en la página siguiente...
Función Acción
cos(a) coseno de a en radianes
www.editorialuc.es
cosh(a) coseno hiperbólico de a
exp(a) Elevación del número e a una determinada potencia (a)
expm1(a) Calcula ea − 1 de forma segura cuando |a| 1
factorial(a) Calcula a!
floor(a) Mayor entero menor que a
gamma(a) Calcula Γa
lgamma(a) Logaritmo neperiano de Γa
log(a) Logaritmo neperiano de a
log(a, n) Logaritmo de a en base n
log10(a) Logaritmo decimal de a (son los logaritmos comunes)
log1p(a) Calcula de forma segura ln(1 + a) cuando |a| 1
log2(a) Logaritmo de a en base 2
rnorm(a) Genera a números aleatorios de una distribución normal
round(a, d) Redondea a con d decimales
runif(a) Genera a números aleatorios entre 0 y 1 de una distribu-
ción uniforme
signif(a, d) Presenta a con d dı́gitos en notación cientı́fica
sin(a) seno de a en radianes
sinh(a) seno hiperbólico de a
sqrt(a) Raı́z cuadrada de a
tan(a) tangente de a en radianes
tanh(a) tangente hiperbólica de a
trunc(a) Elimina los decimales de (a) hacia 0
PROBLEMAS
Problema 1. Según el Padrón Municipal (datos del INE), la cifra de población de
Cantabria referida al 1 de enero de 2015 era de 585 179, de los que 300 391 eran mu-
jeres. Se le pide que calcular el porcentaje de hombres, expresado con un decimal.
Problema 2. En un determinado servicio hospitalario compuesto por 9 facultativos
se realizan guardias de dos personas. ¿Cuántas combinaciones diferentes se pueden
formar?
Problema 3. En ese mismo servicio se quieren repartir 9 despachos entre sus facul-
tativos. ¿Cuántos repartos (ordenaciones) posibles se pueden efectuar?
Problema 4. Una mujer de 34 años mide 163 cm de altura y pesa 52 kg, ¿qué super-
ficie corporal (m2 ) tiene según la fórmula de Du Bois?
Problema 5. La mujer del problema anterior, ¿qué superficie corporal (m2 ) tiene
según la fórmula de Mosteller?
Problema 6. En una consulta antropométrica se mide el perı́metro del brazo de una
adolescente de 17 años, que mide 20.4 cm. ¿Cuánto mide el radio de su brazo?
El sistema de ayuda en R
53
Libros de Estadística en PDF | Statistics Books in PDF
54 CAPÍTULO 6. EL SISTEMA DE AYUDA EN R
#---------------------------------------------------------------
help.search(pattern, fields = c("alias", "concept", "title"),
apropos, keyword, whatis, ignore.case = TRUE,
package = NULL, lib.loc = NULL,
help.db = getOption("help.db"),
verbose = getOption("verbose"),
rebuild = FALSE, agrep = NULL, use_UTF8 = FALSE,
types = getOption("help.search.types"))
#---------------------------------------------------------------
www.editorialuc.es
MASS::loglm1 Fit Log-Linear Models by Iterative Proportional
Scaling -- Internal function
MASS::rlm Robust Fitting of Linear Models
MASS::stdres Extract Standardized Residuals from a Linear
Model
MASS::studres Extract Studentized Residuals from a Linear Model
MASS::summary.rlm Summary Method for Robust Linear Models
Matrix::lm.fit.sparse Fitter Function for Sparse Linear Models
mgcv::bam Generalized additive models for very large
datasets
mgcv::bam.update Update a strictly additive bam model for new
data.
mgcv::gam Generalized additive models with integrated
smoothness estimation
nlme::gls Fit Linear Model Using Generalized Least Squares
nlme::gnls Fit Nonlinear Model Using Generalized Least
Squares
nlme::recalc Recalculate Condensed Linear Model Object
nnet::multinom Fit Multinomial Log-linear Models
stats::anova.glm Analysis of Deviance for Generalized Linear Model
Fits
stats::anova.lm ANOVA for Linear Model Fits
stats::anova.mlm Comparisons between Multivariate Linear Models
stats::glm Fitting Generalized Linear Models
stats::family.glm Accessing Generalized Linear Model Fits
stats::lm Fitting Linear Models
stats::family.lm Accessing Linear Model Fits
stats::lm.fit Fitter Functions for Linear Models
stats::loglin Fitting Log-Linear Models
stats::predict.lm Predict method for Linear Model Fits
stats::selfStart Construct Self-starting Nonlinear Models
stats::summary.glm Summarizing Generalized Linear Model Fits
stats::summary.lm Summarizing Linear Model Fits
#---------------------------------------------------------------
apropos(what, where = FALSE, ignore.case = TRUE, mode = "any")
> apropos(’wilcox’)
[1] "dwilcox" "pairwise.wilcox.test"
[3] "pwilcox" "qwilcox"
[5] "rwilcox" "wilcox.test"
#---------------------------------------------------------------
example(topic, package = NULL, lib.loc = NULL,
character.only = FALSE, give.lines = FALSE, local = FALSE,
echo = TRUE, verbose = getOption("verbose"),
www.editorialuc.es
run.dontrun = FALSE, run.donttest = interactive())
#---------------------------------------------------------------
> example(mean)
#---------------------------------------------------------------
find(what, mode = "any", numeric = FALSE, simple.words = TRUE)
apropos(what, where = FALSE, ignore.case = TRUE, mode = "any")
#---------------------------------------------------------------
> find(’summ’)
[1] "package:epicalc"
#---------------------------------------------------------------
demo(topic, package = NULL, lib.loc = NULL,
character.only = FALSE, verbose = getOption("verbose"),
echo = TRUE, ask = getOption("demo.ask"),
encoding = getOption("encoding"))
#---------------------------------------------------------------
www.editorialuc.es
Figura 6.6: Primera página de la viñeta rotated del paquete grid.
#---------------------------------------------------------------
history(max.show = 25, reverse = FALSE, pattern, ...)
#---------------------------------------------------------------
Función Acción
? Ayuda sobre una función (ejemplo, ?mean
apropos() Ayuda sobre todo lo relacionado con ’cadena’
demo() Demostración de alguna caracterı́stica implementada
Continúa en la página siguiente...
Función Acción
example() Ejemplos de trabajo de una función
find() Presenta en qué paquete está una determinada función
help() Ayuda sobre un objeto o función
help.search() Buscar ayuda sobre un objeto o función
help.start() Ayuda en internet
history() Comandos tecleados
local() Evalúa una expresión en un entorno de R
summ() Estadı́stica descriptiva de una variable
vignette() Viñetas de ayuda (si existen)
PROBLEMAS
Problema 1. Ejecute example(binconf).
Problema 2. Ejecute example(barplot) y vaya pulsando con el ratón en la
ventana gráfica conforme se lo solicite R˙
Problema 3. Hojee la viñeta Follow-up del paquete Epi.
Problema 4. En qué paquete se encuentra la función use?
Problema 5. ¿Existe alguna viñeta sobre una introducción a las matrices?
Problema 6. Encuentre un manual sobre Sweave.
Problema 7. ¿Qué argumentos tiene la función xyplot()?
Problema 8. ¿Qué devuelve la función lm()?
Problema 9. ¿Qué parámetros necesita la función chis.test()?
Problema 10. ¿Qué significa na.rm = TRUE en la función mean()?
EL LENGUAJE R
Guı́a de estilo en R
7.1. Nombres
Los nombres de los objetos tienen mucha importancia en R, por lo que se
deberán aplicar las siguientes reglas.
7.1.1. Ficheros
Los nombres de los ficheros deben ser autoexplicativos, es decir, que de-
ben indicar qué hacen.
BIEN: Lectura_datos.R
LecturaDatos.R
El nombre debe estar formado por una única cadena: si están formados
por varias palabras, únalas con un signo de subrayado (( )) o use la nota-
ción húngara.
BIEN: Lectura_datos.R
LecturaDatos.R
63
Libros de Estadística en PDF | Statistics Books in PDF
64 CAPÍTULO 7. GUÍA DE ESTILO EN R
BIEN: Lectura_datos.R
a1_LecturaDatos.R
a2_Depuracion.R
BIEN: Lectura_datos.R
BIEN: Depuración.R
7.1.2. Objetos
Los nombres deben ser informativos1 [150] y concisos.
Los nombres para variables deben ser sustantivos y para las funciones
deben ser verbos.
Los nombres de las variables deben ir en minúsculas. Se pueden unir
varias palabras con el signo del subrayado (( )) o con notación húngara.
Es aconsejable usar (( )) para separación de palabras
Los nombres de las variables no deben llevar ((.))
Conviene evitar los nombres de las funciones y palabras reservadas de R.
7.2. Sintaxis
Todo operador debe ir rodeado por un espacio delante y otro detrás, ex-
cepto los operadores ((:)), ((::)), ((:::))
BIEN: a <- 7
epicalc::des()
1 Según Jones et al. ((A good programming practice is to use informative names for your varia-
www.editorialuc.es
BIEN: mean(x, na.rm = TRUE)
Una llave de apertura no debe estar sola en una lı́nea, mientras que una
llave de cierre sı́.
PERMITIDO: a <- 7
a2 <- 5
Use nombres largos para variables que se usan rara vez y nombres cortos
para las que se usan con frecuencia.
7.4. Documentación
Documente siempre su código. Lo que ahora le parece evidente, pasados
unos meses puede que no lo entienda.
¡Documente!
#==============================================#
# Fichero....: sb_01.R #
# Creado el..: 06jun2016 #
# Actualizado: 06jun2016 #
# Contenido..: Script del tema Tb01.tex #
# Autor......: Carlos G. Redondo Figuero #
#----------------------------------------------#
# Guı́a de estilo en R #
#==============================================#
PROBLEMAS
Problema 1. Documente la función anterior que en el apartado ((Documentación)) se
ha catalogado como ((MAL)).
Problema 2. ¿El código de la función shapiro.test() respeta al 100 % lo reco-
mendado en este capı́tulo?
8.1. Comandos
Los comandos son la órdenes que se dan a R para que las ejecute1 .
Los comandos comienzan desde donde se empiezan a escribir (generalmen-
te al comienzo de la lı́nea, aunque los espacios en blanco que haya a su izquier-
da o ((sangrado)) no se tiene en consideración, por lo que se utilizan para hacer
más elegante la escritura del código) y acaban al final de una lı́nea o al encon-
trar una almohadilla #. Por eso ésta se utiliza para incluir comentarios en el
código que el compilador no tendrá en cuenta.
Los comandos están separados unos de otros por un punto y coma ; (se-
micolon) o por una nueva lı́nea. Esta segunda opción es más elegante ya que
ayuda a leer mejor el código.
> sum(12, 13
+ )
[1] 25
Por supuesto, cuando copie el código de los ejemplos de este libro no de-
berá teclear los signos ((>)) ni ((+)).
67
Libros de Estadística en PDF | Statistics Books in PDF
68 CAPÍTULO 8. SINTAXIS DEL LENGUAJE R
8.1.1. Expresiones
Un comando de expresión es una orden que se da a R para que la evalúe, la
ejecute y la imprima. Con una expresión siempre se obtiene un resultado.
> 7 + exp(2.35)
[1] 17.48557
> 2 * pi * 7
[1] 43.9823
8.1.2. Asignaciones
Un comando de asignación, que utiliza el operador <- (assignment operator),
es una orden que se da a R para evaluar una expresión y pasar su valor a una
variable, pero no la imprime. Por ejemplo:
> x <- 2
Para que el código sea más legible se aconseja dejar un espacio antes y des-
pués del operador de asignación. No puede haber ningún espacio entre el signo
((menor)) y el signo ((menos)).
www.editorialuc.es
También se pueden agrupar varios comandos en una única expresión den-
tro de dos llaves {...}. El valor de esta expresión es el valor del último co-
mando (por tanto, los cálculos intermedios se pierden) [151].
> x <- {13; sqrt(49); log10(100); 15}
> x
[1] 15
Otro comando que puede ser útil en alguna ocasión es el que permite recu-
perar el último valor de una expresión: tecleando ((.Last.value)) se obtiene
el valor de la expresi√ón evaluada en último lugar. Supongamos que hemos
calculado 7 + e1,45 + 3 245,36 sin asignarlo a ninguna variable, pero luego que-
remos asignarle a la variable ((a)) sin tener que volver a teclearlo. Lo harı́amos
ası́:
> 7 + exp(1.45) + 245.36ˆ(1/3) # cálculo sin asignación
[1] 17.52350
> a <- .Last.value # asignación a la variable a
> a # se imprime el valor de a
[1] 17.52350
8.2. Operadores
Un operador es una función (aunque no lo parezca) que realiza una opera-
ción sobre uno o más objetos. Por ejemplo el operador + aplicado a un vector
suma los elementos que están en la misma posición: el primer elemento de un
vector con el primero del otro, el segundo con el segundo, etc.
En el capı́tulo ((R Calculadora Cientı́fica)) se vieron los operadores básicos
(+, -, *, /, ˆ, % % y %/ %). Hay algunos: :, >, <, <=, >=, ==, !=, &, |, &&, ||, ˜,
<-, ->, =. Cuando en una expresión hay varios, unos tienen mayor preceden-
cia o importancia que otros y se ejecutan antes. Cuando hay dudas es mejor
separarlos con paréntesis.
> 2 + 5 ˆ 2
[1] 27
> (2 + 5) ˆ 2
[1] 49
Operador Realiza
(, { Paréntesis y llaves
[, [[ Para extracción de vectores y de listas
::, ::: acceso a espacios nominados
$, @ Para extracción de listas y slots
ˆ Elevación a potencias
+, - Signo más y signo menos
: Generación de secuencias
% %, %/ %, %* % Otros operadores especiales
*, / Multiplicación y división
+, -, ? Suma, resta y documentación
<, >, <=, >=, ==, != Operadores de comparación
! Negación lógica
&, |, &&, || Operadores lógicos
˜ Fórmulas
<-, ->, = Asignación
Los operadores del tipo %any % pertenecen al lenguaje R, pero pueden de-
finirse algunos por el propio usuario; por ejemplo:
8.3. Funciones
www.editorialuc.es
Todo en R son funciones. Una función es como una caja negra: admite unos
parámetros como entrada llamados argumentos (agruments), trabaja con ellos
en su interior y luego ofrece unos resultados como salida (output function). En
R, todo el trabajo se hace con funciones [145].
La funciones permiten una programación modular [153], ya que los usua-
rios interactúan con el software por medio de las funciones. su sintaxis es:
f <- function(...) {
trabajo interno
salida
}
#---------------------------------------------------------------
var(x, y = NULL, na.rm = FALSE, use)
#---------------------------------------------------------------
Función Acción
c() Concetena elementos en un vector
exp() Número e elevado a un exponente
function() Crea una función
invisible() Hace invisible la salida de una función
is.na() Comprueba si es NA
length() Longitud de un objeto
log10() Logaritmo en base decimal
mean() Media de un vector
print() Imprime en la consola
return() Salida de una función
rnorm() Crea un vector de números aleatorios normales
sample() Extracción aleatoria
sd() Calcula la desviación estándar de un vector
set.seed() Fija la semilla de aleatorización
show() Imprime en la consola
sqrt() Calcula la raı́z cuadrada de los elementos de un vector
sum() Calcula la suma de los elementos de un vector
var() Calcula la varianza de un vector
varianza() Calcula la varianza de un vector
xor() OR exclusivo
> mean(z)
[1] 11
www.editorialuc.es
> MEAN(z)
Error: no se pudo encontrar la función "MEAN"
> MEAN <- mean
> MEAN(z)
[1] 11
PROBLEMAS
OR
Value NA FALSE TRUE
NA ? ? ?
FALSE ? ? ?
TRUE ? ? ?
XOR
Value NA FALSE TRUE
NA ? ? ?
FALSE ? ? ?
TRUE ? ? ?
AND
Value NA FALSE TRUE
NA ? ? ?
FALSE ? ? ?
TRUE ? ? ?
Problema 11. Programer la función trig() que admita como parámetros los gra-
dos sexagesimales y devuelva un vector de tres cifras numéricas correspondientes al
seno, coseno y tangente de un ángulo. Compruebe que da la siguiente salida.
> trig(87)
seno coseno tangente
0.99862953 0.05233596 19.08113669
Objetos
9.1. Nombre
Los objetos en R pueden ser nombrados por palabras formadas por: (1) le-
tras (mayúsculas, minúsculas e incluso acentuadas), (2) dı́gitos del 0 al 9 (pero
no en posición inicial), (3) el . que se suele utilizar para separar palabras com-
puestas, pero que no debiera estar en posición inicial ya que las variables que
comienzan con un . suelen ser palabras utilizadas internamente en el progra-
ma, y (4) el signo de subrayado se puede utilizar para separar palabras.
No se permiten espacios en blanco entre palabras, pues se considerarı́an
como varios objetos, de forma que para formar una palabra compuesta se pue-
den intercalar puntos o el guión-bajo entre las palabras o ponerlas juntas con
la primera letra en mayúscula, conocida como ((notación húngara)), que es un
sistema usado normalmente para crear los nombres de variables en lenguajes
de programación. El nombre de la notación proviene de su inventor, el húnga-
ro Charles Simonyi (Figura 9.1) [163]. Éste se hizo multimillonario por ser el
creador de la suite ofimática Office de Microsoft.
Son correctas:
1 ((Everything
within the S language is an object, even the functions and operators)) [151].
el propio Chambers: ((To understand computations in R, two slogans are helpful: (1)
2 Según
Everything that exists is an object. (2) Everything that happens is a function call)). [162]
75
Libros de Estadística en PDF | Statistics Books in PDF
76 CAPÍTULO 9. OBJETOS
Son incorrectas:
www.editorialuc.es
evitar porque tienen un significado especial en R (Tabla 9.1, lado derecho) y
pueden causar problemas difı́ciles de detectar [102].
Tabla 9.1: Palabras reservadas que no deben utilizarse para nombrar objetos y palabras
que den evitarse
9.2. Memoria
Cuando arranca R se crea un espacio de trabajo donde el usuario crea y
manipula variables [94]. Todos los objetos que usa R están en la memoria, en
un marco determinado (environment) en el que se pueden crear, salvar o borrar.
Hay un entorno llamado ((workspace)) donde están los objetos con los que se
puede trabajar (variables, bases de datos, funciones creadas por el usuario)3 .
En la Tabla 9.2 se presentan las funciones relacionadas.
Funciones Significado
ls() Lista los objetos del entorno de trabajo
objects() Idem
rm() Remueve los objetos del entorno de trabajo
remove() Idem
#---------------------------------------------------------------
ls(name, pos = -1L, envir = as.environment(pos),
all.names = FALSE, pattern, sorted = TRUE)
objects(name, pos= -1L, envir = as.environment(pos),
all.names = FALSE, pattern, sorted = TRUE)
#---------------------------------------------------------------
3 Según Robert Gentelman, uno de los padres de R, ((An environment is a set of bindings of names, or
symbols, to values. The top-level workspace can be accessed through its name, which is .GlobalEnv [94].))
La función ls() lista todos los objetos que hay en el entorno, excepto los
que comienzan por un punto.
Ejemplo 9.1. Liste los objetos que tiene en memoria (puede ser que no le
aparezca ninguno si no ha creado ninguno).
> ls()
character(0)
Ejemplo 9.2. Cree un objeto x que contenga los 100 primeros números natu-
rales. Lı́stelo, bórrelo y compruebe que ya no existe.
> library(epicalc)
> ls(2)
[1] "addMissingRecords" "adjust"
[3] "aggregate.numeric" "aggregate.plot"
[5] "alpha" "alphaBest"
[7] "auc" "be2ad"
[9] "cc" "cci"
[11] "ci" "ci.binomial"
[13] "ci.default" "ci.numeric"
[15] "ci.poisson" "clogistic.display"
[17] "codebook" "cox.display"
[19] "cs" "csi"
[21] "des" "detachAllData"
[23] "dotplot" "expand"
[25] "fillin" "followup.plot"
[27] "graph.casecontrol" "graph.prospective"
[29] "idr.display" "kap"
[31] "kap.2.raters" "kap.ByCategory"
[33] "kap.default" "kap.m.raters"
[35] "kap.table" "keepData"
[37] "label.var" "labelTable"
[39] "lagVar" "logistic.display"
[41] "lookup" "lroc"
[43] "lrtest" "lsNoFunction"
www.editorialuc.es
[49] "mhor" "mlogit.display"
[51] "n.for.2means" "n.for.2p"
[53] "n.for.cluster.2means" "n.for.cluster.2p"
[55] "n.for.equi.2p" "n.for.lqas"
[57] "n.for.noninferior.2p" "n.for.survey"
[59] "ordinal.or.display" "pack"
[61] "poisgof" "power.for.2means"
[63] "power.for.2p" "print.alpha"
[65] "print.cci" "print.des"
[67] "print.display" "print.kap.ByCategory"
[69] "print.kap.table" "print.lrtest"
[71] "print.n.for.2means" "print.n.for.2p"
[73] "print.n.for.cluster.2means" "print.n.for.cluster.2p"
[75] "print.n.for.equi.2p" "print.n.for.lqas"
[77] "print.n.for.noninferior.2p" "print.n.for.survey"
[79] "print.power.for.2means" "print.power.for.2p"
[81] "print.summ" "print.tab1"
[83] "print.tableStack" "pyramid"
[85] "recode" "recode.default"
[87] "recode.is.na" "regress.display"
[89] "ren" "rename"
[91] "rename.default" "rename.pattern"
[93] "rename.var" "roc.from.table"
[95] "setTitle" "shapiro.qqnorm"
[97] "sortBy" "summ"
[99] "tab1" "tableGlm"
[101] "tableStack" "tabpct"
[103] "tally.events" "titleString"
[105] "unclassDataframe" "use"
[107] "zap"
9.3. Propiedades
Cualquier cosa en R es un objeto, incluso las funciones y los operadores
[151]. Las distintas funciones que se pueden utilizar en relación con los obje-
tos quedan recogidas en la Tabla 9.3, y nos permiten explorar las diferentes
caracterı́sticas de los objetos.
Para explorar las diferentes propiedades de los objetos vamos a declarar
cuatro objetos:
9.3.1. Atributos
La función attributes() informa de los atributos del objeto (cuando los
tiene, de lo contrario su resultado es NULL. La función attr() permite acceder
a un determinado atributo. Se pueden declarar atributos para cualquier objeto.
Funciones Significado
attr() permite cambiar un atributo
attributes() atributos
class() clase del objeto
dim() dimensiones
length() longitud del objeto (número de componentes)
mode() modo de almacenamiento del objeto
names() nombres de los componentes
str() estructura resumida del objeto
structure() estructura amplia del objeto
storage.mode() modo de almacenamiento
typeof() tipo de objeto
Los atributos se almacenan en una lista según sus nombres. Son muy utilizados
por los programadores.
#---------------------------------------------------------------
attributes(obj)
attributes(obj) <- value
#---------------------------------------------------------------
$longitud
[1] 4
$almacena
[1] "probabilidades"
www.editorialuc.es
[1] "vector numérico"
attr(,"longitud")
[1] 4
attr(,"almacena")
[1] "probabilidades"
attr(,"probabilidades")
[1] "prob."
9.3.2. Clase
La función class() informa de qué clase es el objeto. También permite
asignar una clase.
#---------------------------------------------------------------
class(x)
class(x) <- value
#---------------------------------------------------------------
#---------------------------------------------------------------
dim(x)
dim(x) <- value
length(x)
length(x) <- value
#---------------------------------------------------------------
Ejemplo 9.8. Confirme que el objeto w es una matriz. Cambie sus dimensio-
nes a c(2, 2, 3 y compruebe si es de la misma clase.
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 11 13
[2,] 12 14
, , 3
[,1] [,2]
[1,] 21 23
[2,] 22 24
9.3.4. Nombres
La función names() presenta el nombre de cada uno de los elementos del
objeto (si los tiene). También sirve para asignar nombres.
#---------------------------------------------------------------
names(x)
names(x) <- value
#---------------------------------------------------------------
www.editorialuc.es
> n <- 23 # casos
> c(n, m, s) # presentación sin nombres
[1] 23.00 2.78 0.56
> c(N = n, media = m, DE = s) # presentación con nombres
N media DE
23.00 2.78 0.56
> rm(m, n, s) # se borran
9.3.5. Tipo
La función typeof() devuelve una cadena de caracteres entrecomillada
con el tipo de un objeto, cuyos posibles valores se detallan en la Tabla 9.4.
#---------------------------------------------------------------
typeof(x)
#---------------------------------------------------------------
> typeof(x)
[1] "double"
> typeof(y)
[1] "character"
> typeof(z)
[1] "logical"
> typeof(w)
[1] "integer"
> mode(x)
[1] "numeric"
> mode(y)
[1] "character"
> mode(z)
[1] "logical"
> mode(w)
[1] "numeric"
Tipos Significado
NULL un objeto nulo
symbol un nombre de una variable
pairlist un objeto pairlist
closure una función
environment un entorno de trabajo
promise un objeto usado para implementar la evaluación lazy
language un constructor de lenguaje RR
special una función interna que no evalúa sus argumentos
builtin una función interna que evalúa sus argumentos
char una cadena de caracteres
logical un vector de valores lógicos
integer un vector de enteros
double un vector de números reales
complex un vector de números complejos
character un vector de caracteres
... un argumento especial de longitud variable
any cualquier tipo
expression un objeto expresión
list una lista
bytecode un código bit (uso interno)
externalptr un puntero externo
weakref un objeto de referencia weak
raw un vector que contiene bytes
S4 un objeto S4
9.3.7. Estructura
La función str() da información sobre la estructura del objeto, de una for-
www.editorialuc.es
ma resumida. Esta es una de las funciones que se utilizan con más frecuencia.
#---------------------------------------------------------------
str(object, max.level = NA,
vec.len = strO$vec.len, digits.d = strO$digits.d,
nchar.max = 128, give.attr = TRUE,
give.head = TRUE, give.length = give.head,
width = getOption("width"), nest.lev = 0,
indent.str = paste(rep.int(" ", max(0, nest.lev + 1)),
collapse = ".."),
comp.str = "$ ", no.list = FALSE, envir = baseenv(),
strict.width = strO$strict.width,
formatNum = strO$formatNum, list.len = 99, ...)
#---------------------------------------------------------------
> str(x)
Named num [1:4] 0.1 0.2 0.3 0.4
- attr(*, "names")= chr [1:4] "A" "B" "C" "D"
> str(y)
chr "Marı́a"
> str(z)
logi [1:3] TRUE TRUE FALSE
> str(w)
int [1:2, 1:2, 1:3] 1 2 3 4 11 12 13 14 21 22 ...
#---------------------------------------------------------------
structure(.Data, ...)
#---------------------------------------------------------------
> structure(x)
A B C D
0.1 0.2 0.3 0.4
> structure(y)
[1] "Marı́a"
> structure(z)
[1] TRUE TRUE FALSE
> structure(w)
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 11 13
[2,] 12 14
, , 3
[,1] [,2]
[1,] 21 23
[2,] 22 24
> ls()
[1] "w" "x" "y" "z"
9.4.1. Creación
Los objetos se crean en memoria cuando se les asigna algo (por ejemplo,
a <- 22, crea un objeto llamado a que contiene el valor 22) o simplemen-
te declarando su tipo, aunque no contenga ningún valor (por ejemplo, b <-
numeric()).
9.4.2. Coerción
En algunas ocasiones interesa que un objeto de un determinado tipo cambie
a otro tipo diferente (coercion). Esto se logra con las funciones que se presentan
en la Tabla 9.5, unas sirven para hacer el cambio, y otras para comprobar que
el tipo es el adecuado.
Para ver todas las funciones is.* o as* existentes en el paquete base se
debe utilizar la función ls()
Ejemplo 9.16. Liste todas las funciones ((is.*)) existentes en el paquete base.
Tabla 9.5: Funciones que permiten comprobar (is.xxx) o cambiar (as.xxx) los atributos
de diferentes categorı́as de objetos
www.editorialuc.es
Tipo Comprobación Cambio
Array is.array() as.array()
Character is.character() as.character()
Complex is.complex() as.complex()
Dataframe is.data.frame() as.data.frame()
Double is.double() as.double()
Factor is.factor() as.factor()
List is.list() as.list()
Logical is.logical() as.logical()
Matrix is.matrix() as.matrix()
Numeric is.numeric() as.numeric()
Raw is.raw() as.raw()
Time serie is.ts() as.ts()
Vector is.vector() as.vector()
Ejemplo 9.17. Liste todas las funciones ((as.*)) existentes en el paquete base.
www.editorialuc.es
9.4.3. Destrucción
El acumular muchos objetos en memoria no es deseable porque puede en-
lentecer la ejecución del programa, e incluso, producir errores por utilizar ob-
jetos que pueden tener el mismo nombre pero con valores diferentes. Por es-
to una buena técnica de programación es borrar los objetos que no vayan a
ser usados con posterioridad. R tiene una función que permite borrarlos. Con
rm() se pasan como argumento los objetos que se quieren borrar. Cuando se
desean borrar todos los objetos excepto las funciones, una función excelente
para ello es la función zap del paquete epicalc.
#---------------------------------------------------------------
zap()
#---------------------------------------------------------------
9.5. Visibilidad
Las variables creadas dentro de una función se dice que son locales: son
visibles dentro de la función y desaparecen al salir de ella.
Ejemplo 9.19. Declare la variable a con valor 77. Cree una función que en su
interior cambie el valor de a. Tras ejecutar esa función, ¿cambia el valor de a?
> a <- 77
> f <- function(x) {
+ a <- x
+ cat("El valor de a dentro de la función es", a, "\n")
+ aˆ3
+ }
>
> cat("El valor de a es", a, "\n")
El valor de a es 77
> f(2)
El valor de a dentro de la función es 2
[1] 8
> cat("El valor de a fuera de la función es", a, "\n")
El valor de a fuera de la función es 77
Las variables creadas fuera de las funciones son globales, y están dispo-
nibles también dentro de las funciones [146].
> a <- 77
Función Acción
as.array() Fuerza a array
as.character() Fuerza a caracteres
as.complex() Fuerza a complejo
as.data.frame() Fuerza a data frame
as.double() Fuerza a Doble
as.factor() Fuerza a factor
as.list() Fuerza a lista
as.logical() Fuerza a lógico
as.matrix() Fuerza a matriz
as.numeric() Fuerza a numérico
as.raw() Fuerza a datos raw
as.ts() Fuerza a serie temporal
as.vector() Fuerza a vector
attr() Visualiza o crea un atributo
attributes() Visualiza o crea atributos
c() Concatena elementos
cbind() Junta objetos opor columnas
cat() Imprime en pantalla
class() Clase de un objeto
dim() Visualiza las dimensiones de un objeto
function() Crea una función
is.array() Comprueba si es un array
is.character() Comprueba si es un vector de caracteres
is.complex() Comprueba si es un vector complejo
is.data.frame() Comprueba si es un data frame
Continúa en la página siguiente...
Función Acción
is.double() Comprueba si es un número ((double))
www.editorialuc.es
is.factor() Comprueba si es un factor
is.list() Comprueba si es una lista
is.logical() Comprueba si es un vector lógico
is.matrix() Comprueba si es una matriz
is.numeric() Comprueba si es un un vector numérico
is.raw() Comprueba si es un un vector de datos raw
is.ts() Comprueba si es una serie temporal
is.vector() Comprueba si es un vector
length() Longitud de un objeto
library() Carga un paquete
list() Crea listas
ls() Lista los objetos existentes en memoria
mode() Modo de almacenamiento
names() Presenta o asigna los nombres
numeric() Declara un objeto como numérico
objects() Lista los objetos en memoria
remove() Remueve (elimina) objetos de la memoria
rm() Remueve (elimina) objetos de la memoria
storage.mode() Modo de almacenamiento de un objeto
str() Estructura de un objeto
structure() estructura ((fina)) de un objeto
typeof() Declara el tipo de un objeto.
zap() Borra todas los objetos excepto las funciones
Función Acción
epicalc Funciones epidemiológicas con epicalc [136]
PROBLEMAS
Problema 1. Con la función ls.str() puede ver los objetos que tiene en el entorno
de trabajo. Después de ejecutar el código anterior, ¿cuantos objetos tiene en memoria?,
¿de qué tipo son?
Problema 2. Intente averiguar el resultado del siguiente código antes de ejecutarlo
(tomado de Wickham [148]).
f <- function(x) {
f <- function(x) {
f <- function(x) {
x ˆ 2
}
f(x) + 1
}
f(x) + 2
}
f(10)
Problema 3. ¿Qué longitud cree que tendrá la función f() que acaba de crear?
Compruébelo.
Problema 4. Cree la función g() más sencilla que la anterior, con una única lı́nea
de código. ¿Qué longitud tendrá?
Problema 5. ¿Se pueden comparar objetos que no sean listas o vectores atómicos?
Compruebe si es posible conocer si la función b() es mayor que la función g().
Problema 6. ¿Como puede convertir la cadena "2.718281828459" en un núme-
ro? (es el valor del número e, base de los logaritmos neperianos).
Vectores
Estructuras en R
Vectores data
listas matrices arrays
atómicos frames
1It’s hard to imagine R code, or even an interactive R session, that doesn’t involve vectors.
93
Libros de Estadística en PDF | Statistics Books in PDF
94 CAPÍTULO 10. VECTORES
10.1. Concepto
Los vectores son colecciones ordenadas de objetos, todos ellos del mismo
tipo [94]. Los vectores son el tipo de objetos más utilizados en R. En la mayorı́a
de las ocasiones se crean con la función c().
Las caracterı́sticas de los elementos que los forman (números, valores lógi-
cos, cadenas de caracteres, etc.) determinan los diferentes tipos de vectores.
Hay dos tipos fundamentales: vectores y listas2 . Los componentes de los vec-
tores son todos del mismo tipo, mientras que los de las listas no.
Todos ellos tienen tres propiedades comunes: longitud, tipo y atributos que
se exploran con las funciones length(), typeof() y attributes(), res-
pectivamente.
10.1.2. Listas
Los elementos de una lista pueden ser de diferentes tipos, como veremos
en un próximo capı́tulo.
Para comprobar si un objeto es una lista se debe utilizar is.list().
Para ir explicando los diferentes vectores nos serviremos de un pequeño
ejemplo en el que se han recogido diferentes datos antropométricos de diez
familias3 (Tabla 10.1).
Del sujeto número 6 no se dispone de ningún dato antropométrico porque
falleció cuando tenı́a dos años de edad. Del sujeto 15 no se dispone de la talla
y del sujeto 18 no se dispone del perı́metro de la cintura.
A lo largo de este capı́tulo iremos creando vectores con los datos de esta
tabla, cada uno de ellos con los datos de cada una de las variables registradas;
cuando no está disponible un dato se teclea NA (not available).
www.editorialuc.es
id family relative nom age alive sex weight height waist
(yr) (kg) (cm) (cm)
1 F1 padre Pedro 42 TRUE M 78,0 173,0 86,2
2 F1 madre Marı́a 39 TRUE F 57,3 164,5 66,4
3 F1 hijo1 Juan 13 TRUE M 42,7 156,3 60,1
4 F1 hijo2 Lucı́a 12 TRUE F 38,3 147,6 53,2
5 F1 hijo3 Marcos 9 TRUE M 27,7 130,2 54,6
6 F1 hijo4 Miguel FALSE M
7 F1 hijo5 Clara 3 TRUE F 14,6 95,7 48,3
8 F2 padre Luis 37 TRUE M 86,9 172,5 93,0
9 F2 madre Marta 34 TRUE F 62,5 161,6 68,5
10 F2 hijo1 Marta 7 TRUE F 23,0 124,0 48,0
11 F3 padre Martı́n 28 TRUE M 76,3 178,0 77,0
12 F3 madre Carmen 26 TRUE F 58,0 162,0 64,0
13 F3 hijo1 FALSE F
14 F4 padre Antón 42 TRUE M 78,2 173,0 86,2
15 F4 madre Mónica 42 TRUE F 67,0 159,0 77,0
16 F4 hijo1 Aylin 10 TRUE F 28,6 50,5
17 F5 padre Paco 38 TRUE M 82,0 176,0 85,0
18 F5 madre Paz 37 TRUE F 61,5 159,5 66,0
19 F5 hijo1 Dolores 6 TRUE F 18,7 114,0
20 F5 hijo2 Gorka 4 TRUE M 16,3 102,6 44,0
21 F5 hijo3 José 4 TRUE M 16,5 101,3 45.2
22 F6 padre Alberto 36 TRUE M 82,0 176,0 45,0
23 F6 madre Andrea 32 TRUE F 61,5 159,0 66,0
24 F6 hijo1 Juan 3 TRUE M 13,2 98.7 44,0
25 F6 hijo2 Paco 3 TRUE M 13,8 99.6 45,0
26 F6 hijo3 José 3 TRUE M 13,6 95.0 45,5
27 F7 madre Marina 32 TRUE F 61,4 169,0 76,0
28 F7 hijo1 Juan 1 TRUE M 8,7 74.0 43.2
29 F7 hijo2 Pablo 1 TRUE M 9,3 75.5 44.0
30 F8 padre Gabriel 42 TRUE M 78.8 173.8 85.2
31 F8 madre Marı́a 39 TRUE F 57.8 164.8 67.4
32 F8 hijo1 Juan 13 TRUE M 42.9 156.8 60.3
33 F8 hijo2 Leonor 12 TRUE F 38.8 147.8 53.8
34 F9 padre Pepe 37 TRUE M 81.0 174.0 89.5
35 F9 madre Gloria 34 TRUE F 56.7 165.5 70.5
36 F9 hijo1 Ana 16 TRUE F 52.0 164.0 56.0
37 F9 hijo2 Marina 14 TRUE F 49.5 153.0 54.0
38 F9 hijo3 Pilar 14 TRUE F 48.0 152.0 53.3
39 F9 hijo4 Carmen 7 TRUE F 34.0 135.0 62.2
40 F10 padre Emil 29 TRUE M 88.9 170.5 88.2
41 F10 madre Isis 22 TRUE F 70.3 160.3 69.0
42 F10 hijo1 Chema 1 TRUE M 10.5 75.0 49.5
10.2.1. Concatenación
La forma más simple de crear un vector es concatenar todos sus elementos
utilizando la función c().
#---------------------------------------------------------------
c(..., recursive = FALSE)
#---------------------------------------------------------------
Ejemplo 10.1. Cree el vector weight con los pesos (kg) de las familias de la
tabla 10.1.
#---------------------------------------------------------------
scan(file = "", what = double(), nmax = -1, n = -1, sep = "",
quote = if(identical(sep, "\n")) "" else "’\"", dec = ".",
skip = 0, nlines = 0, na.strings = "NA",
flush = FALSE, fill = FALSE, strip.white = FALSE,
quiet = FALSE, blank.lines.skip = TRUE, multi.line = TRUE,
comment.char = "", allowEscapes = FALSE,
fileEncoding = "", encoding = "unknown", text,
skipNul = FALSE)
www.editorialuc.es
+ 160.3, 75.0))
> height # presenta en la consola su contenido
[1] 173.0 164.5 156.3 147.6 130.2 NA 97.5 172.5 161.6 124.0
----------------------- lı́neas omitidas -----------------------
[31] 164.8 156.8 147.8 174.0 165.5 164.0 153.0 152.0 135.0 170.5
[41] 160.3 75.0
10.2.2. Secuencias
En estadı́stica se utilizan con mucha frecuencia series de números. Estas
series o secuencias se pueden crear con la función seq() que admite varios
parámetros: from = x (x es el valor de inicio, por defecto es igual a 1), to =
y (y es el valor final, por defecto es igual a 1), by = z (z es el incremento de un
valor a otro, por defecto es igual a 1), length.out (es la longitud del vector),
along.with = vector (genera una secuencia de números naturales, desde
1 hasta la longitud del vector especificado. En este caso este parámetro debe
ser el único especificado).
#---------------------------------------------------------------
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),
length.out = NULL, along.with = NULL, ...)
#---------------------------------------------------------------
Ejemplo 10.3. Cree un vector numérico llamado id, con los primeros 42
números naturales, para identificar biunı́vocamente y sin duplicados a cada
uno de los individuos de la Tabla 10.1.
> (id <- 1:42)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[21] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
[41] 41 42
10.2.3. Repeticiones
Otra función relacionada con la generación de números, y muy utilizada,
es rep(), que permite replicar un objeto (o cada uno de sus elementos) un
determinado número de veces.
#---------------------------------------------------------------
rep(x, ...)
#---------------------------------------------------------------
Ejemplo 10.7. Cree el vector family utilizando las funciones c() y rep().
www.editorialuc.es
Ejemplo 10.8. Cree el vector relative utilizando la función c() y con ayu-
da de un vector auxiliar formado por c(’padre’, ’madre’, ’hijo1’,
’hijo2’, ’hijo3’, ’hijo4’, ’hijo5’).
10.3.1. Lógicos
Están compuestos por elementos que solo pueden ser TRUE o FALSE.
Cuando se crean con la función vector(), se crean por defecto con FALSE:
#---------------------------------------------------------------
vector(mode = "logical", length = 0)
as.vector(x, mode = "any")
is.vector(x, mode = "any")
#---------------------------------------------------------------
#---------------------------------------------------------------
logical(length = 0)
as.logical(x, ...)
is.logical(x)
#---------------------------------------------------------------
> logical(10)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[10] FALSE
10.3.2. Numéricos
Los vectores numéricos son muy utilizados en estadı́stica. Se pueden dis-
tinguir tres subtipos según el tipo de número de sus elementos:
Enteros
Son vectores en los que todos sus elementos son números enteros (positivos
y negativos).
Ejemplo 10.11. Cree el vector age con las edades de los 42 sujetos de las
familias recogidos en la Tabla 10.1.
> age <- c(42, 39, 13, 12, 9, NA, 3, 37, 34, 7,
+ 28, 26, NA, 42, 42, 10, 38, 37, 6, 4,
+ 4, 36, 32, 3, 3, 3, 32, 1, 1, 42,
+ 39, 13, 12, 37, 34, 16, 14, 14, 7, 29,
+ 22, 1)
> age
[1] 42 39 13 12 9 NA 3 37 34 7 28 26 NA 42 42 10 38 37 6 4
[21] 4 36 32 3 3 3 32 1 1 42 39 13 12 37 34 16 14 14 7 29
[41] 22 1
Se pueden crear con la función vector(), que pone todos sus elementos
igual a 0, o con la función integer():
#---------------------------------------------------------------
integer(length = 0)
as.integer(x, ...)
is.integer(x)
#---------------------------------------------------------------
[1] "integer"
> (x <- integer(10)) # similar a vector()
www.editorialuc.es
[1] 0 0 0 0 0 0 0 0 0 0
Reales
Los números reales abarcan a los enteros, racionales e irracionales. Se al-
macenan en memoria con doble precisión (15 decimales). Por ejemplo el peso
y la talla se han almacenado como números reales. Se pueden crear con las
funciones c(), vector(mode = "numeric") y double().
#---------------------------------------------------------------
double(length = 0)
as.double(x, ...)
is.double(x)
#---------------------------------------------------------------
> (weight)
[1] 78.0 57.3 42.7 38.3 27.7 NA 14.6 86.9 62.5 23.0 76.3 58.0
----------------------- lı́neas omitidas -----------------------
[37] 49.5 48.0 34.0 88.9 70.3 10.5
> mode(weight)
[1] "numeric"
> class(weight)
[1] "numeric"
Complejos
Son los números que tienen una parte real y otra imaginaria. Por ejemplo,
3+2.5i. El primer componente es la parte real y se trata de un número real. La
segunda parte está compuesta por √ un número real y adyacente a él, sin ningún
espacio intermedio, la letra i (i = −1). Este tipo de números no los vamos a
utilizar en estadı́stica.
Por ejemplo, cuando queremos obtener raı́ces cuadradas de números nega-
tivos obtenemos un mensaje de aviso indicándonos que el resultado no es un
número (NaN), mientras que si le escribimos como número complejo, se obtiene
la solución correcta.
> sqrt(-4)
[1] NaN
Warning message:
In sqrt(-4) : Se han producido NaNs
> sqrt(-4 + 0i)
[1] 0+2i
#---------------------------------------------------------------
complex(length.out = 0, real = numeric(), imaginary = numeric(),
modulus = 1, argument = 0)
as.complex(x, ...)
is.complex(x)
#---------------------------------------------------------------
Hay una serie de funciones para manejar números complejos: Re(), Im(),
Mod(), Arg(), Conj(). Aunque ponemos un ejemplo de su uso, no las utili-
zaremos en el trabajo habitual con R.
Ejemplo 10.15. Aplique estas últimas cinco funciones con el número com-
plejo 3 + 4i.
10.3.3. Cadena
Son vectores en los que cada uno de sus elementos son cadenas de caracte-
res. Siempre deben ir entrecomillados.
Ejemplo 10.16. Cree el vector nom con los nombres de los miembros de las
familias de la Tabla 10.1.
www.editorialuc.es
+ ’Martı́n’, ’Carmen’, NA, ’Antón’, ’Mónica’,
+ ’Aylı́n’, ’Paco’, ’Paz’, ’Dolores’, ’Gorka’,
+ ’José’, ’Alberto’, ’Andrea’, ’Juan’, ’Paco’,
+ ’José’, ’Marina’, ’Juan’, ’Pablo’, ’Gabriel’,
+ ’Marı́a’, ’Juan’, ’Leonor’, ’Pepe’, ’Gloria’,
+ ’Ana’, ’Marina’, ’Pilar’, ’Carmen’, ’Emil’,
+ ’Isis’, ’Chema’)
> nom
[1] "Pedro" "Marı́a" "Juan" "Lucı́a" "Marcos" "Miguel"
----------------------- lı́neas omitidas -----------------------
[37] "Marina" "Pilar" "Carmen" "Emil" "Isis" "Chema"
10.3.4. Listas
Se trata de un tipo especial de vectores en los que todos sus elementos no
tienen por qué ser del mismo tipo. Se utilizan mucho para presentar los resul-
tados de las funciones. Se crean con la función list().
#---------------------------------------------------------------
list(...)
#---------------------------------------------------------------
Ejemplo 10.18. Cree una lista que contenga un vector numérico, un vector
de caracteres, un vector lógico, una matriz y un data frame.
+ 2, 2)))))
> class(x)
[1] "list"
> x
$Numero
[1] 1 2 3 4 5 6 7 8 9 10
$Cadena
[1] "Carmen"
$Logico
[1] TRUE FALSE
$Matriz
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
$DF
x y z
1 1 -0.30005219 1
2 2 -1.06524125 1
3 3 -0.38313515 1
4 4 -0.84972448 2
5 5 -0.11528650 2
6 6 0.08039173 1
7 7 0.85326327 2
8 8 -0.96125588 2
9 9 -0.09634481 1
10 10 -0.14138306 1
11 11 -0.54458848 2
12 12 0.88333289 2
www.editorialuc.es
> Inf / Inf
[1] NaN
> Inf * 0
[1] NaN
> 0 * Inf
[1] NaN
> 0 / 0
[1] NaN
∞ 0
∞ − ∞, , 0 × ∞, , ∞0 , 1∞ , 00 (10.1)
∞ 0
# indeterminaciones incorrectas
> Infˆ0
[1] 1
> 1ˆInf
[1] 1
> 0ˆ0
[1] 1
Ejemplo 10.19. Cree el vector waist con los datos de la Tabla 10.1.
Se observa que en tres sujetos, id = 6, 13 y 19, el perı́metro de la cintura no
se registró. Deberemos teclear NA, ya que son datos ausentes no disponibles
(missing).
Ejemplo 10.20. Calcule la relación ((cintura / altura)) con los datos de las
personas de la Tabla 10.1.
www.editorialuc.es
[7] 0.4953846 0.5391304 0.4238861 0.3870968 0.4325843 0.3950617
[13] NA 0.4982659 0.4842767 NA 0.4829545 0.4137931
[19] NA 0.4288499 0.4461994 0.2556818 0.4150943 0.4457953
[25] 0.4518072 0.4789474 0.4497041 0.5837838 0.5827815 0.4902186
[31] 0.4089806 0.3845663 0.3640054 0.5143678 0.4259819 0.3414634
[37] 0.3529412 0.3506579 0.4607407 0.5173021 0.4304429 0.6600000
Cuando uno de los vectores es más corto, le recicla y utiliza sus elementos
de forma completa (si la longitud de un vector es múltiplo de la longitud del
otro) o incompleta (cuando la longitud de uno no es múltiplo de la del otro).
> c <- c(’chico’, ’chica’)
> paste(a, c) # reciclado incompleto
[1] "bici chico" "coche chica" "moto chico"
> rm(a, b, c)
Se puede utilizar esto para crear nombres de variables, ası́ para crear 30
variables llamadas var1, var2, ..., var30, se utiliza el siguiente código, en el que
se ha pasado como tercer parámetro a la función paste() la indicación de que
no deje ningún espacio con sep = ’’:
> paste(’var’, 1:30, sep=’’)
[1] "var1" "var2" "var3" "var4" "var5" "var6" "var7"
[8] "var8" "var9" "var10" "var11" "var12" "var13" "var14"
[15] "var15" "var16" "var17" "var18" "var19" "var20" "var21"
[22] "var22" "var23" "var24" "var25" "var26" "var27" "var28"
[29] "var29" "var30"
#---------------------------------------------------------------
substr(x, start, stop)
substr(x, start, stop) <- value
#---------------------------------------------------------------
Ejemplo 10.22. Extraiga una subcadena desde la posición 162 hasta la 178.
#---------------------------------------------------------------
strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)
#---------------------------------------------------------------
www.editorialuc.es
[55] "Investigación."
> length(unlist(x))
[1] 55
Ejemplo 10.24. ¿Qué letra, vocal o consonante aparece con mayor frecuen-
cia?
, . a á c C d e é f g h i I ı́ l L m M n
54 8 2 26 1 15 1 18 35 2 4 6 1 22 1 3 14 1 4 2 29
o ó p P q r s t u v x y z
32 4 6 1 1 17 20 15 10 3 1 1 1
La letra ((e)).
Operación Resultado
x[1] Extrae el primer elemento
x[length(x)] Extrae el último
x[i] Extrae el elemento que está en la posición i
x[-i] Extrae todos menos el elemento en posición i
x[c(4, 7, 8)] Extrae los elementos en posición 4, 7 y 8
x[-c(4, 7, 8)] Extrae todos menos los elementos en posición
4, 7 y 8
x[’cadena’] Extrae el elemento cuyo nombre coincide con
’cadena’
x[i] <- 420 Cambia el valor del elemento en posición i
por 420
x[c(3,7)] <- c(1, 2) Los elementos en posición 3 y 7 cambian a 1
y2
which(x >50.1) Pregunta qué elemento cumple una condi-
ción
Cuando el ı́ndice es superior a la longitud del vector, devuelve NA, por eso
waist[min(waist)] y waist[max(waist)] devuelven NA.
> waist[max(waist)]
[1] NA
> waist[min(waist)]
[1] NA
Estas posiciones permiten extraer el valor que presenta otra variable en esa
posición:
Ejemplo 10.27. ¿Cómo se llaman los sujetos con una perı́metro de cintura
menor de 50 cm?
> (x <- which(waist < 50))
[1] 7 10 20 21 22 24 25 26 28 29 42
> nom[x]
[1] "Clara" "Marta" "Gorka" "José" "Alberto" "Juan"
[7] "Paco" "José" "Juan" "Pablo" "Chema"
> age[x]
[1] 3 7 4 4 36 3 3 3 1 1 1
Observamos que el sujeto en posición 22, con una edad de 36 años y llama-
do Alberto tiene una perı́metro de cintura menor de 50 cm; ¡es un error!
También podemos extraer los elementos que cumplen una determinada
condición; por ejemplo, los que tienen un perı́metro de cintura mayor de 90
cm.
www.editorialuc.es
> waist[8]
[1] 93
Ejemplo 10.28. Encuentre en la Tabla 10.1 el nombre, edad y sexo del sujeto
con menor perı́metro de cintura.
El paquete epicalc tiene una función muy útil en este sentido llamada
recode(). Solo actúa sobre variables que están en un data frame.
#---------------------------------------------------------------
recode(vars, old.value, new.value, dataFrame = .data, ...)
#---------------------------------------------------------------
#---------------------------------------------------------------
sort(x, decreasing = FALSE, ...)
rev(x)
#---------------------------------------------------------------
#---------------------------------------------------------------
remove(..., list = character(), pos = -1,
envir = as.environment(pos), inherits = FALSE)
www.editorialuc.es
[6] "nom" "relative" "sex" "w" "waist"
[11] "weight" "x" "z"
> rm(x) # se borra x
> ls() # comprobamos que se ha borrado
[1] "age" "alive" "family" "height" "id"
[6] "nom" "relative" "sex" "w" "waist"
[11] "weight" "z"
#---------------------------------------------------------------
save(..., list = character(0L),
file = stop("’file’ must be specified"),
ascii = FALSE, version = NULL, envir = parent.frame(),
compress = !ascii, compression_level,
eval.promises = TRUE, precheck = TRUE)
Ejemplo 10.33. Grabe los vectores de los datos de las familias en un objeto
llamado vectores familias.RData.
Ejemplo 10.34. Calcule la edad media de los sujetos del ejemplo familias.
Como hay algún dato ausente, antes hay que removerlo.
Función Acción
min(x) Valor mı́nimo del vector x
max(x) Valor máximo
range(x) Rango, vector con dos elementos: min(x) y max(x)
sum(x) Suma de todos los elementos
median(x) Mediana del vector x
mean(x) Media del vector x
mode(x) Moda del vector x
sd(x) Desviación estándar del vector x
var(x) Variancia del vector x
quantile(x) Vector con min(x), Q1, mediana, Q3 y max(x)
cumsum(x) Vector con las sumas acumuladas del vector x
cumprod(x) Vector con los productos acumulados del vector x
cummin(x) Vector no crecientes con el mı́nimo acumulado hasta ese
punto
cummax(x) Vector no decrecientes con el máximo acumulado hasta ese
punto
Ejemplo 10.37. De los sujetos cuyo nombre comienza por la letra ((M)) o la
letra ((J)) calcule la suma de sus edades y presente sus nombres. ¿Están todos
vivos?
$suma_de_edades
[1] 281
$nombres
[1] "Marı́a" "Juan" "Marcos" "Miguel" "Marta" "Marta"
www.editorialuc.es
$estan_vivos
[1] TRUE TRUE TRUE FALSE TRUE TRUE TRUE TRUE TRUE TRUE
[11] TRUE TRUE TRUE TRUE TRUE TRUE
Función Acción
Arg() Argumento de un número complejo
assign() Asigna un valor a un elemento de un vector
attributes() Atributos de un objeto
c() Crea un vector concatenando elementos
bind() Unión de objetos por columnas
class() Clase de un objeto
complex() Crea un vector numérico complejo
Conj() Conjugado de un número complejo
cummax(X) Vector no decrecientes con el máximo acumulado has-
ta ese punto
cummin(X) Vector no crecientes con el mı́nimo acumulado hasta
ese punto
cumprod(X) Vector con los productos acumulados del vector X
cumsum(X) Vector con las sumas acumuladas del vector X
data.frame() Crea una data frame
double() Crea un vector numérico coma-flotante
factor() Crea un factor
Im() Parte imaginaria de un número complejo
integer() Crea un vector de enteros
is.atomic() Comprueba que es de tipo atómico
is.character() Comprueba que es de tipo carácter
is.double() Comprueba que es de tipo numérico flotante
is.integer() Comprueba que es de tipo numérico entero
is.list() Comprueba que es de tipo lista
is.logical() Comprueba que es de tipo lógico
is.na() Comprueba si el elemento es NA
length() Longitud de un vector
list() Crea una lista
logical() Crea un vector lógico
max(X) Valor máximo
mean(X) Media del vector X
median(X) Mediana del vector X
min(X) Valor mı́nimo del vector X
Mod() Módulo de un número complejo
Continúa en la página siguiente...
Función Acción
mode() Evalúa el modo de un objeto
names() Asigna nombres
nchar() Longitud (número de caracteres) de una cadena
paste() Une distintos elementos en uno sólo
quantile(X) Vector con min(X), Q1, mediana, Q3 y max(X)
range(X) Rango, vector con dos elementos: min(X) y max(X)
Re() Parte real de un número complejo
remove() Borra objetos de la memoria de trabajo
rep() Crea una secuencia repitiendo elementos
rev() Revierte el orden
rm() Borra objetos de la memoria de trabajo
rnorm() Números aleatorios según una distribución normal
save() Guarda objetos en un fichero de datos
save.image() Guarda objetos en un fichero de datos
scan() Crea un lector leyendo datos
sd(X) Desviación estándar del vector X
seq() Crea una secuencia
setNames() Asigna nombres
sort() Ordena un vector en orden creciente
sqrt() Raı́z cuadrada
strsplit() Divide una cadena de caracteres
substr() Extrae una subcadena
sum(X) Suma de todos los elementos
table() Genera una tabla
tolower() Convierte en minúsculas
toupper() Convierte en mayúsculas
typeof() Tipo de objeto
var(X) Variancia del vector X
vector() Crea un vector
which() Pregunta qué elemento cumple una condición (devuel-
ve el ı́ndice)
which.min() Mı́nimo según una condición
which.max() Máximo según una condición
PROBLEMAS
Problema 1. ¿Cuál será el resultado de dividir 1:10 entre 3:5?
Problema 2. Cree un vector, llamado Id.caso, para etiquetar cada uno de los casos de
un estudio (n = 27) como Caso-1, ..., Caso-27.
Problema 3. Elimine todos los objetos que tenga en su área de trabajo que comienzan
por la letra I (mayúscula).
Problema 4. ¿Es posible sumar dos vectores numéricos de distinta longitud?
Problema 5. ¿Cómo puede crear el vector numérico formado por 0, 3, 6, 9, 12, 15,
18 y 24 empleando la función seq() en una única expresión?
www.editorialuc.es
Problema 6. Si x <- 1:15, ¿qué longitud tendrá x[c(1, -15)]? (responda
antes de comprobar la respuesta)
Factores
Los factores son vectores utilizados para almacenar datos de tipo cualitativo
[151]. Son variables categóricas con un número fijo de categorı́as o niveles [167].
Constituyen una manera compacta (y, por tanto, muy eficiente) de manejar
datos cualitativos, por lo que son muy utilizados en R.
Los vectores de la clase factor se diferencian de los vectores de la clase cha-
racter en la manera en que almacenan la información [97], mientras que los
vectores de cadenas de caracteres almacenan todos los caracteres entrecomi-
llados ocupando memoria, los vectores de factores almacenan únicamente un
número que se corresponde a cada uno de sus niveles, con valores 1, 2, 3, ..., k,
siendo k el número de categorı́as [101]. Este se entiende perfectamente con un
ejemplo.
119
Libros de Estadística en PDF | Statistics Books in PDF
120 CAPÍTULO 11. FACTORES
+ ’Alemania’, ’Alemania’)
> # vector factor
> pais_f <- as.factor(pais_c)
> class(pais_c) # tipo de vector: character
[1] "character"
> pais_c # caracteres (entrecomillado)
[1] "Alemania" "Francia" "Inglaterra" "Alemania"
[5] "Alemania" "Francia" "Francia" "Francia"
-------------------- lineas omitidas --------------------
[25] "Rumanı́a" "Austria" "Alemania" "Francia"
[29] "Alemania" "Alemania"
> class(pais_f) # tipo de vector: factor
[1] "factor"
> pais_f # nombres sin comillas
[1] Alemania Francia Inglaterra Alemania Alemania
[6] Francia Francia Francia Holanda Portugal
-------------------- lineas omitidas --------------------
[26] Austria Alemania Francia Alemania Alemania
11 Levels: Alemania Austria Dinamarca Francia ... Suecia
> unclass(pais_f) # almacena números
[1] 1 4 6 1 1 4 4 4 5 9 11 1 9 1 7 8 1 4 5
[20] 1 3 11 10 10 10 2 1 4 1 1
attr(,"levels")
[1] "Alemania" "Austria" "Dinamarca" "Francia"
[5] "Holanda" "Inglaterra" "Italia" "Polonia"
[9] "Portugal" "Rumanı́a" "Suecia"
www.editorialuc.es
+ 30, 30, 39, 33, 36, 34, 40, 34, 32, 36, 36, 37,
+ 38, 28, 25, 31, 29, 26, 29, 44, 34, 32, 28, 34,
+ 32, 33, 41, 37, 36, 36, 23, 39, 31, 29, 28, 28,
+ 27, 27, 30, 38, 30, 32)
> table(sexo_f4)
sexo_f4
www.editorialuc.es
mujer hombre
30 24
Ejemplo 11.5. Cree el vector factor sexo f5 con sus niveles ordenados.
> (sexo_f5 <- ordered(sexo))
[1] hombre mujer mujer hombre hombre hombre mujer hombre
[9] mujer mujer mujer mujer mujer hombre hombre mujer
-------------------- lineas omitidas --------------------
[49] mujer hombre mujer mujer hombre mujer
Levels: hombre < mujer
> is.ordered(sexo_f5)
[1] TRUE
Se observa que R presenta los niveles separados por el signo ((<)), indicando
que es un factor ordenado.
El paquete Hmisc tiene la función cut2 de manejo más sencillo y con ma-
yores posibilidades, como descubrirá el lector consultando la ayuda correspon-
diente [168].
#---------------------------------------------------------------
cut2(x, cuts, m, g, levels.mean, digits, minmax=TRUE,
oneval=TRUE, onlycuts=FALSE)
#---------------------------------------------------------------
Ejemplo 11.6. Categorice la edad en tres grupos, con puntos de corte en 20,
30, 40 y 50 años.
Con la función cut() vamos a crear el factor edad f1. Esta función crea
un factor dividiendo la variable edad según los puntos de corte especificados
con breaks=c(20, 30, 40, 50), de forma que divide entre los 20 años de
edad y los 30 (sin incluir a los 30), entre los 30 (incluido) hasta los 40 (excluido)
y entre los 40 y 50 (ambos incluidos):
www.editorialuc.es
+ include.lowest = TRUE,
+ right = FALSE,
+ ordered_result = TRUE))
[1] [30,40) [40,50] [30,40) [30,40) [30,40) [30,40) [30,40)
[8] [30,40) [30,40) [30,40) [30,40) [20,30) [30,40) [30,40)
-------------------- lineas omitidas --------------------
[43] [20,30) [30,40) [30,40) [20,30) [20,30) [20,30) [20,30)
[50] [20,30) [30,40) [30,40) [30,40) [30,40)
Levels: [20,30) < [30,40) < [40,50]
> is.ordered(edad_f3)
[1] TRUE
Ejemplo 11.9. Con el vector pais f cree un vector factor que tenga solo dos
niveles (europa este y europa oeste).
www.editorialuc.es
> pais_2f <- pais_f # se crea una copia
> levels(pais_2f) <- list(europa_oeste = c(’Portugal’,
+ ’Francia’,
+ ’Inglaterra’,
+ ’Holanda’,
+ ’Dinamarca’,
+ ’Suecia’,
+ ’Alemania’,
+ ’Italia’,
+ ’Austria’),
+ europa_este = c(’Polonia’,
+ ’Rumanı́a’))
> pais_2f
[1] europa_oeste europa_oeste europa_oeste europa_oeste
[5] europa_oeste europa_oeste europa_oeste europa_oeste
[9] europa_oeste europa_oeste europa_oeste europa_oeste
[13] europa_oeste europa_oeste europa_oeste europa_este
[17] europa_oeste europa_oeste europa_oeste europa_oeste
[21] europa_oeste europa_oeste europa_este europa_este
[25] europa_este europa_oeste europa_oeste europa_oeste
[29] europa_oeste europa_oeste
Levels: europa_oeste europa_este
#---------------------------------------------------------------
epicalc::recode(vars, old.value, new.value,
dataFrame = .data, ...)
car::recode(var, recodes, as.factor.result,
as.numeric.result=TRUE, levels)
#---------------------------------------------------------------
Ejemplo 11.10. Utilice la función recode del paquete car para agrupar los
11 niveles del vector pais f en dos niveles, como se ha hecho en el ejemplo
anterior.
> nlevels(pais_f)
[1] 11
Ejemplo 11.13. Cree un vector similar, pero etiquetado con las primeras cua-
tro letras mayúsculas.
www.editorialuc.es
[7] Centro D Centro D Centro A Centro A Centro B Centro B
[13] Centro C Centro C Centro D Centro D Centro A Centro A
[19] Centro B Centro B Centro C Centro C Centro D Centro D
[25] Centro A Centro A Centro B Centro B Centro C Centro C
[31] Centro D Centro D Centro A Centro A Centro B Centro B
[37] Centro C
Levels: Centro A Centro B Centro C Centro D
Operación Resultado
apply() matrices, arrays, data frame
lapply() listas, vectores
sapply() listas, vectores
tapply() vectores
by() similar a tapply()
eapply entornos
mapply múltiples valores
rapply versión recursiva de lapply()
#---------------------------------------------------------------
tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
#---------------------------------------------------------------
4.035845 4.837711
> tapply(edad, sexo, mean) # también con vector cadena
hombre mujer
32.125 33.100
Incluso se puede ejecutar por una lista de factores. Ası́, cuando queremos
calcular la desviación estándar de la edad según sexo y en cada uno de los
grupos de edad categorizada:
Ejemplo 11.15. Con los datos del ejemplo 2, presente de forma compacta el
número de sujetos, la media, la desviación estándar, la mediana y el rango
de la edad según sexo.
Función Acción
c() Crea un vector concatenando elementos
class() Informa de la clase de un objeto
as.factor() Convierte en factor
unclass() Elimina el atributo clase
factor() Convierte en factor
ordered() Convierte en factor ordenado
cut() Categoriza un vector numérico
cut2() Categoriza un vector numérico
as.ordered() Convierte en factor ordenado
tapply() Aplica una función a cada uno de los grupos de un vector
numérico
Continúa en la página siguiente...
Función Acción
levels() Extrae los niveles de un factor
www.editorialuc.es
recode() Recodifica variables
nlevels() Número de niveles
PROBLEMAS
Se tiene una BdD formada por los siguientes vectores: edad, sexo, estado
nutricional y hábitat de 2000 sujetos.
> set.seed(2016)
> n <- 2000
> edad <- rpois(n, 26)
> sexo <- sample(c(’F’, ’M’), n, replace = TRUE)
> en <- sample(c(’D’, ’E’, ’S’,’O’), n, replace = TRUE,
+ prob = c(5, 50, 30, 15) / 100)
> habitat <- sample(c(’rural’, ’semiurbano’, ’urbano’), n,
+ replace = TRUE, prob = c(.1, .4, .5))
Tablas
#---------------------------------------------------------------
table(...,
exclude = if (useNA == "no") c(NA, NaN),
useNA = c("no", "ifany", "always"),
dnn = list.names(...), deparse.level = 1)
as.table(x, ...)
is.table(x)
#---------------------------------------------------------------
133
Libros de Estadística en PDF | Statistics Books in PDF
134 CAPÍTULO 12. TABLAS
Aquı́ queremos ver el número de sujetos de cada una de las familias, es de-
cir, cuántas veces se repite el código de cada familia. La variable family es una
variable cualitativa que se puede tabular, pero table() nos presenta los datos
ordenados alfabéticamente; para que aparezcan correctamente, antes debemos
convertirla en factor y declarar los niveles en el orden que nos interesa.
> load(’vectores_familias.RData’)
> familias <- paste(’F’, 1:10, sep=’’)
> (x <- table(factor(family, levels = familias)))
F1 F2 F3 F4 F5 F6 F7 F8 F9 F10
7 3 3 3 5 5 3 4 6 3
> class(x)
[1] "table"
www.editorialuc.es
Distribution of family
7
7
6
6
5 5
5
Frequency
4
4
3 3 3 3 3
3
2
1
0
F1 F2 F3 F4 F5 F6 F7 F8 F9 F10
#---------------------------------------------------------------
prop.table(x, margin = NULL)
#---------------------------------------------------------------
Ejemplo 12.3. Haga una tabla de los miembros de cada familia según se-
xo utilizando table() y calcule las proporciones de ambos sexos en cada
familia con la prop.table().
Ejemplo 12.4. Haga una tabla con los miembros de las familias según edad
y sexo utilizando table(). Resuma esta tabla en otra más sencilla.
sex
F M
(0,20] 10 11
(20,45] 10 9
Ejemplo 12.5. Haga una tabla de contingencia con sexo y edad categorizada
en tres grupos (niño, adolescente y adulto) empleando la función tabpct().
Original table
age3
sex niño adolescente adulto Total
F 4 6 10 20
M 9 2 9 20
Total 13 8 19 40
Row percent
age3
sex niño adolescente adulto Total
F 4 6 10 20
(20) (30) (50) (100)
M 9 2 9 20
(45) (10) (45) (100)
Column percent
age3
sex niño % adolescente % adulto %
F 4 (30.8) 6 (75) 10 (52.6)
M 9 (69.2) 2 (25) 9 (47.4)
Total 13 (100) 8 (100) 19 (100)
Figura 12.2: Distribución del sexo según tres grupos de edad en los miembros de las
10 familias.
www.editorialuc.es
Distribution of age3 by sex
F M
niño
adolescente
age3
adulto
sex
Ejemplo 12.6. Haga una tabla de los miembros de las familias según sexo
utilizando xtabs().
Ejemplo 12.7. En los datasets disponibles en R está esoph, una BdD que
contiene los datos de un estudio de casos y controles llevado a cabo en Fran-
cia [171]. Hay 5 variables: (1) agegp, (2) alcgp, (3) tobgp, (4) ncases y (5)
ncontrols. Se le pide que utilizando la función xtabs() haga unas tablas
de los casos y controles según el consumo de alcohol y otra según el consumo
de tabaco.
> head(esoph, 3)
agegp alcgp tobgp ncases ncontrols
1 25-34 0-39g/day 0-9g/day 0 40
2 25-34 0-39g/day 10-19 0 10
3 25-34 0-39g/day 20-29 0 6
> tail(esoph, 3)
agegp alcgp tobgp ncases ncontrols
86 75+ 80-119 10-19 1 1
87 75+ 120+ 0-9g/day 2 2
88 75+ 120+ 10-19 1 1
#---------------------------------------------------------------
ftable(x, ...)
#---------------------------------------------------------------
Ejemplo 12.8. Haga una tabulación de los miembros de las familias (relati-
ve) según sexo (sex) y su estado (alive) utilizando la función ftable() y la
función ftable() para comprobar el espacio que se ahorra.
Con la función table() se gasta mucho espacio:
alive
relative FALSE TRUE
hijo1 1 4
hijo2 0 3
hijo3 0 1
hijo4 0 1
hijo5 0 1
madre 0 10
padre 0 0
, , sex = M
alive
relative FALSE TRUE
hijo1 0 5
hijo2 0 3
hijo3 0 3
hijo4 1 0
hijo5 0 0
www.editorialuc.es
madre 0 0
padre 0 9
Función Acción
addmargins() Marginales en una tabla
as.table() Convierte en tabla
c() Concatena elementos
class() Clase de un objeto
cut2() Categoriza un vector numérico
factor() Crea una factor
ftable() Crea una tabla plana
head() Primeros 6 elemento
is.table() Evalúa si es una table
levels() Niveles de un factor
load() Lee un fichero
margintable() Marginales en una tabla (por filas o por columnas)
paste() Concatena cadenas
prop.table() Proporciones en una tabla (por filas o por columnas)
round() Redondeo de decimales
tab1() Crea una tabla de una dimensión
table() Crea una tabla de 1, 2 o más entradas
tabpct() Tablas de dos vı́as
tail() Últimos 6 elementos
xtabs() Crea una tabla de 1, 2 o más entradas
PROBLEMAS
Problema 1. Con los datos de las familias, haga una tabla bidimensional con el
número de padres, madres e hijos en cada una de las 10 familias.
Problema 2. Con los datos de las familias creó en un ejemplo anterior una tabla de
contingencia con el sexo (sex) y la edad categorizada en niños, adolescentes y adultos
(age3). Vuelva a crear la tabla y utilizando la función addmargins() se le pide
que añada los totales por filas y columnas.
Problema 3. Con los datos del problema anterior emplee la función prop.table()
para crear tres tablas de proporciones: 1) con los porcentajes por filas, 2) con los por-
centajes por columnas, y 3) con los porcentajes por el total de casos.
Problema 4. Siendo x <- table(sex, age3) ¿Los resultados con las funcio-
nes margin.table(x, 1) y rowSums(x) son iguales?
Problema 5. Siendo x <- table(sex, age3) ¿Los resultados con las funcio-
nes margin.table(x, 2) y colSums(x) son iguales?
Problema 6. Con los datos de las familias presente una tabla de contingencia con la
edad categorizada como niño, adolescente y adulto age3, el sexo sex y las familias
family.
Listas
Una lista es un tipo de vector especial, que tiene una longitud determinada
pero, a diferencia de los vectores vistos hasta ahora, puede estar formado por
distintos tipos de elementos, incluso otras listas [150], por tanto, una lista es un
contenedor de otros objetos, es decir, puede verse una lista como una colección
de cajas [170] en las que podemos guardar distingos tipos de objetos.
Las listas se utilizan mucho como resultado de funciones o como resultado
de un análisis estadı́stico. Las listas juegan un papel importantı́simo en R [?],
ya que son la base de los data frame y de la programación orientada a objetos.
Las listas tienen su propia clase, como podemos ver:
[[2]]
[1] 635 670 1097 693 352 205 128 852 484 1035 92 161
-------------------- lı́neas omitidas --------------------
[289] 174 390 1112 65 36 1195 995 914 75 1117 726 128
[[3]]
[1] FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE
-------------------- lı́neas omitidas --------------------
[291] FALSE FALSE TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE
> class(objeto_lista)
[1] "list"
> rm(a, b, c, n)
141
Libros de Estadística en PDF | Statistics Books in PDF
142 CAPÍTULO 13. LISTAS
pueden ser rotos en otros más básicos), sino que es un vector recursivo (llamado
ası́ porque sus elementos son listas) [101, 146].
Hjalmarson et al. [173] estudiaron el efecto del metoprolol frente a placebo
en la mortalidad después de un infarto agudo de miocardio medida 90 dı́as
después del infarto 1 .
data: m
X-squared = 4.6971, df = 1, p-value = 0.03021
> str(chi_test)
List of 9
$ statistic: Named num 4.7
..- attr(*, "names")= chr "X-squared"
$ parameter: Named int 1
..- attr(*, "names")= chr "df"
$ p.value : num 0.0302
$ method : chr "Pearson’s Chi-squared test with Yates’ continuity correction"
$ data.name: chr "m"
$ observed : num [1:2, 1:2] 62 635 40 658
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:2] "Died" "Survived"
.. ..$ : chr [1:2] "Placebo" "Metoprolol"
1 The effect of metoprolol on mortality was compared with that of placebo in a double blind
randomised trial in patients with definite or suspected acute myocardial infarction. Treatment
with metoprolol or placebo started as soon as possible after the patient’s arrival in hospital and
was continued for 90 days. Metoprolol was given as a 15 mg intravenous dose followed by oral
administration of 100 mg twice daily. 1395 patients (697 on placebo and 698 on metoprolol) were
included in the trial. Definite acute myocardial infarction developed in 809 and probable infar-
ction in 162. Patients were allocated to various risk groups and within each group patients were
randomly assigned to treatment with metoprolol or placebo. There were 62 deaths in the placebo
group (8.9 %) and 40 deaths in the metoprolol group (5.7 %), a reduction of 36 % (p less than 0.03).
Mortality rates are given according to the treatment group to which the patients were initially
randomly allocated.
www.editorialuc.es
.. ..$ : chr [1:2] "Died" "Survived"
.. ..$ : chr [1:2] "Placebo" "Metoprolol"
$ residuals: num [1:2, 1:2] 1.546 -0.434 -1.545 0.434
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:2] "Died" "Survived"
.. ..$ : chr [1:2] "Placebo" "Metoprolol"
$ stdres : num [1:2, 1:2] 2.27 -2.27 -2.27 2.27
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:2] "Died" "Survived"
.. ..$ : chr [1:2] "Placebo" "Metoprolol"
- attr(*, "class")= chr "htest"
> rm(m, chi_test)
> length(chi_test)
[1] 9
Los corchetes sencillos dan el objeto que está en una determinada posición,
mientras que los corchetes dobles nos dan el contenido del objeto seleccionado,
por eso debemos utilizar los corchetes dobles (([[x]])) en vez de los sencillos
(([x])).
> chi_test$observed
Placebo Metoprolol
Died 62 40
Survived 635 658
> chi_test$expected
Placebo Metoprolol
Died 50.96344 51.03656
Survived 646.03656 646.96344
13.1. Crear
Las listas se crean con la función list(), incluyendo como argumentos
distintos objetos con nombre o sin él.
#---------------------------------------------------------------
list(...)
#---------------------------------------------------------------
Ejemplo 13.3. Cree una lista formada por un vector numérico con los núme-
ros del 1 al 20, un vector sin nombre con las seis primeras letras, una de
cadena de caracteres con tres nombres propios, una matriz cuadrada con los
primeros 25 números naturales y un data frame con dos variables numéri-
cas, la primera, llamada x, con los cinco primeros números naturales y la
segunda, llamada y, con los números del 50 al 46.
> lista <- list(a = 1:20,
+ letters[1:6],
+ c = c(’Juan’, ’Marta’, ’Elisa’),
+ d = matrix(1:25, nr = 5),
+ e = data.frame(x = 1:5, y = 50:46))
> lista
$a
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[19] 19 20
[[2]]
[1] "a" "b" "c" "d" "e" "f"
$c
[1] "Juan" "Marta" "Elisa"
$d
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
$e
x y
1 1 50
2 2 49
3 3 48
4 4 47
5 5 46
13.2. Nombrar
Los nombres de los ((bin)) que forman la lista se pueden poner cuando se
crea la lista (como hemos visto en el ejemplo anterior) o posteriormente con la
función names().
www.editorialuc.es
> names(lista) # segundo ’bin’ sin nombre
[1] "a" "" "c" "d" "e"
> names(lista)[2] <- ’b’ # se asigna nombre
> names(lista) # todos los objetos con nombre
[1] "a" "b" "c" "d" "e"
Ejemplo 13.5. Cree una copia de la lista anterior y elimine los nombres de
sus componentes. Compruebe que los ha suprimido y elimine esta copia.
13.3. Indexar
Una lista es como un tren de mercancı́as, cada componente es un vagón
del tren y cada vagón tiene su propio contenido [148], de manera que cuando
queramos acceder a un bin lo podemos hacer con los corchetes simples [bin],
pero cuando queremos acceder al contenido del bin emplearemos los corchetes
dobles [[número]] o si la lista tiene nombre, mediante $
Ejemplo 13.6. Reemplace el segundo componente del objeto lista por otro
similar pero que contenga las mismas letras en mayúsculas.
$b
[1] "A" "B" "C" "D" "E"
$c
[1] "Juan" "Marta" "Elisa"
$d
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
$e
x y
1 1 50
2 2 49
3 3 48
4 4 47
5 5 46
Ejemplo 13.7. Reemplace el valor 50 del data frame de la lista por 500. Vi-
sualice que ha hecho el cambio. Vuelva a cambiarlo a su valor original y
compruebe que lo ha hecho bien.
www.editorialuc.es
Con una lista se pueden hacer operaciones, pero en general se utilizan po-
co debido a que la lista suele estar formada por elementos de distintos tipos,
por lo que es muy difı́cil que se quiera hacer lo mismo con cada uno de sus
componentes.
Se emplean dos funciones: lapply (list apply) y sapply (simplified apply):
lapply() aplica una función a cada uno de los componentes de la lista
y devuelve una lista.
sapply() aplica una función a cada uno de los componentes de la lista
y devuelve un vector.
Ejemplo 13.8. ¿Cuántos elementos tiene lista y qué longitud tiene cada
uno de ellos?
> length(lista)
[1] 5
> lapply(lista, length)
$a
[1] 20
$b
[1] 5
$c
[1] 3
$d
[1] 25
$e
[1] 2
13.6. Eliminar
13.6.1. Eliminar la clase
La clase ((list)) se puede eliminar con la función unlist(), que convierte el
objeto lista en un vector atómico con todos los elementos de la lista.
#---------------------------------------------------------------
unlist(x, recursive = TRUE, use.names = TRUE)
#---------------------------------------------------------------
www.editorialuc.es
> lista_sin5 # visualización de la nueva lista
$a
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
$b
[1] "A" "B" "C" "D" "E"
$c
[1] "Juan" "Marta" "Elisa"
$d
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
Función Acción
addmargins() Marginales en una tabla
class() Clase de un objeto
chisq.test() Prueba de ji cuadrado
dimnames() Pone nombre a un objeto
lapply() Aplica una función y devuelve una lista
length() Longitud de un vector
list() Crea una lista
matrix() Crea una función
names() Pone nombre a un objeto
print() Imprime en pantalla
rm() Remueve objetos
sample() Muestreo aleatorio
sapply() Aplica una función y simplifica
str() Estructura de un objeto
unlist() Elimina la estructura de una lista
PROBLEMAS
Problema 1. Compruebe que el objeto ((objeto lista)) creado anteriormente está for-
mado por tres componentes, cada uno de ellos de longitud 300.
Problema 2. Calcule la media del los datos contenidos en el segundo componente de
objeto lista utilizando únicamente una lı́nea de código.
Problema 3. ¿Es posible concatenar dos listas con la función c()? Demuéstrelo con
un ejemplo.
Problema 4. Si una lista está formada por tres vectores de longitud 10, 20 y 30
respectivamente, ¿cuál será la longitud de esa lista?
Matrices
14.1. Introducción
Se llama matriz a una disposición de elementos del mismo tipo en filas y
columnas. Es un vector con dos dimensiones. Una matriz numérica es un es-
quema formal de elementos de un conjunto numérico ordenados rectangular-
mente en filas y columnas [174]. En R una matriz es es un vector de datos que
tiene el atributo dim (dimensiones) especificando un doble ı́ndice [102].
Las matrices se representan con letras mayúsculas y con subı́ndices (filas y
columnas). Por ejemplo, Am×n se trata de la matriz A, que consta de m filas
y n columnas. Cada elemento se representa con una letra minúscula con dos
subı́ndices aij .
a11 a12 ... a1j ... a1n
a21 a22 ... a2j ... a2n
a31 a32 ... a3j ... a3n
A :=
... ... ... ... ... ...
ai1 ai2 ... aij ... ain
... ... ... ... ... ...
am1 am2 ... amj ... amn
Por ejemplo:
5 4 2 1
2 3 1 −2
M :=
−5 −7 −3
9
1 −2 −1 4
14.2. Creación
Las matrices se pueden crear de tres maneras:
151
Libros de Estadística en PDF | Statistics Books in PDF
152 CAPÍTULO 14. MATRICES
#---------------------------------------------------------------
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
dimnames = NULL)
#---------------------------------------------------------------
[1] TRUE
> v # se visualiza
www.editorialuc.es
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
Los nombres de los vectores pasan a ser los nombres de las columnas si se
ha empleado cbind() o los nombres de las filas si se ha utilizado rbind().
Ejemplo 14.2. Lea el fichero vectores familias.RData y cree una matriz con
los vectores age, weight, height, waist, empleando la función cbind()
e imprı́malos en la consola de R.
> load(’vectores_familias.RData’)
> (M <- cbind(age, weight, height, waist))
age weight height waist
[1,] 42 78.0 173.0 89.2
[2,] 39 57.3 164.5 66.4
[3,] 13 42.7 156.3 60.1
------ lı́neas omitidas ------
[40,] 29 88.9 170.5 88.2
[41,] 22 70.3 160.3 69.0
[42,] 1 10.5 75.0 49.5
$dimnames
$dimnames[[1]]
[1] "F1" "F2" "F3"
$dimnames[[2]]
NULL
$dimnames
$dimnames[[1]]
[1] "F1" "F2" "F3"
$dimnames[[2]]
[1] "C1" "C2" "C3" "C4"
Ejemplo 14.3. En el ejemplo anterior creó una matriz con la edad, peso, al-
tura y cintura de los miembros de las familias. Ponga nombres a las filas de
www.editorialuc.es
la matriz con los nombres de los sujetos.
En muchas ocasiones interesa dar los nombres en un único paso con la fun-
ción dimnames(), que precisa que le pasemos –obligatoriamente– los nombres
en una lista y no en dos vectores.
En otras ocasiones interesa eliminar los nombres de las filas, de las colum-
nas o ambos a la vez. Esto se realiza asignando NULL a los nombres de la di-
mensión que interese.
Ejemplo 14.6. Quite los nombres de las filas y de las columnas a la matriz N.
Ejemplo 14.7. Se desea calcular la odds ratio (OR) del estudio de cohortes
anterior en el que se creó la matriz E.
Como la OR es la razón de los productos cruzados [175], se necesita acceder a
cada uno de los elementos de la matriz:
> addmargins(E)
No expuesto Expuesto Sum
Enfermo 23 416 439
Sano 217 315 532
Sum 240 731 971
> or <- (E[1, 2] * E[2, 1] / (E[1, 1] * E[2, 2]))
> or # OR = 416 * 217 / (23 * 315)
[1] 12.4599
Ejemplo 14.9. Cree una matriz numérica de 7x5 con los primeros 35 núme-
ros naturales y a continuación elimine las filas 2 y 4 y después elimine las
www.editorialuc.es
columnas 1, 2, 6 y 7.
> addmargins(A)
Enfermo Sano Sum
Factor 23 25 48
No factor 12 78 90
Sum 35 103 138
> addmargins(t(A))
Factor No factor Sum
Enfermo 23 12 35
Sano 25 78 103
Sum 48 90 138
> nrow(A)
[1] 2
> ncol(A)
[1] 2
> diag(A)
[1] 23 78
> det(A)
[1] 1494
> diag(7)
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1 0 0 0 0 0 0
[2,] 0 1 0 0 0 0 0
[3,] 0 0 1 0 0 0 0
[4,] 0 0 0 1 0 0 0
[5,] 0 0 0 0 1 0 0
[6,] 0 0 0 0 0 1 0
[7,] 0 0 0 0 0 0 1
Ejemplo 14.14. Cree una matriz diagonal cuya diagonal sea el vector 1:7.
www.editorialuc.es
> x <- 1:7
> diag(x, length(x))
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 1 0 0 0 0 0 0
[2,] 0 2 0 0 0 0 0
[3,] 0 0 3 0 0 0 0
[4,] 0 0 0 4 0 0 0
[5,] 0 0 0 0 5 0 0
[6,] 0 0 0 0 0 6 0
[7,] 0 0 0 0 0 0 7
Ejemplo 14.15. Cree una matriz diagonal 7x7 cuya diagonal principal sea el
número 8.
> x <- 1:7
> diag(8, length(x))
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 8 0 0 0 0 0 0
[2,] 0 8 0 0 0 0 0
[3,] 0 0 8 0 0 0 0
[4,] 0 0 0 8 0 0 0
[5,] 0 0 0 0 8 0 0
[6,] 0 0 0 0 0 8 0
[7,] 0 0 0 0 0 0 8
Ejemplo 14.16. En una matriz H formada por los 15 primeros números na-
turales, calcule la matriz triangular inferior.
> (H <- matrix(1:25, nrow = 5))
[,1] [,2] [,3] [,4] [,5]
[1,] 1 6 11 16 21
[2,] 2 7 12 17 22
[3,] 3 8 13 18 23
[4,] 4 9 14 19 24
[5,] 5 10 15 20 25
> lower.tri(H) # es igual que col(H) < row(H)
[,1] [,2] [,3] [,4] [,5]
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE FALSE
[5,] TRUE TRUE TRUE TRUE FALSE
> H[lower.tri(H)]
[1] 2 3 4 5 8 9 10 14 15 20
> H[upper.tri(H)] <- NA
> H
[,1] [,2] [,3] [,4] [,5]
[1,] 1 NA NA NA NA
[2,] 2 7 NA NA NA
[3,] 3 8 13 NA NA
[4,] 4 9 14 19 NA
[5,] 5 10 15 20 25
Ejemplo 14.17. En una matriz H formada por los 15 primeros números na-
turales, calcule el vector que forma la matriz triangular superior.
>
> # Se crea una matriz llamada G uniendo los vectores por filas
www.editorialuc.es
> G <- rbind(mujer_1, mujer_2, mujer_3, mujer_4,
+ mujer_5, mujer_6, mujer_7)
>
> # Se ponen nombres a las columnas (las filas ya lo tienen)
> colnames(G) <- paste(’dı́a’, 1:5, sep = ’_’)
>
> G # se visualiza la matriz
dı́a_1 dı́a_2 dı́a_3 dı́a_4 dı́a_5
mujer_1 94 78 102 87 95
mujer_2 83 91 81 84 86
mujer_3 71 78 74 84 66
mujer_4 113 99 116 121 100
mujer_5 121 114 128 132 124
mujer_6 100 102 115 107 104
mujer_7 80 89 78 101 92
> rowSums(G) # total filas
mujer_1 mujer_2 mujer_3 mujer_4 mujer_5 mujer_6 mujer_7
456 425 373 549 619 528 440
> colSums(G) # total columnas
dı́a_1 dı́a_2 dı́a_3 dı́a_4 dı́a_5
662 651 694 716 667
> colMeans(G) # glucemia media cada uno de los dı́as
dı́a_1 dı́a_2 dı́a_3 dı́a_4 dı́a_5
94.57143 93.00000 99.14286 102.28571 95.28571
> rowMeans(G) # glucemia media en cada mujer
mujer_1 mujer_2 mujer_3 mujer_4 mujer_5 mujer_6 mujer_7
91.2 85.0 74.6 109.8 123.8 105.6 88.
Hay una función interesante rowsum() que permite calcular sumas en las
matrices según un determinado factor.
Se aprecia que cada dı́a la glucemia de las mujeres con sobrepeso es mayor
que en las que tienen normopeso.
Otra función que se utiliza mucho es apply(), que permite aplicar a una
matriz una función por un margen (filas o por columnas). Los argumentos son:
apply(matriz, margen, función). Ası́ para calcular la suma de las filas
(igual que con la función rowSums()) se harı́a con:
Una función útil es aquella que elimina las filas de una matriz que conten-
gan algún valor missing, como es la función nomiss() del paquete Hmisc.
www.editorialuc.es
Función Significado
t() traspuesta
det() determinante
diag(M) extrae la diagonal de la matriz M
diag(vector) crea una matriz diagonal
diag(n) crea una matriz identidad de tamaño n × n
eigen(M) crea una lista con autovalores y los autovectores de
una matriz cuadrada
svd(M) descomposición de la matriz M en valores singulares
solve() matriz inversa
> A + 1 # suma
[,1] [,2] [,3]
[1,] 2 5 8
[2,] 3 6 9
[3,] 4 7 10
> A - 2 # resta
[,1] [,2] [,3]
[1,] -1 2 5
[2,] 0 3 6
[3,] 1 4 7
> A * 3 # multiplicación
[,1] [,2] [,3]
[1,] 3 12 21
[2,] 6 15 24
[3,] 9 18 27
> A / 4 # división
[,1] [,2] [,3]
[1,] 0.25 1.00 1.75
[2,] 0.50 1.25 2.00
[3,] 0.75 1.50 2.25
> A ˆ 5 # potencia
[,1] [,2] [,3]
[1,] 1 1024 16807
[2,] 32 3125 32768
[3,] 243 7776 59049
> sqrt(A) # raı́z cuadrada
[,1] [,2] [,3]
[1,] 1.000000 2.000000 2.645751
[2,] 1.414214 2.236068 2.828427
[3,] 1.732051 2.449490 3.000000
> log(A) # logaritmo decimal
[,1] [,2] [,3]
[1,] 0.0000000 1.386294 1.945910
[2,] 0.6931472 1.609438 2.079442
[3,] 1.0986123 1.791759 2.197225
Ejemplo 14.23. Si x <- 1:10, calcule x*x, x’*x y x*x’, siendo x’ el tras-
puesto del vector original.
> x <- 1:10
> x % *% x # producto interno de dos vextores
[,1]
[1,] 385
> t(x) %*% x # traspuesto (1xn) por original (nx1)
[,1]
[1,] 385
>
> x %o% x # producto externo de dos vectores
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 2 3 4 5 6 7 8 9 10
[2,] 2 4 6 8 10 12 14 16 18 20
[3,] 3 6 9 12 15 18 21 24 27 30
[4,] 4 8 12 16 20 24 28 32 36 40
www.editorialuc.es
[5,] 5 10 15 20 25 30 35 40 45 50
[6,] 6 12 18 24 30 36 42 48 54 60
[7,] 7 14 21 28 35 42 49 56 63 70
[8,] 8 16 24 32 40 48 56 64 72 80
[9,] 9 18 27 36 45 54 63 72 81 90
[10,] 10 20 30 40 50 60 70 80 90 100
> x %*% t(x) # original (nx1) por traspuesto (1xn)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1 2 3 4 5 6 7 8 9 10
[2,] 2 4 6 8 10 12 14 16 18 20
[3,] 3 6 9 12 15 18 21 24 27 30
[4,] 4 8 12 16 20 24 28 32 36 40
[5,] 5 10 15 20 25 30 35 40 45 50
[6,] 6 12 18 24 30 36 42 48 54 60
[7,] 7 14 21 28 35 42 49 56 63 70
[8,] 8 16 24 32 40 48 56 64 72 80
[9,] 9 18 27 36 45 54 63 72 81 90
[10,] 10 20 30 40 50 60 70 80 90 100
>
> t(x) %*% t(x) # traspuesto (1xn) por traspuesto (1xn)
Error in t(x) %*% t(x) : argumentos no compatibles
> x == t(x) # verdadero
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
#---------------------------------------------------------------
crossprod(x, y = NULL)
tcrossprod(x, y = NULL)
#---------------------------------------------------------------
Ejemplo 14.24. Sea el vector x los números 1:10 y la matriz H (10x3) formada
por los primeros 30 números naturales. Calcule H’x y H’H.
www.editorialuc.es
> A % *% H
[,1] [,2] [,3]
[1,] 90 54 18
[2,] 114 69 24
[3,] 138 84 30
> H % *% A
[,1] [,2] [,3]
[1,] 30 84 138
[2,] 24 69 114
[3,] 18 54 90
#---------------------------------------------------------------
solve(a, b, ...)
#---------------------------------------------------------------
Función Acción
addmargins() Añade los marginales a una matriz
apply() aplica una función a una matriz por filas o por columnas
attributes() Muestra los atributos de un objeto
c() Crea objetos concatenando elementos
cbind() Une por columnas
colMeans() Calcula las medias de las columnas de una matriz
colnames() Asigna o muestra los nombres de las columnas
colSums() Calcula las sumas de laas columnas de una matriz
det() Calcula el determinante de una matriz
diag() Calcula la diagonal principal de una matriz
dim() Dimensiones de una matriz
dimnames() Asigna nombres a las filas y a las columnas de una ma-
triz
eigen() Calcula los eigenvalues
factor() Crea un factor
is.matrix() Comprueba si es una matriz
load() Lee un fichero de datos
matrix() Crea una matriz
Continúa en la página siguiente...
Función Acción
nomiss() Elimina las filas que contienen algún NA
www.editorialuc.es
rbind() Une objetos por filas
rm() Remueve objetos de la memoria
rowMeans() Calcula las medias de las filas de una matriz
rownames() Nombres de las filas
rowsum() Calcula sumas de una matriz según un factor
rowSums() Calcula las sumas de laas filas de una matriz
solve() Calcula la inversa de una matriz o resuelve un sistema
de ecuaciones
svd() Calcula la descomposición singular de una matriz
t() Traspuesta de una matriz
tapply() Aplica una función a una matriz
PROBLEMAS
Problema 1. Resuelva el siguiente sistema de ecuaciones:
3x + 4y = 12
x + 2y = 8
Arrays
Una matriz es una disposición de elementos del mismo tipo en filas y co-
lumnas; es un vector con dos dimensiones. Los arrays también es una dispo-
sición ordenada de elementos de igual tipo, que si tienen dos dimensiones es
igual que una matriz, pero los arrays pueden tener más de dos dimensiones.
Por ejemplo, para almacenar una tabla 2x2 de un factor causal (expuesto y no
expuesto) y una variable resultado (sano o enfermo) se puede utilizar una ma-
triz. Pero si esta misma tabla es recogida teniendo en cuenta el sexo, en vez de
tener dos tablas, una para hombres y otra para mujeres, es mejor almacenar los
datos en un array con tres dimensiones: factor, resultado y sexo.
La mayorı́a de los paquetes estadı́sticos manejan un array o BdD a la vez.
R es capaz de manejar varios a la vez debido a que es un programa orientado
a los objetos.
15.1. Creación
Los array (un caso más general que las matrices) se crean con la función
array().
#---------------------------------------------------------------
array(data = NA, dim = length(data), dimnames = NULL)
#---------------------------------------------------------------
171
Libros de Estadística en PDF | Statistics Books in PDF
172 CAPÍTULO 15. ARRAYS
noExp Exp
Enf 160 240
Sano 270 330
, , Mujeres
noExp Exp
Enf 440 160
Sano 320 80
> class(A)
[1] "array"
chd 9 15 24
No chd 30 107 137
www.editorialuc.es
Sum 39 122 161
, , Sum
Ejemplo 15.3. Calcule los riesgos relativos en cada uno de los cuatro estratos
del array evans.
#---------------------------------------------------------------
aperm(a, perm = NULL, resize = TRUE, ...)
#---------------------------------------------------------------
cat No cat
age < 55, ecg = 0 1 17
age < 55, ecg = 1 3 7
age 55+, ecg = 0 9 15
age 55+, ecg = 1 14 5
, , No chd
cat No cat
age < 55, ecg = 0 7 257
age < 55, ecg = 1 14 52
age 55+, ecg = 0 30 107
age 55+, ecg = 1 44 27
Función Acción
addmargins() Añade los marginales cuando se imprime un array
aperm() Permuta las dimensiones de un array
array() Crea un array
prop.table() Proporciones en una tabla, por filas o por columnas
PROBLEMAS
Problema 1. Selvin [182] en su libro Statistical Tools for Epidemiologic Re-
search, página 45, presenta los datos (en tablas 2x2) de bajo peso al nacer (< 2500 g)
y hábito tabáquico en las madres, estratificado según etnia/raza (blancas, afroamerica-
nas, hispanas, y asiáticas) con los siguientes datos: c(98, 169, 832, 3520, 54, 55, 227,
686, 11, 61, 85, 926, 7, 90, 102, 1936). Se le pide que cree un array con estos datos,
lo imprima en la consola y -suponiendo que fuera un estudio prospectivo- calcule en
qué estrato hay mayor riesgo relativo.
Problema 2. Con los datos del estudio ((Evans County)), calcule la OR en cada
estrato sabiendo que la OR es la rezan de los productos cruzados.
Problema 3. En el estudio ((Evans County)), ¿qué estrato tiene la OR con el valor
más elevado?, ¿son simulares los valores de OR y RR?
Data frames
16.1. Creación
La manera más sencilla de crear una BdD con la función data.frame()
que permite unir varios vectores en una BdD.
#---------------------------------------------------------------
data.frame(..., row.names = NULL, check.rows = FALSE,
check.names = TRUE, fix.empty.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
#---------------------------------------------------------------
Ejemplo 16.1. En el capı́tulo sobre ((vectores)), tabla 10.1, se presentó una dis-
posición rectangular de datos que sirvieron para crear una serie de vectores:
id, family, relative, nom, age, alive, sex, weight, height, waist.
Utilicemos la función data.frame() para crear un dataframe.
> load(’vectores_familias.RData’)
> df <- data.frame(id, family, relative, nom, age, alive,
+ sex, weight, height, waist)
> df
id family relative nom age alive sex weight height waist
175
Libros de Estadística en PDF | Statistics Books in PDF
176 CAPÍTULO 16. DATA FRAMES
16.2. Lectura
La manera más eficiente, y por tanto la más utilizada, para recuperar una
BdD y poderla analizar es con la función read.table(). Hay otras funciones
disponibles, como vamos a ver a continuación. Se utilizará una u otra en virtud
de las caracterı́sticas de los datos almacenados que queramos recuperar.
www.editorialuc.es
3 3 F1 hijo1 Juan 13 TRUE M 42.7 156.3 60.1
Si los números están con la coma decimal en vez del punto, la lectura será in-
correcta, porque R convierte los vectores numéricos en cadenas (por tanto los
leerá como factores) y sus NA pasan a <NA>.
Para leerlo bien deberemos especificar que los decimales están con comas
pasando otro parámetro (dec=’,’) a la función read.table():
www.editorialuc.es
3 3 F1 hijo1 Juan 13 TRUE M 42.7 156.3 60.1
4 4 F1 hijo2 Lucı́a 12 TRUE F 38.3 147.6 53.2
5 5 F1 hijo3 Marcos 9 TRUE M 27.7 130.2 54.6
6 6 F1 hijo4 Miguel NA FALSE M NA NA NA
%#---------------------------------------------------------------
Función Acción
read.arff() Lee datos en formato ARFF (Weka Attribute-Relation
File Format
read.csv2() Lee datos en formato cdv adaptado al español
read.dbf() Lee datos en formato dBase
read.DIF() Lee datos en formato DIF (Data Interchange Format)
read.dta() Lee datos en formato Stata
read.epiinfo() Lee datos en formato EpiInfo
read.fortran() Lee datos en formato Fortran
read.ftable() Lee datos en formato tablas planas
read.fwf() Lee datos en formato fijo
read.mtp() Lee datos en formato Minitab
read.octave() Lee datos en formato Octave
read.spss() Lee datos en formato SPSS
read.ssd() Lee datos en formato SAS
read.systat() Lee datos en formato Systat
read.xport() Lee datos en formato SAS-Xport
www.editorialuc.es
buffersize = 2000, ...)
read.mtp(file)
read.octave(file)
read.ssd(libname, sectionnames,
tmpXport=tempfile(), tmpProgLoc=tempfile(), sascmd="sas")
read.xport(file)
%#---------------------------------------------------------------
> set.seed(2016)
> (df8 <- df6[sample(df6$id, 10), ])
id family relative nom age alive sex weight height waist
8 8 F2 padre Luis 37 TRUE M 86.9 172.5 93.0
6 6 F1 hijo4 Miguel NA FALSE M NA NA NA
%#---------------------------------------------------------------
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"), incomparables = NULL,
...)
%#---------------------------------------------------------------
Ejemplo 16.4. Supongamos que, además de la BdD df6 con los datos de
las familias, tenemos otra BdD de los mismos sujetos (aunque nos faltan los
datos de dos familias) en la que hemos registrado la ciudad en la que viven
y en nivel de colesterol total (mg/dL). Queremos unir las dos BdD (llamadas
df6 y df9) en una única llamada df10.
16.5.1. Dimensiones
Las dimensiones de una BdD se exploran con la función dim(). Devuelve
www.editorialuc.es
dos valores, el primero corresponde al número de filas y el segundo al de las
columnas.
> dim(DF)
[1] 632 9
El resultado de explorar la BdD con la función dim() [632 9] nos está indi-
cando que es una BdD que contiene 632 registros y 9 variables.
16.5.2. Estructura
La estructura de un DF se explora con la función str(). Es muy impor-
tante cuando uno comienza a trabajar con una BdD el conocer su estructura,
qué variables contiene, cómo se llaman, de qué tipo son, etc.
Por ser una lista podemos utilizar el operador $, por lo que para acceder a
una variable deberemos teclear DF$variable:
> DF$bp
[1] 90 78 82 58 78 60 64 55 66 62 70 90 62 96 52
[16] 88 72 72 70 82 76 90 78 74 85 NA 72 70 70 88
------------------------ filas omitidas ------------------------
[601] 84 40 56 62 74 64 50 64 64 30 68 78 78 62 66
[616] 64 76 56 84 50 88 90 86 60 74 60 74 84 46 88
[631] 70 78
> str(df10)
’data.frame’: 42 obs. of 12 variables:
$ id : int 1 2 3 4 5 6 7 8 9 10 ...
$ family : Factor w/ 10 levels "F1","F10","F2",..: 1 1 1 1 1 1
$ relative: Factor w/ 7 levels "hijo1","hijo2",..: 7 6 1 2 3 4
$ nom : Factor w/ 32 levels "Alberto","Ana",..: 30 21 16 18
$ age : int 42 39 13 12 9 NA 3 37 34 7 ...
$ alive : logi TRUE TRUE TRUE TRUE TRUE FALSE ...
$ sex : Factor w/ 2 levels "F","M": 2 1 2 1 2 2 1 2 1 1 ...
$ weight : num 78 57.3 42.7 38.3 27.7 NA 14.6 86.9 62.5 23 ...
$ height : num 173 164 156 148 130 ...
$ waist : num 89.2 66.4 60.1 53.2 54.6 NA 48.3 93 68.5 48 ...
$ ciudad : Factor w/ 5 levels "Barcelona","Bilbao",..: 4 4 4 4
$ ct : int 220 176 175 154 180 166 158 192 220 187 ...
16.5.3. Variables
Las variables son las columnas del DF. Su nombre puede ponerse de mani-
fiesto con la función names().
16.5.4. Registros
Los registros se refieren a cuántos casos o sujetos hay en la BdD. Habitual-
mente hay un registro por persona. Ya veremos que en los estudios longitudi-
nales hay más de un registro por cada uno de los sujetos participantes.
Ejemplo 16.10. Ponga una etiqueta a la BdD de las indias Pima con el si-
guiente texto: ((Diabetes y factores asociados en indias Pima (1988)))
www.editorialuc.es
> des(DF)
Diabetes y factores asociados en indias Pima (1988)
No. of observations = 632
Variable Class Description
1 Id numeric
2 Nemb numeric
3 Glup numeric
4 TAD numeric
5 Ptri numeric
6 IMC numeric
7 Fpdia numeric
8 Edad numeric
9 Diab factor
Ejemplo 16.13. Ordene la BdD de las familias ((df6)) por el peso y la altura.
Ejemplo 16.15. Seleccione los varones con una cintura superior a 90 cm.
www.editorialuc.es
DF[, sapply(DF, is.numeric)]
Para extraer todas las columnas que son un factor:
DF[, sapply(DF, is.factor)]
Para extraer todas las columnas que son factores:
DF[, sapply(DF, is.character)]
Ejemplo 16.17. En la BdD df6 con los datos de las familias, ¿cuántos regis-
tros completos hay?.
> sum(complete.cases(df6))
[1] 38
> summary(df10)
id family relative nom
Min. : 1.00 F1 : 7 hijo1:10 Juan : 4
1st Qu.:11.25 F9 : 6 hijo2: 6 Carmen : 2
Median :21.50 F5 : 5 hijo3: 4 José : 2
Mean :21.50 F6 : 5 hijo4: 2 Marı́a : 2
3rd Qu.:31.75 F8 : 4 hijo5: 1 Marina : 2
Max. :42.00 F10 : 3 madre:10 (Other):29
(Other):12 padre: 9 NA’s : 1
age alive sex weight
Min. : 1.00 Mode :logical F:21 Min. : 8.70
1st Qu.: 6.75 FALSE:2 M:21 1st Qu.:21.93
Median :15.00 TRUE :40 Median :50.75
Mean :20.60 NA’s :0 Mean :47.67
3rd Qu.:36.25 3rd Qu.:67.83
Max. :42.00 Max. :88.90
NA’s :2 NA’s :2
height waist ciudad ct
Min. : 74.0 Min. :43.20 Barcelona: 3 Min. :132.0
1st Qu.:119.0 1st Qu.:48.90 Bilbao : 4 1st Qu.:164.0
Median :159.0 Median :60.30 Burgos : 5 Median :176.0
Mean :143.4 Mean :62.66 Madrid : 7 Mean :188.3
3rd Qu.:167.2 3rd Qu.:73.25 Santander:14 3rd Qu.:200.0
Max. :178.0 Max. :93.00 NA’s : 9 Max. :280.0
NA’s :3 NA’s :3 NA’s :9
#---------------------------------------------------------------
## S3 method for class ’data.frame’
aggregate(x, by, FUN, ..., simplify = TRUE, drop = TRUE)
Ejemplo 16.20. Se quiere calcular la edad media de los padres, las madres,
los hijos primogénitos y los que han nacido en 2o , 3o , 4o y 5o lugar.
www.editorialuc.es
En este capı́tulo se han utilizado las funciones recogidas en la siguiente
Tabla:
Función Acción
aggregate() Aplica una función a un dataframe.
apply() Aplica una función a un dataframe.
complete.cases() Selecciona casos sin NA.
data.frame() Crea un dataframe.
head() Primeros 6 registros de una dataframe.
load() Lee un fichero.
merge() Une dos BdD.
na.exclude() Elimina casos con NA.
na.omit() Elimina casos con NA.
order() Ordena una BdB.
read.csv() Lee un fichero csv.
read.table() Lee una BdD en varios formatos.
rev() invierte el orden.
sample() Muestreo aleatorio.
sapply() Aplica una función a una BdD.
set.seed() Semilla de aleatorización.
str() Estructura de un objeto R.
summary() Resumen de un objeto.
which() Identifica según una condición.
with () Hace accesibles las variables de una BdD.
PROBLEMAS
Problema 1. ¿Cuántos registros completos hay en la BdD df Pima.csv?
Tiempo en R
191
Libros de Estadística en PDF | Statistics Books in PDF
192 CAPÍTULO 17. TIEMPO EN R
17.1. Clases
Varias son las clases relacionadas con el tiempo (Tabla 17.1). La clase ((Date))
es la más sencilla pues son fechas. La clase ((POSIXct)) mide el tiempo como
algo continuo (en segundos desde un origen), mientras que la clase ((POSIXlt))
lo expresa como una lista con varios componentes separados [183].
Clase Significado
POSIXct Fechas + horas (tiempo continuo)
POSIXlt Fechas, Horas (lista de tiempo)
Date Fechas
difftime Diferencias de tiempo (con unidades)
www.editorialuc.es
> Sys.timezone()
[1] "Europe/Madrid"
#---------------------------------------------------------------
Sys.time()
#---------------------------------------------------------------
Ejemplo 17.2. Suponga que son las 18:37:00 del 11 de junio de 2016. ¿Qué in-
formación sobre la fecha y hora tiene el sistema?
Ejemplo 17.3. De la fecha del problema anterior extraiga dos cadenas, una
con la fecha y otra con la hora.
#---------------------------------------------------------------
Sys.Date()
#---------------------------------------------------------------
#---------------------------------------------------------------
date()
#---------------------------------------------------------------
#---------------------------------------------------------------
as.Date(x, format, ...)
#---------------------------------------------------------------
www.editorialuc.es
Cadena Significado
%d Dı́a del mes (01–31)
%m Mes del año en número (01–12)
%b Nombre abreviado del mes
%B Nombre completo del mes
%y Año sin siglo, por ejemplo 16
%Y Año con siglo, por ejemplo 2016
%H Horas del dı́a (00–23) en reloj con formato de 24 horas
%I Horas del dı́a (01–12) en reloj con formato de 12 horas
%p Indicador AM/PM
%M Minutos (00–59)
%S Segundos (00–61)
%U Semana del año (00-53) utilizando el primer domingo como dı́a 1
%W Semana del año (00–53), el primer lunes es el dı́a 1
%a Nombre abreviado del dı́a de la semana
%A Nombre completo del dı́a de la semana
%w Dı́a de la semana (0–6)
%j Dı́a del año (001–366)
#---------------------------------------------------------------
ISOdatetime(year, month, day, hour, min, sec, tz = "")
#---------------------------------------------------------------
Ejemplo 17.9. Cree un objeto fecha con los siguientes datos numéricos: año
2016, mes 06, dia 11, hora 21, minutos 20 y segundos 11.
#---------------------------------------------------------------
difftime(time1, time2, tz,
units = c("auto", "secs", "mins", "hours",
"days", "weeks"))
#---------------------------------------------------------------
www.editorialuc.es
> fnac <- as.Date(fnac, format = ’%d/%m/%Y’)
> fing <- as.Date(fing, format = ’%d/%m/%Y’)
> edad <- as.numeric((fing - fnac) / 365.25)
> edad
[1] 18.29706
Ejemplo 17.11. ¿Cuanto tiempo ha transcurrido desde las 7:2:20 hasta las
14:21:35 del mismo dı́a.
Ahora hay que convertir las cadenas de caracteres de fecha en fechas y los
tres vectores de horas, minutos y segundos en tiempo.
www.editorialuc.es
+ paste(df$hora, df$min, df$seg, sep = ’:’),
+ units = ’secs’)
> df
id fecha hora min seg res dura
1 1 2016-06-20 1 20 13 positivo 4813 secs
2 2 2016-06-20 1 1 2 positivo 3662 secs
3 3 2016-06-20 0 56 13 positivo 3373 secs
4 4 2016-06-21 1 43 17 negativo 6197 secs
5 5 2016-06-21 1 25 0 positivo 5100 secs
6 6 2016-06-21 1 18 20 negativo 4700 secs
Función Acción
as.Date() Convierte una cadena en fecha.
as.difftime() Convierte una cadena en tiempo.
date() Fecha actual.
difftime() Diferencia entre dos fechas.
format() Distintos formatos de tiempo.
ISOdatatime() Convierte números en fechas.
months() Mes de una fecha.
quarters() Trimestre de una fecha.
seq() Genera una secuencia.
substr() Extrae una subcadena.
summary() Resume un vector.
Sys.Date() Fecha del ordenador.
Sys.time() Fecha y hora del sistema.
Sys.timezone() Huso horario del sistema.
weekdays() Dı́a de la semana.
as.POSIXct() Convierte en tiempo continuo.
as.POSIXlt() Convierte en lista de tiempo.
PROBLEMAS
Problema 1. ¿Cómo se llaman las variables que almacenan fecha y tiempo utilizando
la clase POSIXlt?
Problema 2. ¿Qué valores tienen estas variables hoy?
Problema 3. Introduzca le fecha y hora en que empezó a leer este libro. ¿Cuántos
segundos hace de ello?
Problema 4. ¿Qué dı́a de la semana es hoy?
Problema 5. ¿En qué trimestre del año estamos?
Problema 6. ¿Cómo se llama el mes actual?
Problema 7. ¿Cuántos segundos ha vivido usted?
Fórmulas en R
Una clase especial de objetos en R son las fórmulas, que se emplean para
poner de manifiesto relaciones entre variables.
18.1. Declaración
Las fórmulas se declaran con el sı́mbolo ∼ que separa dos partes, la del lado
izquierdo que corresponde a las variables dependientes y la del lado derecho
que corresponde a las variables independientes. Por ejemplo: y ˜ x, significa
que y es modelada en función de x, o que y depende de x.
201
Libros de Estadística en PDF | Statistics Books in PDF
202 CAPÍTULO 18. FÓRMULAS EN R
18.2. Uso
Las fórmulas se emplean fundamentalmente en el modelado de regresión
(lm(), glm(), etc.), aunque también se emplean en gráficos lattice y en alguna
función (xtabs(), plot(), boxplot(), etc.)
Ejemplo 18.2. Dibuje la nube de puntos con los siguientes datos: x = 1:30 e y
= rpois(30, 4) + x.
> set.seed(2016)
> x <- 1:30
> y <- rpois(30, 4) + x
> plot(form1)
●
35
●
● ●
30
●
●
●
●
●
25
●
●
●
●
20
● ●
y
●
●
15
● ●●
●
● ●
10
● ● ●
●
●
5
●
●
0 5 10 15 20 25 30
Ejemplo 18.3. Emplee de tres formas diferentes la función plot() para ob-
tener el mismo gráfico.
www.editorialuc.es
> par(opar); rm(opar)
35
35
● ● ●
● ● ● ● ● ●
30
30
30
● ● ●
● ● ●
● ● ●
● ● ●
● ● ●
25
25
25
● ● ●
● ● ●
● ● ●
● ● ●
20
20
20
● ● ● ● ● ●
y
y
● ● ●
● ● ●
15
15
15
● ●● ● ●● ● ●●
● ● ●
● ● ● ● ● ●
10
10
10
● ● ● ● ● ● ● ● ●
● ● ●
● ● ●
5
5
● ● ●
● ● ●
0 5 10 15 20 25 30 0 5 10 15 20 25 30 0 5 10 15 20 25 30
x x x
13 14 15 16 17 18
Femenino Masculino
●
●
50 ●
● ● ●●
● ●● ● ●●
● ● ● ●
● ● ●
●● ● ●
● ● ● ●●
● ● ●● ● ●●● ● ● ● ● ●
40 ● ● ●
●
●●● ●● ●
fmax
●● ● ● ● ●
● ●
●●● ●● ●
●●●● ● ●●● ●● ●
● ●● ● ● ● ●●● ●● ● ●
●
●●
●
●● ●● ●
●● ● ●●●● ●● ●● ● ●●
●●● ● ● ● ●● ●
30 ● ●● ●
●● ● ● ● ● ● ● ●●● ●●
● ● ● ● ●● ●● ● ●●●●●● ●●● ● ●● ●●●●●● ●●● ●
●●
●● ●
● ● ● ● ●● ●● ● ●
●●●●● ●●● ●●● ●●● ●●●
● ● ●● ●●●● ●●●●
●●● ●● ●● ●●● ● ● ●●
● ● ●
● ● ●● ● ● ●●
● ●●● ● ●● ●●
● ●
●●●
● ●●
● ●● ●●●●● ● ●●●● ● ● ●
●●● ●● ●●● ●● ● ●● ●
● ● ● ●●●●●
● ●
● ●●●
● ●●
●
● ●●●●●
● ●●● ●●
●● ● ●●●
●●
●
●
●●
● ●
●● ● ●● ● ● ● ●
●
● ●
● ● ●●●● ● ● ● ●● ●● ●
●●
●
●
●
●● ●●● ●
● ●● ●
● ●● ●
●
20 ●●●●
●
●●
●
●
●● ●●
●● ● ●● ●
● ● ●● ●●●
●●● ●●● ● ● ●
●●●● ●● ●
●
●●●
●
13 14 15 16 17 18
edad
10 20 30 40 50 60 10 20 30 40 50 60 10 20 30 40 50 60
Fuerza (kgf)
Ejemplo 18.6. Con la BdD de Fuerza modele la fuerza máxima de los adoles-
centes en función de su edad, IMC, sexo, peso, talla y mano dominante (sin
interacciones).
> load(’bd_Fuerza.RData’)
> names(DATA)
[1] "id" "ies" "edad" "curso" "sexo" "md" "sus"
[8] "peso" "talla" "fmd" "fmi" "fmax" "imc"
> lm1 <- lm(fmax ˜ edad + imc + sexo + peso + talla + md,
+ data = DATA)
> summary(lm1)
Call:
lm(formula = fmax ˜ edad + imc + sexo + peso + talla + md, data = DATA)
Residuals:
Min 1Q Median 3Q Max
-14.8454 -3.0234 -0.2797 2.9148 19.0408
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 6.68370 20.56654 0.325 0.74535
edad 0.80824 0.17942 4.505 8.49e-06 ***
imc -0.89490 0.47353 -1.890 0.05943 .
sexoMasculino 5.38189 0.52318 10.287 < 2e-16 ***
peso 0.48687 0.17372 2.803 0.00529 **
talla -0.01917 0.12876 -0.149 0.88172
mdizquierda 1.19024 0.74923 1.589 0.11285
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
www.editorialuc.es
La función update() es muy útil en el modelado ya que ahorra teclear de
nuevo. Aquı́ el ((.)) significa que se incluyen todas las variables del modelo y
con ((–)) se excluyen las que se quieran.
Ejemplo 18.7. Elimine las variables peso y md del modelo y ajuste de nuevo.
Call:
lm(formula = fmax ˜ edad + imc + sexo + talla, data = DATA)
Residuals:
Min 1Q Median 3Q Max
-15.2132 -3.0861 -0.5013 3.1054 18.6112
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -50.01263 4.09628 -12.209 < 2e-16 ***
edad 0.75041 0.17938 4.183 3.46e-05 ***
imc 0.43020 0.06743 6.380 4.41e-10 ***
sexoMasculino 5.62077 0.52319 10.743 < 2e-16 ***
talla 0.33095 0.03058 10.823 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Función Acción
boxplot() Gráfico boxplot
class() Asigna una clase a un objeto
dotPlot() Histograma de puntos (paquete ((mosaic)))
floor() Redondea hacia abajo
glm() Modelo generalizado
lm() Regresión lineal
load() Lee un objeto guardado en un fichero
names() Asigna nombres a un objeto
par() Asigna un parámetro gráfico
plot() Función genérica de dibujo
require() Lee un paquete
rm() Remueve objetos de la memoria
rpois() Vector de elementos que siguen una distribución de Poisson
set.seed() Fija semilla aleatoria
summary() Función genérica de sı́ntesis de un objeto
update() Actualiza un modelo
xtabs() Genera tablas
xyplot() Gráfico condicional
Función Acción
mosaic Funciones generales de R con mosaic [185]
PROBLEMAS
Problema 1. Utilizando una fórmula cree una tabla de la distribución de alumnos
por centro escolar y sexo en la BdD del estudio de la fuerza en adolescentes de 12 a 17
años de edad.
Problema 2. En la fuerza máxima de los adolescentes, ¿interacciona la edad con el
sexo significativamente? Compruébelo creando el modelo adecuado con una fórmula.
Entornos en R
Figura 19.1: Estructura de un entorno que contiene tres nombres. Éstos apuntan a
algún lugar de la memoria RAM donde está almacenado su contenido. Con el punto
y flecha hacia la izquierda se quiere indicar que el entrono ((e)) cuelga de su entorno
padre.
Entorno «e»
c 1, 2, ..., 10
Entorno padre
1, 2, ..., 5
b
A, B, ..., J
a TRUE
●
207
Libros de Estadística en PDF | Statistics Books in PDF
208 CAPÍTULO 19. ENTORNOS EN R
19.1. Tipos
Un marco (frame) asocia nombres con valores [151, 186]. Un entorno es un
marco más una referencia (llamada enclosure) a otro entorno 1 .
> globalenv()
<environment: R_GlobalEnv>
> baseenv()
<environment: base>
> emptyenv()
<environment: R_EmptyEnv>
> environment()
<environment: R_GlobalEnv>
1 Según Venables y Ripley: ((An environment is a frame plus an enclosure, a reference an other envi-
www.editorialuc.es
search()
● emptyenv()
● baseenv() Base
● Autoloads
search() ● methods
datasets
utils
Packages
● grDevices
graphics
● stats
globalenv()
Entorno de trabajo
● environment()
Ejemplo 19.3. Ancle la BdD ((Fuerza)) y compruebe que aparece cuando eje-
cuta la función search().
> load(’bd_Fuerza.RData’)
> attach(DATA)
> search()
[1] ".GlobalEnv" "DATA" "tools:rstudio"
[4] "package:stats" "package:graphics" "package:grDevices"
[7] "package:utils" "package:datasets" "package:methods"
[10] "Autoloads" "package:base"
Ejemplo 19.4. Cree un nuevo entorno que contenga tres objetos: a = 1:10, b
= list(num = 1:5, char = LETTERS[1:10]) y c = TRUE).
19.3.2. Explorar
Para explorar un entorno se utilizan las funciones ls() y ls.str().
> ls(e)
[1] "a" "b" "c"
> ls.str(e)
a : int [1:10] 1 2 3 4 5 6 7 8 9 10
b : List of 2
$ num : int [1:5] 1 2 3 4 5
$ char: chr [1:10] "A" "B" "C" "D" ...
c : logi TRUE
> ls(package:graphics)
[1] "abline" "arrows" "assocplot"
www.editorialuc.es
[10] "barplot.default" "box" "boxplot"
[13] "boxplot.default" "boxplot.matrix" "bxp"
[16] "cdplot" "clip" "close.screen"
[19] "co.intervals" "contour" "contour.default"
--------------- lı́neas omitidas ----------------
[55] "plot" "plot.default" "plot.design"
[58] "plot.function" "plot.new" "plot.window"
[61] "plot.xy" "points" "points.default"
[64] "polygon" "polypath" "rasterImage"
[67] "rect" "rug" "screen"
[70] "segments" "smoothScatter" "spineplot"
[73] "split.screen" "stars" "stem"
[76] "strheight" "stripchart" "strwidth"
[79] "sunflowerplot" "symbols" "text"
[82] "text.default" "title" "xinch"
[85] "xspline" "xyinch" "yinch"
19.3.3. Borrar
Para ubicar un entorno se utilizan las funciones rm().
> rm(e)
19.3.4. Ubicar
Para ubicar un entorno se utilizan las funciones parent.env().
> parent.env(baseenv())
<environment: R_EmptyEnv>
Función Acción
attach() Fija un dataframe y hace accesible sus variables
detach() Desliga el dataframe
emptyenv() Presenta el entorno vacı́o
environment() Presenta el entorno actual
globalenv() Presenta el entorno global
ls() Lista los objetos de un entorno
ls.str() Lista los objetos de un entorno con su contenido
new.env() Crea un nuevo entorno
parent.env() Presenta el entorno padre del entorno actual
rm() Borra los objetos de un entorno
search() Presenta el entorno global y todos sus ancestros
searchpaths() Idem, pero presentando el path donde está su código
PROBLEMAS
Problema 1. ¿Qué obtiene cuando ejecuta la función searchpaths()?
Problema 2. Compruebe que desaparece del resultado proporcionado por la función
search() cuando ejecuta la función detach() pasando como argumento DATA.
GRÁFICOS EN R
Gráficos tradicionales
pima. Esta base de datos está tomada del paquete MASS que consta de 632
registros, de los que 532 están completos y 100 tienen algunos datos au-
sentes. En una población de mujeres indias Pima de 21 años y más de
Phoenix, Arizona (EE. UU.) que llevaban más de cinco años viviendo en
esa comunidad, se investigó la presencia de diabetes según criterios de
la OMS. Los datos están grabados en el fichero bd Pima.csv y con los
nombres de las variables traducidos al español: id número de identifica-
ción, emb número de embarazos, glu p glucemia postprandial (mg/dL),
tad TAD (mm Hg), ptri grosor del pliegue tricipital (mm), imc IMC
(kg/m2 ), fp dia función de pedigree de la diabetes, edad edad (años) y
dial presencia de diabetes según criterios de la OMS.
215
Libros de Estadística en PDF | Statistics Books in PDF
216 CAPÍTULO 20. GRÁFICOS TRADICIONALES
www.editorialuc.es
Función Acción
adj Justificación del texto
ann ¿Poner etiquetas y tı́tulos?
bg Color background
bty Tipo de caja dibujada por box()
cex Tamaño del texto
cex.axis Tamaño de las escalas de los ejes
cex.lab Tamaño de las etiquetas de los ejes (variables)
cex.main Tamaño del tı́tulo
cex.sub Tamaño del subtı́tulo
col Color del gráfico
col.axis Color de los ejes
col.lab Color de las etiquetas
col.main Color del tı́tulo
col.sub Color del subtı́tulo
fg Color del marco de los ejes foreground
font Fuente para el texto
font.axis Fuente para los ejes
font.lab Fuente para las etiquetas
font.main Fuente para el tı́tulo
font.sub Fuente para el subtı́tulo
gamma Corrección gamma de los colores
lab Número de marcas en los ejes
las Orientación del texto en los márgenes
lty Tipo de lı́nea
lwd Anchura de la lı́nea
mgp Colocación de las marcas en los ejes y sus etiquetas
pch Tipo de sı́mbolo para los puntos
set Rotación del texto en la región del gráfico
tck Longitud de los ticks respecto del gráfico
tcl Longitud de los ticks respecto del texto
tmag Tamaño del tı́tulo respecto de las etiquetas
type Tipo de plot (puntos, lı́neas o ambos o ninguno)
xaxp Número de ticks en el eje de abscisas
xaxs Cálculo del rango de la escala en el eje de abscisas
xaxt Estilo del eje de abscisas (standard, none)
xpd Region de recorte
yaxp Número de ticks en el eje de ordenadas
yaxs Cálculo del rango de la escala en el eje de ordenadas
yaxt Estilo del eje de ordenadas (standard, none)
Función Acción
ask Pregunta al usuario si desea un nuevo gráfico
family Familia de las fuentes para el texto
fig Localización normalizada de la zona de figura
fin Tamaño de la región figura (pulgadas)
lend Estilo para el final de lı́nea
lheight Espaciado de lı́neas
ljoin Estilo de unión de lı́neas
lmitre Lı́mite de la lı́nea inglete de unión
mai Tamaño del margen de la figura (pulgadas)
mar Tamaño del margen de la figura (en lı́neas de texto)
mex Espaciado de la lı́neas en los márgenes
mfcol Número de figuras
mfg Figura próxima
mfrow Número de figuras
new Nueva figura
oma Tamaño de los márgenes (lı́neas de texto)
omd Localización de la región interior
omi Tamaño de los márgenes (pulgadas)
pin Tamaño de la región de dibujo (pulgadas)
plt Localización de la región de dibujo (normalizada)
ps Tamaño del texto (puntos)
pty Proporción de la región de dibujo
usr Rango de las escalas de los ejes
xlog Escala logarı́tmica para las abscisas
ylog Escala logarı́tmica para las ordenadas
20.2.1. Color
Con el parámetro col = ? se pueden pasar colores a un gráfico. Los co-
lores básicos (Figura 20.2) son: 1 = negro, 2 = rojo, 3 = verde, 4 = azul, 5 = cyan,
6 = magenta y 7 = amarillo. Se pueden especificar como número (por ejem-
plo, para el rojo: col = 2) o como texto (por ejemplo, para el verde: col =
’green’). Además de estos 7 colores primarios, R ofrece 657 colores, cuyos
nombres se pueden ver con la función colors(). Por ejemplo, uno de ellos es
col = ’lightblue’.
También se pueden especificar los flores mediante la función rgb(), con
tres componentes cuyo valor va de 0 a 1. Por ejemplo, si se deseara dibujar algo
en color rojo se pondrı́a col = rgb(1, 0, 0). Con la función col2rgb()
se puede conocer el valor de los tres números para un color determinado.
Otra forma de especificar los colores es con ’#000000’, en el que cada dos
cifras (que van de 00 a FF, en hexadecimal) permiten especificar la cantidad de
www.editorialuc.es
rojo, verde y azul, por lo que hay 256 ∗ 256 ∗ 256 = 16777216 colores. Por ejem-
plo, el rojo es: col = "#FF0000". Se pueden añadir dos cifras que indican el
grado de transparencia (desde 00 a 99).
7 yellow 9= 19 = ●
8= 18 =
6 magenta 6
7= 17 =
5 cyan 6= 16 = ● 5
5= 15 = 25 =
4 blue 4
4= 14 = 24 =
3 green 3= 13 = ● 23 = 3
2= 12 = 22 =
2 red 2
1= ● 11 = 21 = ●
1 black 0= 10 = ● 20 = ● 1
20.2.2. Lı́neas
El tipo de lı́nea, que se elige con ltype = x (siendo x un número entre 1
y 6), permite elegir entre lı́nea continua, de puntos, de rayas, etc (Figura 20.2).
El grosor del trazo se controla con el parámetro lid = y, siendo y igual a 1, 2,
etc.
20.2.3. Sı́mbolos
Los sı́mbolos gráficos pueden ser letras, puntos, etc. además de los 27 reco-
gidos en la Figura 20.2. Se controlan con el parámetro pch = z, siendo z un
número entre 0 y 25, además de letras, etc.
20.2.4. Figuras
Por defecto R dibuja puntos, pero es posible dibujar lı́neas verticales, lı́neas,
lı́neas y puntos o lı́neas quebradas.
Figura 20.3: Los seis tipos de figuras con plot() según el parámetro type.
type = "p" type = "l" type = "b"
● ●
8
8
● ●
6
6
● ●
y
y
● ●
4
4
● ●
● ●
● ●
2
2
● ● ● ●
● ●
2 4 6 8 10 2 4 6 8 10 2 4 6 8 10
x x x
●
8
●
6
●
y
●
4
●
2
● ●
●
2 4 6 8 10 2 4 6 8 10 2 4 6 8 10
x x x
20.2.5. Textos
R permite incluir texto en los gráficos: la función mtext() para los márge-
nes y text() para la región gráfica.
Con el parámetro par : adj = 0 ajustado por la izquierda, adj = 0.5
centrado y adj = 1 ajustado por la derecha.
En la región gráfica el ajuste puede admitir dos valores: adj = c(x, y),
en el que el valor x es para el ajuste horizontal, como hemos visto, y el valor y
es para el ajuste vertical.
www.editorialuc.es
Con el parámetro font = x se controlan las fuentes: 1 para texto normal, 2
para texto en negrita, 3 para texto en cursiva y 4 para texto en cursiva y negrita.
barplot()
Crea un gráfico de barras. Útil para variables cualitativas o numéricas dis-
cretas. Un gráfico de barras es como un histograma pero con una variable cua-
litativa en el eje de abscisas.
#---------------------------------------------------------------
barplot(height, width = 1, space = NULL,
120
100
80
60
40
20
0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 17
pie()
Crea una gráfico de tartas. La amplitud del sector es proporcional a la fre-
cuencia de efectivos en esa categorı́a. Es poco apreciado por los estadı́sticos
debido a la incapacidad del ojo humano de diferenciar bien entre el número de
grados de dos sectores, como se puede apreciar en la Figura 20.5.
#---------------------------------------------------------------
pie(x, labels = names(x), edges = 200, radius = 0.8,
clockwise = FALSE, init.angle = if(clockwise) 90 else 0,
density = NULL, angle = 45, col = NULL, border = NULL,
lty = NULL, main = NULL, ...)
#---------------------------------------------------------------
Ejemplo 20.3. Cree un gráfico de tartas con la tabla del número de embara-
zos de las indias Pima.
> with(pima, pie(table(emb)))
Se aprecia que nos es difı́cil decidir sobre el tamaño del sector 0 y 2, o entre
el 6 y el 7, mientras que en la Figura 20.4 no hay problema.
Hay varias funciones para representar una única variable numérica: hist(),
density(), stripchart(), boxplot(), qqnorm(), qqline().
www.editorialuc.es
Figura 20.5: Gráfico con la función pie().
hist()
Crea un histograma. Se utiliza con variables numéricas continuas. Puede
ofrecer diferentes resultados según la anchura de los intervalos, de ahı́ que no
sea el más apreciado por los estadı́sticos cuando se quiere graficar una variable
numérica.
#---------------------------------------------------------------
hist(x, breaks = "Sturges",
freq = NULL, probability = !freq,
include.lowest = TRUE, right = TRUE,
density = NULL, angle = 45, col = NULL, border = NULL,
main = paste("Histogram of" , xname),
xlim = range(breaks), ylim = NULL,
xlab = xname, ylab,
axes = TRUE, plot = TRUE, labels = FALSE,
nclass = NULL, ...)
#---------------------------------------------------------------
density()
A ñade una lı́nea de densidad a un histograma (de probabilidad).
Density
100
50
0
tad tad
#---------------------------------------------------------------
density(x, bw = "nrd0", adjust = 1,
kernel = c("gaussian", "epanechnikov", "rectangular",
"triangular", "biweight",
"cosine", "optcosine"),
weights = NULL, window = kernel, width,
give.Rkern = FALSE,
n = 512, from, to, cut = 3, na.rm = FALSE, ...)
#---------------------------------------------------------------
stripchart()
Este tipo de gráficos, también llamados dot plot, son una alternativa a los
gráficos de tallos y hojas [172]. En una lı́nea se van colocando todos los puntos
y si alguno coincide con otro se coloca encima.
#---------------------------------------------------------------
stripchart(x, method = "overplot", jitter = 0.1, offset = 1/3,
vertical = FALSE, group.names, add = FALSE,
at = NULL, xlim = NULL, ylim = NULL,
ylab=NULL, xlab=NULL, dlab="", glab="",
log = "", pch = 0, col = par("fg"), cex = par("cex"),
axes = TRUE, frame.plot = axes, ...)
#---------------------------------------------------------------
Ejemplo 20.6. Cree un gráfico stripchart con las edades de las familias.
> with(familias,
+ stripchart(age, method = ’stack’, offset = 1.5,
+ xlab = ’Age’, pch = 16, col = 3,
www.editorialuc.es
Distribución de la Edad
● ●
● ● ● ●
● ● ● ● ● ● ● ● ● ● ● ●
● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
0 10 20 30 40
Age
boxplot()
Este es un gráfico muy utilizado para describir gráficamente una variable
numérica: de un vistazo nos permite hacernos una buena idea de la dispersión
de los datos, de su tendencia central, de la amplitud, de la existencia de valores
extremos, de la simetrı́a, etc. Además, permite comparar varios distribuciones
en un mismo gráfico.
#---------------------------------------------------------------
boxplot(x, ..., range = 1.5, width = NULL, varwidth = FALSE,
notch = FALSE, outline = TRUE, names, plot = TRUE,
border = par("fg"), col = NULL, log = "",
pars = list(boxwex = 0.8, staplewex = 0.5, outwex = 0.5),
horizontal = FALSE, add = FALSE, at = NULL)
#---------------------------------------------------------------
Ejemplo 20.7. Genere en un mismo gráfico dos boxplots, uno con la TAD y
otro con el IMC.
> opar <- par(mfrow = c(1, 2))
> with(pima, {
+ boxplot(tad, las = 1, col = ’green’,
+ main = ’TAD (mm Hg)’)
+ boxplot(imc, las = 1, col = ’yellow’,
+ main = ’IMC (kg/mˆ2)’) }
+ )
> par(opar); rm(opar)
● ●
●
●
●
100 60 ●
●
●
●
●
80 50
40
60
30
40 ●
●
● 20
Figura 20.8: Gráfico boxplot de la TAD (izquierda) y del IMC (derecha) de las indias
Pima.
#---------------------------------------------------------------
dotchart(x, labels = NULL, groups = NULL, gdata = NULL,
cex = par("cex"), pch = 21, gpch = 21, bg = par("bg"),
color = par("fg"), gcolor = par("fg"), lcolor = "gray",
xlim = range(x[is.finite(x)]),
main = NULL, xlab = NULL, ylab = NULL, ...)
#---------------------------------------------------------------
Ejemplo 20.8. Cree un gráfico dot chart con el número de embarazos de las
indias Pima. Compárelo con un scatterplot de la frecuencia frente al número.
plot()
Es el ((gráfico por excelencia)) en estadı́stica.
● ●
●
15
● ●
● ●
www.editorialuc.es
● ●
● ●
●
●
10
●
●
●
●
y
●
●
●
●
●
● ●
5
● ●
● ●
● ●
● ●
● ●
0
Figura 20.9: Número de embarazos en las indias Pima (en el lado izquierdo scatterplot
y en el lado derecho dot plot).
#---------------------------------------------------------------
plot(x, y, ...)
#---------------------------------------------------------------
● ● ● ● ●● ●●
●● ● ●●
● ●● ●● ● ● ●● ●
●● ●
180
●● ● ●● ●● ● ● ● ●●
● ●
●
● ●
● ● ● ● ● ●● ● ●
● ● ● ●● ●● ● ●
● ●●
●●●●● ● ● ●
● ●● ● ● ●
●● ● ● ●● ● ●
●● ●● ●●●●●
● ● ● ●●
● ●● ● ● ● ●●●
●
●●● ● ● ●●● ●● ●
● ●● ● ● ● ●
140
● ● ● ●● ● ● ●
● ● ●● ●
●●● ●●
●
● ●
● ●●●● ● ●● ● ●
●● ●●● ●● ● ●
● ● ●●● ●● ●
●●● ●●● ●
●●●●●●●● ● ●● ●
● ● ●● ●●●●●●
●●● ●● ● ● ●
● ● ●● ●● ●
●● ●●● ● ●●●● ●● ● ●●
● ●●●
●
●
● ● ●●●
●● ●●
●● ● ● ●●● ● ● ●●
●● ● ●
●● ● ●●
● ●●●● ●●●●●● ●● ●●● ●
●●●
● ●
●
●●
● ● ●●
●●
●●
●● ● ●
●●
● ●●● ●
● ●
● ● ● ●
●
●●●● ● ● ●● ●● ● ●●
100
● ● ●●
● ●● ●
●●●● ●
● ●●●●●●●●● ● ● ● ●
●●
●● ● ●●●●● ●● ●●
●●
●●● ●●
●●
●●
●●
●●●● ●● ●●
● ●●
●● ●● ●●
● ● ●
●● ●● ●● ● ●● ●● ●●
●
●●●● ●
● ●
●
● ● ●● ●●●
●●●● ●●● ● ●● ● ●
● ●● ●
● ● ●●
●●●
●●● ● ●
●● ● ● ●● ●● ● ●
●●●● ●
80
● ● ●● ●●
●● ● ● ● ● ● ●
● ●● ● ● ●
●● ● ●●● ●●
● ● ●
●
60
●
● ●
20 30 40 50 60
imc
qqnorm() y qqline()
Gráfico para valorar visualmente la normalidad de una variable. Se em-
plean qqnorm() y qqline(). El paquete car contiene la función qqPlot()
más agradable y que presenta bandas de confianza [96, 120].
#---------------------------------------------------------------
qqnorm(y, ylim, main = "Normal Q-Q Plot",
xlab = "Theoretical Quantiles", ylab = "Sample Quantiles",
plot.it = TRUE, datax = FALSE, ...)
qqline(y, datax = FALSE, ...)
#---------------------------------------------------------------
●●
●●●●● ● ●●
●●●●● ●
●
●●
●● ●
●●
●●
●
●
●●
● ●
●
●●
●
● ●
180
180
●
●● ●
●●
●●
●
●
●● ●●
●
●
●●
●
●
●● ●
●
●●
●
Sample Quantiles
●
●● ●
●
●●
● ●●
●
●
●
● ●
●
●
●
●
●● ●
●
●●
●
●
●
● ●
●
●
●
●
● ●
●
140
140
●
●
●●
● ●
●
●●
●
●
●
● ●
●
●
glu_p
●
●
●● ●
●
●●
●
●● ●
●
●
●
●●
● ●
●●
●
●●
●
●
●● ●●
●
●
●●
●●
●
● ●●
●
●
●●
●
● ●●
●
●
●
●
●●
●
● ●
●
●●
●
●
●
●● ●
●●
100
100
●
●●
● ●
●●
●
●●
●
●●
●
●
●● ●●
●
●●
●
●
●●
●●
●
●●
●
● ●●
●
●●
●
●
●
●
●●
●
● ●
●
●●
●
●
●
●●
●
●
● ●
●●
●
●
●
●●
●
●
●● ●
●●
●
●
●●
●●
●
●●
●
●
●● ●●
●
●●
●
●
●●
●
●
●●
● ●
●
●●
●
●●
●
●●
●
● ●●
●
●●
●
●
●
●●● ●●
●●
60
60
● ●
● ● ● ●
−3 −2 −1 0 1 2 3 −3 −2 −1 0 1 2 3
#---------------------------------------------------------------
pairs(x, labels, panel = points, ...,
lower.panel = panel, upper.panel = panel,
diag.panel = NULL, text.panel = textPanel,
label.pos = 0.5 + has.diag/3,
cex.labels = NULL, font.labels = 1,
row1attop = TRUE, gap = 1)
#---------------------------------------------------------------
www.editorialuc.es
> panel.hist <- function(x) {
+ par(new = TRUE)
+ hist(x, col = ’cyan’, main = ’’)
+ }
Ejemplo 20.11. Gráfico scatter plot matricial de las variables imc, tad y
edad.
> with(pima, pairs(˜ imc + tad + edad))
interaction.plot()
Es un gráfico muy útil para visualizar la interacción.
#---------------------------------------------------------------
interaction.plot(x.factor, trace.factor, response, fun = mean,
type = c("l", "p", "b"), legend = TRUE,
trace.label = deparse(substitute(trace.factor)),
fixed = FALSE,
xlab = deparse(substitute(x.factor)),
ylab = ylabel,
ylim = range(cells, na.rm=TRUE),
40 60 80
● ●
20 30 40 50 60
● ●
● ●
● ●
● ● ● ●●●
● ●●●
● ●●● ●
●
● ●● ●
● ●●● ●●●●● ●● ●● ● ●● ●● ●●
●● ● ●●●
● ●●
imc ● ● ●
●
●●
●
●● ●●
●
●
●●
●●
●
●
●
●
●●
●●
●
●
●
●
●●
●
●●●
●●
●●●
●●
●●
●
●●
●
●
●
● ●●●●●
●●●
●●●
●●
●●
●
●●
●
●●
●
●●
●
●
●
●
●●
●
●●●● ●
●●● ●●
●● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●● ●
●●●
●
● ●●
●●
●
●●
●
●●
●
●●
●●
●●● ●
●
● ●
●●
●
● ●●● ● ●
●●●
●
●● ●●●●● ● ●●
●
●●●
●●● ● ●
●
●●
●●
●● ●●
●●●
● ●●●●
●
●●●●
●
●● ● ●●
●
●
●
●
●
●●
●
●
●●
●
●
●●
●
●●
● ●
●
●
●●●
●
●
●
●
●●
● ●●
●
●
●
●● ●●●●● ●●●●●
●●●●
●
●●●
●●●●
● ●
●●
●
●●●
●●
●●●●● ●
●●
●● ●●●
●
●
●●●●●
●
●
●
●●
●●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●●
●●
●
●
●
●
●
●
●
●●●
●
● ●
●
●●
●●● ●
● ●● ●
●●● ● ● ●
●●●●●●●●●●● ●
●●●
●● ●●●●●●● ● ●● ● ● ●
●● ●●●
●●●
● ●●●●
● ●
●●
●●●
●●●●
●
●
● ● ●
●
●
●●
●●
● ●
●●
●●●●
●
●●●●●●
●● ●●●
● ●● ●● ●
●●●
● ●●●
●●● ●
●● ●●
●●● ●●
●● ● ●●
●●
● ● ● ●
●
●
●●
●●●●
●●●
●●●●
●●● ● ●●●● ● ●
●
●
●●● ●●●
●●●●
●●●
●●
●● ●
●●●
●
●● ●
●
●●●
● ●
●●●
●●
●
●●● ●
● ●● ● ● ● ●● ●
●● ●● ●
●● ●●● ●●
●●
●●●
●
●
●●
●●
●
●●
● ●●●●● ● ●
●
●
●
●●
●●
●
●
●●●●●
●●
●●●●
● ● ●● ● ●
● ●●●
●●●●● ●●●●● ●●
●●●● ●
●
●
●●
●●
●●
●● ● ● ●●
● ● ●●● ● ●
●●●●●●● ● ●
●●●● ● ● ●
●
● ● ●
● ●
● ● ● ● ● ● ● ●
●●● ●●●● ●
●● ●
● ● ● ● ● ● ●●
● ●
●
● ●
● ● ●●●● ● ●●● ●● ●● ● ●●● ●● ● ●●
● ● ●
●●
● ●●
●●●
●●●
●
●●●
●●●●●
● ●
●●● ●
●● ●●
● ●●
●●●
●
●
● ●
●
●● ●
●●
●●
●●
●●● ●
● ●●●● ●●●
●
●
●
●
●●
●●
● ●
●● ●●
●● ●●● ●
●●●● ●
●
● ● ● ● ●●●
● ●●
●● ● ● ● ●●● ●● ● ● ●●● ● ●
●
80
●● ●●
●
●
●
●●
●●
●
●
●
●●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●
●●●
● ●
●●●
●●●
●
●●● ● ●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●●●●
●
●●
●
●
●●
●●●
●
●●
● ●●●
●
●
● ●
●●● ●●
●
● ● ●
●● ●
●
●
●●
●●●●●
●
●●
●●●
●●●
●●
●● ●
●●
●●
●
●●●
●
●
●●
●●
●
●●●
●●
●
●● ●
●● ●● ●
●● ● ●●
●
●●
●●
●
●
●●
●●
●●●
●●
●●●
●●●
●●●●●●
● ●●
●●
●● ●●● ●
●●●
●●
●●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●●
●
●●
●
●●●
●
●
●
●
●
●
●●●
●● tad ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●●● ● ●●
●●●● ●● ●●
● ●●
60
●●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●●●
●●
●
●●
●
●
●
●●
●
●
●
●
●●
●●● ● ● ●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●●
●
●
●●●●
● ●
●●
●● ●●●● ● ●●
●●●●●
● ●
●
●
●●
●●●●●●
● ●● ●● ●●
●
●
●●
●●● ●
● ●●
●
● ● ●●● ●
● ●● ●
● ●●●●●●●●
●● ● ●● ●●
●
●●
●●
●
●●●● ●
●● ●● ●● ●● ●
● ●
40
● ● ● ●
● ● ● ●
● ●
80
● ●
●
● ● ●●
●
● ● ● ●
●● ●● ●● ●● ●
● ●●●●● ●●●
60
● ● ●●● ●●
●● ● ●●●● ● ●● ● ●
●●
●
● ●
●●●●
●● ●●
●● ●●● ● ●● ● ● ● ●● ●
●●
●● ●●●●
● ●●
●●●●●
●● ●
●
●●
●●●
●●●
●●
●
●●
●●
●●
●
●
●●
●
●
●
●
●●●
●●●
●
●
●●●
● ●
● ●
● ●● ●
●●● ●●
●
● ● ●●
●●●●●
●●
●●
● ●●
●
●●
●
● ●●
●●
●●●
●●●
●●●
●●
●●●●
●
●●●● ●
●●
● ● ●● ●
●●●●●●●●●
●
●
edad
●
● ●● ● ● ●●●
●● ●●●
40
●●● ●● ●
●●● ●●●●● ●
●●●●● ●●●
●
●
●
●
●●
●
●
●●●● ●●● ● ● ●●●●● ● ●●●
●
●●●● ●●
●● ●●
●●●
●●●
●
● ●
●●
●
●●
●●●● ●● ●●● ● ●
●● ●● ● ●●
● ●●●●
● ●●
●●●● ●
●
●● ●●● ●●●
● ●●●●● ● ● ● ● ●●
●●
●●●
●●
●●● ●●
●● ●●
● ●
●● ●
●●
● ● ●● ● ● ● ● ● ●●●●●● ●
●●●
● ●
●●
●●
● ●
●●●
●●
●
●●
●
●
●
●●●
●
●
●●●●
●
●
●●
●●
● ●●●●
●
●●●
● ●● ●●●●●●
●●
●●●
●●●●
●
●
●
●
●●● ●●●●●
●
●
● ●●
●●
●●●
●●●
●●●●●
●●
●●
●
●●●
●
●●●
●
●●
●
●●
●●
●
●●
● ●●
●●● ● ●
●●●●●●●●●
●●●●
●●●●
● ●
●
●●
● ●●●●
●● ●●●●
●● ●
● ●●●●●●
●●
●● ●●● ●●●●●●● ●●● ● ●● ●●
●●●●●●
●●●
●●●
● ●
●
●●●
●
●
●
●●
●
●●
●
●
●
●●
●●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●
●
●
●
●
●●
●
●●●
●
●
●
●
●
●
●●
●
●
●
● ●● ● ● ●● ●●●●●●
●●
●
●●
●●●
●●●●●
●●
●●
●
●●
●
●● ●●● ●●
● ●
●
●
●●
●●
●●
●●
●
●●
●
●
●
●●
● ●
●
●●
●●
●●
●
●
●●●
●
●●
●
●
●●
●
●●
●
● ●●●
●
●●●
●●●
● ●
●●
●
●●● ● ● ●●
●●●●
●●
●●●●
●●●
●●
●●●
●●
●
●●
●●
● ●
●●●
●●
●●
●
●
●●
●
●●● ● ●
●●
●● ●● ●
● ●●●
20
●●●●
●●●
●
●●●
●●●
● ●
●●●
● ●●
●● ●●
● ●
● ●●●● ● ●●●●●
●●●● ●●
●●●●● ●
20 30 40 50 60 20 40 60 80
40 60 80
imc
20 30 40 50 60
150
100
0.31
Frequency
0.05
50
0
●
20 ● 40 ● ●
60 ●
●●●
●●
tad
100 150
● ● ● ●
● ●●● ●● ●● ●
● ● ●●●●
● ●●
● ●●●● ● ● ●
●
●
● ●
●●● ●
●●
●●● ●●
●●● ●
●
●
● ●● ●
● ●●
●
●●
● ●●●
● ● ●●●
●●●● ●●●● ●●
80
●● ●●●
●
●●
●●
●
●
●●●
●●
●
●●
●
●
●
●
●
●●
●
●●
●
● ●
●●
●●
●●
●●●
● ●●●
●●
●
●●●●●
●
●●●
● ●
●
●●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●●
●
●
●●●● ● ●
●
● ●
x
●●● ●●
●●●
●
●
●●
●
●●
●
●●●
●
●●
●
●●
●
●
●
●●
●●
●
●
●●
●
●
●●
●
●●
●●
●
●
●●
●●●●
●●●
●
0.36
Frequency
●●●● ●
●●
●●
●●●
●
●●
●●
●
●●●●
●
●● ●
●●● ● ●
●● ●●●●●
●●
●
●●
●
●●●
●●
●●
●
●●●
●
●●
●
●
●●●●
●
● ●●
●
●●
●●
60
●●
●●
● ●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●●●
●●
●
●●
●
●
●
●
●
●
●
●
●
●●
●●● ● ●
●●●●●
● ●
●
●
●●
●●●●●●
● ●● ●●
●
● ● ●●●
50
● ●●●●● ●●●●● ● ●●
●● ●● ●●
40
● ●
● ●
●
0
80
●
20 40 60 ●80 120
●
● ●
● ● ●
●●
●
●
edad
●● ●● ●● ●● ●
● ●●●●● ●●●
150
60
● ● ●●● ●●
●● ● ●●●● ● ●● ● ●
●●
●
● ●
●●●●
●● ●●
●● ●●● ● ●● ● ● ● ●● ●
●● ●●● ● x●● ●
●●●●●●
●
●● ● ●
Frequency
●● ● ●●●● ●
●● ●●●●
●●● ●
●● ● ● ● ●●●● ●● ●●●●
●●● ●●● ● ● ● ●●●●●●● ●
● ●●
●● ●●●●
● ●● ●● ● ● ● ●●●●
●●●●
●●● ● ● ●● ●
●●● ●● ●
● ●
●
●●●●●●● ●●
● ●●●●● ●●●●● ●
●● ● ●●●
●● ●● ●●●
40
●● ●
●● ●
● ●
●
● ● ● ●● ● ● ●
●●●●● ●●●
●●
●
●
●
●
●
●
●
●●● ●●● ● ● ●●●●● ● ●●●
●
●●●● ●●
●● ●●
●●●
●●●
●
● ●
●●
●
●
●●●●●●● ●● ● ● ●●●
● ● ●
●●
●● ●●●●
●
●● ●
● ● ●● ●●
50
●
●● ●●● ●
●
●●
● ●●●●●
● ● ● ●
● ● ●
●●●●●●●
● ●●●●
●●● ●●
●
●● ●● ●
●●
●
●●●
●●●●●● ●●● ●● ● ● ●● ●●●●●
●
●● ●
●●
●●●●●● ●
● ● ●●
●
●●
●
●●
●
●●●
●●
●
●●
●
●
●
●
●
●
●
●●
●
●●
●
●●
●●
●●●
●
●
●
●
● ●●● ●● ● ●●●●●●
●●
●
●●
● ●●●●●●
●●●●
●●●
●● ●
●
●●●●●
●
●●
●●●
●●●
●●● ●
●●
●●
●
●●●
●●
●
●●
●●●●
● ●●●●●● ● ●●●●● ●●
●●● ●●
●●
●●
●●
● ●
●
●
●
●●
●●
●● ●●
●●●
●●
●●●
●●
●●
● ●
●
●
●
●
●
●●
●
●
●●
●●
●
●
●●
●●
●
●●
●●
●
●
●
●●
●
●
●
●
●●●
● ●●
●●● ● ●● ● ● ● ●●
●● ●●●●●●●●●●●●●
●●● ●●●
●
●●●
●
● ●
● ●
● ●
●●●
●●
●
●
●●
●
●●
● ● ●
●
●●
●
●●
●
●●●
●●●●
●
● ●
●●
● ●
●●
●●● ●●
●●●●●
●
●● ●
●●
●
●
●
●●●●
● ●
●●●●
●● ●●
●●●●
● ● ●●
●
●●●
●●●
●●
●●
●
● ●
●●
●●
●●
●
●●
●
●
●●
●●●
●
●●●●●
●●●●●
● ●●
●●● ● ●
● ●●
●●●●
●●●
●●
●● ●●●●
● ●
●●●
●● ●
●●
● ●●
●● ● ● ●
●●●
20
●●●●●●
●
●●
●●
●●●
● ●
●●●
●●●●●●●
● ●
● ●● ●
● ● ●●●●●
●●● ●●
●●●●● ●
0
20 30 40 50 60 20
20 40 60
60 80
8
0
www.editorialuc.es
> with(pima, {
+ x <- factor(tad > 90, labels = c(’No HTD’, ’Sı́ HTD’))
+ interaction.plot(diab, x, glu_p, legend = TRUE, col = 1:2)
+ }
+ )
x
140
No HTD
135
Sí HTD
mean of glu_p
130
125
120
115
110
N S
diab
sunflowerplot()
Cuando los puntos se solapan, una forma de solucionarlo es que vayan
saliendo pétalos en sentido radial.
#---------------------------------------------------------------
sunflowerplot(x, y = NULL, number, log = "", digits = 6,
xlab = NULL, ylab = NULL, xlim = NULL, ylim = NULL,
add = FALSE, rotate = FALSE,
pch = 16, cex = 0.8, cex.fact = 1.5,
col = par("col"), bg = NA, size = 1/8, seg.col = 2,
seg.lwd = 1.5, ...)
#---------------------------------------------------------------
15
●
● ●
● ● ●●● ●
● ● ● ● ● ● ●
● ● ● ●●
10
● ● ● ●●●● ● ● ● ●● ●
emb
● ●●● ● ● ● ●●● ●● ● ●● ●● ●
● ● ●● ● ●● ●● ● ● ● ●● ●
● ●● ● ●● ●●● ● ● ● ● ●● ●● ●●
●● ● ● ● ● ● ● ●●●●● ● ● ● ● ● ●● ● ●
5
●●●● ● ● ● ● ●● ● ●● ●●●●● ●● ●●● ● ● ● ●
●● ● ● ● ● ● ●●● ● ● ● ● ● ●● ● ● ● ● ●
●●●●●●●●●●● ●● ● ●● ● ●
●●●●●●●●●●●●● ● ●● ●● ●● ●● ● ● ●
0
● ● ● ● ● ● ● ● ●●● ● ● ●● ● ● ●●
20 30 40 50 60 70 80
edad
matplot()
Dibuja los valores de una matriz. Puede ser muy útil como paso explorato-
rio de los datos.
#---------------------------------------------------------------
matplot(x, y, type = "p", lty = 1:5, lwd = 1, lend = par("lend"),
pch = NULL,
col = 1:6, cex = NULL, bg = NA,
xlab = NULL, ylab = NULL, xlim = NULL, ylim = NULL,
..., add = FALSE, verbose = getOption("verbose"))
#---------------------------------------------------------------
> with(pima, {
+ M <- cbind(glu_p, tad, emb)
+ matplot(M, pch=16)}
+ )
cdplot()
Es un gráfico de conditional density para una variable cualitativa que depen-
www.editorialuc.es
de de una numérica.
#---------------------------------------------------------------
cdplot(x, y,
plot = TRUE, tol.ylab = 0.05, ylevels = NULL,
bw = "nrd0", n = 512, from = NULL, to = NULL,
col = NULL, border = 1, main = "", xlab = NULL, ylab = NULL,
yaxlabels = NULL, xlim = NULL, ylim = c(0, 1), ...)
#---------------------------------------------------------------
1.0
S
0.8
0.6
diab
0.4
N
0.2
0.0
5 10 15
emb
mosaicplot()
Un mosaic-plot consiste en la visualización de las frecuencias observadas
mediante rectángulos cuya área es proporcional a la frecuencia [196, 197]. Per-
mite representar datos categóricos relacionados mediante una fórmula [198].
#---------------------------------------------------------------
mosaicplot(x, main = deparse(substitute(x)),
sub = NULL, xlab = NULL, ylab = NULL,
sort = NULL, off = NULL, dir = NULL,
color = NULL, shade = FALSE, margin = NULL,
cex.axis = 0.66, las = par("las"),
type = c("pearson", "deviance", "FT"), ...)
#---------------------------------------------------------------
N S
No OB
obe
Obesidad
diab
> with(pima, {
+ obe <- factor(imc > 30, labels = c(’No OB’,’Obesidad’))
+ mosaicplot(diab ˜ obe, main=’Diabetes vs. Obesidad’)}
+ )
spineplot()
Muy similar al anterior.
#---------------------------------------------------------------
spineplot(x, y = NULL,
breaks = NULL, tol.ylab = 0.05, off = NULL,
ylevels = NULL, col = NULL,
main = "", xlab = NULL, ylab = NULL,
xaxlabels = NULL, yaxlabels = NULL,
xlim = NULL, ylim = c(0, 1), axes = TRUE, ...)
#---------------------------------------------------------------
> with(pima, {
+ obe <- factor(imc > 30, labels = c(’No OB’,’Obesidad’))
+ spineplot(diab ˜ obe, main=’Diabetes vs. Obesidad’)}
+ )
assocplot() y fourfoldplot()
Es una función útil para hacer gráficos con tablas de contingencia de dos
dimensiones, en cada celda se calcula la diferencia entre el valor observado (O)
y el esperado (E); cada rectángulo tiene una altura proporcional a esta dife-
rencia y una anchura proporcional a la raı́z cuadrada del valor esperado, por
lo que su área es proporcional a la diferencia (O − E), colocando el rectángulo
www.editorialuc.es
1.0
S
0.8
0.6
diab
0.4
N
0.2
0.0
No OB Obesidad
obe
#---------------------------------------------------------------
assocplot(x, col = c("black", "red"), space = 0.3,
main = NULL, xlab = NULL, ylab = NULL)
fourfoldplot(x, color = c("#99CCFF", "#6699CC"),
conf.level = 0.95,
std = c("margins", "ind.max", "all.max"),
margin = c(1, 2), space = 0.2, main = NULL,
mfrow = NULL, mfcol = NULL)
#---------------------------------------------------------------
> with(pima, {
+ obe <- factor(imc > 30, labels = c(’No OB’,’Obesidad’))
+ tabla <- table(diab, obe)
+ opar <- par(mfrow = c(1, 2))
+ assocplot(tabla)
+ fourfoldplot(tabla)
+ par(opar)
+ })
smoothScatter()
Produce una versión suavizada de un gráfico de puntos.
#---------------------------------------------------------------
smoothScatter(x, y = NULL, nbin = 128, bandwidth,
colramp = colorRampPalette(c("white", blues9)),
nrpoints = 100, pch = ".", cex = 1, col = "black",
transformation = function(x) xˆ.25,
postPlotHook = box,
xlab = NULL, ylab = NULL, xlim, ylim,
diab: N
197 218
No OB
obe: Obesidad
obe: No OB
obe
Obesidad
N S
40 174
diab diab: S
40
20
20 30 40 50 60
imc
image()
Dibuja imágenes de niveles de color.
#---------------------------------------------------------------
image(x, y, z, zlim, xlim, ylim, col = heat.colors(12),
add = FALSE, xaxs = "i", yaxs = "i", xlab, ylab,
breaks, oldstyle = FALSE, ...)
#---------------------------------------------------------------
www.editorialuc.es
> x <- 10 * (1:nrow(volcano))
> x.at <- seq(100, 800, by=100)
> y <- 10 * (1:ncol(volcano))
> y.at <- seq(100, 600, by=100)
> image(x, y, volcano, col = terrain.colors(100), axes = FALSE)
contour()
Esta función dibuja curvas de nivel. Se suele utilizar en conjunción con
image().
#---------------------------------------------------------------
contour(x = seq(0, 1, length.out = nrow(z)),
y = seq(0, 1, length.out = ncol(z)),
z,
nlevels = 10, levels = pretty(zlim, nlevels),
labels = NULL,
xlim = range(x, finite = TRUE),
ylim = range(y, finite = TRUE),
zlim = range(z, finite = TRUE),
labcex = 0.6, drawlabels = TRUE, method = "flattest",
vfont, axes = TRUE, frame.plot = axes,
col = par("fg"), lty = par("lty"), lwd = par("lwd"),
add = FALSE, ...)
#---------------------------------------------------------------
col = terrain.colors(100)
persp()
Esta función permite crear gráficos tridimensionales.
#---------------------------------------------------------------
persp(x = seq(0, 1, length.out = nrow(z)),
y = seq(0, 1, length.out = ncol(z)),
z, xlim = range(x), ylim = range(y),
zlim = range(z, na.rm = TRUE),
xlab = NULL, ylab = NULL, zlab = NULL,
main = NULL, sub = NULL,
theta = 0, phi = 15, r = sqrt(3), d = 1,
scale = TRUE, expand = 1,
col = "white", border = NULL, ltheta = -135, lphi = 0,
shade = NA, box = TRUE, axes = TRUE, nticks = 5,
ticktype = "simple", ...)
#---------------------------------------------------------------
www.editorialuc.es
persp(x, y, z, theta = 120, phi = 15, scale = FALSE, axes = FALSE)
title(main = "Maunga Whau\nOne of 50 Volcanoes in the Auckland Region.",
font.main = 4)
Maunga Whau
One of 50 Volcanoes in the Auckland Region.
heatmap()
Permite gráficos bidimensionales con dendogramas.
#---------------------------------------------------------------
heatmap(x, Rowv=NULL, Colv=if(symm)"Rowv" else NULL,
distfun = dist, hclustfun = hclust,
reorderfun = function(d,w) reorder(d,w),
add.expr, symm = FALSE, revC = identical(Colv, "Rowv"),
scale=c("row", "column", "none"), na.rm = TRUE,
margins = c(5, 5), ColSideColors, RowSideColors,
cexRow = 0.2 + 1/log10(nr), cexCol = 0.2 + 1/log10(nc),
labRow = NULL, labCol = NULL, main = NULL,
xlab = NULL, ylab = NULL,
keep.dendro = FALSE, verbose = getOption("verbose"), ...)
#---------------------------------------------------------------
> with(pima, {
+ obe <- factor(imc > 30, labels = c(’No OB’,’Obesidad’))
+ M <- cbind(diab, obe, emb)
+ heatmap(t(M[1:10, ]))
+ M[1:10, ] }
+ )
diab obe emb
[1,] 1 2 5
[2,] 2 1 7
[3,] 1 2 5
[4,] 1 2 0
[5,] 1 1 0
[6,] 2 2 5
[7,] 1 2 3
[8,] 1 1 1
[9,] 1 2 3
[10,] 2 2 2
Hay más funciones gráficas que iremos viendo a lo largo de los próximos
capı́tulos.
20.5.1. Puntos
points()
Dibuja puntos.
#---------------------------------------------------------------
points(x, y = NULL, type = "p", ...)
www.editorialuc.es
#---------------------------------------------------------------
20.5.2. Lı́neas
abline()
Dibuja lı́neas.
#---------------------------------------------------------------
abline(a = NULL, b = NULL, h = NULL, v = NULL, reg = NULL,
coef = NULL, untf = FALSE, ...)
#---------------------------------------------------------------
arrows()
Dibuja flechas.
#---------------------------------------------------------------
arrows(x0, y0, x1 = x0, y1 = y0, length = 0.25, angle = 30, code = 2,
col = par("fg"), lty = par("lty"), lwd = par("lwd"),
...)
#---------------------------------------------------------------
lines()
Dibuja lı́neas, no necesariamente rectas.
#---------------------------------------------------------------
lines(x, y = NULL, type = "l", ...)
#---------------------------------------------------------------
polygon()
Dibuja polı́gonos uniendo puntos definidos por sus coordenadas.
#---------------------------------------------------------------
polygon(x, y = NULL, density = NULL, angle = 45,
border = NULL, col = NA, lty = par("lty"),
..., fillOddEven = FALSE)
#---------------------------------------------------------------
100
●
80
●
60
40
●
20
leyenda
0
0 2 4 6 8 10
> grid()
> points(2, 25, pch = 16, col = 2)
> points(4, 63, pch = 16, col = 3)
> points(9, 90, pch = 16, col = 4)
> abline(16.64, 8.54, lwd = 3, col = 5)
> arrows(1, 80, 4, 64)
> lines(c(2, 4, 9), c(25, 63, 90), lt=2)
> legend(6, 20, ’leyenda’, fill = ’yellow’)
segments()
Dibuja segmentos.
#---------------------------------------------------------------
segments(x0, y0, x1 = x0, y1 = y0,
col = par("fg"), lty = par("lty"), lwd = par("lwd"),
...)
#---------------------------------------------------------------
20.5.3. Ejes
axis()
Dibuja los ejes.
#---------------------------------------------------------------
axis(side, at = NULL, labels = TRUE, tick = TRUE, line = NA,
pos = NA, outer = FALSE, font = NA, lty = "solid",
lwd = 1, lwd.ticks = lwd, col = NULL, col.ticks = NULL,
hadj = NA, padj = NA, ...)
#---------------------------------------------------------------
box()
Dibuja un marco para el gráfico.
#---------------------------------------------------------------
box(which = "plot", lty = "solid", ...)
#---------------------------------------------------------------
grid()
Dibuja una rejilla en punteado gris para una mejor lectura de los gráficos.
www.editorialuc.es
#---------------------------------------------------------------
grid(nx = NULL, ny = nx, col = "lightgray", lty = "dotted",
lwd = par("lwd"), equilogs = TRUE)
#---------------------------------------------------------------
20.5.4. Texto
legend()
Dibuja leyendas (tan necesarias en un gráfico).
#---------------------------------------------------------------
legend(x, y = NULL, legend, fill = NULL, col = par("col"),
border="black", lty, lwd, pch,
angle = 45, density = NULL, bty = "o", bg = par("bg"),
box.lwd = par("lwd"), box.lty = par("lty"),
box.col = par("fg"),
pt.bg = NA, cex = 1, pt.cex = cex, pt.lwd = lwd,
xjust = 0, yjust = 1, x.intersp = 1, y.intersp = 1,
adj = c(0, 0.5), text.width = NULL, text.col = par("col"),
merge = do.lines && has.pch, trace = FALSE,
plot = TRUE, ncol = 1, horiz = FALSE, title = NULL,
inset = 0, xpd, title.col = text.col)
#---------------------------------------------------------------
mtext()
Dibuja texto en los márgenes del gráfico.
#---------------------------------------------------------------
mtext(text, side = 3, line = 0, outer = FALSE, at = NA,
adj = NA, padj = NA, cex = NA, col = NA, font = NA, ...)
#---------------------------------------------------------------
rect()
Dibuja rectángulos definidos por sus coordenadas.
#---------------------------------------------------------------
rect(xleft, ybottom, xright, ytop, density = NULL, angle = 45,
col = NA, border = NULL, lty = par("lty"), lwd = par("lwd"),
...)
#---------------------------------------------------------------
text()
Escribe un texto en una posición determinada.
#---------------------------------------------------------------
text (x, y = NULL, labels = seq_along(x), adj = NULL,
pos = NULL, offset = 0.5, vfont = NULL,
cex = 1, col = NULL, font = NULL, ...)
#---------------------------------------------------------------
title()
Escribe un tı́tulo en un gráfico.
#---------------------------------------------------------------
title(main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
line = NA, outer = FALSE, ...)
#---------------------------------------------------------------
#---------------------------------------------------------------
coplot(formula, data, given.values, panel = points,
rows, columns,
www.editorialuc.es
xlab = c(x.name, paste("Given :", a.name)),
ylab = c(y.name, paste("Given :", b.name)),
subscripts = FALSE,
axlabels = function(f) abbreviate(levels(f)),
number = 6, overlap = 0.5, xlim, ylim, ...)
#---------------------------------------------------------------
Given : sex
50 60 70 80 90
●
30
●
●
● ● ● ●
●● ●
25
●● ●
imc
●
● ●● ● ●
●
20
●
● ●
●
● ●
●●
● ●
●●
15
●
●
●●
50 60 70 80 90
waist
Missing rows: 201, 202, 203, 204, 205, 206, 207, 208, 209, 210,
211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236,
237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249,
250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262,
263, 264, 265, 266, 267, 268, 269, 270, 272, 273, 274, 275, 276,
277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289,
290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300
Given : edad
30 40 50 60 70 80
20 40 60 80 20 40 60 80
60
●● ● ● ●
●● ● ● ●●●● ● ● ● ● ●● ●
●●●●● ● ●
● ●●
●● ●
●
●● ● ● ●●
● ●●●
40
●● ● ● ●
● ●
● ●
● ●●
●●
●●●
● ●●●●●
● ●
●●●●● ●●● ●●●
● ●●●
● ●● ●● ●● ●●●●●
● ● ●●●
●● ●●
● ●●
● ●●
●
●●
●
●
●●
●●
●
●
●●
●
●
●
●●
●
●
●
●
●● ●
●
●
●●
●●●
●●●
●●
●●●
●●
●
●
●●●●●
●●
● ●●
●
●
●
●
●
●
●
●
●
●●
●●
●
● ●● ●
●●●
● ●
●●●●●●● ● ● ● ●●● ●
●● ● ● ●
● ● ●●
●●
●● ●
●● ●●
●● ●
● ● ●●●
●●● ●●● ●● ●●●
●●
●
● ●
●
●●●●●
●
●●
●●●●● ●
● ●
●● ●●
●● ●●●
●●●
●
●●
●●
●● ●● ●●
● ●
●●
● ●●●●
●
●
●●●
●
● ● ●
● ●●
●
● ●●
●●
●●●●● ●●● ●● ●●●●
●●●●●●
●●●
●● ● ● ● ●●
●●
●●
●●
●● ●● ● ● ●● ●
● ●
● ●● ● ●●
●● ● ●● ●
●● ● ●
● ● ●●●●
20
●●
● ● ●
imc
● ●
60
● ●
● ●
● ●
● ● ● ●
●● ●●
● ●
●●● ●●●●●●
●● ● ●●● ●●●● ●
●● ●
●● ●● ●
●
● ●● ● ●● ●● ●●● ●●● ●●●
40
● ●
●● ● ●●●●●● ●●●●● ●●●
● ●● ●● ● ●● ●● ●●●●
●
● ●
●
● ●●●
●●●●●●●●
●●●● ●
●●●
●
●●
●●●●
●
●●●
●
●●● ● ●●
●●
●●
●
●●
●●●●● ●● ●●
●● ●
● ●●● ●
●●
● ● ●●
● ●
●●●
●
●●
●
●●●●●
●
●●●
●
●
●●
● ● ● ●
●●●
●●
●
●●●
● ● ●●●
●
●●
●
●●●
●
●
●
●● ● ●●
●●
●●●●●● ●
● ●
● ●●● ●
●●
●
● ●
●●●●● ●●● ●
●●
● ●● ●
● ●
●●●●
●●●
●
●●●●●
●●
●
● ●●●●●
●
●●
●●●●
●
●
●
●
●
●●
●
●
●
●
●
●●
●●●●
●●●●●
●●
●●
●
●
●●●●●
●●● ●
●
●
●
●●
●
●●
● ●●
●
●●
● ●●● ●
●
●
●
●●
●
●
●
●●
●●
●●
●●● ● ●●
● ●
●●●
● ●●● ●●
●●●
●●●
● ●
● ●
●● ●
● ●●
●● ●● ●
●●●●
●
●●
●
●
●
●
●●●●●●●● ●
●●●●●
●
●●
●
●● ●
●●●●●
●
● ● ●●●●
●●
●●●
●
●●●
● ●● ●
●
●●●●●
● ● ●● ●● ● ● ●
20
●● ●
●●●●
●●
● ●●● ●●● ●●●●● ●
20 40 60 80
ptri
Figura 20.28: Gráfico IMC vs. Ptri condicionado por la Edad, con la función
coplot().
www.editorialuc.es
fmi 0.40 0.58 0.66 0.93 1.00 0.96 0.27
fmax 0.41 0.59 0.67 0.99 0.96 1.00 0.28
imc 0.19 0.83 0.16 0.27 0.27 0.28 1.00
ax
la
c
i
pe
ed
fm
fm
fm
tal
im
1
edad ● 0.8
peso 0.6
0.4
talla ● 0.2
fmd ● 0
−0.2
fmi ● −0.4
fmax
● −0.6
● ● ●
−0.8
imc ● ●
−1
so
ad
ax
la
c
i
pe
ed
fm
fm
fm
tal
im
1
edad 1 0.42 0.52 0.39 0.4 0.41 0.19
0.8
0.4
talla 0.52 0.67 1 0.66 0.66 0.67 0.16
0.2
−0.2
fmi 0.4 0.58 0.66 0.93 1 0.96 0.27
−0.4
−0.8
imc 0.19 0.83 0.16 0.27 0.27 0.28 1
−1
20.10. Mapas
Con R es sencillo crear mapas. En el campo de las Ciencias de la Salud tie-
nen aplicación cuando se quieren presentar datos epidemiológicos [202–206].
www.editorialuc.es
20.11. Funciones y paquetes en este capı́tulo
En este capı́tulo se han utilizado las funciones recogidas en las siguientes
tablas:
Función Acción
abline() Dibuja una lı́nea
arrows() Dibuja una flecha
attr() Para cambiar los atributos de un objeto
barplot() Gráfico de barras
boxplot() Gráfico de cajas y bigotes
codebook() Descripción de las variables de una BdD según el
paquete epicalc
contents() Atributos de las variables de una BdD según el pa-
quete Hmisc
des() Estadı́stica descriptiva de una BdD según el pa-
quete epicalc
describe() Estadı́stica descriptiva de una variable según el
paquete Hmisc
dim() Dimensiones de un objeto
duplicated() Comprueba si hay duplicados
factor() Convierte una variable en factor
Continúa en la página siguiente...
Función Acción
Fcomplete cases() Missings en una BdD
FleeXLS() Lee una BdD en formato excel
hist.data.frame() Histogramas de una BdD según el paquete Hmisc
identify() Identifica un punto
invisible() No muestra el resultado de una función
label.var() Etiqueta una variable según el paquete epicalc
levels() Fija los niveles de un factor
library() Carga un paquete
log() Logaritmo de una variable
max() Máximo de un vector
mtext() Pone un texto debajo del tı́tulo, en el margen supe-
rior
numeric() Crea un vector numérico
pairs() Gráficos de puntos de una BdD
par() Fija determinados parámetros gráficos
paste() Pega varios elementos en una cadena
plot() Función genérica de dibujo
read.csv2() Lee un fichero csv en español
recode() Recodifica una variable según el paquete epicalc
replace() Reemplaza un valor de un elemento por otro valor
rm() Remueve objetos de la memoria
shapiro.test() Prueba de normalidad de una variable
str() Estructura de un objeto
summ() Estadı́stica descriptiva de una variable según el
paquete epicalc
summary() Resumen de un vector
tab1() Descriptiva de una variable cualitativa según el
paquete epicalc
table() Crea una tabla
rainbow() Colores del arcoiris
text() Escribe texto en una posición determinada
transform() Transforma una variable
use() Fija en memoria y usa una BdD según el paquete
epicalc
zap() Borra objetos de la memoria según el paquete
epicalc
Función Acción
maps Mapas package [207]
tabplot Gráfico de grandes bases de datos [191]
PROBLEMAS
www.editorialuc.es
Problema 1. Empleando la BdD ((pima)), represente la nube de puntos formada por
las variables imc (variable independiente) y glu p (variable dependiente) mediante
puntos sólidos de color verde para las mujeres no diabéticas y de color rojo para las que
lo son. Añada una lı́nea de regresión lineal de color azul y de doble grosor. Rotule las
variables como ((IMC (kg/m2 ))) y ((Glucemia (mg/dL))) y ponga como tı́tulo ((Glucemia
e IMC en indias Pima (1988))) y como subtı́tulo ((Graficado por -su nombre-)) e iden-
tifique los cuatro sujetos con mayor IMC.
Problema 2. Represente el mapa de la Comunidad de Cantabria.
Gráficos Trellis
Los gráficos ((trellis)), basados en ideas de Cleveland [208] creados por Sar-
kar, amplı́an las capacidades gráficas de R por su especial énfasis en los gráfi-
cos multivariantes [189], de ahı́ su amplia utilización en citometrı́a [209], far-
macocinética [210], bioinformática [211].
Para poder ((disfrutar)) de estos gráficos hay que cargar previamente el pa-
quete lattice. Hay muchos tipos de gráficos, análogos a los gráficos tradi-
cionales, pero con más ((glamour)) (Tabla 21.1).
Gráfico Gráfico
tradicional trellis Descripción
cloud() Gráficos tridimensionales
densityplot() Gráfico de densidad condicional
parallel() gráficos paralelos
barplot() barchart() Gráfico de barras
boxplot() bwplot() Gráfico boxplot
contour() contourplot() Gráficos de contornos
dotchart() dotplot() Gráfico de puntos
hist() histogram() Histograma
image() levelplot() Gráficos de niveles
pairs() splom() Gráficos de matrices
persp() wireframe() Gráficos tridimensionales
plot() xyplot() Gráfico de nubes de puntos
qqnorm() qqmath() Gráfico quantil-quantil teóricos
qqplot() qq() Gráfico quantil-quantil reales
stripchart() stripplot() Gráfico de puntos de una dimensión
253
Libros de Estadística en PDF | Statistics Books in PDF
254 CAPÍTULO 21. GRÁFICOS TRELLIS
y v x | cond
y Es la variable dependiente.
x Es la variable independiente.
cond Es la variable condicional. Puede ser una o más, en cuyo caso están se-
paradas por el signo ((+)) o ((*)).
#---------------------------------------------------------------
histogram(x,
data,
allow.multiple, outer = TRUE,
auto.key = FALSE,
aspect = "fill",
panel = lattice.getOption("panel.histogram"),
prepanel, scales, strip, groups,
xlab, xlim, ylab, ylim,
type = c("percent", "count", "density"),
nint = if (is.factor(x)) nlevels(x)
else round(log2(length(x)) + 1),
endpoints = extend.limits(range(as.numeric(x),
finite = TRUE), prop = 0.04),
breaks,
equal.widths = TRUE,
drop.unused.levels =
lattice.getOption("drop.unused.levels"),
...,
lattice.options = NULL,
default.scales = list(),
default.prepanel =
lattice.getOption("prepanel.default.histogram"),
subscripts,
subset)
#---------------------------------------------------------------
> use(DATA)
> edad_c <- factor(floor(DATA$edad), labels=paste(12:17, ’años’))
www.editorialuc.es
> label.var(edad_c, ’Edad en años cumplidos’)
> histogram(˜ fmax | edad_c, data = .data[sexo == ’Masculino’, ])
20 30 40 50 60
10
0
12 años 13 años 14 años
40
30
20
10
0
20 30 40 50 60 20 30 40 50 60
fmax
#---------------------------------------------------------------
densityplot(x,
data,
allow.multiple = is.null(groups) || outer,
outer = !is.null(groups),
auto.key = FALSE,
aspect = "fill",
panel = lattice.getOption("panel.densityplot"),
prepanel, scales, strip, groups, weights,
xlab, xlim, ylab, ylim,
bw, adjust, kernel, window, width, give.Rkern,
n = 50, from, to, cut, na.rm,
drop.unused.levels =
lattice.getOption("drop.unused.levels"),
...,
lattice.options = NULL,
default.scales = list(),
default.prepanel =
lattice.getOption("prepanel.default.densityplot"),
subscripts,
subset)
#---------------------------------------------------------------
10 20 30
0.10
0.05
Density
●
●●
●●●
●
● ●
●
●●
●
●●●
●●●
●
●●● ●
●
● ●
●
● ●
●●
●●●
●
●
●●
●
●●
●●
●
●
●●
● ●●
●●
● ●
●●
●●●●
●●
●●●●
● ●
● 0.00
12 años 13 años 14 años
0.15
0.10
0.05
0.00 ● ●●
●
●●
●●
●
●●
●●
●●● ●
●● ● ●●
● ●
●
●●●
●● ●●
●
●●●
●●●
●
●●●
●
●
●●● ●
●
● ● ● ●●
●
● ●
●●
● ●
●
●●
●●●●
●●
●●● ●
10 20 30 10 20 30
fmax
www.editorialuc.es
Figura 21.3: Densidad de la fuerza máxima en los varones según su edad.
#---------------------------------------------------------------
bwplot(x,
data,
allow.multiple = is.null(groups) || outer,
outer = FALSE,
auto.key = FALSE,
aspect = "fill",
panel = lattice.getOption("panel.bwplot"),
prepanel = NULL,
scales = list(),
strip = TRUE,
groups = NULL,
xlab,
xlim,
ylab,
ylim,
box.ratio = 1,
horizontal = NULL,
drop.unused.levels = lattice.getOption("drop.unused.levels"),
...,
lattice.options = NULL,
default.scales,
default.prepanel = lattice.getOption("prepanel.default.bwplot"),
subscripts = !is.null(groups),
subset = TRUE)
#---------------------------------------------------------------
● ● ● ●
0 5 10 15
Embrazos
S ●
Diabetes
N ● ● ●
0 5 10 15
Emabarazos
0 5 10 15 0 5 10 15
www.editorialuc.es
DE EU SO OB
S ● ● ● ●
Diabetes
N ● ● ●● ● ●● ● ● ●
0 5 10 15 0 5 10 15
Emabarazos
0 5 10 15 0 5 10 15
DE EU SO OB
S
Diabetes
0 5 10 15 0 5 10 15
Emabarazos
#---------------------------------------------------------------
barchart(x,
data,
panel = lattice.getOption("panel.barchart"),
default.prepanel = lattice.getOption("prepanel.default.barchart"),
box.ratio = 2,
...)
#---------------------------------------------------------------
N S Sum
0 60 33 93
1 97 25 122
2 74 16 90
3 40 24 64
4 41 19 60
5 28 14 42
6 26 11 37
7 16 18 34
8 10 16 26
9 7 14 21
10 8 9 17
11 2 6 8
www.editorialuc.es
12 4 4 8
13 4 2 6
14 0 2 2
15 0 1 1
17 0 1 1
Sum 417 215 632
> barchart(tabla, groups = FALSE)
0 20 40 60 80 100
N S
17
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
0 20 40 60 80 100
Freq
Embarazos y diabetes
17 ●
15 ●
14 ●
13 ●
12 ●
Nº de embarazos
11 ●
10 ●
9 ●
8 ●
7 ●
6 ●
5 ●
4 ●
3 ●
2 ●
1 ●
0 ●
Frecuencia
Figura 21.9: Porcentaje de diabetes en las indias Pima según el número de embarazos.
#---------------------------------------------------------------
xyplot(x,
data,
allow.multiple = is.null(groups) || outer,
outer = !is.null(groups),
auto.key = FALSE,
aspect = "fill",
panel = lattice.getOption("panel.xyplot"),
prepanel = NULL,
scales = list(),
strip = TRUE,
groups = NULL,
xlab,
xlim,
ylab,
ylim,
drop.unused.levels = lattice.getOption("drop.unused.levels"),
...,
lattice.options = NULL,
default.scales,
default.prepanel = lattice.getOption("prepanel.default.xyplot"),
subscripts = !is.null(groups),
subset = TRUE)
#---------------------------------------------------------------
1 En palabras de Sarkar: ”The scatter plot is possibly the single most important statistical graphic”
[189].
www.editorialuc.es
nubes de puntos, una para las diabéticas y otra para las normales.
20 30 40 50 60
N S
●
● ● ● ●
● ● ●
● ● ●● ●
100 ● ●
● ●● ● ● ● ● ●
●● ● ● ●●
● ●● ●●●● ●●●●● ● ● ● ●●●●●●●
●●●
●
● ● ●●● ●
●● ● ●
●● ● ●● ●●
TAD (mm Hg)
●●
●●●● ●●
● ●● ● ●
● ● ●● ●●● ●
● ● ●●●●●
●●●●
●
●
● ●●●
●
●
●
●●●
● ●●●
●
●●●●●●
●●●●
●● ●●
●● ●●●● ●● ●●
●● ●●●
●
●●
●
● ● ●●
●
●
●
●
80 ●● ●● ●● ●
●●● ●●●●
● ●
●
●
●●●
●●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●●●●
●●
●
●
●● ●●●●
●
● ●●●●●●●
●● ●
●●●
●● ●
●● ●
●●● ●●●●
● ●● ●
● ●
●
●●● ●● ●●●
●● ●● ●
●● ●●
●●●●●●
●●
●●●●● ●●● ●●● ●
●●●●
●● ●● ●
●● ●
●●
●●●
●●
●●●●
●
● ●
●●
●
●●●●
●
●
●● ●● ●
●● ●●● ● ● ●●●
●●
●●
●●
●
●●
●●●
●
●● ●
●●●
● ●
●
●●
●● ●●●●●
●● ●●●●●
●●●●
●
●●●
●●●●
●●● ●●●●●●
● ● ● ● ● ● ●● ●● ●●●●●
● ●● ●●●●
60 ●●●
●●
●●●
●
●●
●
●
●●
●
●●●
●
●
●
●●
●●●
●
●
●
●●
● ●●
●●●●●
●●● ● ●
●●● ●● ●●●● ●
●
●●●
● ●●●●
●
●●●
●●●●●
● ●●●●●●●●●
● ● ● ●
●● ●●● ● ● ● ●
● ●● ● ● ● ● ●● ● ● ● ●● ● ●
●●
40 ● ●
● ●
●
20
20 30 40 50 60
IMC (kg/m^2)
Figura 21.10: Relación entre TAD e IMC en las indias Pima según la presencia de
diabetes.
#---------------------------------------------------------------
splom(x,
data,
auto.key = FALSE,
aspect = 1,
between = list(x = 0.5, y = 0.5),
panel = lattice.getOption("panel.splom"),
prepanel,
scales,
strip,
groups,
xlab,
xlim,
ylab = NULL,
ylim,
superpanel = lattice.getOption("panel.pairs"),
pscales = 5,
varnames = NULL,
drop.unused.levels,
...,
lattice.options = NULL,
default.scales,
default.prepanel = lattice.getOption("prepanel.default.splom"),
subset = TRUE)
#---------------------------------------------------------------
● ● ● ● ●
●●● ● ●● ● ● ● ●●
●● ● ●● ● ●
● ● ● ●● ● ●
●●●
●●● ●● ●●
●●●● ●
●
●● ●●
●●
●
● ●●
●
●
●
●
●
●● ●
●●●●● ●
● ●
●●
●
●
●
●●
●
●
●●
●●
●
●●●● ●●●●
●
●
●
●
●
●
●
●●●●● ● ●●●
●
●●
●
●
●
●●
●
●●
●
●
●●
● ●
●●●
●●●●● ●● ●● ●
● ● ●●● ●●
●●● ●●● ● ●
●●● ● ●● ●●● ●
●●
●
●
●●●
●●●
●●●●●
●●●
●●●●
●
●●
●●●
●● ●●● ● ●●●
●●
●●●● ●●●
●
●
●
●●●●
●
●
●●●
●
●
●
●
●●●
●
●
●●
●
●
●
●●
●
●
●●●●●
●●●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●●●
● ● ●
●
●
●
●● ● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●● edad
●●
●●
● ●●
●
●
●
●
●
●
●
●●●
●
●●
●●
●
●
●
●
●
●
●●
●● ●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●●
●
●
●
●
●
●●●●●
●●
●
●
●
●
●
●●● ●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
● ●
●● ●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
● ●
●● ●●
●●●●
●●●● ● ●● ●● ● ● ●● ●●● ●●
●●●
● ● ● ● ●● ● ● ●●●
●●
●●●●
●
●
●
●●
●
●
●
●●
●●
●
●●
●●
●●
●●●●●
●● ● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●●
●
●●●●● ● ●
●●●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●● ● ●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●●
●●● ●
●
●●
●●●●
●●
●
●●
● ●●●
●● ●●●●
●
●●
●
●
●
●●
●
●
●
●
●●
●
● ●
●
●
●●
●
●
●●
●
●
●
●
●●
●
●
●●●●
●
●
●
●
●●
●
●●●
●●
●●
●
●●● ●
●
●●●
● ●● ● ●●●
●
●●
●
●
●
●●
●
●
●
●●●
●
●
●●
●●
●●
●
●
●
●●
●
●
●
●●
●●
●●
●
●
●
●
●●
●
●
●●
●
●●● ●
●
● ●
●
●●
●
●
●●
●
●
●
●●
●
●
●
●●●
●
●
●●
●●
●●
●
●●●
●
●
●●●
●
●●
●
●●
●
●●
●
●
●●● ●●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●●
●
●●
●●
●
●
●
●
●●
●
●
●
●●
●●
●
●
●●
●
●
●
●●●
● ●
●
● ● ● ● ●
● ● ● ● ● ● ● ● ●●
●● ● ● ● ● ● ● ●● ●● ●
●
●
●● ●●●● ●● ● ●●●● ●
●●
●
●● ●●●●●●
●
●
● ●●●
●●
●
●
●●●●●
●●
● ●●●●
●●●●●●●●●●●●● ●● ●
●●● ●
● ● ●●● ●●●
●
●●
●
●●●
●
● ● ●
●●●
● ●●● ●
●●
●
●
●●● ●●
● ●●
●
●
●
●
●
●●
●
●●
●
●●
●●
●●
●
●●●
● ●●
●●
●
●●●
●●
●●
●●●
●●●●
●●●●
●
●
●●●●● ●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
●
●
●
●
●
●●
●
●
●●
●●
●
●
● ●●●
●
● ●
●
●●●
●●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●●●
●● ●●
●
● ● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
● ●
imc ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
● ●
●● ● ●●●●●
●●● ● ●
●
●●● ●●
● ●
●●
● ●●●●
● ● ●
● ● ●●●
●●
●●
●●●
●●
●
●●
●● ●●● ● ●
●●●
●●
● ●
●●
●●● ●
●●
●●
●●●●
●●●
●
●
●● ●●
● ● ●●
●
●●
●●
●●
●
●●●
●●
●
●●●●●
●●
●●
●● ●●● ●●
●
●
●
●●
●
●●
●●●
●
●
●
●●
●
●●
●●
●
●
●●
●
●●
●●
●
●
●
●●
●
●●
●
●● ●●●
●●
●● ● ●
●
● ●●
●
●
●
●●
●
●
●●
●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●● ● ●●●
●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●●
●●●
●
● ● ●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●
●●
●
●
●
●●
●
●●●
● ●
●
●●
●
●
●
●●●
●●
● ●●●●
●●
●●●●●●
●●
●●
●
●●
●
●●
●●
●
●
●●
●
●●
●
●
●●
●
●
●●
●●
●
●
●
●
●
●
●
●
●●
●
●
●●●●● ●● ●● ●
●
●
●●
●
●
●●
●
●●
●
●
●
●
●●
●●●
●
●
●
●●
●
●
●
●
●
●●
●
● ●
●
●
●
●●
●●
●
●
●●
●●
●●
●
●
●
●
●●
●
●
●
●
●● ●
●
●
●
●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●●
●
●●
●
●●●●●
●●● ●
●
●●
●●
●●●●●●
●●
●
●
● ●● ● ●●●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●
●
●●
●● ●●
● ●●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●●
●● ●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●●
●● ●
●● ●●
● ●
● ● ● ● ●
●
● ●● ●● ● ●● ● ●●
●●●●● ●●● ● ●● ● ●●● ●● ●●
●●
●● ●● ptri ●
●●
●●●●●● ●
●
●●● ●● ●
●●
●●
●●●●●●
●●
● ●●
●● ●
●●
●● ●●●
●● ● ● ●● ●
●●
●
●
●
●
●
●
●
●
●
●
●
●●
●●●
●
●
●
●●
●●
●●●
●
●
●
●
●
●
●●
●●
●
●●●
●●●
●● ●
●●●●
●● ●●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●●●●
●● ●● ●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●●
●
●●
●●● ● ●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●●
●●●●●●
●
●●
●●
●●
● ●●●
●●● ●●●
●●●●●●
●● ● ●●●
●
●
●●
●●
●
●
●●
●●
●●●
●
●●●
●
●
●●●
●●
●●
●●●
●●
●
●●
●● ●●●
●
● ●
● ●●●
●
●
●
●
●●
●
●
●
●
●●
●
●
●●
●
●
●●
●
●
●●
●●●
●
●
●●●
● ●●●
●
●
●●
●
●
●●
●
●
●●
●
●●
●
●●
●
●
●●
●
●
●●
●●
●
●
●●
●●●●
● ●
●
●
●
●
●●●
●
●
●
●
●●
●
●
●
●
●●
●●
●
●
●
●●
●
●
●●●
●●
●
●
●●●
●
●●●
●●●
● ●
●
●●●
●●●●●●
●●
●●●●●
●●
● ●
●●●●
●●● ●● ●●
●
●●
●
●●
●
●●
●
●●
●
●●
●
●●●
●●
●
●
●●
●●●
●●●
●
●●
●●●
●●●
●
●●● ●●●
●●
●●
●
●
●●
●
●
●
●●
●●
●
●
●●
●
●●
●
●
●
●●
●●
●
●
● ●● ● ●
●●
●
●
●●
●
●
●
●
●●
●
●
●
●●
●
●
●●
●
● ●
●●
●
●
●●
●
●
●
● ●●
●
● ●
●
●
●
●
●●
●
●
●
●●
●
●
●
●●
●
●●
●
●
●●
●
●
●
●
●●
●
●●●
●
● ●
●
●●
●
● ●
●
●●●
●
●
●●
●●
●●
● ●
●●
●●
●●
●●
● ●
●●
●
●
●●●
●●
●●●●
● ●● ●●
●●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●
●●
●
●●
●
●
●
●●
●
●
●●
●
●
●●●
●
●
●
●● ●●●●●●●
●● ● ●●
●●
●
●
●
●
●●●
●●
●
●
●
●●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●●●
●●
●
●
●●
●●
●
●● ●● ●
●
●
●
●●
●●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●●●● ● ●
●
●
●
●
●●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
●●
●
●●
●
●
●
●●●
● ●●
●
●●
●● ●●●
●● ● ●
●●●●
●●●
●
●
● ●●
● ● ●●●●●●
●
●●●
●
●
● ● ●
●
● ●
●
●●
●●●
●
●●
●
●●
● ●
●
●●
●●
●
●●●● ● ●
● ●● ● ● ● ● ●● ● ●●●● ● ●● ● ●● ● ● ● ●● ●
●●
●●● ● ● ●●● ● ●● ● ● ● ●● ●●●●● ●●●● ●● ●● ●● ●●●●
●● ●● ● ●
●● ● ● ● ●
●
●●●●
●
●●
●●
●●●
●●
●● ●●●●●●●
● ●●
●●
●
●
●●●
● ●
●
● ●
●●
●
●●
●
●
●
●
●●
●
●
●
●
●
●●
●●
●●
●●
●
●
●●
●
●
●●●
●
●●
●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●● ●● ●●
●●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●●
●●●
●●● ●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●●
●●
●
●
●●
●
●
●
●
●
●
●●
●
●
●●●
●
●
●●●
●●●●●●
●●
●● ●
●● ●
●●●●
●● ●● ●●●
●●●● ●
●●●
●
●●
●
●●
●
●
●●
●
●
●●●●
●
●●
●●●
●
●●●
●●
●
●●●●
●●
●●●
●
●● ●●
●
●
●●
●●
●
●
●●
●
●
●●
●
●
●
●●
●
●
●●
●
●●●● ● ●●●
●
●
●●
●●
●
●
●●
●
●●
●
●●
●
●●
●●●
●●
●●
●●●● ● ● ●
●
●
●
●●
●
●
●●
●
●
●
●●
●●
●
●
●
●●
●●
●●
●●
●
●●
●●
●●
● ●
● ●● ●
●
●
●
●
●
●●
●
●●●
●
●●
●● ●
●
●●
●●●
●●●
●●
●● ●
●
●
●
●●
●
●
●
●
●
●
●●
●
●
●●
●
●●
●●
●
●
●
●
●
●
●●
●
●
●
● ●
●●
●
●
●
●
●
●
●●
●●
● ●●
●
● tad ●●●
●
●
●●
●
●
●
●●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●●
●●● ●
●
●●
●●
●
●●
●●
●
●
●
●●
●
●
●●
●●
●
●
●
●
●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●●
●
●●
●
● ●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●●
●●
●
●
●
●
●
●
●
●●
●●
●
●●
●
●
●
●
●
●
●
●●
●
●●
●
●
●●●
●
●●
●●
●●●●
●●●●●●
●●●●
●● ●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●●●
●
●
●●●●
●
●●●
●●●
●
●●● ●●
●
●
●
●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●● ●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
●●
● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
● ●●●
●●●●
●● ●● ●
●●●●●●●●●
●
●●●● ●● ● ●●
●● ●●
●●
●●
● ● ●
●●
●●
●
●
●●
●●●
●●
●●● ●
●
●
●●
●
●●
●●●
●●
● ● ●●
●●● ●
●● ● ● ●●
● ● ● ● ●●
●
● ●
●
●
● ●● ● ● ●
● ● ● ● ●●●
●●
●●●●●●●
●● ●● ●●● ●
● ● ●● ●●
●● ●●
●●●
● ● ● ●●●
● ●
●●
● ●● ●●●
●●●●●● ●●● ●
●●
● ●
●● ●●
●
●● ●
●● ●●
●
●
●●
●● ●
●●●
●●● ● ●
●
● ●
●●
●
●●
●●
●
●
●
●
●
●
●●● ● ●
●●
●
●●
●●
●
●●
●●●●
●
● ● ● ●
●
●●
●●●●
●
● ●●
●● ●●
●
●●
●
●●
●
●●
●●●●●●●
●● ●● ● ●
●●
●
●●
●
●
●●
●
●
●●
●●●
●
● ●● ● ●
●●
●
●●
●●
●
●●
●
●
●
●
●●
●
● ● ●●
●● ●
●
●
●
●
●●
●●
●
●●●●
●●
●●●●
●
●
●●
●
●
●
●●
●
●●
●●
●
●
●●●●●●●
●
●●●
●
●●●● ●
●● ●●
●● ●●●●● ●●● ●
●
●●
●
●●
●●●
● ●
●●
● ●●
●●
●●
●
●
●
●
●●
●
●
●●
● ● ●●
●
●
●
●●●
●
●
●●●
●●
● ●●●
● ●
●●
●●
●
●
●
●●
●●
●
●
●●
●
●
● ●
●
●
●●
● ●●●
●●
● ●●
●●● ●● ●●
●● ●●● ● ● ●
●
●●●●
●
●●●
●
●
●
●
●●●
●●
● ●
●
●●
●●
●
●●
●●
● ●
●●
●●
●●● ●
●●●
●
●●
●
●●
●● ●
●
● ●
●●
●●
● ●
●
●●
●
●●
●
●
●
● ●●
●●● ●
●
●●
●● ●●●●
●
●
●
●
●
●
●
●●●●
●
●●●●
●●
●
● ●
●
●
●●●●
●●● ● glu_p ●●●
●
●● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●●●●● ●●
●
● ●●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●
● ●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●●● ● ● ● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●
●●
●
●●
●
●●●● ●
●
● ● ●● ● ● ●● ●
●● ●
●● ●● ●● ●●● ● ●
●●
●●
●
●
●●
●●
●●
●
●●
●●●
●●●
●●●
●●●●●
●●●●●●● ●
●●●●
●●●
●●●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●● ●
●●● ● ●
●
●●
●
●●
●●
●
●
●
●
●●
●
●●
●
●
●●
●
●●●
●
●
●
●
●
●
●
●●
●●
●
●
●
●
●●●● ●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●
●
●
●
●● ● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●●●●
●●●●●
●●●
●●
●●●●
●●●
●
●●●●●● ● ● ●● ●●●●
●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●●
●
●
●
●
●●
●●
●
●● ● ●●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●●
●
●●
●
●●
● ●
●
●
●●●
●●●
●
●
●
●
●●
●●
●●
●
●●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●●
●
●●●
● ●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●●
●
●●
●
●●
●●
●●
●
●
●●
●●●● ●●
●
●●
● ●●
●●
●●
●● ●
● ●●●●
● ● ●
●
●
●
●
●
●●
●
●
●●
●
●
●
●●
●●●
●
●
●
●
●●●
● ●
●
●
●
●
●●
●●
●
●●
●●
●
●
●●
●
● ●●
●
●●
●
●●
●
●
●●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●●●●● ● ●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●●●●
●● ●●
● ●
● ●● ● ● ●●●● ●●● ●
●
● ●
●●
●
●
● ●
●
●● ●●
● ●
●
● ● ● ● ●
● ● ● ● ●● ●●● ●●●
● ● ●●
●●●●●●● ● ●
●●● ●
●●●●
●
●●●
●●● ● ●●
● ●● ●
●●
●●● ●●●●●
● ●●
●●●
● ●
●●
●●
●
●●
●● ●
●●
●●
● ●●●
●
● ●
● ● ●● ●
● ●● ●●● ●
● ●
●●
● ● ●●
●● ● ● ●●●●●
●
●●● ●●●●
●●
●
●●●
●
● ●●
●
●●
●●●●● ●●
●●
●
●●
●
●
●
●●
●●
●
●
●●
●
●
●● ●●●● ●
●●
●●
●
●
●●
●●
●
●
● ●
●● ●● ●
●
●●
●
●●
●
●
●●
●●
●
●●
● ●●●
● ●●●
●
●
●
●●
●
●●
●
●
●●
●
●●
●
●●
●●
●
●●
●●●● ●
emb ●●
●●
●
●●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●
●
●●●
●
●
●
●●
●
●
●
●
●
●●●
●
●
●
●
●
●●●
●●
● ●●
●●
●●
● ●● ●
●●
●●
●●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●●
●
●
●
●●
●● ●●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●● ●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●●●
●
● ●● ●●
●●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●
●
●
●
●
●●
●
●
●●
●●●
●
●
●
●
●
●
●●●
●
●●
●
●
●●●
●
●●
●
●●
●●
●
●
●
●●
●●
●
●●
●
●
●
●●●
●
●
●●●
●
●●
●
●
●●
●●● ●
●
●● ●●
●
●
●
●●
●
●
●
●
●●
●●
●
●
●
●●
●●
●
●
●●
●
●●
●●● ●
● ●●●
●
●●
●
●
●
●●
●
●
●●
●
●●
●
●
●●
●
●●
●● ●●●
●
●●
●
●●
●
●
●
●
●●
●
●
●●
●●
●
●
●●
●
●
●
●
●●
●●●
●
●●●● ●
●
●●
●
●
●
●
●●
●
●
●
●
●
●
●●
●
●●
●
●
●
●
●
●●
●
●
●●
●●
●
●●●
●●●
●●●●
●
●●●
● ●
●
●●●
●
●●●
●
●
●
●
●●
●
●●
●
●
●
●●
●
●
●
●●●
●
●
●●
●
●
●●●
●
●●
●●●
●●
● ●
●
●●
●●●
● ●●
●●
●
●●
●
●●
●●
●
●
●●
●
●
●
●●
●
●●
●
●●●
●●
●
●
●
●
●●
●●
●
●
●●
●
●
●●
●
●
●●
● ● ●
●●
●
●
●
●●
●●
●
●
●●
●
●●
●●
●
●
●●●
●
●
●
●
●●
●
●
●
●●●●
● ●
●
●●
●●
●
●
●●
●●●
●
●
●
●
●
●●
●
●
●
●
●●
●
●
●
●
●●
●
●
●●
●
●
●
●●
●
●
●
●
●●
●●●
●
●● ● ●
●
●
●
●
●●
●
●
●
●
●●
●●
●
●
●
●
●
●
●●
●
●●
●
●
●
●●
●
●●●● ●
●●●
● ● ●
●
●●
●●
●
●●●
●●
●
●
●
●
●●●
●
●●●
●
●
●
●
●
●●
●●
●
●●
●●
●
●
●
●
●●
●●
●
●
●
● ●
●
●●●●
●
●●●●
●●●●●
●
● ●●
●●● ●●
● ●●●
●
● ●●●
●
●●●
●
●●
●
●
●●
●●
●
● ●
●●
●
●
● ●
●
●
●●●
●●
●
●
●●
●
●
●●
●●
●●
● ●● ●
●●●● ●●●
●
●●
●
●●
●
●●
●●
●
●●
●●
●
●●●
●
●●
●●●
●
●
●●
●
●●
●
●●
●
●
●
●●
●
●●
●
●●● ●
●● ●
●●
●
●●
●●
●
●●
●●
●
●
●
●●
●
●
●
●
●●●
●
●
●
●
●●
●
●●
●●
●
●
●
●
●●
●
●
●
●●
●
●●
●
●
●●
●
●●
●
●
●●●
●●
●●● ● ●
●
●
●
●
●●
●●
●●
●
●
●
●●
●
●
●
●
●
●●
●
●
●●
●
●
●
●●
●
●●
●
●●
●●●
● ● ●
●
N S
www.editorialuc.es
edad edad
imc imc
ptri ptri
tad tad
glu_p glu_p
emb emb
Figura 21.12: Gráfico de la BdD de indias Pima, con la función splom(); a la iz-
quierda las no diabéticas y a la derecha las diabéticas..
#---------------------------------------------------------------
cloud(x,
data,
allow.multiple = is.null(groups) || outer,
outer = FALSE,
auto.key = FALSE,
aspect = c(1,1),
panel.aspect = 1,
panel = lattice.getOption("panel.cloud"),
prepanel = NULL,
scales = list(),
strip = TRUE,
groups = NULL,
xlab,
ylab,
zlab,
xlim = if (is.factor(x)) levels(x) else range(x, finite = TRUE),
ylim = if (is.factor(y)) levels(y) else range(y, finite = TRUE),
zlim = if (is.factor(z)) levels(z) else range(z, finite = TRUE),
at,
drape = FALSE,
pretty = FALSE,
drop.unused.levels,
...,
lattice.options = NULL,
default.scales =
list(distance = c(1, 1, 1),
arrows = TRUE,
axs = axs.default),
default.prepanel = lattice.getOption("prepanel.default.cloud"),
colorkey,
col.regions,
alpha.regions,
cuts = 70,
subset = TRUE,
axs.default = "r")
#---------------------------------------------------------------
1.0
www.editorialuc.es
edad 64 28 35 16 7 100
ptri 10 23 23 100 65 16
0.0
tad 20 22 100 23 31 35
emb 100 13 20 10 1 64
−1.0
emb glu_p tad ptri imc edad
+ y <- as.numeric(y)[subscripts]
+ z <- as.numeric(z)[subscripts]
+ zcol <- level.colors(z, at = at, ...)
+ for (i in seq(along = z)) {
+ ell <- ellipse(z[i], level = level, npoints = 50,
+ scale = c(0.2, 0.2),
+ centre = c(x[i], y[i]))
+ panel.polygon(ell, col = zcol[i], border = zcol[i], ...)
+ }
+ if (label)
+ panel.text(x = x, y = y, lab = 100 * round(z, 2),
+ cex = 0.8, col = ifelse(z < 0, ’white’,
+ ’black’))
+ }
>
> cor_pima <- cor(pima[, c(2:6, 8)], use = ’complete.obs’)
> levelplot(cor_pima, at = do.breaks(c(-1.01, 1.01), 20),
+ xlab = ’’, ylab = ’’,
+ colorkey = list(space = ’right’),
+ panel = panel.corrgram, label = TRUE)
21.2.10. Mapas
Los gráficos ((Trellis)) también tienen capacidad de crear mapas condiciona-
les con la función mapplot().
> library(lattice)
> library(latticeExtra)
> library("mapproj")
> data(USCancerRates)
> rng <- with(USCancerRates,
+ range(rate.male, rate.female, finite = TRUE))
> nbreaks <- 40
> breaks <- exp(do.breaks(log(rng), nbreaks))
> mapplot(rownames(USCancerRates) ˜ rate.male + rate.female,
+ data = USCancerRates, breaks = breaks,
+ map = map("county", plot = FALSE, fill = TRUE,
+ projection = "tetra"),
+ scales = list(draw = FALSE), xlab = "",
+ main = ’Muertes por cáncer\n
+ Tasa anual / 100000 habitantes’)
www.editorialuc.es
Función Acción
addmargins() Calcula los marginales en una tabla o matriz
barchart() Gráfico de barras
barplot() Gráfico de barras
boxplot() Gráfico boxplot
bwplot() Gráfico boxplot
c() Concatena elementos en un vector
cloud() Gráficos tridimensionales
contour() Gráficos de contornos
contourplot() Gráficos de contornos
cut() Discretiza un vector
densityplot() Gráfico de densidad condicional
dotchart() Gráfico de puntos
dotplot() Gráfico de puntos
factor() Crea un factor
floor() Redondea al mayor entero menor
hist() Histograma
histogram() Histograma
image() Gráficos de niveles
label.var() Etiqueta una variable
levelplot() Gráficos de niveles
max() Calcula el máximo
pairs() Gráficos de matrices
parallel() Gráficos paralelos
paste() Forma una cadena con subcadenas
persp() Gráficos tridimensionales
plot() Gráfico de nubes de puntos
qqmath() Gráfico quantil-quantil teóricos
qq() Gráfico quantil-quantil reales
qqnorm() Gráfico quantil-quantil teóricos
qqplot() Gráfico quantil-quantil reales
rowSums() Suma las filas de una tabla o matriz
splom() Gráficos de matrices
stripchart() Gráfico de puntos de una dimensión
stripplot() Gráfico de puntos de una dimensión
table() Crea una tabla
use() Crea un data frame oculto en memoria
xyplot() Gráfico de nubes de puntos
wireframe() Gráficos tridimensionales
Función Acción
ellipse Dibujar elipses con ellipse package [218]
lattice Gráficos ((Trellis)) con lattice package [189]
latticeExtra Gráficos ((Trellis)) con latticeExtra package [219]
mapproj Proyección de mapas con mapproj package [220]
PROBLEMAS
Problema 1. Represente un gráfico de densidad de la fuerza máxima para cada uno
de los años de edad en los varones.
Problema 2. Represente el mapa de la Comunidad de Cantabria.
Problema 3. Dibuje la matriz de correlaciones de las variables numéricas de la BdD
de laFuerza en adolescentes.
Problema 4. Con volcano presente en el paquete datasets, ¿cómo puede con-
seguir esta imagen?
Gráficos ggplot2
Los gráficos ((ggplot2)) fueron creados por Hadley Wickham en 2009 [221,
222]. Desde entonces han ido siendo aceptados por la comunidad cientı́fica po-
co a poco y actualmente son empleados con profusión [188, 210, 223, 224]. El
creador de esta librerı́a, uno de los más prolı́ficos autores de paquetes para R,
se basó en los conceptos de Wilkinson [225] publicados en su libro ((Grammar of
Graphics)) en el que se pueden juntar de alguna manera diferentes componen-
tes.
data set. Es el data frame que proporciona los datos para el gráfico.
labels. Para poder poner etiquetas en los ejes cartesianos y en el tı́tulo del
gráfico.
theme. Para controlar el fondo gris, blanco, con sin cuadrı́cula, etc.
271
Libros de Estadística en PDF | Statistics Books in PDF
272 CAPÍTULO 22. GRÁFICOS GGPLOT2
Las posibilidades del componente geom son muy amplias, como se recoge
en la Tabla 22.1.
www.editorialuc.es
Paquete Descripción
GGally Extension to ”ggplot2”
ggalt Extra coordinate systems, geoms and statistical transforma-
tions for ”ggplot2”
ggbeeswarm Categorical scatter (violin point) plots
ggcorrplot Visualization of a correlation matrix using ”ggplot2”
ggdendro Create dendrograms and tree diagrams using ”ggplot2”
ggExtra Add marginal histograms to ”ggplot2”, and more ”ggplot2”
enhancements
ggfortify Data visualization tools for statistical analysis results
ggiraph Make ”ggplot2”graphics interactive using ”htmlwidgets”
ggmap Spatial visualization with ggplot2
ggmcmc Tools for analyzing MCMC simulations from bayesian infe-
rence
ggnetwork Geometries to plot networks with ”ggplot2”
ggparallel Variations of parallel coordinate plots for categorical data
ggplot2 An implementation of the grammar of graphics
ggplot2movies Movies data
ggpmisc Miscellaneous extensions to ”ggplot2”
ggRandomForests Visually exploring random forests
ggraptR Allows interactive visualization of data through a web brow-
ser GUI
ggrepel Repulsive text and label geoms for ”ggplot2”
ggROC Package for roc curve plot with ggplot2
ggsci Scientific journal and sci-Fi themed color palettes for ”gg-
plot2”
ggseas ”stats”for seasonal adjustment on the fly with ”ggplot2”
ggsn North symbols and scale bars for maps created with ”ggplot2”
or ”ggmap”
ggspectra Extensions to ”ggplot2”for radiation spectra
ggswissmaps Offers various swiss maps as ggplot2 objects
ggtern An extension to ”ggplot2”, for the creation of ternary dia-
grams
ggThemeAssist Add-in to customize ”ggplot2”themes
ggthemes Extra themes, scales and geoms for ”ggplot2”
ggvis Interactive grammar of graphic
sexo
● Femenino Masculino
50
40
fmax
● ●
●
●● ●
30
● ● ●● ●●
● ● ● ● ●●●● ●●
● ●
●●● ● ● ●● ● ● ●● ●●
● ●● ●●●
●
●● ●● ●● ●●● ●● ● ● ● ● ● ●●●●●●● ●●●●●
● ●● ● ●●●●●●●●● ●● ●●●●●●● ●● ●●● ●●●
●●●●
● ●●●●●
●
● ●●● ● ● ●●
● ● ●● ● ● ●●● ●● ● ● ●
● ●● ● ●●●
●● ● ●
20
●
● ● ● ● ●● ● ●
●● ● ● ● ● ●
●●●● ●● ● ●● ● ● ●
●●
● ● ●
● ● ●● ● ●●●●●
●
● ●
●●
●● ●
●
13 14 15 16 17 18
edad
www.editorialuc.es
Edad y Fuerza máxima en los adolescentes
●
●
50 ● ●
●
● ● ●
● ● ● ● ●
● ● ●
● ●
● ● ● ●
● ●● ● ●
● ● ●
● ● ● ●●
● ●
● ●
● ● ● ● ● ●●
40 ●
● ● ●
●
●
● ●
●
● sexo
● ● ●● ●● ●
fmax
●
● ●
●
● ●● ● ● ● ●●
●
●●
● ● ● ● ●
●● ● ● ● ● Femenino
●●
● ● ● ●●● ●●
● ●● ●
● ● ● ● ● ● ● ● ● ●●
●● ● ● ● ● ● ●
●● ●●
● ●● ● ● Masculino
● ●● ●● ● ●
30 ● ● ● ●
●● ● ● ● ● ●● ● ●
● ● ● ●● ●
● ●
●● ● ●
● ● ●● ● ●
●●● ● ● ● ● ● ● ●●●● ●
● ● ● ●●
● ● ● ● ●
● ● ●● ● ●● ●● ● ●● ●● ●● ● ● ● ●● ● ●● ●● ●
●● ● ● ● ● ●● ● ●
● ● ● ●●● ●● ●●●
● ●● ●●● ●● ● ● ●● ●● ● ● ●●●● ●● ● ●● ● ● ● ●●
● ● ● ●● ● ●● ● ● ● ●●● ●●● ●● ●●● ● ● ●●
● ●●● ● ● ●● ●● ● ● ● ● ● ●● ●
● ●● ● ● ●● ●● ● ● ●●
●●
●● ●●●●●● ●●
●●
●
●
● ● ● ● ● ●
●
●● ●
●●
●●
●●
●● ●● ●● ●● ●● ●● ● ●● ● ● ● ●
● ●●
●● ● ● ●●
20 ● ●
●●● ●● ● ●● ● ● ● ● ●● ●
●
● ●
●●●
●
● ● ● ● ● ● ●●●
●● ● ● ●●
●
●● ● ● ●
●
●
●
●● ●
10
14 16 18
edad
●
50 ● ●
●
● ● ●
● ● ● ● ●
● ● ●
● ●
● ● ● ●
● ●● ● ●
● ● ●
● ● ● ●●
● ● ● ● ●
● ● ● ● ●● ●
40 ●
● ● ●
●
● ●
●
● sexo
● ● ●● ●● ●
fmax
●
● ●
●
● ●● ● ● ● ●●
●
●●
● ● ● ● ●
●● ● ● ● ● Femenino
●●
● ● ● ●●● ●●
● ●● ●
● ● ● ● ● ● ● ● ● ●●
●● ● ● ● ● ● ●
●● ● ●● ●● ● ● Masculino
● ●● ●● ●
30 ●● ● ● ● ●● ●● ●
● ● ● ● ● ●● ●
●
●● ● ● ●● ● ●
● ● ●●●● ● ● ●● ●
● ●
● ● ●
● ● ●● ● ● ● ● ● ● ●●
● ● ●● ● ●● ●● ● ●● ●● ●● ● ● ● ● ●● ●
●● ● ● ● ● ●● ● ●● ● ● ●● ● ●● ● ●●● ●● ●●●
● ●● ●●● ●● ● ● ●● ●● ● ● ●●●● ●● ● ●● ● ● ● ●●
● ● ● ●● ● ●● ● ● ● ●●● ●●● ●● ●●● ● ● ●●
● ●●● ● ● ●● ●● ● ● ● ● ● ●● ●
● ●● ● ● ●● ●● ● ● ●●
●
●● ●●●●●
● ● ●●
●●
●
●
● ● ● ● ● ●
●
●● ●
●●
● ●
●●● ● ● ●● ●● ● ●● ● ●
●● ● ● ●●● ● ● ●● ●● ● ● ●●
20 ●● ● ● ●●
● ●● ● ● ● ● ● ●●
● ●
●●●● ● ● ● ● ● ● ● ●●●
●● ● ● ●●
●
●● ● ● ●
●
●
●
●● ●
10
14 16 18
edad
Pero este gráfico no interesa ya que es mucho mejor el que presenta las
lı́neas de regresión, con su intervalo de confianza, para cada uno de los sexos
(Figura 22.3). Lo interesante de ggplot2 es que como va creando los gráficos
por capas, ahora simplemente hay que añadir a g1 la orden para que dibuje las
lı́neas de regresión utilizando la función geom smooth().
g1 + geom_smooth()
Figura 22.5: Fuerza máxima (kgf) en adolescentes. Nube de puntos y rectas de regre-
sión lineal simple según sexo.
●
50 ● ●
●
● ● ●
● ● ● ● ●
● ● ●
● ●
● ● ● ●
● ●● ● ●
● ● ●
● ● ● ●●
● ●
● ●
● ● ●● ●
●● ●
40 ●
● ● ●
● ●
● ●
●●●
● sexo
● ●● ●
fmax
●
● ● ●
● ●● ● ● ● ●●
● ●
●●
● ●● ●
●● ● ● ● ● Femenino
●● ●● ● ●
●
● ●● ●
● ●● ●●
●●
●
● ● ● ● ● ●
●● ● ● ● ● ● ●
●● ●●
● ●● ● ● Masculino
● ●● ●● ●
30 ●● ● ● ● ●● ●● ●
● ● ● ● ● ●● ●
●
●● ● ● ● ●● ● ●
● ● ●●● ● ● ● ●
● ● ● ●●
● ●
● ●
● ● ● ● ●●●● ●
● ● ●● ● ●● ●● ● ●● ●● ●● ● ● ● ● ●● ●
●● ● ● ● ● ●● ● ●● ● ● ●● ● ●● ● ● ●●●● ●●●
● ●● ●●● ●● ● ● ●● ● ● ●
● ●
●● ● ● ●●● ● ● ●
● ●●
● ● ● ●● ● ●● ●● ● ● ●● ● ●●● ●● ●●● ● ●●
● ●●● ● ● ●● ●● ● ● ● ● ● ●● ●
● ● ●● ● ●
● ●● ●● ● ● ●●
● ●
● ● ● ●
●●
●● ● ● ●● ● ● ● ● ● ● ● ●● ●
●●
●●
●●
●● ●
● ●● ●● ●● ●● ● ●● ● ● ● ●
● ●●
●● ● ● ●●
20 ● ●
●●● ● ●● ●● ● ● ● ● ●●● ●
● ●
●●●
●
● ● ● ● ● ● ●●●
●● ● ● ●●
●
●
●● ● ●
●
●
●
●● ●
10
14 16 18
edad
Figura 22.6: Fuerza máxima (kgf) en adolescentes. Nube de puntos y curvas de regre-
sión no paramétrica según sexo.
www.editorialuc.es
Edad y Fuerza máxima en los adolescentes
50
Fuerza máxima (kgf)
40
sexo
●
● Femenino
●
● ●
●●
● ●
●● Masculino
30 ● ● ● ●
●●
●
● ● ● ●● ●●
● ●
● ● ●
● ● ● ●●● ●
● ● ● ●● ● ● ● ●● ●
●● ● ● ● ● ● ●● ●●
● ● ● ● ● ●● ●●●
● ● ● ● ● ●● ● ●● ●
●
●●
● ● ●● ●● ●● ● ● ● ●●● ● ● ●●● ● ●● ●
● ●● ● ● ●● ● ● ● ● ● ●
● ●
● ●● ●●
● ●● ● ● ● ●
●●
●
● ●● ●● ● ● ● ●● ●
●
●● ● ●● ● ●● ● ●● ● ● ● ●
●● ● ●
20 ●● ●
●● ● ● ● ●
●
●
●
● ●● ●
● ● ●●● ● ●●● ● ● ●●●
● ● ●
●●
●
10
14 16 18
Edad (años)
Como se puede ver en la Figura 22.6 ahora las etiquetas de ambos ejes están
correctamente rotuladas.
En otras ocasiones interesa un gráfico de nube de puntos con los puntos co-
loreados según un gradiente de color correspondiente a una variable numérica.
> ggplot(z,
+ aes(x=edad, y=fmax, fill=imc)) +
+ geom_point(shape=21, size=2.5) +
+ scale_fill_gradient(low=’green’, high = ’red’)
Figura 22.7: Fuerza máxima (kgf) en adolescentes. Nube de puntos coloreados según
el IMC de los sujetos (verde = menor y rojo = mayor).
Histogram of fmax
60
Frequency
40
20
0
20 30 40 50
fmax
www.editorialuc.es
+ fill = ’orange’, colour = ’black’) +
+ labs(x = ’Fuerza máxima (kgf)’, y = ’Frecuencia’)
60
Frecuencia
40
20
10 20 30 40 50
Fuerza máxima (kgf)
40
Femenino
20
Frecuencia
40
Masculino
20
0
10 20 30 40 50
Fuerza máxima (kgf)
0.06
0.04
density
0.02
0.00
10 20 30 40 50
fmax
www.editorialuc.es
Ejemplo 22.8. Dibuje un histograma de densidad de la fuerza máxima fmax
diferenciando entre los del sexo masculino y femenino para los sujetos dies-
tros y zurdos.
En este gráfico se aprecia claramente que los zurdos tienen más fuerza que
los diestros, ya que sus curvas de densidad están ligeramente desplazadas ha-
cia la derecha.
● ●
50 ● 50
●
●
●
●
40 40
fmax
fmax
30 30
20 20
10 10
0.6 0.8 1.0 1.2 1.4 Femenino Masculino
1 sexo
www.editorialuc.es
#---------------------------------------------------------------
Fdiscrepa_mdym(x)
#---------------------------------------------------------------
> #-----------------------------------------------------------
> # Fdiscrepa_mdym() Discrepancia entre mediana y media
> #-----------------------------------------------------------
> Fdiscrepa_mdym <- function(x, dec = 3) {
+ if (!is.numeric(x)) stop(’x must be a numeric variable’)
+ x <- x[!is.na(x)]
+ md <- median(x)
+ m <- mean(x)
+ iqr <- IQR(x)
+ cn <- abs(md - m) / iqr
+ normalidad = ifelse(cn < 0.05, ’Normal’, ’no normal’)
+ res <- list(shapiro_wilk = shapiro.test(x),
+ statistics = c(mean = m, median = md, IQR = iqr,
+ discr = round(cn, dec)),
+ signif = normalidad)
+ res
+ }
> #----------------------------------------fin Fdiscrepa_mdym()
Figura 22.15: Box plot de la fuerza máxima (kgf) en adolescentes según su edad en
años cumplidos. A la izquierda en chicas y a la derecha en chicos.
Femenino Masculino
50
●
40
fmax
● ● ●
●
●
●
30
20
●
●
10
12 13 14 15 16 17 12 13 14 15 16 17
factor(floor(edad))
Figura 22.16: Box plot de la fuerza máxima (kgf) en adolescentes según su edad en
años cumplidos. A la izquierda en chicas y a la derecha en chicos.
Femenino Masculino
50
●
40
fmax
● ● ●
●
●
●
30
20
●
●
10
12 13 14 15 16 17 12 13 14 15 16 17
factor(floor(edad))
www.editorialuc.es
de 0 a 20 con df = 5.
0.3
0.10
f(x)
0.2
y
0.05
0.1
0.0 0.00
−4 −2 0 2 4 0 5 10 15 20
z x
Ejemplo 22.14. Se quiere sombrear el área entre -0.5 y 1.6 de la curva normal
estandarizada.
2.5
0.0
y
−2.5
−5.0
−3 −2 −1 0 1 2
x
0.3
0.2
y
0.1
0.0
−2 0 2
x
+ y
+ }
www.editorialuc.es
+ }
>
> dlimit <- limitRange(dnorm, -0.5, 1.6)
> ggplot(data.frame(x = c(-3, 3)), aes(x = x)) +
+ stat_function(fun = dnorm) +
+ stat_function(fun = dlimit,
+ geom = ’area’, fill = ’blue’, alpha = .3) +
+ theme_bw()
Ejemplo 22.15. Cree un gráfico de barras con los alumnos en cada centro.
Figura 22.20: Distribución de los alumnos estudiados en cada uno de los centros edu-
cativos.
150
100
count
50
También se puede controlar por una segunda variable cualitativa con facet().
Figura 22.21: Distribución de los alumnos estudiados en cada uno de los centros edu-
cativos.
1º Bach 1º ESO 2º ESO 3º ESO 4º ESO
60
40
count
20
Femenino Masculino Femenino Masculino Femenino Masculino Femenino Masculino Femenino Masculino
sexo
> require(ggcorrplot)
> corr <- cor(.data[, c(3, 8:13)])
> corrp <- cor_pmat(.data[, c(3, 8:13)])
> round(corr, 2)
edad peso talla fmd fmi fmax imc
edad 1.00 0.42 0.52 0.39 0.40 0.41 0.19
peso 0.42 1.00 0.67 0.58 0.58 0.59 0.83
talla 0.52 0.67 1.00 0.66 0.66 0.67 0.16
fmd 0.39 0.58 0.66 1.00 0.93 0.99 0.27
fmi 0.40 0.58 0.66 0.93 1.00 0.96 0.27
fmax 0.41 0.59 0.67 0.99 0.96 1.00 0.28
imc 0.19 0.83 0.16 0.27 0.27 0.28 1.00
> ggcorrplot(corr, method = ’circle’)
www.editorialuc.es
imc ● ● ● ● ●
fmax ● ● ● ●
Corr
fmi ● ● ● ● 1.0
0.5
fmd ● ● ● ● 0.0
talla ● ● ● ● ● ●
−0.5
−1.0
peso ● ● ● ● ●
edad ● ● ● ● ● ●
d
so
lla
ax
c
fm
im
a
fm
ta
pe
fm
ed
fmd 0.99
0.0
edad 0.52 0.4 0.39 0.41
−0.5
−1.0
imc 0.19 0.16 0.27 0.27 0.28
ad
lla
ax
fm
im
fm
ta
fm
ed
22.2.7. Mapas
En estudios epidemiológicos, en ocasiones es importante presentar mapas.
Con ggplot2 se puede realizar esta tarea. A modo de ejemplo se presenta el
mapa de las comarcas de Cantabria con datos ficticios del número de lectores
de una determinada publicación (Figura 22.24).
Figura 22.24: Mapa de Cantabria con datos ficticios de incidencia de una enfermedad
determinada.
smier
> library(rgdal)
> # Datos administrativos de GADM y selecciono Cantabria
> load("/Users/carlosredondofiguero/Downloads/ESP_adm3.RData")
> cant3.spdf <- gadm[gadm$NAME_2 == "Cantabria", ]
> cant3.df <- fortify(cant3.spdf, group = "NAME_2")
> set.seed(2015)
> # Genero datos epidemiológicos de forma aleatoria para cada id
> epidem.df <- data.frame(id = unique(cant3.df[ ,’id’]),
+ epidem = rpois(11, 450),
+ min = 0, max = 2000)
> #epidem = runif(n = length(unique(cant3.df[ ,’id’])),
>
> # Fusiono ambos data.frames
> cant3.df <- merge(cant3.df, epidem.df,
+ by.y = ’id’, all.x = TRUE)
> # Obtengo las coordenadas para las etiquetas
> cant3.centroids.df <- data.frame(
+ long = coordinates(cant3.spdf)[, 1],
+ lat = coordinates(cant3.spdf)[, 2],
+ ID_2 = cant3.spdf@data[, "ID_3"],
+ NAME_2 = cant3.spdf@data[, ’NAME_3’])
> #Cambio codificaci´on del texto de latin a utf-8 para que se muestren
los acentos correctamente
> cant3.centroids.df$NAME_2 <- as.factor(
+ iconv(as.character(cant3.centroids.df$NAME_2),
+ "latin1", "utf-8"))
www.editorialuc.es
> # Create ggplot with labels for administrative areas
> require(ggplot2)
> ggplot(cant3.df, aes(x = long, y = lat, group = group)) +
+ geom_polygon(aes(fill = cut(epidem,11))) +
+ geom_text(data = cant3.centroids.df,
+ aes(label = NAME_2, x = long, y = lat,
+ group = NAME_2), size = 3) +
+ labs(x=" ", y=" ") +
+ scale_fill_brewer(’Incidencia’,
+ palette = ’Accent’) +
+ coord_map() +
+ theme(axis.ticks = element_blank(),
+ axis.text.x = element_blank(),
+ axis.text.y = element_blank()) +
+ theme(panel.border = element_blank())
Función Acción
abs() Valor absoluto
aes() Estética de un gráfico ggplot
c() Concatena elementos
cor() Correlación entre variables numéricas
cor pmat() Matriz de significación de una matriz de correla-
ciones
ifelse() Ejecución condicional vectorizada
facet grid() Rejilla de gráficos condicionales
Fdiscrepa mdym() Diferencia entre mediana y media
FlimitRange() Limita el rango para área bajo la curva
floor() Redondea hacia abajo
geom bar() Gráfico de barras
geom boxplot() Gráfico boxplot
geom density() Gráfico de densidad
geom histogram() Histograma
geom line() Lı́nea
geom point() Punto/s
geom smooth() Ajuste suavizado
ggcorrplot() Gráfico de una matriz de correlaciones
ggplot() Principal función del paquete ggplot2
ggtitle() Pone tı́tulo al gráfico
hist() Histograma clásico
IQR() Rango intercuartı́lico
mean() Media
Continúa en la página siguiente...
Función Acción
labs() Pone etiquetas al gráfico
median() Mediana
rep() Repite elementos de un vector
round() Redondea a un número fijo de decimales
scale color brewer() Escala de color
scale fill gradient() Escala de relleno
scale shape manual() Escala manual
scatterplot() Nube de puntos (paquete car)
shapiro.test() Prueba de Shapiro-Wilk
stat function() Estadı́stica para una función
stat summary() Estadı́stica para boxplot
theme bw() Fondo en blanco y negro
Función Acción
car Funciones con car package [120]
ggcorrplot Matriz de correlaciones con ggcorrplot package [227]
ggplot2 Gráficos elegantes con ggplot2 package [221]
rgdal Paquete para datos geoespaciales rgdal [228–230]
PROBLEMAS
Problema 1. Con la BdD de las indias Pima, dibuje la recta de regresión lineal simple
y sus bandas de confianza para el modelo de la TAD en función de la edad.
Problema 2. Dibuje la matriz de correlaciones de las variables numéricas de la BdD
de las indias Pima empleando la función adecuada correspondiente al sistema gráfico
ggplot2.
Problema 3. Represente en un histograma la TAD de las indias Pima, diferenciando
entre diabéticas y no diabéticas.
Problema 4. Dibuje los box plots del IMC de las indias Pima según su estado nutri-
cional.
Problema 5. Represente mediante un gráfico de nube de puntos las variables
height waist de la BdD correspondiente a las Familias. Coloree los puntos co-
rrespondientes a cada familia con un color diferente y dibuje la recta suavizada de
regresión no paramétrica con su intervalo de confianza.
PROGRAMACIÓN
Scripts
23.1. Concepto
Un script es un fichero de texto con las instrucciones que debe ejecutar el
procesador secuencialmente1 .
Los comandos u órdenes se pueden teclear directamente en la consola; tras
pulsar ((Intro)) aparece el resultado en la misma. Este proceso se llama estilo
interactivo [231] y puede ser útil en contadas ocasiones, por ejemplo cuando se
hace una operación sencilla en la que se emplean pocos comandos.
Cuando hay muchos comandos, ejecuciones condicionales, etc. es mucho
mejor escribirlas en un fichero de texto que se pueda ejecutar secuencialmente,
ya que ofrece una serie de ventajas (Tabla 23.1).
# Ventajas
1 Es una manera efectiva de salvar el trabajo.
2 Permite volver atrás cuando hay un error.
3 Permite incluir notas para documentar el trabajo.
4 Permite reutilizar el código para problemas similares.
5 Permite hacer tareas complejas.
6 Permite difundir nuestro trabajo a otras personas.
1 De Wikipedia: ((programs written for a special run-time environment that automate[1] the execution
295
Libros de Estadística en PDF | Statistics Books in PDF
296 CAPÍTULO 23. SCRIPTS
23.2.1. Escritura
Para escribir un script conviene utilizar un programa que permita grabar
texto plano. La mejor forma es con RStudio (Figura 23.1).
Conviene que los scripts tengan una cabecera y que estén documentados.
Se deberá seguir estrictamente la guı́a de estilo que vimos en el capı́tulo 7. A
continuación se presenta el código del script de ejemplo:
> #-----------------------------------------------------------
> # Fecu_2g() Ecuación de segundo grado (Axˆ2 + Bx + C = 0)
> #-----------------------------------------------------------
> Fecu_2g <- function(
+ A, # coeficiente de x2
+ B, # coeficiente de x
+ C, # término independiente en Axˆ2 + Bx + C = 0
+ info = FALSE, # si se desea información extra
+ graph = TRUE, # si se desea un gráfico
+ x_inf = -20, # lı́mite inferior del eje x
+ x_sup = +20, # lı́mite superior del eje x
+ dec = 3, # decimales de redondeo
+ ... # por si se quieren pasar más parámetros
+ ) {
+ # ecuación con signos correctos
+ signo1 <- ifelse(B < 0, paste(’-’, abs(B)), paste(’+’, B))
+ signo2 <- ifelse(C < 0, paste(’-’, abs(C)), paste(’+’, C))
www.editorialuc.es
+ ifelse(signo1 == ’- 1’, ’-’, signo1))
+ ecu <- paste(coef2, ’x?’, signo1, ’x’, signo2)
+
+ # vértice de la parábola
+ ver <- c(-B / (2 * A), -(B ˆ 2 - 4 * A * C) / (4 * A))
+
+ # semiparámetro, alfa y beta
+ p <- 1 / (2 * A)
+ alfa <- - B / (2 * A)
+ beta <- (4 * A * C - B ˆ 2) / (4 * A)
+
+ # discriminante en forma compleja (si es necesario)
+ dis <- B ˆ 2 - 4 * A * C
+ if (dis < 0) {
+ A <- A + 0i
+ B <- B + 0i
+ C <- C + 0i
+ }
+ dis <- B ˆ 2 - 4 * A * C
+
+ # soluciones de la ecuación
+ x1 <- (-B - sqrt(dis)) / (2 * A)
+ x2 <- (-B + sqrt(dis)) / (2 * A)
+ res <- c(x1 = x1, x2 = x2)
+
+ # información más amplia
+ if (info) {
+ cat(’\nSOLUCIONES DE LA ECUACIÓN DE 2o GRADO’)
+ cat(’\n=====================================’)
+ cat(’\nEcuación.....:’, ecu)
+ cat(’\n’)
+ cat(’\nSoluciones x1:’, round(x1, dec))
+ cat(’\n x2:’, round(x2, dec))
+ cat(’\n’)
+ cat(’\nSemiparámetro:’, round(p, dec))
+ cat(’\nVértice......:’, paste(’(’, round(ver[1], dec),
+ ’, ’, round(ver[2], dec),
+ ’)’, sep = ’’))
+ cat(’\nFoco.........:’, paste(’(’, round(alfa, dec), ’, ’,
+ round(beta + p / 2, dec),
+ ’)’, sep = ’’))
+ cat(’\n’)
+ cat(’\n’)
+ }
+
+ # gráfico
+ if (graph) {
+ aa <- ’Soluciones a la ecuación de 2o grado’
+ curve(A * x ˆ 2 + B * x + C,
+ from = x_inf, to = x_sup, col = 2, lwd = 2,
+ main = paste(aa, ’\n’, ecu),
+ ylab = expression(’f(x)’), ...)
+ grid()
+ abline(h = 0, col = ’grey’)
+ abline(v = 0, col = ’grey’)
+ abline(v = alfa, lt = 2, col = 5)
+ abline(h = beta - p / 2, lt = 2, col = 5)
+ points(ver[1], ver[2], col = 3, pch = 16)
+ points(alfa, beta + p / 2, pch = 15, col = 6, cex = 0.7)
+ if (!is.complex(x1) | !is.complex(x2)) {
+ points(x1, 0, col = 4, pch = 16)
+ points(x2, 0, col = 4, pch = 16)
+ }
+ }
+
+ # resultado
+ res
+
+ }
> #-----------------------------------------------fin Fecu_2g()
23.2.2. Grabación
Para grabar el script se debe pulsar en el icono que representa un disco de
ordenador. RStudio lo graba automáticamente (Figura 23.2).
23.2.3. Lectura
Para leer un script con RStudio se debe pulsar en el menú de RStudio
www.editorialuc.es
en el icono que representa una carpeta (Figura 23.4). Aparece una ventana y se
deberá seleccionar el fichero con el script que se desea abrir.
Por supuesto que también se puede hacer desde la consola con las funciones
writte() y source(), pero es mucho más cómodo con RStudio .
Nos dice que la ecuación de segundo grado 2x2 +3x−2 tiene dos soluciones:
● ●
0
−2
−3 −2 −1 0 1
Función Acción
write() Escribe un fichero
source() Lee un fichero
PROBLEMAS
Problema 1. Escriba una función que calcule el área de un circulo, pasándole como
parámetro único la longitud de su perı́metro.
Programación de funciones
#---------------------------------------------------------------
f <- function(...) {
# comprobación de condiciones
1 Según Chambers: ((Writing functions is the natural way to expand what you can do with the system)).
[161]
301
Libros de Estadística en PDF | Statistics Books in PDF
302 CAPÍTULO 24. PROGRAMACIÓN DE FUNCIONES
...
# cálculos internos
...
# resultado
...
}
#---------------------------------------------------------------
Componentes de una
FUNCIÓN
24.1.1. Argumentos
Son la lista de argumentos que controlan cómo se puede llamar a la función.
Se explora con la función formals(), que devuelve una lista con todos los
argumentos que utiliza la función. Si la función es primitiva devuelve NULL.
> formals(chisq.test)
$x
$y
NULL
$correct
[1] TRUE
$p
rep(1/length(x), length(x))
www.editorialuc.es
$rescale.p
[1] FALSE
$simulate.p.value
[1] FALSE
$B
[1] 2000
> args(chisq.test)
function (x, y = NULL, correct = TRUE, p = rep(1/length(x), length(x)),
rescale.p = FALSE, simulate.p.value = FALSE, B = 2000)
NULL
24.1.2. Cuerpo
El cuerpo de una función es el código que hay dentro de la función, es decir,
todo lo encerrado entre las dos llaves.
Se explora con la función body().
> body(shapiro.test)
{
DNAME <- deparse(substitute(x))
stopifnot(is.numeric(x))
x <- sort(x[complete.cases(x)])
n <- length(x)
if (is.na(n) || n < 3L || n > 5000L)
stop("sample size must be between 3 and 5000")
rng <- x[n] - x[1L]
if (rng == 0)
stop("all ’x’ values are identical")
if (rng < 1e-10)
x <- x/rng
res <- .Call(C_SWilk, x)
RVAL <- list(statistic = c(W = res[1]), p.value = res[2],
method = "Shapiro-Wilk normality test", data.name = DNAME)
class(RVAL) <- "htest"
return(RVAL)
}
24.1.3. Entorno
Es el mapa que indica dónde están colocadas las variables de la función.
Ejemplo 24.4. Explore los tres componentes de la siguiente función que cal-
cula el logaritmo natural y el logaritmo decimal de un número y cuyo código
presentamos:
#---------------------------------------------------------------
> # programación de la función
> f <- function(x){
+ a <- log(x) # logaritmo neperiano
+ b <- log10(x) # logaritmo decimal
+ res <- cbind(LN = a, LD = b) # vector numérico resultado
+ res # resultado
+ }
#---------------------------------------------------------------
Se trata de una función que admite un único parámetro (x), calcula su lo-
garitmo neperiano y decimal y los concatena en un vector resultado. Cuando
exploramos el cuerpo de la función con body() se pierden los comentarios. La
función f() fue creada en el entorno Global.
Hay una excepción a esta regla y son las Funciones Primitivas, del paque-
te base que no contienen código R sino código C, por lo que formals(),
body() y environment() ofrecen resultado NULL.
UseMethod("mean")
<bytecode: 0x106cf04a0>
www.editorialuc.es
<environment: namespace:base>
> formals(mean)
$x
$...
> body(mean)
UseMethod("mean")
> environment(mean)
<environment: namespace:base>
> sum
function (..., na.rm = FALSE) .Primitive("sum")
> formals(sum)
NULL
> body(sum)
NULL
> environment(sum)
NULL
Ejemplo 24.7. Calcule los logaritmos de los números naturales 1:10 con la
función f().
> f(1:10)
LN LD
[1,] 0.0000000 0.0000000
[2,] 0.6931472 0.3010300
[3,] 1.0986123 0.4771213
[4,] 1.3862944 0.6020600
[5,] 1.6094379 0.6989700
[6,] 1.7917595 0.7781513
[7,] 1.9459101 0.8450980
[8,] 2.0794415 0.9030900
[9,] 2.1972246 0.9542425
[10,] 2.3025851 1.0000000
www.editorialuc.es
=====================================
Ecuación.....: 0.08 x? - 4 x + 8
Semiparámetro: 6.25
Vértice......: (25, -42)
Foco.........: (25, -38.875)
x1 x2
2.087122 47.912878
● ●
−10 0
f(x)
−30
●
−50
0 10 20 30 40 50
> body(Fecu_2g)
{
signo1 <- ifelse(B < 0, paste("-", abs(B)), paste("+", B))
signo2 <- ifelse(C < 0, paste("-", abs(C)), paste("+", C))
coef2 <- ifelse(A == 1, "", ifelse(A == -1, "-", A))
signo1 <- ifelse(signo1 == "+ 1", "+", ifelse(signo1 == "- 1",
"-", signo1))
ecu <- paste(coef2, "x?", signo1, "x", signo2)
ver <- c(-B/(2 * A), -(Bˆ2 - 4 * A * C)/(4 * A))
p <- 1/(2 * A)
alfa <- -B/(2 * A)
beta <- (4 * A * C - Bˆ2)/(4 * A)
dis <- Bˆ2 - 4 * A * C
if (dis < 0) {
A <- A + (0+0i)
B <- B + (0+0i)
C <- C + (0+0i)
}
dis <- Bˆ2 - 4 * A * C
---------- lı́neas omitidas -------------
res
}
Ámbito léxico (lexical scoping). Indica cómo R mira los valores de los sı́mbo-
los cuando fueron creados. R usa los valores definidos dentro de la fun-
www.editorialuc.es
ción y si no encuentra alguno le busca en un nivel superior. Igual com-
portamiento sigue para las funciones.
Ámbito dinámico (dynamic scoping). R mira los valores cuando ejecuta la fun-
ción, de manera que puede ofrecer resultados diferentes cuando mira
algún valor fuera de su entorno que ha podido cambiar.
> set.seed(2016)
> x <- sample(1000, 100)
> y <- abs(rnorm(100))+log(x)
> z <- cut(x, breaks = 4, labels=letters[1:4])
> mean
function (x, ...)
UseMethod("mean")
<bytecode: 0x103c585f8>
<environment: namespace:base>
> mean.default
function (x, trim = 0, na.rm = FALSE, ...)
{
if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) {
warning("argument is not numeric or logical: returning NA")
return(NA_real_)
}
if (na.rm)
x <- x[!is.na(x)]
if (!is.numeric(trim) || length(trim) != 1L)
stop("’trim’ must be numeric of length one")
n <- length(x)
if (trim > 0 && n) {
if (is.complex(x))
stop("trimmed means are not defined for complex data")
if (anyNA(x))
return(NA_real_)
if (trim >= 0.5)
return(stats::median(x, na.rm = FALSE))
lo <- floor(n * trim) + 1
hi <- n + 1 - lo
x <- sort.int(x, partial = unique(c(lo, hi)))[lo:hi]
}
.Internal(mean(x))
}
<bytecode: 0x103c58140>
<environment: namespace:base>
#-----------------------------------------------------
methods(generic.function, class)
#-----------------------------------------------------
> methods(mean)
[1] mean.Date mean.default mean.difftime mean.POSIXct
[5] mean.POSIXlt
> methods(boxplot)
[1] boxplot.default boxplot.formula* boxplot.matrix
www.editorialuc.es
Ejemplo 24.13. ¿Cómo se comporta summary() ante un vector
numérico o ante un objeto de la clase lm?
El comportamiento de summary() ante un vector numérico:
> summary(x) # vector numérico
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.0 193.0 450.0 482.9 767.5 999.0
Call:
lm(formula = y ˜ x)
Residuals:
Min 1Q Median 3Q Max
-3.8849 -0.4666 -0.0961 0.5054 2.2995
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 5.3091959 0.1541281 34.45 <2e-16 ***
x 0.0029135 0.0002714 10.74 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
1000
30
● ● ●
● ●
●● ● ●
●
● ● ●
● ●
● ● ● ●
● ● ●
● ● ●
● ● ●
25
● ● ●
●●
800
800
● ● ● ●
8
● ● ● ● ● ● ●
● ●
● ●●● ● ● ●
● ●
● ●● ● ● ●● ● ● ●
● ●● ● ● ●●● ●
● ●● ● ●● ● ●●
20
● ● ●
●● ● ● ●
● ● ● ● ●
● ●● ● ●
600
600
● ● ●
●● ● ● ● ●
● ● ● ●●●
6
● ●●●
● ● ●●
● ●
●
●
15
x
x
● ● ● ● ●●●
●
● ● ● ●●
● ● ●
400
400
● ●
●● ● ● ●
● ● ● ●
●
10
● ● ●
4
● ●
● ● ●
● ●● ●
200
200
●
● ● ● ●● ●
● ●● ●●
5
●● ● ●
●
● ● ●●
2
● ● ● ●
●
● ●
0
0
0 20 40 60 80 100 0 200 400 600 800 1000 a b c d a b c d
Index x z
Función Acción
abs() Valor absoluto
args() Argumentos de una función
body() Cuerpo de una función
cbind() Concatena por columnas
class() Determina la clase de un objeto
complete.cases() Selecciona los casos de un data frame sin missings
cut() Categoriza una variable numérica
deparse() Influye sobre caracteres
environment() Entorno de una función
f() Función f()
Fecu 2g() Soluciones a una ecuación de segundo grado
floor() Redondea ((a la baja))
formals() Argumentos de una función
formalsArgs() Argumentos de una función
function() Declaración de una función
getAnywhere() Visualiza código de métodos ocultos
ifelse() Ejecución condicional
invisible() Hace invisible lo que devuelve una función
is.complex() Comprueba si es un número complejo
is.logical() Comprueba si es un vector lógico
is.na() Comprueba si es NA
is.numeric() Comprueba si es numérico
length() Longitud de un objeto
list() Crea una lista
lm() Regresión lineal
log() Logaritmo neperiano
log10() Logaritmo decimal
mean() Media de un vector
mean.default() Calcula la media en un vector numérico (por defecto)
par() Fija parámetros gráficos
Continúa en la página siguiente...
Función Acción
paste() Une objetos en una cadena
www.editorialuc.es
plot() Función gráfica por excelencia
rep() Repite elementos para formar un vector
return() Salida de una función
sample() Muestreo aleatorio
shapiro.test() Test de normalidad
sort() Ordena un objeto
stop() Detiene la ejecución de una función
stopifnot() Detención condicional
substitute() Substitución de caracteres
sum() Suma de un vector
summary() Función genérica de resumen
UseMethod() Métodos usados por las funciones genéricas
warning() Pone un aviso
PROBLEMAS
Problema 1. Incluya al principio del cuerpo de la función Fecu 2g() código en R
que compruebe que los coeficientes del polinomio son objetos numéricos.
Problema 2. Programe una función que calcule la suma de los primeros 100 núme-
ros:
n=100
X
i
i=1
Problema 3. Programe una función que calcule la suma de los primeros 100 números
al cuadrado (cada número elevado al cuadrado):
n=100
X
i2
i=1
Problema 4. Programe una función que calcule la suma de los primeros 100 números
al cubo (cada número elevado al cubo):
n=100
X
i3
i=1
Estructuras de control
315
Libros de Estadística en PDF | Statistics Books in PDF
316 CAPÍTULO 25. ESTRUCTURAS DE CONTROL
muy complejos tipo regresión logı́stica, integrales, etc. Esto es lo que sucede en
las funciones, como veremos más adelante, en que todo el cuerpo de la función
está encerrado entre llaves y la última expresión será el resultado de la función.
En muchas ocasiones interesa implementar algún mecanismo que permita
la ejecución de un aparte del código si se cumple una condición especı́fica,
o que se repita la ejecución de un bloque de código determinado número de
veces. Este tipo de control en R se realiza mediante:
Estructuras de control
Ejecución
Condicional Repetitiva
25.1.1. if
Solo evalúa una condición lógica y si se cumple se ejecuta un código escrito
entre corchetes, si no se cumple salta a la siguiente orden.
#--------------------------------------
if (logical_expression) {
expression1
...
}
#--------------------------------------
Cuando lo que hay entre corchetes es una única expresión, se puede escribir
en la misma lı́nea del if y sin corchetes, aunque es preferible poner siempre
www.editorialuc.es
los corchetes.
La evaluación de la condición lógica arrojara TRUE o FALSE. Si la evalua-
ción lógica se efectúa sobre un vector, solo se hace sobre el primer elemento
25.1.2. if else
Aquı́ siempre se ejecuta un bloque de código, el bloque uno ({cons.expr})
si se cumple o el bloque dos ({alt.expr}) si no se cumple.
#--------------------------------------
if (logical_expression) {
expression_1
...
} else {
expression_2
...
}
#--------------------------------------
Es posible que haya obtenido otro resultado has que la selección del dı́a es
aleatoria.
+ }
[1] "Es par"
Para evitar este error, o else debe estar en la misma lı́nea que if, o hay
que usar llaves.
Recorriendo uno a uno cada elemento con for. Aunque lo veremos más
adelante, ponemos aquı́ la solución:
www.editorialuc.es
> x <- c(2, 3, -5, 6, -2, 8)
> texto <- character(length(x))
> for (i in 1:(length(x))) {
+ if (x[i] > 0) {
+ texto[i] <- ’positivo’
+ } else {
+ texto[i] <- ’NEGATIVO’
+ }
+ }
> data.frame(x = x, texto = texto)
x texto
1 2 positivo
2 3 positivo
3 -5 NEGATIVO
4 6 positivo
5 -2 NEGATIVO
6 8 positivo
> if (x %% 2 == 0 || x %% 3 == 0 || x %% 7 == 0) {
+ print(’x es múltiplo de 2 o 3 o 7’)
+ } else {
+ print(’x no es múltiplo ni de 2, ni de 3, ni de 7’)
+ }
[1] "x no es múltiplo ni de 2, ni de 3, ni de 7"
A los operadores ((||)) y ((&&)) se les llama short-circuit evaluation [160] por-
que además de no ser vectorizados se evalúan de izquierda a derecha, es decir,
que solo se evalúa la condición de la derecha si la de la izquierda es TRUE, de
lo contrario no se evalúa. Esto evita errores y hace que el programa sea más
rápido.
25.1.3. ifelse()
Es una versión más corta de if/else en el que se evalúa si cada uno de los
elementos de un vector cumple una condición; si la cumple se adopta la ex-
presión ((A)) y si no la cumple se adopta la expresión ((B)). Se genera un vector
de la misma longitud que el vector evaluado, en el que cada elemento vale
((A)) o ((B)) según cumpla o no la condición. Se trata de los llamados ((cálculos
vectorizados)).
#--------------------------------------
ifelse(logical_expression, A, B)
#--------------------------------------
www.editorialuc.es
[6] "múltiplo de 2 o 3 o 7"
[7] "múltiplo de 2 o 3 o 7"
[8] "múltiplo de 2 o 3 o 7"
[9] "no es múltiplo ni de 2, ni de 3, ni de 7"
[10] "no es múltiplo ni de 2, ni de 3, ni de 7"
rm(x, y, z)
Figura 25.2: Nube de puntos (Edad, IMC) de la BdD de indias Pima, coloreados según
son o no diabéticas, utilizando la función ifelse().
Ejemplo 25.9. Clasifique el estado nutricional de las indias Pima como nor-
mal (IMC ¡25 kg/m2 ), con sobrepeso (IMC ¡30 kg/m2 ) y como obesas (IMC ≥
30 kg/m2 ).
Este código tiene mucha utilidad a la hora de crear nuevas variables deri-
vadas en BdD de proyectos de investigación.
25.2.1. for
Cuando se desea una ejecución un determinado número de veces [160], o
una secuencia de veces se escribe entre paréntesis una variable de ((vueltas)) y
un vector de secuencia. Se ejecutará el código mientras var in seq sea cierto.
#---------------------------------------------------------------
for(var in seq) expr
#---------------------------------------------------------------
[1] 60
[1] 80
www.editorialuc.es
> rm(x, i)
Ejemplo 25.11. Programe una función que imprima los primeros 50 números
de la serie de Fibonacci.
25.2.2. repeat
Aquı́ no se utiliza ninguna variable de ((vueltas)); el código se repite inde-
finidamente hasta que se apague el ordenador, se pulse Ctrl+C o se encuentre
una declaración break.
#---------------------------------------------------------------
repeat expr
#---------------------------------------------------------------
> i <- 0
> repeat {
+ if (i > 15) break
+ else {
+ cat(’\n’, i, ’años es edad pediátrica’)
+ i <- i + 1
+ }
+ }
25.2.3. while
Otras veces se repite el código mientras una condición es verdadera
#---------------------------------------------------------------
while(cond) expr
#---------------------------------------------------------------
www.editorialuc.es
> y <- rnorm(100000)
> z <- c()
> system.time(for (i in 1:100000) z <- c(z, x[i] + y[i]))
user system elapsed
44.50 0.13 44.77
Función Acción
sin() Seno
cos() Coseno
if() Condición
ifelse() Condición
sample() Muestreo aleatorio
print() Imprimir en consola
rpois() Números aleatorios con distribución de Poisson
set.seed() Fija semilla aleatoria
FleeXLS() Lee datos Excel
use() Coloca una BdD en la memoria de trabajo
plot() Gráfico de nube de puntos
data.frame() Une vectores para crear un data frame
table() Crea una tabla de contingencia
c() Concatena elementos
seq() Crea una secuencia
traceback() Función de depuración
while() Repetir mientras
PROBLEMAS
Problema 1. Escriba una función que calcule los marginales (total de cada una de las
filas y de cada una de las columnas) utilizando algún bucle (for o while). Compare
su tiempo de ejecución con otro método vectorizado.
Problema 2. Escriba una función que calcule los coeficientes producto de dos polino-
mios.
of art and science; and as is true of most crafts, facility in programming is partly the product of experience)).
[115]
327
Libros de Estadística en PDF | Statistics Books in PDF
328 CAPÍTULO 26. PRIMERAS FUNCIONES ESCRITAS POR EL USUARIO
Como R pone entre corchetes el número ı́ndice del primer elemento de los
que caben en cada renglón hasta que imprime todo el vector.
Visibilidad de las variables. Las variables que se crean dentro de una fun-
ción tienen vida dentro de esa función; cuando se sale de ella se pierden sus
valores y desaparecen.
> (a <- 12) # valor original de a
[1] 12
> f <- function() {
+ a <- 7
+ a # valor de a dentro de la función
+ }
> f()
[1] 7
> a # valor de a fuera de la función (sin cambios)
[1] 12
www.editorialuc.es
un vector numérico:
> #-----------------------------------------------------------
> # Fmedia() Calcula la media de un vector numérico
> #-----------------------------------------------------------
> Fmedia <- function(
+ x, # vector numérico
+ dec = 2 # decimales de redondeo
+ ) {
+ n <- length(x) # datos
+ sx <- sum(x) # suma de datos
+ m <- sx / n # media
+ round(m, dec) # media redondeada
+ }
> #-----------------------------------------------fin Fmedia()
> load(’df_familias.RData’)
> with(df_familias, Fmedia(waist))
[1] NA
> #-----------------------------------------------------------
> # Fmedia() Calcula la media de un vector numérico
> #-----------------------------------------------------------
> Fmedia <- function(
+ x, # x debe ser un vector numérico
+ dec = 3 # decimales de redondeo
+ ) {
+ # comprobación de condiciones
+ if (!is.numeric(x)) # parar si no es numérico
+ stop(’x debe ser un vector numérico’)
+
+ # cuerpo de la función
+ x <- x[!is.na(x)] # se eliminan los NA
+ n <- length(x) # datos
+ sx <- sum(x) # suma de datos
+ m <- sx / n # media
+
+ # resultado
+ round(m, dec) # media redondeada
+ }
> #-----------------------------------------------fin Fmedia()
Suponga que desea programar una sencilla función que realice una estadı́sti-
ca descriptiva básica de un vector numérico; quiere que calcule el número de
www.editorialuc.es
datos válidos, la media, la desviación estándar y el número de datos ausentes
(NA o missing) existentes. Podrı́a hacer algo ası́:
> #-----------------------------------------------------------
> # Fdescrip_basica() Estadı́stica descriptiva básica de un
> # vector numérico
> #-----------------------------------------------------------
> Fdescrip_basica <- function(
+ x, # vector numárico
+ dec = 3 # decimales de redondeo
+ ) {
+ # comprobación de condiciones
+ if (!is.numeric(x)) stop(’x debe ser un vector numérico’)
+
+ # cuerpo de la función (cálculos)
+ N <- length(x) # longitud del vector original
+ x <- x[!is.na(x)] # se eliminan los NA
+ n <- length(x) # longitud del vector depurado
+ m <- mean(x) # media
+ s <- sd(x) # desviación estándar
+ res <- cbind(missing = N - n,
+ datos = n,
+ media = m,
+ DE = s)
+ rownames(res) <- ’Estadı́sticos’
+
+ # resultado
+ res
+ }
> #-------------------------------------fin Fdescrip_basica()
Ejemplo 26.1. Pruébela con los datos del peso, talla y perı́metro de la cintura
del ejemplo FAMILIAS.
Deberá tener en memoria la BdD df familias; si no la tiene léala con
load(’df familias.RData’).
> with(df_familias, Fdescrip_basica(weight))
missing datos media DE
Estadı́sticos 2 40 47.67 25.79964
> with(df_familias, Fdescrip_basica(height))
missing datos media DE
Estadı́sticos 3 39 143.3821 32.70267
> with(df_familias, Fdescrip_basica(waist))
missing datos media DE
Estadı́sticos 3 39 62.66154 15.54717
www.editorialuc.es
> Ftabla_diag(x, y, pdc = 0.43)
Tabla 2x2:
var_c
y 0 1 Sum
[-2.79,0.43) 80 97 177
[0.43,3.03] 43 47 90
Sum 123 144 267
$sen
[1] 0.3263889
$esp
[1] 0.6504065
> rm(x, y)
1 2 3 4 5 6
> set.seed(2016)
> Fazar(200)
$tiradas
[1] 200
$limite_inf
[1] 1
$limite_sup
[1] 6
$resultados
[1] 2 1 6 1 3 1 4 6 1 1 3 2 2 6 2 3 4 1 4 1 2 5 3 4 6 4 2 4 6 3
[31] 4 5 2 6 6 1 2 2 2 5 3 1 2 5 3 2 5 2 4 3 1 3 2 3 6 3 6 1 1 3
[61] 1 4 3 2 6 6 1 1 4 6 6 6 2 5 2 1 2 6 1 1 3 1 5 5 3 2 2 4 5 4
[91] 3 5 1 5 6 1 5 4 1 3 3 2 2 2 1 4 1 4 4 1 1 5 6 6 1 4 3 2 3 6
[121] 5 6 5 4 2 4 2 1 5 4 6 5 3 1 1 3 3 3 5 2 5 1 4 3 1 1 3 4 3 4
[151] 5 5 4 3 5 4 3 3 3 1 5 3 5 5 5 2 2 1 1 1 6 4 2 2 5 4 3 4 4 2
[181] 6 4 5 6 1 4 5 1 3 4 2 1 4 3 3 6 1 5 6 4
$media
[1] 3.285
$DE
[1] 1.690581
$tabla
k
1 2 3 4 5 6
41 33 36 34 30 26
www.editorialuc.es
En este capı́tulo se han utilizado las funciones recogidas en las siguientes
tablas:
Función Acción
addmargins() Añade márgenes a una tabla
barplot() Gráfico de barras
c() Concatena elementos
cat() Imprime en pantalla
cbind() Concatena por columnas
cut() Categoriza una variable numérica
dim() Dimensiones de un objeto
f() ((f)) función de ejemplo
Fmedia() Función programada: media de un vector
Fdescrip basica() Función programada: descriptiva numérica
Fsaludos() Función programada: saludos
Ftabla diag() Función programada: tabla diagnóstica
if() Condición
is.character() Comprueba si es on objeto de tipo caracteres
is.na() Comprueba si es NA
is.numeric() Comprueba si es un vector numérico
length() Longitud de un vector
list() Crea una lista
load() Lee un objeto guardado en un fichero
max() Valor máximo
mean() Media de un vector numérico
min() Valor mı́nimo
paste() Une objetos y los imprime en la consola
print() Imprimir en consola
return() Devuelve un objeto de una función
rm() Remueve objetos de la memoria
rnorm() Vector de elementos que siguen una distribución normal
round() Función de redondeo
rownames() Da nombres a las filas de un objeto (o los lee)
sample() Muestreo aleatorio
set.seed() Fija semilla aleatoria
sd() Calcula la desviación estándar de un vector numérico
sum() Suma de los elementos de un vector numérico
stop() Sale de una función
table() Crea una tabla de contingencia
toupper() Convierte una cadena a mayúsculas
with() Para acceder a las variables de una data frame
Función Acción
epicalc Funciones epidemiológicas con epicalc [136]
PROBLEMAS
Problema 1. Escriba una función que calcule la suma de los n primeros números
naturales.
Problema 2. Escriba una función que calcule
n
X
i2
i=1
Problema 3. Escriba una función que encuentre el valor mı́nimo de un vector em-
pleando un bucle y sin emplear las funciones min() ni sort().
Funciones de utilidad
Rótulo1 Rótulo2
Fed n() Estadı́stica descriptiva de una variable numérica
Fnormalidad() Comprobación de la normalidad de una variable
Fh() Histograma mejorado
Fcomplete cases() Casos completos en un data frame
Fprueba diag() Caracterı́sticas de una prueba diagnóstica
#---------------------------------------------------------------
Fed_n(var1, dec = 2, graph = TRUE, pc = TRUE)
#---------------------------------------------------------------
> #----------------------------------------------------------
> # Fed_n() Estad. descriptiva de una variable numérica
> #----------------------------------------------------------
> Fed_n <- function(
+ x, # variable numérica
+ dec = 2, # número de decimales
337
Libros de Estadística en PDF | Statistics Books in PDF
338 CAPÍTULO 27. FUNCIONES DE UTILIDAD
www.editorialuc.es
+ rownames(M) <- ’Estadı́sticos’
+ M
+ }
> #-----------------------------------------------fin Fed_n()
Ejemplo 27.1. Vamos a generar 1000 valores aleatorios que sigan una Ley
Normal (con media 80 y desviación estándar 9.52) y luego utilizaremos la
función Fed n() para realizar la estadı́stica descriptiva de dicha variable.
0.04
0.8
Frequency
Density
Fn(x)
0.02
0.4
50
0.00
0.0
0
50 70 90 50 70 90 50 70 90
●●
●
●
● ●
●●
●
●
100
100
●●
Sample Quantiles
●
●
●
●
●
●
●
●
●
●
●
●
●
●
●●
●
●●
●
●●
●
●●
●
●
●
●
●
●
●
●
●
80
80
●
●
●
●
●●
●
●●
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●
●
●
●
●
●
●●
●●
●
●
●
60
60
●
●
●
●●
●
●●
●● ●
●● ●
> set.seed(2016)
> x <- rnorm(1000, 80, 9.52)
> Fed_n(x)
------------------------------------------------------------
NA n media DE mı́n Q1 mediana Q3 máx
Estadı́sticos 0 1000 80.07 9.52 52.33 73.29 80.58 86.53 110.16
#---------------------------------------------------------------
Fnormalidad(x, bw = 0.7, dec = 5, info = TRUE, graph = TRUE)
#---------------------------------------------------------------
> #----------------------------------------------------------
> # Fnormalidad() Comprobación de la normalidad de una var
> #----------------------------------------------------------
> Fnormalidad <- function(
+ x, # variable numérica
+ bw = 0.7, # bandwidch
+ dec = 3, # decimales
+ info = TRUE, # si se desea información
+ graph = TRUE # si se desea un gráfico
+ ) {
+ # condiciones
+ if (!is.numeric(x)) stop(’La variable no es numérica’)
+ require(nortest)
+
+ # tests de normalidad
+ x <- x[!is.na(x)]
+ x1 <- ad.test(x)
+ x2 <- cvm.test(x)
+ x3 <- lillie.test(x)
+ x4 <- pearson.test(x)
+ x5 <- sf.test(x)
+ x6 <- shapiro.test(x)
+ x7 <- ks.test(x, ’pnorm’)
+ Statistic <- c(x1[1], x2[1], x3[1], x4[1],
+ x5[1], x6[1], x7[1])
+ Statistic <- round(unlist(Statistic), dec)
+ Pvalue <- unlist(c(x1[2], x2[2], x3[2], x4[2],
+ x5[2], x6[2], x7[2]))
+ # resultados
+ M <- data.frame(Statistic, round(Pvalue, dec))
+ rownames(M) <- c(’Anderson-Darling test’,
+ ’Cramer-von Mises test’,
+ ’Lilliefors (K-S) test’,
+ ’Pearson chisquare test’,
+ ’Shapiro-Francia test’,
+ ’SHAPIRO-WILK test =======>’,
+ ’Kolmogorov-Smirnov test’)
www.editorialuc.es
+
+ if (graph) {
+ old.par <- par(mfrow = c(1, 3))
+ qm <- max(density(x, bw = bw)$y)
+ hist(x, prob = TRUE, ylim = c(0, qm))
+ rug(x)
+ lines(density(x, bw = bw), lw = 2, col = ’red’)
+
+ boxplot(x, main = ’Boxplot’)
+ points(1, mean(x, trim = 0.1), pch=15,
+ cex = 2, col = ’green’)
+ points(1, mean(x), pch = 15, cex = 2, col = ’red’)
+ legend(’topleft’, legend = c(’mean’,’mean-10%’),
+ pch = 15, col = 2:3)
+
+ qqnorm(x)
+ qqline(x, lw = 2, col = ’red’)
+ par(old.par)
+ }
+
+ if (info) {
+ cat(’\nPRUEBA DE NORMALIDAD DE UNA VARIABLE’)
+ cat(’\n============================================’)
+ cat(’\nLa más potente y aconsejable es S-W’)
+ cat(’\n’)
+ cat(’\n’)
+ }
+ M
+ }
> #------------------------------------------fin Fnormalidad()
}
statistic p.value
Anderson-Darling test 10.396 0
Cramer-von Mises test 1.732 0
Lilliefors (K-S) test 0.124 0
Pearson chisquare test 125.618 0
Shapiro-Francia test 0.867 0
SHAPIRO-WILK test =======> 0.868 0
Kolmogorov-Smirnov test 0.973 0
Warning messages:
1: In cvm.test(x) :
mean ●
● ●
●
mean−10%
50
50
0.05
● ●
● ●
40
40
0.04
● ●
● ●
● ●
●
● ●●
Sample Quantiles
● ●
●
●
●●
●
●
●
Density
0.03
●
●
30
30
●
●
●
●
●
●
●
●
●●
●
●
●●
●
●●
●
●
●
●
0.02
●●
●
20
20
●
●●
●●
●
●●
●
●
●
●●
●
●
●
●
●●
●
●●
●
●●
●
●●
●
●
●
●
●
●
●
●●
●●
0.01
●●
●
●●
●
●●
●
10
10
●●
●
●
●●
●
●
●●
●
●●
●
●●
●
●
●●
●
●
●
●
●
●●
●
●
●●
●●
●
●●
●
●
●
●
●●
●●
●
●●
●
●●
●●
●●
●
●●
●
●●
●●
●
●●
●
●
●●
●●
●●
●
0.00
●●●
● ● ●●●●●
0
0
0 10 20 30 40 50 60 −3 −2 −1 0 1 2 3
x Theoretical Quantiles
#---------------------------------------------------------------
Fh(
x, # variable cuantitativa
xlab = ’’, # etiqueta variable cuantitativa
ylab = ’Density’, # etiqueta eje de ordenadas
main = ’’, # tı́tulo del gráfico
valores = TRUE, # si se desea una etiqueta
curvaN = TRUE, # si se desea sobreimponer la curva normal
www.editorialuc.es
... # otros parámetros extra
)
#---------------------------------------------------------------
Su código es el siguiente:
> #----------------------------------------------------------
> # Fh() Construye un histograma ((mejorado))
> #----------------------------------------------------------
> Fh <- function(
+ x, # variable cuantitativa
+ xlab = ’’, # etiqueta variable cuantitativa
+ ylab = ’Density’, # etiqueta eje de ordenadas
+ main = ’’, # tı́tulo del gráfico
+ valores = TRUE, # si se desea una etiqueta
+ curvaN = TRUE, # si se desea sobreimponer la curva normal
+ curvaD = TRUE, # si se desea la curva de densidad
+ dec = 1, # decimales para media y DE
+ ... # otros parámetros extra
+ ) {
+
+ if(!is.numeric(x)) stop(’La variable debe ser numérica’)
+
+ x <- x[!is.na(x)]
+ qm <- max(density(x)$y)
+ hist(x, xlab = xlab, main = ’’, freq = FALSE,
+ col = ’grey90’, las = 1, ylab = ylab,
+ cex.lab = .9, col.lab = 4, font.lab = 2,
+ ylim = c(0, qm), cex.axis = .8, ...)
+ A <- shapiro.test(x)
+
+ if (valores) {
+ if (A$p.value <= 0.05) {
+ legend(’topright’,
+ legend = c(paste(’Median =’,
+ round(median(x), dec)),
+ paste(’ IQR =’,
+ round(IQR(x), dec + 1))))
+ } else {
+ legend(’topright’,
+ legend=c(paste(’Mean =’,
+ round(mean(x), dec)),
+ paste(’ SD =’,
+ round(sd(x), dec + 1))))
+ }
+ }
+ rug(x, col = 4, ticksize = 0.02)
+
+ if (curvaN) {
+ mu <- mean(x)
+ sigma <- sqrt(sum((x - mu) ˆ 2) / length(x))
+ z <- seq(min(x), max(x), length = 300)
+ lines(z, dnorm(z, mu, sigma), col = 2, lt = 1)
+ }
+
+ if (curvaD) {
+ lines(density(x), col = 3)
+ }
+
+ if (curvaN & curvaD) {
+ Z <- numeric()
+ Z <- locator(1)
+ if(length(Z) == 2) {
+ legend(Z$x, Z$y,
+ legend = c(’normal’, ’density’),
+ lt = 1, col = 2:3, bty = ’n’)
+ }
+ }
+ B <- ifelse(A$p.value < 0.001, ’p < 0.001’,
+ paste(’p =’,round(A$p.value,3)))
+ cadena <- paste(’Shapiro-Wilk (’, B, ’)’, sep = ’’)
+ mtext(cadena, side = 1, line = 4, font = 3,
+ adj = 0, cex = 0.8)
+ }
> #--------------------------------------------------fin Fh()
www.editorialuc.es
Median = 72
0.030 IQR = 16
150
0.025
Frequency
0.020
Density
100
0.015
0.010
50
0.005
0.000
0
tad
Shapiro−Wilk (p < 0.001)
Su código es el siguiente:
> #----------------------------------------------------------
> # Fcomplete_cases() Calidad de una BdD
> #----------------------------------------------------------
> Fcomplete_cases <- function(
+ df, # el data frame que se va a analizar
+ info = TRUE, # si devuelve información
+ graph = TRUE # si se desea un gráfico
+ ) {
+ # condiciones
+ if(!is.data.frame(df)) stop(’df no es un data frame’)
+
+ # cálculos
+ nt <- dim(df)[1] # número total de casos
+ nc <- dim(df[complete.cases(df), ])[1] # casos completos
+ n3 <- sum(is.na(df)) # número total de NA
+ n4 <- nt * dim(df)[2] # número total de datos
+ (nVar <- dim(df)[2]) # número de variables
+ nMis <- numeric(nVar) # número de missings en cada variable
+ Names <- paste(’v’, 1:nVar, sep = ’’) # nombre variables
+ names(nMis) <- Names # para la representación gráfica
+ for (i in 1:nVar) { # se calculan los missings en
+ nMis[i] <- sum(is.na(df[,i])) # cada una de las variables
+ }
+
+ # gráfico
+ if (graph) { # se pinta un gráfico de barras con los
+ y <- barplot(nMis, col = rainbow(nVar), # missings de
+ main = ’Missings’, las = 1, # cada variable
+ ylim = c(0, max(nMis) * 1.1))
+ text(y, nMis, nMis, pos = 3, cex = 0.8) # núm. over bars
+ }
+ x1 <- paste(’(’, round(nc * 100 / nt), ’ %)’, sep = ’’)
+ x2 <- paste(’(’, round((n4 - n3) * 100 / n4), ’ %)’, sep=’’)
+
+ if (info) {
+ cat(’\n=====================================’)
+ cat(’\n Calidad de la Base de Datos’)
+ cat(’\n=====================================’)
+ cat(’\n’)
+ cat(’\nCasos totales............:’, nt)
+ cat(’\nCasos con missings.......:’, nt - nc)
+ cat(’\nCasos completos..........:’, nc, x1)
+ cat(’\n’)
+ cat(’\nDatos totales............:’, n4)
+ cat(’\nMissings.................:’, n3)
+ cat(’\nDatos evaluables.........:’, n4 - n3, x2)
+ cat(’\n’)
+ cat(’\nMissings en cada variable:’, nMis)
+ cat(’\n’)
+ cat(’\n’)
+ }
+ res <- df[complete.cases(df), ] # devuelve la BdD
+ invisible(res) # sin missings
+ }
> #-------------------------------------fin Fcomplete_cases()
Missings
3 3
3.0
2.5
2 2
2.0
1.5
1
1.0
0.5
0 0 0 0 0
0.0
v1 v2 v3 v4 v5 v6 v7 v8 v9 v10
> load(’df_familias.Rdata’)
> Fcomplete_cases(df_familias)
=====================================
Calidad de la Base de Datos
=====================================
Casos totales............: 42
Casos con missings.......: 4
www.editorialuc.es
Casos completos..........: 38 (90 %)
Se aprecia que de los 42 casos solo 38 están completos (90 %) y que hay
missings en cinco variables.
#---------------------------------------------------------------
Fprueba_diag(a11, a21, a12, a22, alpha = 0.05, d = 3)
#---------------------------------------------------------------
Su código es el siguiente:
> #----------------------------------------------------------
> # Fprueba_diag() Caracterı́sticas de una prueba diagnóstica
> #----------------------------------------------------------
> Fprueba_diag <- function(
+ a11, # Prueba (+) en sanos
+ a21, # Prueba (-) en sanos
+ a12, # Prueba (+) en enfermos
+ a22, # Prueba (-) en enfermos
+ alpha = 0.05, # riesgo alfa
+ dec = 3 # decimales de redondeo
+ ) {
+
+ # condiciones
+ if (!is.numeric(c(a11, a21, a12, a22)))
+ stop(’Debe introducir cuatro valores numéricos’)
+ if (length(a11) > 1 | length(a12) > 1 |
+ length(a21) > 1 | length(a22) > 1)
+ stop(’Solo se admiten 4 escalares’)
+
+ # cálculos
+ require(Hmisc)
+ M <- matrix(c(a11, a21, a12, a22), nr = 2)
+ dimnames(M) <- list(c(’Prueba +’, ’Prueba -’),
+ c(’ Verdad -’, ’ Verdad +’))
+ n <- sum(M) # número de sujetos estudiados
+ M1 <- M / n # matriz de proporciones
+
+ # sensibilidad
+
+ # Odds pretest
www.editorialuc.es
+ opt <- (P / (1 - P)) * (S / (1 - E))
+
+ # odds ratio
+ or <- (a12 * a21) / (a11 * a22)
+ se_or <- sqrt(1 / a11 + 1 / a12 + 1 / a21 + 1 / a22)
+ ori <- or * exp(-qnorm(1 - alpha / 2) * se_or)
+ ors <- or * exp(+qnorm(1 - alpha / 2) * se_or)
+
+ # para redondear
+ r <- function(x, dec = 3) round(x, dec)
+
+ cat(’\nTabla de datos\n’)
+ print(addmargins(M))
+ cat(’\nTabla de probabilidades\n’)
+ print(addmargins(M1))
+ cat(’\n1. Enfermedad’)
+ cat(’\n Prevalencia.................’, r(P, dec),
+ ’ IC-95%:’, r(Pi, dec), ’a’, r(Ps, dec))
+ cat(’\n2. Caracterı́sticas de la prueba’)
+ cat(’\n Validez interna’)
+ cat(’\n Sensibilidad (1-beta).......’, r(S, dec),
+ ’ IC-95%:’, r(Si, dec), ’a’, r(Ss, dec))
+ cat(’\n Especificidad (1-alfa)......’, r(E, dec),
+ ’ IC-95%:’, r(Ei, dec), ’a’, r(Es, dec))
+ cat(’\n Otras’)
+ cat(’\n Falsos positivos (alfa).....’, r(fp, dec),
+ ’ IC-95%:’, r(fpi, dec), ’a’, r(fps, dec))
+ cat(’\n Falsos negativos (beta).....’, r(fn, dec),
+ ’ IC-95%:’, r(fni, dec), ’a’, r(fns, dec))
+ cat(’\n Eficiencia global...........’, r(eff, dec),
+ ’ IC-95%:’, r(effi, dec), ’a’, r(effs, dec))
+ cat(’\n Índice de Youden............’,
+ r(S + E - 1, dec))
+ cat(’\n3. Razones de verosimilitud’)
+ cat(’\n LR+ ........................’,
+ r(lrp, dec), ’ ’, slrp)
+ cat(’\n LR- ........................’,
+ r(lrn, dec), ’ ’, slrn)
+ cat(’\n4. Valores predictivos’)
+ cat(’\n VP+ ........................’, r(vpp, dec),
+ ’ IC-95%:’, r(vppi, dec), ’a’, r(vpps, dec))
+ cat(’\n VP- ........................’, r(vpn, dec),
+ ’ IC-95%:’, r(vpni, dec), ’a’, r(vpns, dec))
+ cat(’\n5. Odds’)
+ cat(’\n Odds pre-test...............’,
+ r(P / (1 - P), dec))
+ cat(’\n Odds post-test..............’, r(opt, dec))
+ cat(’\n Probabilidad post-test......’,
+ r(opt / (opt + 1)))
+ cat(’\n Odds ratio (OR).............’, r(or, dec),
+ ’ IC-95%:’, r(ori, dec), ’a’, r(ors, dec))
+ cat(’\n\n’)
+
+ # resultado
+ res <- list(SEN = S, ESP = E, FP = fp, FN = fn,
+ PRE = P, EFI = eff, VPP = vpp, VPN = vpn,
+ LRP = lrp, LRN = lrn, OPT = opt, OR = or)
+ invisible(res)
+ }
> #-------------------------------------fin Fprueba_diag()
Tabla de datos
Verdad - Verdad + Sum
Prueba + 18 91 109
Prueba - 319 24 343
Sum 337 115 452
Tabla de probabilidades
Verdad - Verdad + Sum
Prueba + 0.03982301 0.20132743 0.2411504
Prueba - 0.70575221 0.05309735 0.7588496
Sum 0.74557522 0.25442478 1.0000000
1. Enfermedad
Prevalencia................. 0.254 IC-95%: 0.216 a 0.297
2. Caracterı́sticas de la prueba
Validez interna
Sensibilidad (1-beta)....... 0.791 IC-95%: 0.708 a 0.856
Especificidad (1-alfa)...... 0.947 IC-95%: 0.917 a 0.966
Otras
Falsos positivos (alfa)..... 0.053 IC-95%: 0.034 a 0.083
Falsos negativos (beta)..... 0.209 IC-95%: 0.144 a 0.292
Eficiencia global........... 0.907 IC-95%: 0.877 a 0.931
Índice de Youden............ 0.738
3. Razones de verosimilitud
LR+ ........................ 14.815 Excelente contribución de una prueba (+) al diag(enf)
LR- ........................ 0.22 Regular contribución de una prueba (-) al diag(sano)
4. Valores predictivos
VP+ ........................ 0.835 IC-95%: 0.754 a 0.893
VP- ........................ 0.93 IC-95%: 0.898 a 0.953
5. Odds
Odds pre-test............... 0.341
Odds post-test.............. 5.056
Probabilidad post-test...... 0.835
Odds ratio (OR)............. 67.197 IC-95%: 34.939 a 129.236
www.editorialuc.es
Función Acción
ad.test() Test de Anderson-Darling
addmargins() Añade totales a una tabla o matriz
barplot() Gráfico de barras
binconf() IC-95 % de una proporción (Hmisc)
boxplot() Gráfico de cajas
c() Concatena elementos en un vector
cat() concatena e imprime
cbind() Crea una matriz con vectores columna
colnames() Pone nombres a las columnas de un dataframe
completre.cases() Selecciona casos sin missings
curve() Dibuja una curva
cvm.test() Test de Cramer-von-Mises
data.frame() Crea un data frame
density() Calcula la densidad de un histograma
detach() libera una BdD del entorno de trabajo
dnorm() Calcula la función de densidad normal
dotchart() Gráfico de puntos
Fcomplete cases() Calcula la calidad de una BdD
Fed n() Estadı́stica descriptiva de una variable numérica
Fh() Histograma mejorado
Fnormalidad() Comprueba la normalidad de una variable
Fprueba diag() Caracterı́sticas de una prueba diagnóstica
invisible() No imprime el resultado
is.numeric() Comprueba si un vector es numérico
ks.test() Test de Kolmogorov-Smirnov
length() Longitud de un vector
library() Carga un paquete
lillie.test() Test de Lilliefors
lines() Dibuja un alı́nea
matrix() Crea una matriz
max() Valor máximo
mean() Media de un vector
media() Media de un vector (no usar)
min() Valor mı́nimo
mtext() Escribe texto en un margen del gráfico
numeric() Crea un vector numérico
par() Fija parámetros gráficos
paste() Pega distintos objetos en uno solo
pearson.test() Test de normalidad de Pearson
plot() Función genérica de dibujo
points() Dibuja puntos
print() Imprime en consola
qqnorm() Función ((quantile))
qqline() Dibuja una lı́nea de normalidad
quantile() Calcula percentiles
rnorm() Números aleatorios según Ley Normal
Continúa en la página siguiente...
Función Acción
round() Redondea a determinados decimales
rownames() Poner nombres por filas
sd() Desviación estándar
set.seed() Fija una semilla de aleatorización
shapiro.test() Test de Shapiro-Wilk
sqrt() Raı́z cuadrada
stop() Escribe un mensaje de parada de una función
sum() Suma de los elementos de un vector numérico
text() Escribe texto en unas coordenadas
toupper() Pasa su argumento a mayúsculas
use() Utilizar una BdD
wilcox.test() Test de Wilcoxon
Función Acción
nortes Comprobación de la normalidad con nortes [136]
PROBLEMAS
Problema 1. Modifique la función FdesBasica() para que calcule también el
valor mı́nimo, el máximo, el percentil 25, la mediana y el percentil 75.
Problema 2. Escriba una función que calcule una tabla de frecuencias.
Depuración de errores
Casi todos los programas contienen errores que hay que buscar y depurar.
La depuración de errores es más un arte que una ciencia [146]. El principio
de la confirmación es la esencia del depurado [237], consistente es comprobar
que lo que cree que es cierto verdaderamente es cierto. Es importante que la
programación sea modular para que el depurado sea más fácil.
Función Acción
print() cat() Imprime el contenido de una variable
debug() Llama al browser para ver el contenido de una variable
browser() Interrumpe la acción de una función para que sea ins-
peccionado el contenido de una variable
traceback() Imprime las llamadas a distintas funciones hasta que
surge el error
#---------------------------------------------------------------
debug(fun, text = "", condition = NULL)
#---------------------------------------------------------------
353
Libros de Estadística en PDF | Statistics Books in PDF
354 CAPÍTULO 28. DEPURACIÓN DE ERRORES
www.editorialuc.es
La función traceback() permite visualizar en qué punto de la función ha
ocurrido el error.
#---------------------------------------------------------------
traceback(x = NULL, max.lines = getOption("deparse.max.lines"))
#---------------------------------------------------------------
Ejemplo 28.5. Supongamos que tenemos una función que utiliza un argu-
mento que no existe....
> traceback()
2: g(x) at #3
1: f(10)
> g
function(x) {
x + variable_inexistente
}
Función Acción
cat() Imprime en pantalla
cbind() Junta objetos por columnas
debug() Inicia el depurador
is.numeric() Comprueba si un objeto es numérico
log() Logaritmo neperiano
rownames() Asigna nombres por columnas
stop() Detiene la ejecución de una función
traceback() Ejecuta hasta el error
Función Acción
debug Paquete de ayuda a la depuración [238]
PROBLEMAS
www.editorialuc.es
Problema 1. Con la BdD de las indias pima intenta el siguiente modelo de re-
gresión: lm(emb ˜ edad + diab + tad + ptri + sexo). Si hay algún
error, compruebe cada una de las variables hasta encontrar quién causa ese error. De-
pure el modelo.
Programación orientada a
objetos
29.1. Concepto
R es un lenguaje de programación orientado a objetos u Object-Oriented Pro-
gramming (OOP) [114, 239, 240]. Se trata de un tipo especial de programación
en la que el programador define, respecto de una estructura de datos, no sólo
los tipos de datos, sino también los tipos de operaciones que pueden aplicarse
a esta estructura u objeto, que consta, por tanto, de datos, funciones y de las
relaciones que puede establecer con otros objetos. Por ejemplo, unos objetos
pueden heredar unas caracterı́sticas de otros objetos.
La principal ventaja de la OOP, una vez aprendida, es la gran facilidad de
mantenimiento de los programas, porque es fácil crear objetos que hereden ca-
racterı́sticas de otros sin tener que volver a programarlos. Pero para ello se ne-
cesita utilizar un lenguaje de programación OOP como pueden ser Java, C++,
Smalltalk. R también es un lenguaje OOP.
29.2. Antecedentes
La OOP nació en 1967 de la mano del lenguaje Simula 67, diseñado por Ole-
Johan Dhal y Kristen Nygaard en el Norwegian Computing Center en Oslo
[241] para hacer simulaciones de seguridad en aviones. Simula 67 ha tenido
una influencia importante en otros lenguajes de programación más modernos,
como por ejemplo en C++ y en Java.
El siguiente gran paso en la historia de la OOP, y el que verdaderamente le
dio categorı́a de paradigma con caracterı́sticas propias, fue el lenguaje Small-
talk, creado por Alan Kay (Figura 29.1), del Centro de Investigación en Palo
Alto de Xerox Corporation [242].
Hijo de un fisiólogo y una música, Kay se dedicó a los ordenadores de un
modo fortuito, ya que tras estudiar matemáticas y biologı́a en la Universidad
de Utah (EE. UU.) y dedicarse a la música, acabó en las Fuerzas Aéreas, donde
aprendió a programar. En 1967 realizando su doctorado [243] contactó con el
lenguaje de programación Simula del que tomó la idea de objeto, a la vez co-
359
Libros de Estadística en PDF | Statistics Books in PDF
360 CAPÍTULO 29. PROGRAMACIÓN ORIENTADA A OBJETOS
29.3. Clases
www.editorialuc.es
Una clase es una definición general de un objeto, posee un nombre, un con-
junto de atributos y un conjunto de funciones y procedimientos (métodos).
29.4. Objetos
Un objeto es una instancia concreta de una clase.
Está definido por: (1) los datos concretos que contiene, (2) por los métodos
que pueden operar sobre él, y (3) por el nombre identificador.
29.6.1. Clase S3
La clase S3 (old-style S3) es el primero que se desarrolló, puesto fue intro-
ducido en 1990 como un simple mecanismo de clase/método y desde entonces
es conocido como S3 classes and methods [161]. Es el más utilizado en programa-
ción en R.
Es muy fácil de implementar ya que una clase es simplemente una lista con
el atributo class y con la capacidad de usar funciones genéricas (plot(),
print(), summary() y muchas otras) [146].
La mayor parte de los modelos estadı́sticos del paquete stats utilizan cla-
ses S3. Pese a su popularidad, no son muy adecuadas1 y son propensas a erro-
res. Estudie el siguiente código:
> methods(plot)
[1] plot,ANY-method plot,color-method
[3] plot.aareg* plot.acf*
[5] plot.agnes* plot.areg
[7] plot.areg.boot plot.aregImpute
[9] plot.biVar plot.clusGap*
[11] plot.correspondence* plot.cox.zph*
[13] plot.curveRep plot.data.frame*
[15] plot.decomposed.ts* plot.default
[17] plot.dendrogram* plot.density*
[19] plot.diana* plot.drawPlot
1 Según Chambers: ((It does not allow many of the techniques we need to produce clear and reliable
software. [161]))
www.editorialuc.es
[25] plot.gbayes plot.ggplot*
[27] plot.gtable* plot.hclust*
[29] plot.histogram* plot.HoltWinters*
[31] plot.isoreg* plot.lda*
[33] plot.lm* plot.mca*
[35] plot.medpolish* plot.mlm*
[37] plot.mona* plot.partition*
[39] plot.ppr* plot.prcomp*
[41] plot.princomp* plot.profile*
[43] plot.profile.nls* plot.Quantile2
[45] plot.raster* plot.ridgelm*
[47] plot.rm.boot plot.rpart*
[49] plot.shingle* plot.silhouette*
[51] plot.spec* plot.spline*
[53] plot.stepfun plot.stl*
[55] plot.summary.formula.response plot.summary.formula.reverse
[57] plot.summaryM plot.summaryP
[59] plot.summaryS plot.survfit*
[61] plot.table* plot.times*
[63] plot.transcan plot.trellis*
[65] plot.ts plot.tskernel*
[67] plot.TukeyHSD* plot.varclus
[69] plot.xyVector*
see ’?methods’ for accessing help and source code
> plot.areg
function (x, whichx = 1:ncol(x$x), ...)
{
plot(x$y, x$ty, xlab = x$yname, ylab = paste("Transformed",
x$yname))
r2 <- round(x$rsquared, 3)
title(sub = bquote(Rˆ2 == .(r2)), adj = 0)
xdata <- x$x
cn <- colnames(xdata)
for (i in whichx) plot(xdata[, i], x$tx[, i], xlab = cn[i],
ylab = paste("Transformed", cn[i]), ...)
invisible()
}
<environment: namespace:Hmisc>
<bytecode: 0x114d76590>
<environment: namespace:stats>
Se han omitido muchas lı́neas de código porque esta función es muy larga.
www.editorialuc.es
> ht <- c(50.16, 60.43, 66.74, 71.11, 75.01, 78.5, 81.37, 86.68)
> cp <- c(34.89, 41.17, 44.14, 46.02, 47.28, 48.1, 48.71, 49.59)
> N <- nenes(777, ’Pérez-Pérez, JuanAntonio’, ’M’,
+ as.Date(’2015-08-31’), age, wt, ht, cp)
> N
$id
[1] 777
$name
[1] "Pérez-Pérez, JuanAntonio"
$sex
[1] "M"
$dob
[1] "2015-08-31"
$data
age wt ht cp
1 0 3.51 50.16 34.89
2 3 6.25 60.43 41.17
3 6 7.99 66.74 44.14
4 9 9.24 71.11 46.02
5 12 10.15 75.01 47.28
6 15 10.80 78.50 48.10
7 18 11.50 81.37 48.71
8 24 12.70 86.68 49.59
attr(,"class")
[1] "nenes"
> class(N)
[1] "nenes"
www.editorialuc.es
Peso y Edad Talla y Edad Perím. cefálico y Edad
100
50
●
●
14
●
●
90
●
●
12
45
●
●
●
80
●
●
Talla (cm)
Peso (kg)
● ●
●
70
40
8
●
●
60
●
●
6
35
●
50
●
4
●
40
30
2
0 5 10 15 20 25 30 0 5 10 15 20 25 30 0 5 10 15 20 25 30
> methods(plot)
[1] plot,ANY-method plot,color-method
[3] plot.aareg* plot.acf*
[5] plot.agnes* plot.areg
[7] plot.areg.boot plot.aregImpute
[9] plot.biVar plot.clusGap*
[11] plot.correspondence* plot.cox.zph*
[13] plot.curveRep plot.data.frame*
[15] plot.decomposed.ts* plot.default
[17] plot.dendrogram* plot.density*
[19] plot.diana* plot.drawPlot
[21] plot.ecdf plot.factor*
[23] plot.formula* plot.function
[25] plot.gbayes plot.ggplot*
[27] plot.gtable* plot.hclust*
[29] plot.histogram* plot.HoltWinters*
[31] plot.isoreg* plot.lda*
[33] plot.lm* plot.mca*
[35] plot.medpolish* plot.mlm*
[37] plot.mona* plot.nenes
[39] plot.partition* plot.ppr*
[41] plot.prcomp* plot.princomp*
[43] plot.profile* plot.profile.nls*
[45] plot.Quantile2 plot.raster*
[47] plot.ridgelm* plot.rm.boot
29.6.2. Clase S4
La clase S4 (new-style S4) es el estilo más moderno, estructurado y seguro.
Aún está poco extendido, pero es el aconsejado por Chambers para conseguir
una programación eficiente y segura [161] ya que es mucho más robusto y gus-
ta más a los programadores.
Algunos programadores tienen la sensación que S3 no proporciona la se-
guridad normalmente asociada a la OOP [146], por lo que exigen las clases S4,
que son más seguras aunque más difı́ciles de programar, ya que las estructuras
S4 son mucho más ricas que las estructuras S3:
Diversas funciones son muy útiles en las clases S4 (Tabla 29.1) [246].
Función Acción
@ Toma o reemplaza el contenido de un slot
new() Crea un nuevo objeto de una determinada clase
setClass() Crea una nueva clase S4
setMethod() Crea un nuevo método S4
setGeneric() Crea una nueva función genérica
getClass() Recoge una definición de clase
getMethod() Recoge una definición de método
getSlots() Recoge el nombre y clase de cada slot
validObject() Comprueba la validez de un objeto
www.editorialuc.es
En este capı́tulo se han utilizado las funciones recogidas en las siguientes
tablas:
Función Acción
c() Concatena elementos
cat() Imprime en pantalla
class() Clase de una objeto
data.frame() Crea una data frame
getAnywhere() Ver código de funciones no accesibles
getClass() Recoge una definición de clase
getMethod() Recoge una definición de método
getSlots() Recoge el nombre y clase de cada slot
if() Ejecución condicional
list() Crea listas
lm() Regresión lineal
methods() Métodos de una función
new() Crea un nuevo objeto de una determinada clase
plot() Función genérica
plot.areg() Método de plot()
plot.nenes() Método de plot()
print() Función genérica
runif Generación aleatoria de números ((uniformes))
setClass() Crea una nueva clase S4
setMethod() Crea un nuevo método S4
setGeneric() Crea una nueva función genérica
summary() Función genérica
validObject() Comprueba la validez de un objeto
Función Acción
microbenchmark Paquete para medir tiempos de ejecución [249]
PROBLEMAS
Problema 1. Amplı́e el método plot.nenes() para que incluya tres gráficos más:
relación peso/talla, ı́ndice de masa corporal y velocidad de crecimiento.
Problema 2. ¿Cuántos métodos tienen la función summary()?
30.1. Introducción
371
Libros de Estadística en PDF | Statistics Books in PDF
372 CAPÍTULO 30. LA FUNCIÓN APPLY Y SIMILARES
#---------------------------------------------------------------
apply(X, MARGIN, FUN, ...)
#---------------------------------------------------------------
¿Qué funciones se pueden usar? Tanto las funciones de R como las defini-
das por el usuario.
Si el objeto es una matriz tiene dos dimensiones:
Ejemplo 30.1. Con la siguiente matriz 6x7 calcule la media por filas y por
columnas.
> set.seed(2016)
> (M <- matrix(rpois(42, 5), nr=6))
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 3 6 3 5 8 6 3
[2,] 3 8 8 2 5 7 4
[3,] 7 0 3 4 3 3 3
[4,] 3 2 4 6 5 8 6
[5,] 5 4 6 4 9 7 4
[6,] 2 4 3 5 4 3 2
> (media_f <- apply(M, 1, mean)) # media por filas
[1] 4.857143 5.285714 3.285714 4.857143 5.571429 3.285714
> (media_c <- apply(M, 2, mean)) # media por columnas
[1] 3.833333 4.000000 4.500000 4.333333 5.666667 5.666667
[7] 3.666667
Ejemplo 30.2. Con el siguiente array 4x5x3 calcule el total por filas, por co-
lumnas y por matrices.
> set.seed(2016)
> (A <- array(rpois(60, 8), dim = c(4, 5, 3)))
, , 1
, , 2
[3,] 7 5 9 11 6
[4,] 8 9 11 5 9
www.editorialuc.es
, , 3
Si el objeto es un dataframe (es una lista con todos sus elementos de igual
longitud):
Ejemplo 30.3. Calcule la media de las variables 2:8 (emb, glu p, tad, ptri,
imc, fp dia, edad) de la BdD pima.
> load(’bd_Pima.RData’)
> round(apply(.data[, 2:8], 2, mean, na.rm = TRUE), 2)
emb glu_p tad ptri imc fp_dia edad
3.63 121.39 71.96 29.16 32.68 0.48 32.16
#---------------------------------------------------------------
lapply(X, FUN, ...)
#---------------------------------------------------------------
Ejemplo 30.5. Suponga que formamos una lista con estos tres vectores:
runif(7, 3, 12), rnorm(6) y rpois(10, 3). Calcule la media em-
pleando lapply().
> set.seed(2)
> x1 <- runif(7, 3, 12)
> x2 <- rnorm(6)
> x3 <- rpois(10, 3)
> (lista <- list(uniforme = x1, normal = x2, poisson = x3))
$uniforme
[1] 4.663940 9.321366 8.159937 4.512467 11.494554 11.491275
[7] 4.162431
$normal
[1] 0.9678839 0.1256203 -0.7098623 -0.9122442 1.0517744
[6] -0.7526655
$poisson
[1] 1 4 2 5 1 2 3 1 2 6
Ahora vamos a realizar un cálculo algo más complicado: en una BdD (que
ya sabemos que es una lista) vamos a realizar varios cálculos:
> library(epicalc)
> load(’bd_Pima.RData’)
> use(.data)
> casos <- unlist(lapply(split(imc, en), length))
> media <- unlist(lapply(split(imc, en), mean))
> DE <- unlist(lapply(split(imc, en), sd))
> round(rbind(casos, media, DE), 2)
NO SO OB
casos 79.00 152.00 398.00
www.editorialuc.es
media 22.54 27.50 36.67
DE 1.85 1.47 5.30
$SO
(Intercept) emb
27.33192647 0.04710158
$OB
(Intercept) emb
37.3197441 -0.1725603
30.3.2. sapply()
La función sapply() aplica una función a cada uno de los elementos de
una lista y devuelve un objeto simplificado.
#---------------------------------------------------------------
sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)
#---------------------------------------------------------------
> obj
$x
[1] 1 2 3 4 5 6 7 8 9 10
$y
[1] 0.04978707 0.13533528 0.36787944 1.00000000 2.71828183
[6] 7.38905610 20.08553692
$z
[1] TRUE FALSE FALSE TRUE
$g
[1] "a" "b" "c" "d"
$y
[1] 18 17 17 1 16 16 16
$z
[1] 4 5 5 4
$g
[1] 1 1 1 1
[2,] 1 2 3 4
[3,] 1 2 3 4
www.editorialuc.es
[4,] 1 2 3 4
> sapply(1:4,function(x) matrix(x,2,2), simplify = "array")
, , 1
[,1] [,2]
[1,] 1 1
[2,] 1 1
, , 2
[,1] [,2]
[1,] 2 2
[2,] 2 2
, , 3
[,1] [,2]
[1,] 3 3
[2,] 3 3
, , 4
[,1] [,2]
[1,] 4 4
[2,] 4 4
#---------------------------------------------------------------
tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
#---------------------------------------------------------------
Ejemplo 30.11. Con la BdD de las indias pima, calcule el IMC medio según
sean o no diabéticas.
> load(’bd_Pima.RData’)
> library(epicalc); use(.data)
> tapply(imc, diab, mean, na.rm = TRUE)
N S
31.19157 35.56449
Ejemplo 30.12. Con la BdD de las indias pima, calcule el IMC medio según
sean o no diabéticas y que tengan una TAD > 90 mm Hg.
30.4.2. split()
La función split() divide un vector o un dataframe según un factor o
una lista de factores.
Ejemplo 30.13. Divida el IMC según sean o no diabéticas las indias Pima.
$S
[1] 25.1 35.6 43.3 43.1 30.1 27.6 36.6 29.3 30.8 42.6 34.3 33.7
-------------------- lı́neas omitidas --------------------
[205] 38.0 41.2 33.9 33.8 44.5 42.3 49.3 36.4 43.3 36.5 44.0
Ejemplo 30.14. Divida el IMC según que las indias Pima presenten una TAD
superior a 90 mm Hg o no.
$‘TRUE‘
[1] 28
Ejemplo 30.15. Divida el IMC según sean o no diabéticas las indias Pima y
presenten o no una TAD > 90 mm Hg.
www.editorialuc.es
$N.FALSE
[1] 398
$S.FALSE
[1] 193
$N.TRUE
[1] 14
$S.TRUE
[1] 14
#---------------------------------------------------------------
by(data, INDICES, FUN, ..., simplify = TRUE)
#---------------------------------------------------------------
30.5.2. aggregate()
La función aggregate() divide un data frame en subconjuntos y calcula
en cada uno de ellos un estadı́stico1
#---------------------------------------------------------------
aggregate(x, by, FUN, ..., simplify = TRUE, drop = TRUE)
Ejemplo 30.17. Calcule la media de las variables 2:8 de la BdD de las indias
Pima empleando la función aggregate().
Ejemplo 30.19. Calcule la media de las variables 2:8 de la BdD de las indias
Pima empleando la función aggregate() utilizando una fórmula.
1 De la ayuda de R: ((Splits the data into subsets, computes summary statistics for each, and returns the
www.editorialuc.es
1 N 331.8282 2.926761 110.0169 69.91268 27.29014 31.42958
2 S 323.0452 4.700565 143.1186 74.70056 32.97740 35.81977
fp_dia edad emb_c en
1 0.4463155 29.22254 2.290141 2.391549
2 0.6165876 36.41243 2.711864 2.824859
30.6. Otras
30.6.1. mapply()
La función mapply() es una versión multivariable de sapply()
#---------------------------------------------------------------
mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,
USE.NAMES = TRUE)
#---------------------------------------------------------------
Ejemplo 30.20. Cree una matriz con una fila 4:8 repetida 6 veces.
30.6.2. vapply()
Es una función similar a sapply(), solamente que se pre-especifica el tipo
de valor que devuelve, por lo que es un poco más segura (y posiblemente más
rápida).
#---------------------------------------------------------------
vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)
#---------------------------------------------------------------
Ejemplo 30.21. Dada la lista formada por los vectores: x1 = rpois(1e7, 25),
x2 = exp(-300:300) + log(1.6) y x3 = 1:1e7. Calcule la desviación estándar de
cada vector.
> set.seed(2016)
> x <- list(x1 = rpois(1e7, 25), # length = 1e7
+ x2 = exp(-300:300) + log(1.6), # length = 601
+ x3 = 1:1e7) # length = 1e7
> vapply(X = x, FUN = sd, FUN.VALUE = 0)
x1 x2 x3
4.997640e+00 8.512592e+128 2.886751e+06
Se le dice a vapply() que debe devolver un único número por cada uno
de los vectores; ası́ lo hace, devolviendo un vector con las tres desviaciones
estándar.
30.6.3. eapply()
La función eapply() es similar a lapply() pero en vez de aplicar una
función a cada elemento de una lista, la aplica a cada elemento en un entorno
y devuelve una lista.
#---------------------------------------------------------------
eapply(env, FUN, ..., all.names = FALSE, USE.NAMES = TRUE)
#---------------------------------------------------------------
$x1
[1] FALSE
$x2
[1] FALSE
$x3
[1] FALSE
Supongamos que no hay nada y se crean las tres variables y una función.
Cuando se ejecuta eapply() nos presenta los cuatro objetos que hay en el
entorno y nos dice cuál de ellos es una función.
30.6.4. outer()
Calcula el producto externo.
www.editorialuc.es
#---------------------------------------------------------------
outer(X, Y, FUN = "*", ...)
X %o% Y
#---------------------------------------------------------------
Ejemplo 30.25. Con los vectores a = 1:3 y b = 10:7. Calcule el producto ex-
terno y aplique outer() con pmax y pmin.
> a <- 1:3
> b <- 10:7
> a %o% b
[,1] [,2] [,3] [,4]
[1,] 10 9 8 7
[2,] 20 18 16 14
[3,] 30 27 24 21
> outer(a, b, ’*’)
[,1] [,2] [,3] [,4]
[1,] 10 9 8 7
[2,] 20 18 16 14
[3,] 30 27 24 21
> outer(a, b, pmax)
[,1] [,2] [,3] [,4]
[1,] 10 9 8 7
[2,] 10 9 8 7
[3,] 10 9 8 7
> outer(a, b, pmin)
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] 2 2 2 2
[3,] 3 3 3 3
30.6.5. sweep()
#---------------------------------------------------------------
sweep(x, MARGIN, STATS, FUN = "-", check.margin = TRUE, ...)
#---------------------------------------------------------------
Ejemplo 30.26. Suponga que desea centrar los vectores numéricos (2:8) de la
BdD Pima restando a cada vector su media.
Función Acción
aggregate() Divide un dataframe y aplica una función
apply() Aplica una función a los márgenes de un array
array() Crea una array
by() Divide un data frame según un factor y aplica una función
c() Concatena elementos
cbind() Concatena por columnas
eapply() Aplica una función a cada elemento de un entorno
exp() Número e elevado a una potencia
data.frame() Crea un data frame
lapply() Aplica una función a cada elemento de una lista
length() Longitud de un vector
library() Carga una librerı́a
Continúa en la página siguiente...
Función Acción
list() Crea una lista
www.editorialuc.es
lm() Regresión lineal
load() Lee un objeto guardado en un fichero
mapply() Versión multivariable de sapply()
matrix() Crea una matriz
max() Valor máximo
mean() Media de un vector numérico
min() Valor mı́nimo
nchar() Calcula el número de caracteres
outer() Producto externo
quantile() Calcula cuantiles
rnorm() Vector de elementos que siguen una distribución normal
round() Función de redondeo
rpois() Genera números aleatorios de Poisson
runif() Genera números aleatorios de distribución uniforme
sapply() Aplica una función sobre los elementos de una lista y simplifica
set.seed() Fija semilla aleatoria
sd() Calcula la desviación estándar de un vector numérico
split() Divide un vector o dataframe según un factor
sum() Suma de los elementos de un vector numérico
sweep() Aplica una función por filas/columnas a un dataframe
system.time() Calcula el tiempo empleado por una función
tapply() Trocea un vector según un factor y aplica una función
unlist() Elimina la caracterı́stica de lista
use() Crea una copia oculta (.data) de una data frame
vapply() Aplica una función sobre una lista de forma segura
PROBLEMAS
Problema 1. Escriba una función que calcule los marginales (total de cada una de las
filas y de cada una de las columnas) utilizando algún bucle (for o while). Compare
su tiempo de ejecución con otro método vectorizado.
Problema 2. Con rpois(longitud, media = 6) cree una lista con 7 vec-
tores numéricos de longitud (1:7)*3. Presente la lista. Ordene todos los vectores y
presente la lista ordenada. set.seed(2) para reproducibilidad.
Problema 3. Cree una matriz aleatoria de 7x6 con la función rpois(42, 12).
Encuentre el valor mı́nimo de cada columna.
Problema 4. Calcule la media y la desviación estándar de todas las variables numéri-
cas de la BdD de las indias Pima y presente dichos valores en una matriz.
Problema 5. Escriba una función, empleando alguna de las funciones vistas en este
capı́tulo, que calcule el número de variables numéricas existente en una BdD.
Programación eficiente
Ejemplo 31.1. Compruebe el tiempo que lleva ejecutar 10000 veces el cálculo
de la media de 1000 números aleatorios que siguen una distribución normal
y finalmente hacer un histograma de las medias calculadas.
En primer lugar se programa la función f1():
> f1 <- function(
+ n1, # número de vueltas
+ n2 # números aleatorios
+ ) {
+ m <- numeric() # vector numérico vacı́o
+ for (i in 1:n1) { # vueltas
+ m <- c(m, mean(rnorm(n2))) # vector de medias
+ }
387
Libros de Estadística en PDF | Statistics Books in PDF
388 CAPÍTULO 31. PROGRAMACIÓN EFICIENTE
> set.seed(2016)
> system.time(f1(1e4, 1e3))
user system elapsed
3.385 0.082 3.458
500
0
Se aprecia que el tiempo es diferente. Por lo tanto, para tener un tiempo más
preciso habrı́a que repetir muchas veces el experimento y calcular una media...
#---------------------------------------------------------------
microbenchmark(..., list = NULL, times = 100L, unit,
check = NULL, control = list())
www.editorialuc.es
#---------------------------------------------------------------
Función Acción
cat() Imprime en pantalla
cbind() Junta objetos por columnas
debug() Inicia el depurador
is.numeric() Comprueba si un objeto es numérico
log() Logaritmo neperiano
rownames() Asigna nombres por columnas
stop() Detiene la ejecución de una función
traceback() Ejecuta hasta el error
Función Acción
microbenchmark Paquete para medir tiempos de ejecución [249]
391
Libros de Estadística en PDF | Statistics Books in PDF
392 BIBLIOGRAFÍA
[22] Kuhn TS. The Copernican Revolution: Planetary Astronomy in the Development of Western
Thought. Cambridge, Massachusetts (USA): Harvard University Press; 1957. ISBN 0-674-
17103-9.
[23] Kuhn TS. The Structure of Scientific Revolutions. 1st ed. Chicago (USA): University of
Chicago Press; 1962. Traducción española por Carlos Solı́s Santos: La estructura de las revo-
luciones cientı́ficas, 3 ed. México, 2006.
[24] Kuhn TS. The Structure of Scientific Revolutions. 2nd ed. Chicago (USA): University of
Chicago Press; 1970.
[25] Kuhn TS. Objectivity, Value Judgment, and Theory Choice. 1973;p. 356–367.
[26] Kuhn TS. Second Thoughts on Paradigms. In: Suppe F, editor. The Structure of Scientific
Theories. Urbana, Illinois (USA): University of Illinois Press; 1974. p. 459–482.
[27] Kuhn TS. Theory-Change as Structure-Change: Comments on the Sneed Formalism. Er-
kenntnis. 1976;10:179–199.
[28] Kuhn TS. The Essential Tension. Selected Studies in Scientific Tradition and Change. Chicago
(USA): University of Chicago Press; 1977.
[29] Kuhn TS. Black-Body Theory and the Quantum Discontinuity. 2nd ed. Chicago (USA):
University of Chicago Press; 1978.
[30] Lakatos I, Musgrave A. Problems in the Philosophy of Science. Amsterdam (Holland): North
Holland; 1965.
[31] Lakatos I, Musgrave A. Criticism and the Growth of Knowledge. Cambridge (UK): Cam-
bridge University Press; 1970.
[32] Lakatos I. Proofs and Refutations. Cambridge (UK): Cambridge University Press; 1976.
[33] Lakatos I. The Methodology of Scientific Research. Philosophical Papers, I. Cambridge (UK):
Cambridge University Press; 1978.
[34] Lakatos I. Mathematics, Science and Epistemology. Philosophical Papers, II. Cambridge
(UK): Cambridge University Press; 1978.
[35] Feyerabend PK. Explanation, reduction and empiricism. Minessota (USA): University of
Minessota; 1962.
[36] Feyerabend PK. Against Method. 3rd ed. London (UK): Verso; 1993. ISBN 0-86091-646-4.
[37] Feyerabend PK. Rationalism and the Rise of Science. London (UK): Cambridge University
Press; 1979.
[38] Feyerabend PK. Philosophical Papers, I: Rationalism and the Scientific Method. Cambridge
(UK): Cambridge University Press; 1981.
[39] Feyerabend PK. Philosophical Papers, II: Problems of Empiricism. Cambridge (UK): Cam-
bridge University Press; 1981.
[40] Feyerabend PK. Realism, Rationalism & Scientific Method. Philosophical Papers. Volume I.
Cambridge (USA): Cambridge University Press; 1981. ISBN 0-521-22897-2.
[41] Feyerabend PK. Farewell to Reason. London (UK): Verso; 1987. ISBN 0-86091-896-3.
[42] Argimón Pallás JM, Jiménez Villa J. Métodos de investigación aplicados a la Atención Pri-
maria de Salud. Barcelona: Doyma; 1991.
[43] Hulley SB, Cummings SR, Browner WS, Newman TB, Hearst N. Diseño de la investigación
clı́nica. Un enfoque epidemiológico. Barcelona: Doyma; 1993.
[44] Hulley SB, Cummings SR, Browner WS, Grady D, Hearst N, Newman TB. Designing Cli-
nical Research: An Epidemiological Approach. 2nd ed. Philadelphia: Lippincott Williams &
Wilkins; 2001.
[45] Redondo-Figuero CG, Santamarı́a-Pablos A, Redondo-OrtÌz CG. Aspectos éticos en Inves-
tigación Clı́nica. Pharm Care Esp. 2015;17(4):482–493.
[46] The Swiss Clinical Trial Organisation and the Swiss Ethics Committees on research involving
humans (swissethics). Research with human subjects. A manual for practitioners (second
edition). Bern, Swisse; 2015. Swiss Academy of Medical Sciences (SAMS).
[47] Hulley SB, Cummings SR, Browner WS, Grady DG, Newman TB. Designing clinical re-
search. 4th ed. Lippincott Williams & Wilkins; 2013.
[48] Altman DG. Statistics and ethics in medical research. III How large a sample? BMJ.
1980;281:1336–1338.
[49] Jennings R. Edición especial Microsoft Access 2000. Madrid: Prentice Hall; 1999.
[50] Courter G, Marquis A. La biblia de Excel 2002. Madrid: Anaya; 2001.
[51] Viescas JL. Guı́a completa de Microsoft Access97. Madrid: McGraw-Hill; 1997.
[52] Dobson R. Programación avanzada con Microsoft Access. Madrid: MaGraw-Hill; 2000.
[53] SPSS Inc. SPSS Base 7.5 Syntax Reference Guide. Chicago: SPSS; 1997.
[54] Ioannidis JPA. Why most published research findings are false. PLoS Med. 2005;2(8):e124.
[55] Altman DG. Statistical reviewing for medical journals. Stat Med. 1998;17:2661–2674.
[56] Bland M. An introduction to medical statistics. 3rd ed. Oxford: Oxford University Press;
2000.
[57] Ercan I, Yazici B, Yang Y, Ozkaya G, Cangur S, Ediz B, et al. Misusage of statistics in medical
research. Eur J Gen Med. 2007;4:128–134.
[58] Altman DG. The scandal of poor medical research. BMJ. 1994;308:283–284.
[59] Altman DG. Transparent reporting of trials is essential. Am J Gastroenterol. 2013;108:1231–
1235.
[60] Lang TA, Altman DG. Basic Statistical Reporting for Articles Published in Biomedical Jour-
nals: The ı̀Statistical Analyses and Methods in the Published Literatureı̂ or The SAMPL Gui-
delinesı̂. In: Smart P, Maisonneuve H, Polderman A, editors. Science Editors’Handbook.
European Association of Science Editors; 2013. .
[61] Cobos-Carbó A, Augustovski F. Declaración CONSORT 2010: actualización de la lista de
comprobación para informar ensayos clı́nicos aleatorizados de grupos paralelos. Med Clin
(Barc). 2011;137:213–215.
[62] Des Jarlais DC, Lyles C, Crepaz N, TRENDG. Improving the reporting quality of nonran-
domized evaluations of behavioral and public health interventions: the TREND statement.
Am J Public Health. 2004;94(3):361–366.
[63] von Elm E, Altman DG, Egger M, Pocock SJ, Gøtzsche PC, Vandenbroucke JP, et al. The
Strengthening the Reporting of Observational Studies in Epidemiology (STROBE) State-
ment: guidelines for reporting observational studies. Int J Surg. 2014 Dec;12(12):1495–1499.
Available from: http://dx.doi.org/10.1016/j.ijsu.2014.07.013.
[64] Gutiérrez-Dı́ez MC, Redondo-Figuero C. La investigación es una necesidad, no una opción.
Emergencias. 2006;18:129–130.
[65] Villanueva J. La investigación cientı́fica y la problemática de la industria farmacéutica. Ars
Pharmaceutica. 2003;44:281–301.
[66] Gutiérrez-Dı́az MC, Santamarı́a-Pablos A, Garcı́a-Benaite DD, Redondo-Figuero C. Razones
para investigar: motivación y reconocimiento. SEMERGEN. 2007;33:111–112.
[67] Redondo-Figuero CG. Aspectos metodológicos básicos en investigación (Investigar en Aten-
ción Primaria). Pediatr Integral. 2012;16:183 (9 pages).
[68] Redondo-Figuero CG. La investigación en la adolescencia. In: Redondo-Figuero CG, Galdó-
Muñoz G, Garcı́a-Fuentes M, editors. Atención al Adolescente. Santander (España): Univer-
sidad de Cantabria; 2008. p. 61–71.
[69] Bacon F. La Gran Restauración (Novum Organum). TraducciÛn de miguel ángel granada
martı́nez ed. Tecnos; 2002. ISBN: 978-84-309-5281-6.
[70] Redondo-Figuero CG. Aspectos metodológicos básicos en Investigación. In: Martı́nez-
Suárez V, editor. Manual de Iniciación a la Investigación en Pediatrı́a de Atención Primaria.
Ergón; 2011. p. 23–48.
[71] Howard Hughes Medical Institute, Burroughs Wellcome Fund. Making the Right Moves.
A Practical Guide to Scientific Management for Postdocs and New Faculty. 2nd ed. North
Carolina (USA): BWF-HHMI; 2006.
[72] Lee A, Dennis C, Campbell P. Nature’s guide for mentors. Nature. 2007;447(7146):791–797.
Available from: http://dx.doi.org/10.1038/447791a.
[73] Yewdell JW. How to succeed in science: a concise guide for young biomedical scientists.
Part I: taking the plunge. Nat Rev Mol Cell Biol. 2008;9(5):413–416. Available from: http:
//dx.doi.org/10.1038/nrm2389.
[74] Yewdell JW. How to succeed in science: a concise guide for young biomedical scientists. Part
II: making discoveries. Nat Rev Mol Cell Biol. 2008;9(6):491–494. Available from: http:
//dx.doi.org/10.1038/nrm2390.
[75] Sambunjak D, Marusić A. Mentoring: what’s in a name? JAMA. 2009;302(23):2591–2592.
Available from: http://dx.doi.org/10.1001/jama.2009.1858.
[76] van der Weijden I, Belder R, van Arensbergen P, van den Besselaar P. How do young tenured
professors benefit from a mentor? Effects on management, motivation and performance.
High Educ. 2015;69:275–287.
[77] Olaussen A, Reddy P, Irvine S, Williams B. Peer-assisted learning: time for nomenclature
clarification. Med Educ Online. 2016;21:30974.
[78] Rolfe A. The mentor’s role. Korean J Med Educ. 2016;28(2):243–244. Available from: http:
//dx.doi.org/10.3946/kjme.2016.37.
[79] Smith R. The trouble with medical journals. J R Soc Med. 2006;99(3):115–119.
[80] Ioannidis JPA. How to make more published research true. PLoS Med. 2014;11(10):e1001747.
[81] Macleod MR, Michie S, Roberts I, Dirnagl U, Chalmers I, Ioannidis JPA, et al. Biomedical
research: increasing value, reducing waste. Lancet. 2014 Jan;383(9912):101–104. Available
from: http://dx.doi.org/10.1016/S0140-6736(13)62329-6.
[82] Chalmers I, Bracken MB, Djulbegovic B, Garattini S, Grant J, Gülmezoglu AM, et al.
How to increase value and reduce waste when research priorities are set. Lan-
cet. 2014 Jan;383(9912):156–165. Available from: http://dx.doi.org/10.1016/
S0140-6736(13)62229-1.
[83] Chan AW, Song F, Vickers A, Jefferson T, Dickersin K, Gøtzsche PC, et al. Increasing value
and reducing waste: addressing inaccessible research. Lancet. 2014 Jan;383(9913):257–266.
Available from: http://dx.doi.org/10.1016/S0140-6736(13)62296-5.
[84] Moher D, Glasziou P, Chalmers I, Nasser M, Bossuyt PMM, Korevaar DA, et al. In-
creasing value and reducing waste in biomedical research: who’s listening? Lan-
cet. 2016 Apr;387(10027):1573–1586. Available from: http://dx.doi.org/10.1016/
S0140-6736(15)00307-4.
[85] Judson HF. The Great Betrayal: Fraud in Science. Orlando, FL (USA): HarcourtBooks; 2004.
ISBN: 978-0151008773.
[86] Becker RA. A Brief History of S. In: Dirschedl P, Ostermann R, editors. Computational
Statistics: Papers Collected on the Occasion of the 25th Conference on Statistical Computing
at Schloss Reisenburg. Heilderberg: Physica-Verlag; 1994. p. 81–110.
[87] Becker RA, Chambers JM. S: An Interactive Environment for Data Analysis and Graphics.
Pacific Grove, CA (USA): Wadsworth & Brooks/Cole.; 1984. ISBN 0-534-03313-X.
[88] Becker RA, Chambers JM, Wilks AR. The New S Language: A Programming Environment
for Data Analysis and Graphics. Pacific Grove, CA, USA: Wadsworth & Brooks/Cole.; 1988.
ISBN 0-534-09192-X.
[89] Chambers JM, Hastie TJ. Statistical Models in S. Pacific Grove, CA (USA): Wadsworth &
Brooks/Cole.; 1991. ISBN 0-412-05291-1.
[90] Becker RA, Chambers JM. Extending the S System. Pacific Grove, CA (USA): Wadsworth &
Brooks/Cole.; 1985. ISBN 0-534-05016-6.
[91] Chambers JM. Programming with Data. New York: Springer; 1998. ISBN 0-387-98503-4.
[92] Ihaka R, Gentleman R. R: A Language for Data Analysis and Graphics. Journal of Compu-
tational and Graphical Statistics. 1996;5(3):299–314.
[93] R Development Core Team. R: A Language and Environment for Statistical Computing.
Vienna, Austria; 2009. ISBN 3-900051-07-0.
[94] Gentelman R. R Programming for Bioinformatics. Boca Raton, FL (USA): Chapman & Hall
/ CRC Press; 2009. ISBN: 978-1-4200-6367-7.
[95] Dalgaard P. Introductory Statistics with R. 2nd ed. New York (USA): Springer; 2008.
[96] Fox J, Weisberg S. An R Companion to Applied Regression. 2nd ed. Thousand Oaks, CA,
USA: Sage Publications; 2011. ISBN 978-1-4129-7514-8.
[97] Everitt BS, Hothorn I. A Handbook of Statistical Analyses Using R. 2nd ed. Boca Raton, FL
(USA): Chapman & Hall / CRC Press; 2010. ISBN 978-1-4200-7933-3.
[98] Salas C. ¿ Por qué comprar un programa estadı́stico si existe R? Ecologı́a Austral. 2008
Agosto;18:223–231.
[99] Oliden PE. ¿ Existe vida más allá del SPSS? Descubre R. Psicothema. 2009;21:652–655.
[100] Gentleman RC, Carey VJ, Bates DM, Bolstad B, Dettling M, Dudoit S, et al. Bioconductor:
open software development for computational biology and bioinformatics. Genome Biol.
2004;5(10):R80. Available from: http://dx.doi.org/10.1186/gb-2004-5-10-r80.
[101] Maindonald J, Braun J. Data Analysis and Graphics Using R. An Example-Based Approach.
2nd ed. Cambridge Series in Statistical and Probabilistic Mathematics. Cambridge: Cambrid-
ge University Press; 2007. ISBN 978-0-521-86116-8.
[102] Venables WN, Ripley BD. Modern Applied Statistics with S. 4th ed. New York (USA):
Springer; 2002. ISBN 0-387-95457-0.
[103] Murrell P. R Graphics. Boca Raton, FL (USA): Chapman & Hall / CRC Press; 2006. ISBN
1-58488-486-X.
[104] Baldi P, Brunak S. Bioinformatics. The Machine Learning Approach. MIT Press; 2001.
[105] Rodriguez-Acevedo AJ, Smith RA, Roy B, Sutherland H, Lea RA, Frith A, et al. Genetic
association and gene expression studies suggest that genetic variants in the SYNE1 and TNF
genes are related to menstrual migraine. J Headache Pain. 2014;15:62. Available from: http:
//dx.doi.org/10.1186/1129-2377-15-62.
[106] Afgan E, Sloggett C, Goonasekera N, Makunin I, Benson D, Crowe M, et al. Geno-
mics Virtual Laboratory: A Practical Bioinformatics Workbench for the Cloud. PLoS One.
2015;10(10):e0140829. Available from: http://dx.doi.org/10.1371/journal.pone.
0140829.
[107] Loraine AE, Blakley IC, Jagadeesan S, Harper J, Miller G, Firon N. Analysis and visualization
of RNA-Seq expression data using RStudio, Bioconductor, and Integrated Genome Browser.
Methods Mol Biol. 2015;1284:481–501. Available from: http://dx.doi.org/10.1007/
978-1-4939-2444-8_24.
[108] Angione C, Conway M, Lió P. Multiplex methods provide effective integration of multi-
omic data in genome-scale models. BMC Bioinformatics. 2016;17 Suppl 4:83. Available from:
http://dx.doi.org/10.1186/s12859-016-0912-1.
[109] Perry BR, Assis R. CDROM: Classification of Duplicate gene RetentiOn Mechanisms.
BMC Evol Biol. 2016;16(1):82 (4 pages). Available from: http://dx.doi.org/10.1186/
s12862-016-0644-x.
[110] Broman KW, Keller MP, Broman AT, Kendziorski C, Yandell BS, Sen S, et al. Identification
and Correction of Sample Mix-Ups in Expression Genetic Data: A Case Study. G3 (Bethes-
da). 2015 Oct;5(10):2177–2186. Available from: http://dx.doi.org/10.1534/g3.115.
019778.
[111] Morgan AP. argyle: An R Package for Analysis of Illumina Genotyping Arrays. G3 (Bethes-
da). 2016;6:281–286.
[112] Turewicz M, Ahrens M, May C, Marcus K, Eisenacher M. PAA: an R/bioconductor package
for biomarker discovery with protein microarrays. Bioinformatics. 2016 May;32(10):1577–
1579. Available from: http://dx.doi.org/10.1093/bioinformatics/btw037.
[113] Schwartz M, Harrell F, Rossini A, Francis I. R: Regulatory Compliance and Validation Issues
A Guidance Document for the Use of R in Regulated Clinical Trial Environments. Vienna,
Austria (EU): The R Foundation for Statistical Computing; 2014.
[114] Chambers JM, Lang DT. Object-Oriented Programming in R. R News. 2001;1(3):17–19.
[115] Fox J. An R and S-Plus Companion to Applied Regression. Thousand Oaks, CA, USA: Sage
Publications; 2002. ISBN 0-761-92279-2.
[116] R Core Team. R: A Language and Environment for Statistical Computing. Vienna, Austria;
2016. Available from: https://www.R-project.org/.
[117] Venables WN, Smith DM, the R Development Core Team. An Introduction to R. Notes on R:
A Programming Environment for Data Analysis and Graphics. Version 2.10.1 (2009-12-14),
101 pages. Vienna, Austria; 2009. ISBN 3-900051-12-7.
[118] RStudio Team. RStudio: Integrated Development Environment for R. Boston, MA; 2015.
Available from: http://www.rstudio.com/.
[119] Verzani J. Getting Started with RStudio. Sebastopol, CA (USA): O’Reilly; 2011. ISBN: 978-1-
449-30903-9.
[120] Fox J, are grateful to Douglas Bates SWW, Firth D, Friendly M, Gorjanc G, Graves S, et al..
car: Companion to Applied Regression; 2010. R package version 2.0-2. Available from:
http://CRAN.R-project.org/package=car.
[121] Jr FEH, with contributions from many other users. Hmisc: Harrell Miscellaneous; 2010.
R package version 3.8-2. Available from: http://CRAN.R-project.org/package=
Hmisc.
[122] Verzani J. UsingR: Data sets for the text Üsing R for Introductory Statistics”; 2010. R package
version 0.1-13. Available from: http://CRAN.R-project.org/package=UsingR.
[123] Meyer D, Zeileis A, Hornik K. vcd: Visualizing Categorical Data. R package version 1.4-1.;
2015.
[124] Signorell A, et al . DescTools: Tools for Descriptive Statistics; 2016. R package version 0.99.17.
Available from: http://CRAN.R-project.org/package=DescTools.
[125] Maindonald J, Braun WJ. Data Analysis and Graphics Using R - an Example-Based Ap-
proach. 3rd ed. Cambridge (UK): Cambridge University Press; 2010. ISBN-13 978-0-521-
76293-9.
[126] Gross J. nortest: Tests for Normality; 2010. R package version 1.0.
[127] with contributions by Wei Liu MH. binomSamSize: Confidence intervals and sample size
determination for a binomial proportion under simple random sampling and pooled sam-
pling; 2009. R package version 0.1-2. Available from: http://CRAN.R-project.org/
package=binomSamSize.
[128] Zhang B, Bilder C, Biggerstaff B, Schaarschmidt F. binGroup: Evaluation and experimental
design for binomial group testing; 2010. R package version 1.0-6. Available from: http:
//CRAN.R-project.org/package=binGroup.
[129] many thanks to V Winston KA, Roberts D. asbio: A collection of statistical tools for biolo-
gists; 2010. R package version 0.3-12. Available from: http://CRAN.R-project.org/
package=asbio.
[130] Robin X, Turck N, Hainard A, Tiberti N, Lisacek F, Sanchez JC, et al.. display and analyze
ROC curves: Tools for visualizing, smoothing and comparing receiver operating characte-
ristic (ROC curves). (Partial) area under the curve (AUC) can be compared with statistical
tests based on U-statistics or bootstrap. Confidence intervals can be computed for (p)AUC
or ROC curves.; 2010. R package version 1.3.1.
[131] Lemon J, Grosjean P. prettyR: Pretty descriptive stats.; 2010. R package version 1.8-1. Avai-
lable from: http://CRAN.R-project.org/package=prettyR.
[132] Carstensen B, Plummer M, Laara E, et al MH. Epi: A package for statistical analysis in epi-
demiology.; 2010. R package version 1.1.15. Available from: http://CRAN.R-project.
org/package=Epi.
[133] Newcombe RG. Interval estimation for the difference between independent proportions:
comparison of eleven methods. Stat Med. 1998;17:873–890.
[134] Stevenson M, Nunes T, Sanchez J, , Thornton R. epiR: Functions for analysing epidemiolo-
gical data; 2010. R package version 0.9-26. Available from: http://CRAN.R-project.
org/package=epiR.
[135] Rotondi MA. epibasix: Elementary Epidemiological Functions for a Graduate
Epidemiology-Biostatistics Course; 2009. R package version 1.1. Available from:
http://CRAN.R-project.org/package=epibasix.
[136] Chongsuvivatwong V. epicalc: Epidemiological calculator; 2010. R package version 2.11.1.0.
Available from: http://CRAN.R-project.org/package=epicalc.
[137] Chongsuvivatwong V. Analysis of epidemiological data using R and Epicalc. McNeil E,
editor. Songkhla, Thailand: Chanmuang Press; 2008. ISBN: 978-974-11-4921-6.
[138] Groendyke C, Welch D, Hunter DR. epinet: A collection of epidemic/network-related
tools; 2010. R package version 0.0-8. Available from: http://CRAN.R-project.org/
package=epinet.
[139] Aragon T. epitools: Epidemiology Tools; 2010. R package version 0.5-6. Available from:
http://CRAN.R-project.org/package=epitools.
[140] Lai CC, Sung MI, Liu HH, Chen CM, Chiang SR, Liu WL, et al. The Ratio of Partial Pressure
Arterial Oxygen and Fraction of Inspired Oxygen 1 Day After Acute Respiratory Distress
Syndrome Onset Can Predict the Outcomes of Involving Patients. Medicine (Baltimore).
2016;95(14):e3333.
[141] Du Bois D, Du Bois EF. A formula to estimate the approximate surface area if height and
weight be know. Arch Intern Med. 1916;17:863–871.
[142] Mosteller RD. Simplified calculation of body-surface area. N Engl J Med. 1987;317:1098.
[143] Cobb JR. Outline for the study of scoliosis. Instructional course lectures. The American Aca-
demy of Orthopedic Surgeons. The American Academy of Orthopedic Surgeons. 1948;5:261–
275.
[144] Cohen Y, Cohen JY. Statistics and Data with R. An Applied Approach Through Examples.
Chichester (UK): Wiley; 2008. ISBN: 978-0-470-75805-2.
[145] Adler J. R in a Nutshell. O’Reilly; 2010.
[146] Matloff N. The Art of Programming. A Tour of Statistical Software Design. San Francisco,
CA (USA): no starch press; 2011. ISBN-13: 978-1-59327-384-2.
[147] Bååth R. The State of Naming Conventions in R. The R Journal. 2012;4(2):74–75. Availa-
ble from: http://journal.r-project.org/archive/2012-2/RJournal_2012-2_
Baaaath.pdf.
[148] Wickham H. Advanced R. The R series. Boca Raton, FL (USA): CRC Press (Chapmana &
Hall); 2014. ISBN: 978-1-4665-8696-3.
[149] Johnson PE. R Style. An Rchaeological Commentary;.
[150] Jones O, Maillardet R, Robinson A. Introduction to Scientific Programming and Simulation
Using R. 1st ed. Bopca Raton, FL (USA): CRC Press (Chapmana & Hall); 2009. ISBN: 978-1-
4200-6872-6.
[151] Venables WN, Ripley BD. S Programming. Statistics and Computing. New York: Springer-
Verlag; 2000. ISBN: 0-387-98966-8.
[152] Crawley MJ. The R Book. Chichester (UK): John Wiley & Sons; 2007. ISBN-13: 978-0-470-
51024-7.
[153] Albert J, Rizzo M. R by Example. Use R!. New York (USA): Springer; 2012. ISBN 978-1-4614-
1364-6.
[154] Cárdenas ML, Cornish-Bowden A. Rounding error, an unexpected fault in the output
from a recording spectrophotometer: implications for model discrimination. Biochem J.
1993;292:37–40.
[155] Garcı́a-Berthou E, Alcaraz C. Incongruence between test statistics and P values in medical
papers. BMC Med Res Methodol. 2004 May;4:13. Available from: http://dx.doi.org/
10.1186/1471-2288-4-13.
[156] Jeng M. Error in statistical tests of error in statistical tests. BMC Med Res Methodol.
2006;6:45. Available from: http://dx.doi.org/10.1186/1471-2288-6-45.
[157] Emmerson AJ, Roberts SA. Rounding of birth weights in a neonatal intensive care unit over
20 years: an analysis of a large cohort study. BMJ open. 2013;3(12):e003650 (5 pages).
[158] Kalinina EA. The most precise computations using Euler’s method in standard floating-
point arithmetic applied to modelling of biological systems. Comput Methods Programs
Biomed. 2013 Aug;111(2):471–479. Available from: http://dx.doi.org/10.1016/j.
cmpb.2013.04.001.
[159] Goede SL, Leow MKS. General error analysis in the relationship between free thyroxine and
thyrotropin and its clinical relevance. Comput Math Methods Med. 2013;p. 831275 (7 pages).
Available from: http://dx.doi.org/10.1155/2013/831275.
[160] Braun WJ, Murdoch DJ. A First Course in Statistical Programming with R. Cambridge:
Cambridge University Press; 2007. ISBN 978-0521872652.
[161] Chambers JM. Software for Data Analysis: Programming with R. New York (USA): Springer;
2008. ISBN 978-0-387-75935-7.
[162] Chambers JM. Object-Oriented Programming, Functional Programming and R. Statistical
Science. 2014;29(2):167–180.
[163] McConnell S. Code Complete: A practical handbook of software construction. 2nd ed.
Redmond. Washington (USA): Microsoft Press; 2004.
[164] Martı́nez Salas J. Elementos de Matemáticas. 3rd ed. Andrés Martı́n; 1969.
[165] Stewart J. Calculus: concepts and contexts. 2nd ed. California (USA): Thompson Learning;
2001.
[166] Larson RE, Hostetler RP. Cálculo y Geometrı́a Analı́tica. Madrid: McGraw-Hill; 1992.
[167] Crawley MJ. The R Book. 2nd ed. Chichester (UK): John Wiley & Sons; 2013. ISBN 978-0-
470-97392-9.
[168] Harrell FE, Dupont C, et al . Hmisc: Harrell Miscellaneous. R package version 3.14-6. Cran-R;
2014.
[169] Chongsuvivatwong V. Epicalc: Epidemiological calculator. R package version 2.15.1.0. Thai-
land: Cran-R; 2012.
[170] Aragón TJ. Applied Epidemiology Using R. The author; 2013.
[171] Breslow NE, Day NE. Statistical Methods in Cancer Research. 1: The Analysis of Case-
Control Studies. IARC Lyon / Oxford University Press; 1980.
[172] Verzani J. Using R for Introductory Statistics. 1st ed. Boca Raton, Florida: Chapman &
Hall/CRC; 2005. ISBN: 1-58488-4509.
[173] Hjalmarson A, Elmfeldt D, Herlitz J, Holmberg S, Málek I, Nyberg G, et al. Effect on morta-
lity of metoprolol in acute myocardial infarction. A double-blind randrandom trial. Lancet.
1981;2(8251):823–827.
[174] Martı́nez Calvo MC, Pérez de Vargas A. Métodos matemáticos en Biologı́a. Madrid: Centro
de Estudios Ramón Areces; 1993.
[175] Rothman KJ, Greeland S. Modern Epidemiology. 2nd ed. Philadelphia (USA): Lippincott;
1998.
[176] Borbolla R, Sanz P. Álgebra lineal y teorı́a de matrices. Madrid, España: Prentice Hall; 1998.
ISBN: 84-8322-008-3.
[177] Armitage P, Berry G, Matthews JNS. Statistical Methods in Medical Research. 4th ed. Mas-
sachusetts (USA): Blackwell Science; 2002. ISBN: 978-0-6320-5257-8.
[178] Chongsuvivatwong V. Analysis of Epidemiological Data Using R and Epicalc. Prince of
Songkla University, Hat Yai, Thailand: World Health Organization; 2007.
[179] Jewell NP. Statistics for Epidemiology. Boca Raton, Florida (USA): Chapman & Hall / CRC
Press; 2009. ISBN 0-203-59461-4.
[180] Olsen J, Christensen K, Murray J, Ekbom A. An Introduction to Epidemiology for Health
Professionals. New York (USA): Springer; 2010. ISBN 978-1-4419-1496-5.
[181] Coghlan A. A Little Book of R For Biomedical Statistics. Cambridge (UK): Parasite Genomics
Group, Wellcome Trust Sanger Institute; 2014.
[182] Selvin S. Statistical Tools for Epidemiologic ResearchFLPxxx2003FLPxxx2003. Oxford (UK):
Oxford University Press; 2011. ISBN 978-0-19-975596-7.
[183] Ripley BD, Hornik K. Date-Time Classes. R-News. 2001;1/2:8–12.
[184] Grolemund G, Wickham H. Dates and Times Made Easy with lubridate. Journal of Statistical
Software. 2011;40(3):25 pages.
[185] Pruim R, Kaplan DT, Horton NJ. mosaic: Project MOSAIC Statistics and Mathematics
Teaching Utilities; 2016. R package version 0.14.4. Available from: https://CRAN.
R-project.org/package=mosaic.
[186] Fox J. Frames, Environments, and Scope in R and S-PLUS. Appendix to An R and S-PLUS
Companion to Applied Regression. Car. 2002;.
[187] Zeileis A, Hornik K, Murrell P. Escaping RGBland: Selecting Colors for Statistical Graphics.
Computational Statistics and Data Analysis. 2009;53:3259–3270.
[188] Zhou L, Braun WJ. Fun with the R Grid Package. Journal of Statistics Education.
2010;18(3):1–35.
[189] Sarkar D. Lattice. Multivariate Data Visualization with R. Use R. USA: Springer; 2008. ISBN:
978-0-387-75968-5.
[190] Tennekes M, de Jonge E, Daas PJH. Visualizing and Inspecting Large Datasets with Table-
plots. Journal of Data Science. 2013;11:43–58.
[191] Tennekes M, de Jonge E. tabplot: Tableplot, a Visualization of Large Datasets; 2016. R pac-
kage version 1.3. Available from: https://CRAN.R-project.org/package=tabplot.
[192] Cleveland WS. Graphical methods for data presentation: Full scale breaks, dot charts, and
multibased logging. The American Statistician. 1981;38(4):270–280.
[193] Cleveland WS, McGill R. Graphical Perception: Theory, Experimentation, and Application
to the Development of Graphical Methods. Journal of the American Statistical Association.
1984;79:531–554.
[194] Cleveland WS. Visualizing Data. Summit, New Jersey: Hobart Press; 1993. ISBN: 0-9634884-
0-6.
[195] Cleveland WS. The Elements of Graphing Data. 2nd ed. Summit, New Jersey (USA): Hobart
Press; 1994. ISBN: 0-9634884-1-4.
[196] Hartigan JA, Kleiner B. A mosaic of television ratings. Tha American Statician. 1984;38:32–
35.
[197] Friendly M. A brief history of the mosaic plot. 2001;.
[198] Friendly M, Meyer D. Discrete Data Analysis with R: Visualization and Modeling Techni-
ques for Categorical and Count Data. Boca Raton, FL. (USA): Chapman & Hall/CRC; 2016.
ISBN 978-1-4987- 2583-5.
[199] Few S. Are mosaic plots worthwhile? Visual Business Intelligence Newsletter. 2014;(1):1–14.
[200] Unlu A, Sargin A, Viehrig M. Mosaics for visualizing knowledge structures. Journal of Data
Science. 2013;11:451–478.
[201] Friendly M. A fourfold display for 2 by 2 by k tables. Technical Report 217. Psychology
Departamente. York University; 1994.
[202] Horváth A, Páll N, Molnár K, Kováts T, Surján G, Vicsek T, et al. A nationwide study of the
epidemiology of relapsing polychondritis. Clin Epidemiol. 2016;8:211–230. Available from:
http://dx.doi.org/10.2147/CLEP.S91439.
[203] Aimone AM, Brown PE, Zlotkin SH, Cole DC, Owusu-Agyei S. Geo-spatial factors as-
sociated with infection risk among young children in rural Ghana: a secondary spa-
tial analysis. Malar J. 2016;15:349. Available from: http://dx.doi.org/10.1186/
s12936-016-1388-1.
[204] Pigott DM, Millear AI, Earl L, Morozoff C, Han BA, Shearer FM, et al. Updates to the
zoonotic niche map of Ebola virus disease in Africa. Elife. 2016;5. Available from: http:
//dx.doi.org/10.7554/eLife.16412.
[205] Moyes CL, Shearer FM, Huang Z, Wiebe A, Gibson HS, Nijman V, et al. Predicting the geo-
graphical distributions of the macaque hosts and mosquito vectors of Plasmodium knowlesi
malaria in forested and non-forested areas. Parasit Vectors. 2016;9(1):242. Available from:
http://dx.doi.org/10.1186/s13071-016-1527-0.
[206] Insaf TZ, Talbot T. Identifying areas at risk of low birth weight using spatial epidemiology:
A small area surveillance study. Prev Med. 2016 Jul;88:108–114. Available from: http:
//dx.doi.org/10.1016/j.ypmed.2016.03.019.
[207] code by Richard A Becker OS, version by Ray Brownrigg Enhancements by Thomas P Min-
ka ARWR, Deckmyn A. maps: Draw Geographical Maps; 2016. R package version 3.1.0.
Available from: https://CRAN.R-project.org/package=maps.
[208] Becker RA, Cleveland WS, Shyu MJ. The visual design and control of trellis display. Juournal
of Computational and Graphical Statistics. 1996;5:123–155.
[209] Sarkar D, Le Meur N, Gentleman R. Using flowViz to visualize flow cytometry data. Bio-
informatics. 2008 Mar;24(6):878–879. Available from: http://dx.doi.org/10.1093/
bioinformatics/btn021.
[210] Sun X, Li J. PKreport: report generation for checking population pharmacokinetic model
assumptions. BMC Med Inform Decis Mak. 2011;11:31. Available from: http://dx.doi.
org/10.1186/1472-6947-11-31.
[211] Gu Z, Eils R, Schlesner M. gtrellis: an R/Bioconductor package for making genome-level
Trellis graphics. BMC Bioinformatics. 2016;17:169. Available from: http://dx.doi.org/
10.1186/s12859-016-1051-4.
[212] Hintze JL, Nelson RD. Violin plots: a box plot-density trace synergism. The American Sta-
tistician. 1998;52(2):181–184.
[213] Kampstra P. Beanplot: a boxplot alternative for visual comparison of distribution. Journal
of Statistical Software. 2008;28:9 pages.
[214] Tufte ER. The Visual Display of Quantitative Information. 2nd ed. Cheshire, Connecticut
(USA): Graphic Press; 2001. ISBN-13: 978-0961392147.
[215] van Belle G, Fisher LD, Heagerty PJ, Lumley T. Biostatistics. A Methodology for the Health
Sciences. 2nd ed. Hoboken, New Jersey (USA): John Wiley & Sons; 2004. ISBN 0-471-03185-2.
[216] Cleveland WS. The Elements of Graphing Data. 1st ed. Monterey, California (USA): Wads-
worth; 1985. ISBN 0-534-03730-5.
[217] Friendly M, Denis D. The early origins and development of the scatterplot. J Hist Behav Sci.
2005;41(2):103–130. Available from: http://dx.doi.org/10.1002/jhbs.20078.
[218] Murdoch D, Chow ED. ellipse: Functions for drawing ellipses and ellipse-like confidence
regions; 2013. R package version 0.3-8. Available from: https://CRAN.R-project.org/
package=ellipse.
[219] Sarkar D, Andrews F. latticeExtra: Extra Graphical Utilities Based on Lattice; 2016. R
package version 0.6-28. Available from: https://CRAN.R-project.org/package=
latticeExtra.
[220] for R by Ray Brownrigg DMP, Minka TP, transition to Plan 9 codebase by Roger Bivand.
mapproj: Map Projections; 2015. R package version 1.2-4. Available from: https://CRAN.
R-project.org/package=mapproj.
[221] Wickham H. ggplot2. Elegant Graphics for Data Analysis. Use R!. New York: Springer; 2009.
ISBN 978-0-387-98140-6.
[222] Wickham H. A Layered Grammar of Graphics. Journal of Computational and Graphical
Statistics. 2010;19:3–28.
[223] Sun X, Wu K, Cook D. PKgraph: an R package for graphically diagnosing population phar-
macokinetic models. Comput Methods Programs Biomed. 2011 Dec;104(3):461–471. Availa-
ble from: http://dx.doi.org/10.1016/j.cmpb.2011.03.016.
[224] Ito K, Murphy D. Application of ggplot2 to Pharmacometric Graphics. CPT Pharmacome-
trics Syst Pharmacol. 2013;2:e79. Available from: http://dx.doi.org/10.1038/psp.
2013.56.
[225] Wilkinson L. The Grammar of Graphics. New York (USA): Springer; 2005. ISBN-13: 978-
0387-24544-7.
[226] Chasalow S. combinat: combinatorics utilities; 2012. R package version 0.0-8. Available from:
https://CRAN.R-project.org/package=combinat.
[227] Kassambara A. ggcorrplot: Visualization of a Correlation Matrix using ’ggplot2’; 2016.
R package version 0.1.1. Available from: https://CRAN.R-project.org/package=
ggcorrplot.
[228] Pebesma EJ, Bivand RS. Classes and methods for spatial data in R. R News. 2005;5(2):9–13.
Available from: http://CRAN.R-project.org/doc/Rnews/.
[229] Bivand RS, Pebesma EJ, GÛmez-Rubio V. Applied Spatial Data Analysis with R. Use R!.
New York (USA): Springer; 2008. ISBN 978-0-387-78170-9.
[230] Bivand RS, Pebesma EJ, GÛmez-Rubio V. Applied Spatial Data Analysis with R. 2nd ed.
New York (USA): Springer; 2013. Available from: http://.www.asdar-book.org/.
[231] Navarro DJ. Learning statistics with R: A tutorial for psychology students and other begin-
ners. University of Adelaide; 2013.
[232] Muenchen RA. R for SAS and SPSS Users. 2nd ed. New York (USA): Springer; 2011. ISBN
978-1-4614-0684-6.
[233] Shapiro SS, Wilk MB. An analysis of variance test for normality (complete samples). Biome-
trika. 1965;52:591–611.
[234] Hain J. Comparison of Common Tests for Normality. Wurzburg, Germany: Julius-
Maximilians-Universitat Wurzburg Institut fur Mathematik und Informatik; 2010.
[235] Ghasemi A, Zahediasl S. Normality tests for statistical analysis: a guide for non-statisticians.
Int J Endocrinol Metab. 2012;10(2):486–489. Available from: http://dx.doi.org/10.
5812/ijem.3505.
[236] Sturges H. The choice of a class-interval. J Amer Statist Assoc. 1926;21:65–66.
[237] Matloff N, Salzman PJ. The Art of Debugging with GDB, DDD, and Eclipse. No Starch Press;
2008.
[238] Bravington MV. debug: MVB’s debugger for R; 2013. R package version 1.3.1. Available
from: https://CRAN.R-project.org/package=debug.
[239] Booch G, Maksimchuk R, Engle M, Young B, Conallen J, Houston K. Object-oriented
analysis and design with applications. 3rd ed. Addison-Wesley Professional; 2007.
ISBN:9780201895513.
[240] R Development Core Team. R Language Definition. Version 2.10.1 (2009-12-14), 60 pages.
Vienna, Austria; 2009. ISBN 3-900051-13-5.
[241] Dahl OJ, Myhrhaug B, Nygaard K. SIMULA information COMMON BASE LANGUAGE.
Oslo (Norway); 1970.
[242] Kay AC. The Early History of Smalltalk. ACM SIGPLAN Notices. 1993;28(3):1–54.
[243] Kay AC. The Reactive Engine (PhD). University of Utah; 1969.
[244] Goldberg A, Kay A. Smalltalk-72: Instruction Manual. Xerox Corporation; 1976.
[245] Peña R. La programación orientada a objetos; 2010.
[246] Gurarie E. Object-Oriented Programming in R. University of Washington; 2015.
Available from: http://http://faculty.washington.edu/eliezg/teaching/
StatR301/2015/Lecture08_MarkovChainsAndFriends/Lecture08c_OOPinRs_
ForPrinting.pdf.
[247] Uyttendaele N. How to speed up R code: an introduction. Voie du Roman Pays 20, B-
1348 Louvain-la-Neuve, Belgium.; 2015. Available from: https://ai2-s2-pdfs.s3.
amazonaws.com/88aa/fee3c59b7c25dfc708fbbf421caedbb6659a.pdf.
[248] Tierney L. A Byte Code Compiler for R. USA; 2016. Department of Statistics and Actuarial
Science. Available from: http://homepage.divms.uiowa.edu/˜luke/R/compiler/
compiler.pdf.
[249] Mersmann O. microbenchmark: Accurate Timing Functions; 2015. R package version 1.4-2.1.
Available from: https://CRAN.R-project.org/package=microbenchmark.
+, 65 as.array(), 85
..., 67 as.character(), 85
.GlobalEnv, 75 as.complex(), 85
.Last.value, 67 as.data.frame(), 85
:, 62 as.difftime(), 196
::, 62 as.double(), 85
:::, 62 as.factor(), 85
;, 65 as.list(), 85
¿, 65 as.logical(), 85
ámbito as.matrix(), 85
léxico, 207 as.numeric(), 85
ángulo de Cobb, 48 as.raw(), 85
árbol de directorios, 31 as.ts(), 85
tab completion, 29 as.vector(), 85
?(), 51 asin(), 48
Arg(), 101 assign(), 94
Conj(), 101 assocplot(), 234
Fazar(), 331 atan(), 48
Fcomplete cases(), 343 attach(), 208
Fdescrip basica(), 329 attr(), 77, 78, 183
Fdiscrepa mdym(), 281 attributes(), 77, 78, 92
Fecu 2g(), 305 autores
Fed n(), 335 Ripley(), 206
Fh(), 340 axis(), 242
Fmedia(), 327 barchart(), 258
Fnormalidad(), 338 barplot(), 220
Fprueba diag(), 345 baseenv(), 206
Fsaludos(), 325 body(), 301
Ftabla diag(), 330 box(), 242
ISOdatetime(), 194 boxplot(), 224
Im(), 101 bwplot(), 255
Mod(), 101 by(), 375
ROC()(), 40 c(), 92
Re(), 101 car::qqPlot(), 226
Sys.Date(), 192 cat(), 88
Sys.time(), 191 cbind(), 151
Sys.timezone()(), 190 cdplot(), 232, 244
UseMethod(), 308 ceiling(), 45
abline(), 240 chisq.test(), 300
abs(), 46 choose(), 46
acos(), 48 ci.pd()(), 40
addmargins(), 171 citation(), 21
aes(), 273 class(), 77, 79, 115
aggregate(), 187, 376 clogistic()(), 40
aperm(), 171, 172 cloud(), 263
apply(), 128, 160, 368 cm.colors(), 217
apropos(), 54, 57 col(), 156
args(), 301 colMeans(), 159
array(), 169 colSums(), 159
arrows(), 240 colnames(), 152
as.Date(), 193 complete.cases(), 186
403
Libros de Estadística en PDF | Statistics Books in PDF
404 ÍNDICE ALFABÉTICO
caracteres, 92
complejos, 92
crudos, 92
enteros, 92
lógicos, 92
numéricos, 92
atributos, 92
complejos, 100
de caracteres, 101
lógicos, 98
longitud, 92
nombrar, 105
numéricos, 98
reales, 99
tipo, 92
velocidad de ejecución, 383
verdad, 1, 2
viñetas, 55
visibilidad de las variables, 88
workspace, 75