Está en la página 1de 40

Handouts

Trptico R
Introduccin al uso y programacin del A quick introduction to ESS
sistema estadstico R
Ramon Daz-Uriarte
rdiaz@cnio.es

http://bioinfo.cnio.es/rdiaz

Unidad de Bioinformatica
Centro Nacional de Investigaciones Oncologicas (CNIO)
Copyright
c 2003 Ramon Daz-Uriarte

Uso y programacion de R p. 1/157 Uso y programacion de R p. 2/157

Programa "Horario"

Introduccin a R 1a maana:
Introduccin a R
Uso de R con XEmacs + ESS
Uso de R con XEmacs + ESS
Objetos en R
Objetos en R 1a tarde:
Objetos en R
Grficos en R
Importacin/Exportacin de datos
2a maana:
Programacin en R
Grficos en R
Ejemplos prcticos
Programacin en R 2a tarde:
Ejemplos prcticos
Ejemplos prcticos
Uso y programacion de R p. 3/157 Uso y programacion de R p. 4/157
Introduccin Qu son R y S

" R, also known as GNU S, is a language and environment for


Qu son R y S statistical computing and graphics. R implements a dialect of
the award-winning language S, developed at Bell Laboratories
Obtencin e instalacin de R by John Chambers et al. For newcomers it provides easy
access to a wide variety of statistical and graphical techniques.
Advanced users are offered a full-featured programming
Uso de R con ESS y XEmacs language with which to add functionality by defining new
functions." (Del folleto que teneis en las manos).
Dos ejemplos con tests de la t y " [S] has forever altered the way how people analyze, visualize
and manipulate data" (Association of Computer Machinery
Software System Award 1998 a John Chambers).
correlacin
Probablemente, S y R son los dos lenguajes ms usados en
investigacin en estadstica. Otras virtudes en el folletillo.

Uso y programacion de R p. 5/157 Uso y programacion de R p. 6/157

Qu son R y S (II) Cunto cuesta R? R es "GNU S"

En pocas palabras, los grandes atractivos de R/S son: R es la implementacin GNU de S.


La capacidad de combinar, sin fisuras, anlisis FIlosofa y objetivos del proyecto GNU: www.gnu.org.
"preempaquetados" (ej., una regresin logstica) con
Desarrollar un sistema completo y "libre" (donde "free is free
anlisis ad-hoc, especficos para una situacin: capacidad
as in freedom, not free as in beer").
de manipular y modificar datos y funciones.
Los grficos de alta calidad (revelaciones de la visualizacin Algunos "GNUs famosos": Emacs, gcc, GNU/Linux, etc.
de datos y produccin de grficas para papers). R se distribuye con licencia GNU GPL o General Public
La comunidad de R es muy dinmica (ej., crecimiento en License (ver http://www.gnu.org/licenses/gpl.html .)
nmero de paquetes), integrada por estadsticos de gran La GPL no pone ninguna restriccin al uso de R. Restringe su
renombre (ej., J. Chambers, L. Terney, B. Ripley, D. Bates, etc). distribucin (ha de ser GPL).
Extensiones especficas a reas nuevas (bioinformtica, R se obtiene por 0 euros en http://cran.r-project.org
geoestadstica, modelos grficos).
Un lenguaje orientado a objetos.
Muy parecido a Matlab y Octave, y con sintaxis que recuerda a
C/C++. Uso y programacion de R p. 7/157 Uso y programacion de R p. 8/157
Obtencin e instalacin de R Paquetes adicionales

Depende del sistema operativo, pero todo se puede encontrar en R consta de un "sistema base" y de paquetes adicionales que
http://cran.r-project.org/bin. extienden la funcionalidad. Distintos "tipos" de paquetes:
Windows: bajar ("download") el ejecutable desde Los que forman parte del sistema base (ej. ctest).
http://cran.r-project.org/bin/windows/base . (por
Los que no son parte del sistema base, pero son
ejemplo,
"recommended" (ej., survival, nlme). En GNU/Linux y
http://cran.r-project.org/bin/windows/base/rw1070.exe).
Windows ya (desde 1.6.0?) forman parte de la distribucin
Ejecutar el fichero. Instalar el sistema base y los paquetes
estndard.
recomendados.
Otros paquetes; ej., car, gregmisc, los paquetes de
GNU/Linux: dos opciones:
Bioconductor (como multtest, etc). Estos necesitamos
Obtener el R-x.y.z.tar.gz y compilar desde las fuentes, y seleccionarlos e instalarlos individualmente. Ms adelante
tambin bajar los paquetes adicionales e instalar. (Buena veremos como.
forma de comprobar que el sistema tiene development
tools).
Obtener binarios (ej., *.deb para Debian, *.rpm para
RedHat, SuSE, Mandrake).
Uso y programacion de R p. 9/157 Uso y programacion de R p. 10/157

Documentacin sobre R (I) Documentacin sobre R (II)

Los "manuales" de R, incluidos en todas las instalaciones. Son: Documentacin general:


An introduction to R. De lectura requerida. A guide for the unwilling S user, de P. Burns. En
Writing R extensions. http://cran.r-project.org/doc/contrib/Burns-unwilling_S.pdf
o http://www.burns-stat.com/pages/tutorials.html. Slo 8
R data import/export. pginas!
The R language definition. R para principiantes, de E. Paradis. En
R installation and administration. http://cran.r-project.org/other-docs.html o
http://cran.r-project.org/doc/contrib/rdebuts_es.pdf .
FAQ.
S Programming, de W. Venables y B. Ripley. (Ver tambin
http://www.stats.ox.ac.uk/pub/MASS3/Sprog .)

Uso y programacion de R p. 11/157 Uso y programacion de R p. 12/157


Documentacin sobre R (III)

Documentacin general: Estadstica:


S poetry de P. Burns. En Introductory statistics with R de P. Dalgaard.
http://www.burns-stat.com/pages/spoetry.html . An R and S-PLUS companion to applied regression, de J. Fox.
Otros documentos en la pgina de J. Fox Modern applied statistics with S, 4th ed. de W. Venables y
(http://cran.r-project.org/doc/contrib/Fox-Companion/appendix.html ), B. Ripley. (Ver tambin
ej. sobre Frames, etc). http://www.stats.ox.ac.uk/pub/MASS4 .)
El site de Paul Johnson Practical regression and ANOVA using R de J. Faraway , en
(http://lark.cc.ukans.edu/~pauljohn/R/statsRus.html). http://cran.r-project.org/other-docs.html o
Los libros azul , marrn y verde de Chambers et al. http://www.stat.lsa.umich.edu/~faraway/book/ .
Otros documentos en
http://cran.r-project.org/other-docs.html .
S-PLUS 6.0 for Unix. Guide to statistics. Vol. I & II. En
http://www.insightful.com/support/documentation.asp?DID=3.

Uso y programacion de R p. 13/157 Uso y programacion de R p. 14/157

Documentacin sobre R (IV) Obteniendo ayuda sobre R

Mixed-effects models in S and S-PLUS, de J. Pinheiro y Ayuda incluida con el programa (veremos ms adelante).
D. Bates. FAQ.
Regression modelling strategies, de F. Harrell. Site de Paul Johnson
Site con documentacin sobre anlisis para datos categricos http://lark.cc.ukans.edu/~pauljohn/R/statsRus.html .
(site para libro de A. Agresti Categorical data analysis.). R-help. Peeero:
http://www.stat.ufl.edu/~aa/cda/cda.html .
Las email lists son "searchable". Ver
Modeling survival data: extending the Cox model, de http://cran.r-project.org/search.html ; y
T. M. Therenau y P. M. Grambsch. http://finzi.psych.upenn.edu/search.html permite
Documentos miscelneos en pgina de J. Fox. hacer las bsquedas no slo sobre las listas de email sino
(http://cran.r-project.org/doc/contrib/Fox-Companion/appendix.html .) tambin sobre la documentacin (incluyendo paquetes).

Uso y programacion de R p. 15/157 Uso y programacion de R p. 16/157


Instalacin de paquetes adicionales

Antes de hacer preguntas comprobar si ya han sido Depende del sistema operativo
contestadas. Windows:
Las listas de ayuda son voluntarias: nadie puede exigir Desde la "GUI" o desde la interfaz de XEmacs.
soluciones. (Cunto habeis pagado por R?) Desde R, con "install.packages()", como en GNU/Linux (ver
Pausarse antes de gritar "bug": vase FAQ, seccin 9. Pero si siguiente).
hay un bug, por favor reportese. GNU/Linux:
"R CMD INSTALL paquete-x.y.z.tar.gz". Permite instalar
aunque uno no sea root (especificando el directorio).
Ms cmodo, desde R, "install.packages()",
"update.packages()", etc. Tambin permiten instalar no
siendo root (especificar lib.loc).

Uso y programacion de R p. 17/157 Uso y programacion de R p. 18/157

Inicio de una sesin de R Una primera sesin

GNU/Linux: > rnorm(5) # 5 numeros aleatorios de una distribucion normal (mean= 0, sd = 1)


> ## Hemos dicho que "#" indica el comienzo de un comentario?
Teclear "R" en una shell. >
Iniciar R desde (X)Emacs (M-X R). > ## Los numeros se producen, y se muestran (print).
>
Windows: > x <- rnorm(5) # asignamos esos numeros a un objeto (un vector) llamado x.
Hacer click dos veces en el icono. Se abrir "Rgui". > summary(x) ## mostrar un "summary" de x (un summary "inteligente").
>
Desde una "ventana del sistema" ejecutar "Rterm"; > ## o tambien:
parecido a "R" en Unix o Linux. > w <- summary(x)
Iniciar R desde de XEmacs. > w
> print(w) # teclear w y print(y) producen el mismo resultado.
Se puede "customizar" como se inicia una sesin de R (ej., >
que paquetes se cargan, mensajes, etc). Ver seccin 10.8 en > ## summary(x) TAMBIEN es un objeto. (virtually) "everything is an object".
An introduction to R.

Uso y programacion de R p. 19/157 Uso y programacion de R p. 20/157


Ayuda incluida con el programa Usando R con (X)Emacs

?rnorm Por qu usar R con XEmacs?


help.start() Uso de scripts, mantenimiento de cdigo ordenado y
?help.search comentado. "Buena prctica estadstica". (ver tambin
loadhistory, savehistory).
help.search("normal")
Colorea sintaxis, completa parntesis, etc.
?apropos
apropos("normal")
Una interfaz comn para R en distintos sistemas operativos.
?demo Una interfaz comn para otros paquetes estadsticos (ej., SAS,
XLispStat, Arc, etc) y numricos (ej., Octave).
demo(graphics); demo(persp); demo(lm.glm)
Pero aunque (X)Emacs es MUCHO ms que un editor...
(X)Emacs con ESS no es "familiar" para los usuarios de
Windows (pero no tanto con las modificaciones de J. Fox).
Problemas no resueltos en interaccin R, XEmacs,
Windows.
Uso y programacion de R p. 21/157 Uso y programacion de R p. 22/157

R, ESS + XEmacs, (a la J. Fox)

Alternativa principal en Windows es WinEdt Toda la informacin est en


(http://www.winedt.com y http://www.socsi.mcmaster.ca/jfox/Books/Companion/ESS/ .
http://cran.r-project.org/contrib/extra/winedt ). Las ltimas pginas de An Introduction to ESS + XEmacs for
Pero: Windows Users of R tiene una clarsima y detallada
WinEdt no es GPL ni gratuito (es shareware). Problemas de informacin de como instalar y configurar ESS y XEmacs con
licencia (por ej., para nosotros aqu). las modificaciones de J. Fox. En resumen:
WinEdt no est disponible para otros sistemas operativos. Descargar XEmacs para Windows (la versin binaria para
Windows, no para Cygwin) de
En GNU/Linux, hay coloreado de sintaxis (y completado de http://www.xemacs.org/Download/win32 . Si es posible,
parntesis?) para Vim y Nedit, pero nada similar a la instalar todos los paquetes seleccionados por defecto (si no,
interaccin con un buffer con R. ver documento J. Fox "An introduction to ESS (...)" para
paquetes requeridos.)
Instalar R (si no est ya instalado).

Uso y programacion de R p. 23/157 Uso y programacion de R p. 24/157


Modificaciones (XEmacs + ESS) (I)

Aadir c:/Archivos de Programa/R/rwxxxx/bin al Muy conveniente mantener cada proyecto separado.


search path the windows (o modificar init.el para que XEmacs Separamos cdigo, datos, etc. Para eso:
sepa donde encontrar rterm.exe). Abrir en el Explorador de Windows el/los directorios donde
Descargar el fichero "fox-ess-config.zip" de queremos trabajar.
http://www.socsi.mcmaster.ca/jfox/Books/Companion/ESS/ . Right-click en el icono de XEmacs, y arrastrar hasta el
Descomprimir. directorio.
Crear un directorio .xemacs en el "home directory". Seleccionar "crear iconos de acceso directo aqu".
Copiar "init.el" a "/.xemacs". El icono de cada directorio inicia R en ese directorio.
Copiar los dems ficheros de "fox-ess-.." a c:/Archivos de (Si nos olvidamos, siempre podemos cambiar directorios con
Programa/XEmacs/XEmacs-x.y.z/etc/toolbar. "getwd").
Listo. Ya se puede ejecutar XEmacs + ESS + R. Tambin podemos editar init.el y donde pone (setq
ess-ask-for-ess-directory nil) poner (setq
ess-ask-for-ess-directory t).

Uso y programacion de R p. 25/157 Uso y programacion de R p. 26/157

Modificaciones (XEmacs + ESS) (II) Modificaciones (XEmacs + ESS) (III)

Si preferimos los keybindings de XEmacs: cambiar la linea Podramos querer usar XEmacs y ESS de la forma
"(defconst pc-behaviour-level 2)" a "(defconst "tradicional", con el estilo genuino de XEmacs.
pc-behaviour-level 0)" (Y algn otro cambio menor). Toda la funcionalidad de XEmacs (que se ve disminuida un
Para que indique en que fila y columna nos encontramos usar poco por los keybindings tipo Windows al no permitir "C-x"
el "custom.el" provisto. como inicio de secuencia de teclas).
Para lo primero, copiar ramon.init.el o fox.init.el como init.el. Funciona si nos movemos a otro sistema operativo/otra
Para lo segundo: ya instalado por defecto en vuestras mquina.
mquinas.
Mis modificaciones estn en mi pgina web
(http://bioinfo.cnio.es/~rdiaz/#cursosR .).

Uso y programacion de R p. 27/157 Uso y programacion de R p. 28/157


Algunas limitaciones usando "modo windows": Si preferimos los keybindings de XEmacs: cambiar la linea
No podemos usar shortcuts para evaluar lnea, regin o "(defconst pc-behaviour-level 2)" a "(defconst pc-behaviour-level 0)
buffer (C-c C-j, C-c C-r, C-c C-b). (Y algn otro cambio menor).
No podemos usar shortcuts para abrir ficheros (C-x C-f), Para que indique en que fila y columna nos encontramos usar
para guardarlos (C-x C-s), para dividir la pantalla en 2 (C-x el "custom.el" provisto.
2, C-x 3), para seleccionar el buffer que estamos editando Para lo primero, copiar ramon.init.el o fox.init.el como init.el.
(C-x b), o para cambiar de ventana (C-x o).
Para lo segundo: ya instalado por defecto en vuestras
Limita un uso completo y sofisticado, tanto de ESS como de
mquinas.
(X)Emacs.
ESS es un sistema grande y complejo con muchas Mis modificaciones estn en mi pgina web
opciones. No se aprende en 2 das. ((X)Emacs mucho (http://bioinfo.cnio.es/~rdiaz/#cursosR .).
menos!).

Uso y programacion de R p. 29/157 Uso y programacion de R p. 30/157

R, ESS + XEmacs bajo GNU/Linux R, ESS + XEmacs bajo GNU/Linux (II)

Obtener XEmacs y ESS.


Si usamos el mtodo "como en Windows", para mantener los
En algunas distribuciones, ESS precompilado (ej. Debian). En proyectos diferenciados necesitaremos iniciar xemacs desde
otras hay que instalar desde fichero tar.gz directorios distintos.
(http://software.biostat.washington.edu/statsoft/ess/). O editar el fichero init.el, y donde pone (setq
Si se quiere replicar comportamiento bajo windows: ess-ask-for-ess-directory nil) poner (setq
ess-ask-for-ess-directory t).
Crear .xemacs en home.
Obtener xemacs-files.tar.gz de mi pgina y descomprimir.
Copiar RDU.Linux.like.Windows.init.el a Esto difiere del comportamiento habitual si no usamos el
/.xemacs/init.el. Linux.like.Windows.
Copiar tambin custom.el.
Poner iconos (xpm) en su sitio (ej.,
/usr/lib/xemacs-x.y.z/etc/toolbar.)

Uso y programacion de R p. 31/157 Uso y programacion de R p. 32/157


Uso bsico de ESS + XEmacs (I) Uso bsico de ESS + XEmacs (II)
Tomado de An introduction to ESS + XEmacs for Windows users of R de J. Fox. Mode line: informacin sobre el buffer que est justo encima.
Frame: la ventana de Xemacs. Informacin sobre buffer name, major mode, font, column
and row. (Ojo: la numeracin de la columna empieza por 0
Menu bar, toolbar: pues eso.
por defecto).
Window: cada una de las ventanas.
El buffer que estamos editando es lo que est en memoria, no
Minibuffer: muestra mensajes, se introducen comandos (ej., es el fichero mismo. Los cambios slo se guardan si salvamos
"C-s", o seleccionar "Edit/FInd" en Menubar). el buffer.
Buffer: lo que Xemacs est editando. Dos importantes: Se crean ficheros "nombre " que son copias del anterior
Inferior R process: el buffer cuyo buffer name es "*R*". estado del buffer. Tambin se puede seleccionar para que
"*scratch buffer*": donde introduciremos comandos y Xemacs haga copias peridicas (til en caso de crash.)
cdigo para R. Lo renombraremos lo-que-sea.R. La extensin de un fichero ayuda a (X)Emacs a elegir el modo
Podemos tener muchos otros buffers (ej., podemos editar de edicin apropiado. Para nuestros ficheros con cdigo en R
cdigo HTML, o C++, o Python, o Perl, o LATEX). usaremos ".R" (o ".r" o ".s" o ".S"). Pero, qu pasa si abrimos
(o creamos) un fichero con extensin Py, cpp, tex, html?
Uso y programacion de R p. 33/157 Uso y programacion de R p. 34/157

Uso bsico de ESS + XEmacs (III) (Cosas a probar)

Iniciamos XEmacs en el directorio de nuestro inters. Edicin de cdigo.


Abrimos o creamos un fichero con cdigo en R. Envo de una lnea.
El fichero de configuracin de J. Fox reserva el buffer inferior Envo de una regin marcada.
para R, as que otros buffers slo por arriba. Envo de un buffer entero.
Escribimos algo de cdigo en R... Guardar una figura como Metafile y pegarla en Word.
Completar parntesis.
Uso de "STOP" para detener un clculo.
Trabajar directamente en *R*, editando comandos,
completando comandos, etc.
Podemos instalar paquetes desde "ESS/R" (tenemos que
estar en un buffer con cdigo R).
Salir de R. Es preferible hacer explcito la salida de R via "q()"
Uso y programacion de R p. 35/157
(en vez de usar el men de "File/ExitR"). Uso y programacion de R p. 36/157
Interludio: guardando grficas
> x1 <- rnorm(100)
Hemos guardado una figura copindola al portapapeles.
> x2 <- rnorm(100)
> plot(x1, x2) El men ofrece otras opciones... pero no funcionan bien.
> rug(x1)
> Si queremos hacer uso de estas opciones, ms sencillo
> typo.paciente <- factor(c(rep("e", 50), rep("s", 50))) arrancar Rgui, copiar el cdigo, y guardar la figura como nos
> plot(x1, x2, type = "n", xlab = "gen A", ylab = "gen B") parezca.
> points(x1, x2, col = c("red", "blue")[typo.paciente])
> Tambin podemos usar comandos como dev.copy(),
> par(mfrow = c(2,2)) dev.copy2eps(), pdf() (ver ?dev.copy).
> typo.paciente <-
+ factor(c(rep("Enfermo", 50), rep("Sano", 50)))

> plot(x1, x2, type = "n", xlab = "gen A", ylab = "gen B")
> points(x1, x2, col = c("red", "blue")[typo.paciente], pch = 19)
> boxplot(x1 typo.paciente, ylab = "Expresion normalizada",
+ xlab = "Tipo de paciente")
> hist(x1)
> hist(x2, main = "Histograma del gen B")

Uso y programacion de R p. 37/157 Uso y programacion de R p. 38/157

Shortcuts tiles en ESS y XEmacs

Guardar la figura (en formato pdf o emf o lo que sea) es ms Los siguientes funcionan tanto con como sin las
til que copiar al clipboard para: modificaciones de J. Fox.
Incluir en documentos de LATEX (en ps o pdf) y en algunos "M-x comment-region" ("M" es la "Meta key" que corresponde
casos de Word (como wmf; ej., si nos hacen usar macros a "Alt").
que piden insercin de figuras).
"C-s": incremental forward search.
Para mantener una copia de la figura en formato no
"C-r": incremental backward search.
Window-cntrico (ej., en formato pdf) que podemos mandar
por email, etc. "M-Shift-5": query replace.
Para aadir figuras en pginas Web. "M-g": Ir a linea.
Recordad que formatos como pdf, o ps son ms
"portables" que metafile!
Por defecto, yo siempre uso dev.copy2eps() y pdf().
En GNU/Linux no hay un "File/Save As" para las figuras.

Uso y programacion de R p. 39/157 Uso y programacion de R p. 40/157


Un ejemplo ms largo Segundo ejemplo

Vamos a ordenar un conjunto de datos en funcin del p-value Adems de data (ej., medidas de expresin con la tcnica A)
del estadstico de la t. (Simulamos los datos; sujetos en tenemos dataB (con la tcnica B). Queremos seleccionar
columnas, "genes" en filas.) aquellos genes con alta correlacin positiva.
> data <- matrix(rnorm(50 * 100), ncol = 50) > dataB <- matrix(rnorm(50 * 100), ncol = 50)
> clase <- factor(c(rep("sano", 20), > correlaciones <- apply(cbind(data,dataB), 1,
+ rep("enfermo", 30)))
+ function(x) cor(x[1:50], x[51:100]))
> tmp <- t.test(data[1, ] clase)
> order(correlaciones)
> tmp
> attributes(tmp) > which(correlaciones > 0.7)
> hist(correlaciones)
> tmp$p.value
> resultado <- apply(data, 1,
+ function(t.test(x clase)$p.value))
> hist(resultado); order(resultado)
> which(resultado < 0.05)

Uso y programacion de R p. 41/157 Uso y programacion de R p. 42/157

Manejo de datos en R Tipos de objetos (I)

Tipos de objetos (Casi) todo en R es un objeto.


vector Coleccin ordenada elementos del mismo tipo.
> x <- c(1, 2, 3); y <- c("a", "b", "Hola")
Operadores bsicos > z1 <- c(TRUE, TRUE, FALSE)
array Generalizacin multidimensional de vector. Elementos
Generacin de secuencias del mismo tipo.
data frame Como array, pero permiten elementos (columnas)
de distintos tipos. El objeto ms habitual para manejo de datos
Acceso a elementos procedentes de experimentos.
> my.data.frame <-
Ordenacin + data.frame(ID = c("gen0", "genB", "genZ"),
+ subj1 = c(10, 25, 33), subj2 = c(NA, 34, 15),

La familia apply +
+
oncogen = c(TRUE, TRUE, FALSE),
loc = c(1,30, 125))
Uso y programacion de R p. 43/157 Uso y programacion de R p. 44/157
Tipos de objetos (II) Atributos de los objetos

factor Un tipo de vector para datos categricos. x <- 1:15; length(x)


list Un "vector generalizado". Cada lista est formada por y <- matrix(5, nrow = 3, ncol = 4); dim(y)
componentes (que pueden ser otras listas), y cada is.vector(x); is.vector(y); is.array(x)
componente puede ser de un tipo distinto. Son unos
mode(x); mode(y); z <- c(TRUE, FALSE); mode(z)
"contenedores generales".
> una.lista <- c(un.vector = 1:10, attributes(y); w <- list(a = 1:3, b = 5);
attributes(w)
+ una.palabra = "Hola",
y <- as.data.frame(y); attributes(y)
+ una.matriz = matrix(rnorm(20), ncol = 5),
+ otra.lista = c(a = 5, f1 <- function(x) {return(2 * x)}; attributes(f1);
+ b = factor(c("a", "b")))) is.function(f1)

funciones Cdigo. x1 <- 1:5; x2 <- c(1, 2, 3, 4, 5); tyepof(x2);


typeof(x3)
Los atributos podemos verlos, pero tambin podemos
cambiarlos.
Uso y programacion de R p. 45/157 Uso y programacion de R p. 46/157

Nombres de objetos

Los nombres vlidos para un objeto son combinaciones de Las "reglas" habituales de nombrar objetos en programacin
letras, nmeros, y el punto ("."). (usar estilo consistente, uso razonable del ".", nombres que
Los nombres no pueden empezar con un nmero. tengan sentido equilibrio entre longitud y frecuencia de uso,
etc). Por ej., suelo nombrar data frames con la inicial en
R es "case-sensitive". x != X. mayscula, pero las variables siempre en minscula. Si varias
Hay nombres reservados ("function", "if", etc). funciones hacen cosas parecidos a objetos distinto, separo
Otras consideraciones: con "." (ms fcil luego usar clases).
El uso del "." es diferente al de C++. Sobre el uso de ";". No es bueno abusar, porque hace el
Mejor evitar nombres que R usa (ej., "c") (pero no es cdigo muy difcil de leer. (Pero en estas transparencias, si no
dramtico si nos confundimos: podemos arreglarlo). lo usara ocuparamos muchsimo espacio).
c <- 4; x <- c(3, 8); x; rm(c); c(7, 9)
Las asignaciones se hacen con "<-", y es buen estilo el
rodear "<-" por un espacio a cada lado.
x<-1:5 # Mal estilo
x <- 1:5 # Mucho mejor.
Uso y programacion de R p. 47/157 Uso y programacion de R p. 48/157
Operaciones aritmticas con vectores (I) Operaciones aritmticas con vectores (II)

FUNDAMENTAL: R puede operar sobre vectores enteros de Operar sobre vectores enteros es MUCHO MEJOR que usar
un golpe. loops:
> x <- 1:10 Mucho ms claro:
> y <- x/2; z <- x 2; w <- y + z Es la forma natural de operar sobre objetos enteros.
Si un elemento es ms corto, se "recicla". Es "intuitivo" si la Cdigo ms fcil de entender.
operacin es escalar con vector. Pero tambin ocurre en Ms sencillo de modificar y mantener.
operaciones entre vectores. Ms fcil hacer debugging.
> x + 15 Ms rpido de escribir (y no slo porque muchas menos
lneas!).
> x2 <- 1:5
> x + x2 Ms eficiente (en tiempo y memoria).
El reciclado cuando (vector, escalar) suele ser lo que
queremos. Entre vectores no siempre: cuidado. (R da un
warning, de momento S4 classes dan un error).

Uso y programacion de R p. 49/157 Uso y programacion de R p. 50/157

Operaciones aritmticas con vectores (III) Operadores comparativos y lgicos

+, -, *, /, , %%, %/%. <, >, <=, >=, ==, !=


log, log10, log2, log(x, base), exp, sin, cos, !, &, |, xor() y los parecidos &&, ||
tan, sqrt
x <- 5; x < 5; x >= 5; x == 6; x != 5
Otras:
y <- c(TRUE, FALSE); !y; z <- c(TRUE, TRUE)
max, min, range, mean, var, sd, sum, prod
xor(y, z)
which.max, which.min.
y & z; y | z
pmax, pmin. max and min devuelven el mximo y el
mnimo de un conjunto de nmeros; devuelven un solo Las formas &&, || son "short-circuit operators" que se suelen
nmero aunque les pasemos varios vectores. pmax, pmin usar dentro de if statements. Se aplican a vectores de
devuelven un vector que contiene el elemento max, min longitud uno y slo evaluan el segundo argumento si es
en esa posicin. preciso.
cumsum, cumprod, diff. if (is.numeric(x) && min(x) > 0) {lo que sea....
min(x) no tiene sentido si x no es numrico.
0 + y; as.numeric(y); mode(y) <- "numeric"

Uso y programacion de R p. 51/157 Uso y programacion de R p. 52/157


Operaciones de conjuntos Generacin de secuencias aleatorias
x <- 1:5; y <- c(1, 3, 7:10) Muestrear un vector (imprescindible en bootstrapping y
union(x, y) cross-validation):
> sample(5)
intersect(x, y)
> sample(5, 3)
setdiff(y, x)
> x <- 1:10
v <- c("bcA1", "bcA2", "blX1") > sample(x)
w <- c("bcA2", "xA3")
> sample(x, replace = TRUE)
union(v, w) > sample(x, length = 2* length(x), replace = TRUE)
intersect(v, w) > probs <- x/sum(x)
setdiff(w, v) > sample(x, prob = probs)
setdiff(v, w)

Uso y programacion de R p. 53/157 Uso y programacion de R p. 54/157

Generacin de secuencias: seq

Nmeros aleatorios: usar rFuncionDistribucion (con sus x <- c(1, 2, 3, 4, 5)


parmetros). x <- 1:10; y <- -5:3
> rnorm(10)
x <- seq(from = 2, to = 18, by = 2)
> rnorm(10, mean = 13, sd = 18)
x <- seq(from = 2, to = 18, length = 30)
> runif(15)
x <- 1:10; y <- seq(along(x))
> runif(8, min = 3, max = 59)
z2 <- c(1:5, 7:10, seq(from = -7, to = 5, by = 2))
Muchas funciones de distribucin: lognormal, t, F, 2 ,
exponential, gamma, beta, poisson, binomial, etc. Ver, por
ejemplo, seccin 8.1 (p. 34) de An introduction to R y p. 16 de
R para principiantes, de E. Paradis. (Con esas funciones
podemos tambin obtener la densidad, quantiles y funcin
cumulativa de todas estas distribuciones).

Uso y programacion de R p. 55/157 Uso y programacion de R p. 56/157


Generacin de secuencias: rep Indexacin de vectores
rep(1, 5) Una de las gran virtudes de R es la flexibilidad en el acceso a
x <- 1:3; rep(x, 2) los elementos (de vectores, arrays, data frames, etc).
y <- rep(5, 3); rep(x, y) x <- 1:5; x[1]; x[3]
rep(1:3, rep(5, 3)) x[x > 3]
rep(x, x) x > 3
rep(x, length = 8) y <- x > 3
x[y]
gl(3, 5) # como rep(1:3, rep(5, 3))
x[-c(1, 4)]; y <- c(1, 2, 5); x[y]
gl(4, 1, length = 20) #Ojo: gl genera factores
names(x) <- c("a", "b", "c", "d", "patata")
gl(3, 4, label = c("Sano", "Enfermo", "Muerto"))
x[c("b", "patata")]
expand.grid(edad = c(10, 18, 25),
sexo = c("Macho", "Hembra"), loc = 1:3)
Podemos combinar: z5 <- c(1:5, rep(8, 3))
Uso y programacion de R p. 57/157 Uso y programacion de R p. 58/157

Interludio: NA, NaN, Inf

Podemos indexar un vector de cuatro formas: "NA" es el cdigo de "Not available".


Un vector lgico. v <- c(1:3, NA)
Un vector de enteros (integers) positivos. is.na(v); which(is.na(v))
Un vector de enteros negativos.
v == NA # No funciona! Por qu?
Un vector de cadenas de caracteres (character strings).
Sustituir NA por, p.ej., 0: v[is.na(v)] <- 0.
Tambin, por supuesto, podemos indexar un vector usando
cualquier expresin o funcin que resulte un una de las cuatro Infinito y NaN (not a number). Son distintos de NA.
anteriores. 5/0; -5/0; 0/0
No solo podemos acceder (devolver) el/los valores, sino is.infinite(-5/0); is.nan(0/0); is.na(5/0)
tambin asignarlos:
x[c(1, 3)] <- c(25, 79); x[x > 3] <- 97

Uso y programacion de R p. 59/157 Uso y programacion de R p. 60/157


Ordenando vectores
xna <- c(1, 2, 3, NA, 4); mean(xna) x <- c(5, 1, 8, 3)
mean(xna, na.rm = TRUE) order(x1)
Lo mismo con otras funciones. sort(x1)
Para "modelling functions" (ej., lm) lo mejor es usar "na.omit" o rank(x1)
"na.exclude" ("na.exclude" ms conveniente para generar
predicciones, residuos, etc). x1[order(x1)]

Eliminar todos los NA: x2 <- c(1, 2, 2, 3, 3, 4); rank(x2)


> XNA <- matrix(c(1, 2, NA, 3, NA, 4), nrow = 3) min(x1); which.min(x1); which(x1 == min(x1))
> XNA y <- c(1, 1, 2, 2); order(y, x)
> X.no.na <- na.omit(XNA) order y sort admiten "decreasing = TRUE".

Uso y programacion de R p. 61/157 Uso y programacion de R p. 62/157

Vectores de caracteres Factores


codigos <- paste(c("A", "B"), 2:3, sep = "") codigo.postal <- c(28430, 28016, 28034);
codigos <- paste(c("A", "B"), 2:3, sep = ".") mode(codigo.postal)
Pero no deberamos usar el cdigo postal en, por ej., un
juntar <-
ANOVA, como si fuera un vector numrico. El usar cdigos
paste(c("una", "frase", "tonta", collapse ="")
(aparentemente) numricos en anlisis estadsticos es una
columna.a <- LETTERS[1:5]; columna.b <- 10:15; frecuente fuente de errores.
juntar <- paste(columna.a, columna.b, sep ="") codigo.postal <- factor(codigo.postal) # mejor.
substr("abcdef",2,4) Si tenemos un vector con caracteres, y lo queremos usar para
x <- paste(LETTERS[1:5], collapse="") un anlisis, necesitamos convertirlo en un factor. Si no, R,
substr(x, 3, 5) <- c("uv") sabiamente, no se deja.
Otras muchas funciones de manipulacin de caracteres, que y <- rnorm(10); x <- rep(letters[1:5], 2);
pueden hacer poco necesario recurrir a Awk, Python, o Perl. aov(y x) # error!
Ver grep, pmatch, match, tolower, toupper, sub, aov(y factor(x)) # funciona.
gsub, regexpr.
Uso y programacion de R p. 63/157 Uso y programacion de R p. 64/157
A veces, al leer datos, un vector de nmeros se convierte en R tambin cuenta con "ordered factors". Slo difieren de los
factor. O queremos convertir un vector factor en numrico. factors "normales" en algunos anlisis (tipo de contrastes
x <- c(34, 89, 1000); y <- factor(x); y usados con modelos lineales treatment vs. polinomial). No
as.numeric(y) # Mal: lo veremos.
# los valores han sido recodificados. Como medida de "higiene mental y analtica" convirtamos en
as.numeric(as.character(y)) # Bien factores lo que debe serlo. Eliminar muchos errores y es
"buena prctica estadstica".
Podemos fijar el orden de las etiquetas.
ftr1 <- factor(c("alto", "bajo", "medio"))
ftr1
ftr1 <- factor(c("alto", "bajo", "medio"),
+ levels = c("bajo", "medio", "alto"))

Uso y programacion de R p. 65/157 Uso y programacion de R p. 66/157

Matrices y arrays (I)

Para discretizar datos: usar cut: Generalizaciones de vectores. Nos centraremos en arrays de
vv <- c(1, 2, 3, 7, 8, 9) 2 dimensiones, pero podemos usar un nmero arbitrario. Con
cut1 <- cut(vv, 3); summary(cut1) dos dimensiones, array y matrix proveen similar
funcionalidad, pero matrix es ms cmoda.
cut2 <- cut(vv, quantile(vv, c(0, 1/3, 2/3, 1)),
+ include.lowest = TRUE) a1 <- array(9, dim = c(5,4))
summary(cut2) a2 <- matrix(1:20, nrow = 5) # column-major-order,
Ver tambin split(x, f): divide datos del vector x usando # como en F O R T R A N .
los grupos definidos en f. a3 <- matrix(1:20, nrow = 5, byrow = TRUE)
a4 <- 1:20; dim(a4) <- c(5, 4)

Uso y programacion de R p. 67/157 Uso y programacion de R p. 68/157


Matrices y arrays (II)

Indexado de arrays es similar a vectores. Ordenar un array usando una de las columnas:
a4[1, 4]; a4[1, ]; a4[, 2]; a4[c(1, 3), c(2, 4)] o.array <- matrix(rnorm(20), ncol = 4)
Podemos usar los cuatro mtodos para vectores y tambin o.array <- o.array[order(o.array[, 1]), ]
indexar con una matriz. En la matriz con los ndices cada fila Seleccin aleatoria de filas:
extrae un elemento; su fila (primera dimensin) se especifica sample.of.rows <-
por el elemento en la primera columna, y su columna por el + o.array[sample(1:dim(o.array)[1],
elemento en la segunda columna. + replace = TRUE), ]
> im <- matrix(c(1, 3, 2, 4), nrow = 2)
> im
> a4[im]
> # Por qu difiere de a4[c(1, 3), c(2, 4)]?
El indexado con matrices se extiende tambin a arrays de ms
dos dimensiones.

Uso y programacion de R p. 69/157 Uso y programacion de R p. 70/157

Matrices y arrays (III) Matrices rbind, cbind y otros

a4[1, ] #es un vector! Para combinar vectores o arrays para obtener arrays, usamos
Para evitar "dropping indices" usar rbind, cbind.
a4[1, , drop = FALSE] x1 <- 1:10; x2 <- 10:20
a4[, 3, drop = FALSE]. a7 <- cbind(x1, x2); a8 <- cbind(x1, x2)
Esto mismo se aplica a arrays de ms de dos dimensiones. a12 <- cbind(a2, a4)
"drop = FALSE" generalmente debe usarse, de forma a9 <- matrix(rnorm(30), nrow = 5)
defensiva, cuando escribamos funciones (si no, nos cbind(a4, a6) # no funciona
encontraremos con errores como "Error in apply(a6, 2, rbind(a4, a6)
mean) : dim(X) must have a positive length".)
Las matrices tiene atributos. En particular:
Operaciones matriciales: muchas disponibles incluyedo attributes(a4)
factorizaciones como svd y qr, determinantes, rango, solucin colnames(a4) <- paste("v", 1:4, sep = "")
de sistemas, etc. Slo mencionamos diag, producto de
rownames(a4) <- paste("id", 1:5, sep = ".")
matrices (%*%) y traspuesto (t):
a4[, c("v1", "v3")]
a6 <- diag(6); diag(a4) <- -17
attributes(a4)
a4 %*% a2; a2 %*% t(a2) Uso y programacion de R p. 71/157 Uso y programacion de R p. 72/157
data.frames
Y si son de distinto tipo? Podemos convertir matrices a data frames con
x3 <- letters[1:10] as.data.frame().
a9 <- cbind(x1, x2, x3) Por estas razones, las data frames suelen ser objetos ms
Pero yo no quera eso!!!. Quizs quera un data.frame tiles que las arrays. Permiten lo mismo que las arrays, pero
a10 <- data.frame(x1, x2, x3) se puede guardar/acceder a otra informacin.
El indexado y subsetting de data frames como el de arrays y Las data.frames tambin tienen rownames, colnames.
matrices. (Por supuesto, no hallaremos el determinante de un attributes(a10) # pero nosotros no habamos
data frame que tenga factores) Pero si podemos hacer: # fijado los row.names
library(mva) #aqu estn func. estad. multiv. Tambin dimnames(a10).
prcomp(a10[, c(1,2)])
prcomp(a10[, c("x1", "x2")])
prcomp(a10[, -3])
Adems, al hacer data.frame, los "character vectors" son
convertidos a factors (lo que es una ventaja).
Uso y programacion de R p. 73/157 Uso y programacion de R p. 74/157

data.frames: $ y attach

La estructura de las data.frames es sujetos (casos) en f ila, Usar $ facilita el acceso y creacin de nuevas columnas.
variables en columna. Esta es (por buenas razones) la > set.seed(1) # fijar la semilla
organizacin de los datos usada en estadstica. Pero esta > ## del random number generator
tructura es la traspuesta de la organizacin habitual de los
> d1 <- data.frame(g1 = runif(10), g2 = rnorm(10))
datos de microarrays: los datos de microarrays generalmente
tiene los sujetos (o casos o tumores) en columnas y las > d1$edad <- c(rep(20, 5), rep(40, 5))
variables (genes) en filas. >
Esto no representa un problema. Podemos trasponer los > set.seed(1)
datos, o guardar otros datos fenotpicos en otras data.frames. > d2 <- cbind(g1 = runif(10), g2 = rnorm(10))
Veremos ejemplos. > d2[, 3] <- c(rep(20, 5), rep(40, 5)) # error
> d2 <- cbind(d2, edad = c(rep(20, 5), rep(40, 5)))
> #OK

Uso y programacion de R p. 75/157 Uso y programacion de R p. 76/157


Precauciones con attach()
Si usamos mucho los datos de un data.frame, podemos Con attach() ponemos el data frame nombrado en el
acceder a ellos directamente: search path (en la posicin 2).
> attach(d1) Cierto cuidado, por masking.
> g1 > edad <- 25
> edad > edad # usando la que est antes
> plot(g1, g2) # en vez de plot(d1$g1, d1$g2) search() #el search path
Adems, la actualizacin no es dinmica:
> d1$g3 <- "nueva columna"
> d1 # aqu est
> g3 # pero aqu no
> detach() # detach(d1) aqu es equivalente
> attach(d1)
> g3
Uso y programacion de R p. 77/157
> edad # y esto qu? Uso y programacion de R p. 78/157

subset
En "entornos confusos" (ej., un anlisis que se prolonga 2 d3 <- data.frame(g1 = runif(10), g2 = rnorm(10),
semanas) mejor evitar attach() y acceder siempre a las id1 = c(rep("a", 3), rep("b", 2), rep("c", 2),
variables usando su localizacin explcita y completa. rep("d", 3))))
Los que no son "a" ni "b"
d3[!(d3$id1 %in% c("a", "b")), ]
O usar subset
subset(d3, !(id1 %in% c("a", "b")))
Por supuesto, podemos usar reglas ms complejas (ej., que
sea igual a una variable, distinto en otra, y no missing en una
tercera).
subset tambin permite la seleccin de variables (columnas);
el argumento "select".

Uso y programacion de R p. 79/157 Uso y programacion de R p. 80/157


aggregate, etc

Escenario: un data frame (datos); varias rplicas del mismo d.collapse.by.cnioid <- aggregate(datos,
clon (cnioID); queremos "colapsar" por clon. Si es una variable list(id = datos[, "cnioID"]),
numrica, hallar la mediana; si categrica, slo debera haber FUN = colapsar)
un valor: devolver ese (si hay ms valores, sealarlo.)
d.collapse.by.cnioid <- d.collapse.by.cnioid[, -1]
colapsar <- function(x) {
# Asegurarse que se ha echo lo que queramos!!!
+ if(is.numeric(x))
Otras funciones para objetivos similares: ver ?reshape,
+ return(median(x, na.rm = TRUE)) ?merge
+ else {
+ tmp <- unique(x)
+ if(length(tmp) > 1) return("varios!")
+ else return(as.character(tmp[1]))
+ }
}

Uso y programacion de R p. 81/157 Uso y programacion de R p. 82/157

La familia apply
ax <- matrix(rnorm(20, ncol = 5) Operar con apply generalmente mucho ms eficiente que
medias.por.fila <- apply(ax, 1, mean) loops (adems de ms claro, ms fcil, etc, etc).
por.si.na <- apply(ax, 1, mean, na.rm = TRUE) sapply, lapply son como apply pero no hay que
mi.f1 <- function(x) { return(2*x - 25)} especificar el "margin"; sapply intenta simplificar el resultado a
mi.f1.por.fila <- apply(ax, 1, mi.f1) un vector o a una matriz (la "s" es de "simplify"), pero lapply
siempre devuelve una lista. Ambas pueden aplicarse a
mas.simple <- apply(ax, 1, function(x)
vectores, listas, arrays.
+ {return(2*x -25)})
media.por.columna <- apply(ax, 2, mean)
sample.rows <- apply(ax, 1, sample)
dos.cosas <- function(y)
+ {return(c(mean(y), var(y)))}
apply(ax, 1, dos.cosas)
t(apply(ax, 1, dos.cosas))

Uso y programacion de R p. 83/157 Uso y programacion de R p. 84/157


Un ejemplo intil de apply tapply, table

Una forma tonta de generar datos de distribuciones normales > # see MASS, p. 38
con una media y desviacin tpicas dadas: > library(MASS)
> parameters <- cbind(mean = -5:5, sd = 2:12) > data(quine) # absentismo escolar
> data <- t(apply(parameters, 1, function(x) > attach(quine)
+ rnorm(10000, x[1], x[2]))) > tapply(Days, Age, mean)
> apply(data, 1, mean); apply(data, 1, sd) > tapply(Days, list(Sex, Age), mean)
Este es un ejemplo tonto, por supuesto. Es ms sencillo (y > tapply(Days, list(Sex, Age),
matemticamente equivalente) hacer: + function(y) sqrt( (var(y)/length(y))))
> z.data <- matrix(rnorm(10000 * 11), nrow = 11)
Una tabla
> data2 <- (z.data * parameters[, 2]) + > table(Sex, Age)
+ parameters[, 1]
>
> apply(data2, 1, mean); apply(data2, 1, sd)

Uso y programacion de R p. 85/157 Uso y programacion de R p. 86/157

Miscel. (cov, cor, outer)

Algunas funciones directamente hacen un "apply". Dos funciones que se aplican directamente sobre matrices:
> m1 <- matrix(1:20, ncol = 5) > cov(m1)
> d1 <- as.data.frame(m1) > cor(m1) #demasiados dgitos ...
> mean(x1); mean(d1); sd(x1); sd(d1); median(m1); > round(cor(m1), 3)
median(d1)
> # cor.test hace otra cosa
apply, sapply, lapply y tapply son funciones muy > cor.test(m1[, 1], m1[, 2])
tiles que contribuyen a hacer el cdigo ms legible, fcil de > cor(apply(m1, 2, rank)) # corr. rangos (Spearman)
entender, y facilitan posteriores modificaciones y aplicaciones.
Cada vez que vayamos a usar un "loop" explcito, intentemos tabla.multiplicacin <- outer(11:15, 11:20, "*")
substituirlo por algn miembro de la ilustre familia apply. A outer se pueden pasar funciones mucho ms complejas; por
ej., outer se usa en el ejemplo de persp.
?persp # y ejecutemos el primero ejemplo
par(mfrow(1,2)); ?image # y otro ejemplo
outer requiere funciones vectorizadas (apply no). Ver FAQ,
Uso y programacion de R p. 87/157 7.19 para ms detalles. Uso y programacion de R p. 88/157
Interludio: listas
Las data.frames son, en realidad, tipos especiales de listas. > d3 <- data.frame(g1 = runif(10), g2 = rnorm(10),
Las listas son contenedores sin estructura determinada. + id1 = c(rep("a", 3), rep("b", 2),
Por tanto muy flexibles, pero sin estructura. + rep("c", 2), rep("d", 3))))
> my.fun <- function(x) {
Muchas funciones devuelven listas: devuelven un conjunto de
resultados de distinta longitud y distinto tipo. + las.medias <- mean(x[, -3])
+ las.vars <- var(x[, -3])
+ max.total <- max(x[, -3])
+ tabla.clases <- table(x[, 3])
+ return(list(row.means = las.medias,
+ row.vars = las.vars, maximum = max.total,
+ factor.classes = tabla.clases))
}
> my.fun(d3)

Uso y programacion de R p. 89/157 Uso y programacion de R p. 90/157

Resumen (y apologa de R)

> una.lista <- my.fun(d3); una.lista Una vez que los datos estn en R, su manipulacin es muy
> attributes(una.lista); names(una.lista) flexible.
> length(una.lista) Podemos seleccionar variables, casos, subsecciones de datos,
> una.lista[[4]] etc, de acuerdo con criterios arbitrarios (que usan, adems,
> una.lista[4] # por qu sale el nombre? condiciones que pueden implicar a un nmero arbitrario de
variables y casos).
> una.lista$factor.classes
> una.lista[[3]] <- list(NULL); una.lista Los data frames y las matrices pueden separarse, juntarse,
cambiarse de forma (reshape), etc.
> una.lista[[3]] <- NULL
> una.lista # hemos eliminado el "slot" maximum El indexado y seleccin de casos pueden usar nmeros,
factores, cadenas de caracteres, etc.
> unlist(una.lista)
> otra.lista <- list(cucu = 25, una.lista) Podemos preparar cdigo que repita las mismas operaciones
con datos semejantes (i.e., podemos automatizar el proceso
> unlist(otra.lista)
con sencillez).
> unlist(otra.lista, drop = FALSE)
> una.lista <- c(una.lista, otro.elemento = "una
frase") Uso y programacion de R p. 91/157 Uso y programacion de R p. 92/157
Importando y exportando datos

Podemos verificar "on-the-fly" que estas transformaciones


hacen lo que queremos que hagan (mirando selectivamente
read.table
los resultados, o "emulando" el proceso en unos datos
artificiales ms pequeos). write.table
Por tanto, una vez que los datos estn en R, no hay muchas
razones para exportarlos y hacer la seleccin y manipulacin
con otros lenguajes (ej., Python, Perl) para luego volver a save.image
leerlos en R.
data

Uso y programacion de R p. 93/157 Uso y programacion de R p. 94/157

Importando datos Importando datos: read.table

R es un tanto inflexible en la importacin de datos. En Queremos leer un fichero simple, separado por tabuladores.
ocasiones, puede ser necesario un preprocesado de los datos
my.data.frame <- read.table("mi.fichero",
con otro programa (Python, Perl).
+ ,
header = TRUE, sep = ""
Hay funciones para importar datos en formato binario de SAS, + comment.char = "")
SPSS, Minitab, Stata, S3 (ver package foreign
(http://cran.r-project.org/src/contrib/PACKAGES.html#foreign ). Si el carcter decimal no es un punto sino, por ej., una coma,
usar: dec = ",".
Tambin de bases de datos. Ver R data import/export.
Se pueden saltar lineas (skip) o leer un nmero fijo de lneas
No hay, por el momento, formas sencillas de importar
(nrows).
directamente datos en formato binario Excel.
Otro separador habitual de columnas es sep = " ".
Por tanto, datos en Excel habrn de ser exportados o salvados
desde Excel como texto. Hay funciones especializadas para otros ficheros (ej.,
(Para usuarios de GNU/Linux: con ficheros de Excel de read.csv) pero son casos especficos de read.table.
tamao moderado, Gnumeric generalmente es ms rpido que
OpenOffice. Con ficheros muy grandes, Gnumeric parece
atragantarse.) Uso y programacion de R p. 95/157 Uso y programacion de R p. 96/157
Importando de Excel

Ojo con comment.char. El "default" es "#" lo que puede Lo mejor es exportar desde Excel como fichero de texto
causar problemas si ese carcter se usa en nombres (como en separado por tabuladores.
muchos ficheros de arrays). Ojo con las ltimas columnas y missing data (Excel elimina los
Podemos especificar el cdigo para "missing data" (por "trailing tabs"). Dos formas de minimizar problemas:
defecto usa NA y el que no haya valor columna vaca). Usar "NA" para missing.
Muchos errores de lectura relacionados con distinto nmero de Poner una ltima columna con datos arbitrarios (ej., una
columnas. Usar count.fields para examinar donde est el columna llena de 2s).
problema. Cuidado tambin con lneas extra al final del fichero.
scan es una funcin ms general, pero de uso ms Salvamos como texto (slo salvamos una de las hojas).
complicado; slo necesaria en ocasiones especiales o cuando
escasos de memoria. Importamos en R con read.table.

Uso y programacion de R p. 97/157 Uso y programacion de R p. 98/157

Exportando datos Guardando datos


Lo ms sencillo es exportar una tabla. Guardar datos, funciones, etc, para ser usados en otras
sesiones de R.
write.table(my.data.frame, file = "mi.output.txt",
+  ,row.names = FALSE,
sep = ""
Datos pueden compartirse entre sesiones de R en distintos
+ col.names = TRUE) sistemas operativos.
Queremos row.names y col.names como TRUE o como > a1 <- rnorm(10)
FALSE? > a2 <- 1:10
> a3 <- letters[10:20]
> save("unos.datos.guardados.RData", a1, a2, a3)
Los leemos con
> load("unos.datos.salvados.RData")
Podemos salvar todos los objetos con
> save.image() # salvado como ".RData"
> save.image(file = "un.nombre.RData")
El fichero ".RData" es cargado al iniciarse R.
Uso y programacion de R p. 99/157 Uso y programacion de R p. 100/157
Cargando built-in data Grf icos
R, y muchos paquetes, incorporan ficheros con datos. plot
Se cargan con load(nombre.fichero). Identificacin datos
rm(list = ls()) # borrar todo del workspace Datos multivariantes
## para ver efectos de siguientes comandos Jittering
library(multtest) Adicin rectas regresin
data(golub) Boxplots
# o data(golub, package = "multtest") si no
Otros grficos
# hemos attached la librera
Guardando grficos
search()
?golub

Uso y programacion de R p. 101/157 Uso y programacion de R p. 102/157

Introduccin a los grf icos plot()

R incluye muchas y variadas funciones para hacer grficos. plot() funcin grfica bsica.
El sistema permite desde simples plots a figuras de calidad # Modificado de "Introductory statistics with R"
para incluir en artculos y libros. x <- runif(50, 0, 4); y <- runif(50, 0, 4)
Slo examinaremos la superficie. Ms detalles en el captulo 4 plot(x, y, main = "Ttulo principal",
de Modern applied statistics with S; los captulos 3 y 7 de An R + sub = "subttulo", xlab = "x label",
and S-PLUS companion to applied regression; el captulo 4 de + ylab = "y label", xlim = c(-1, 5),
R para principiantes; el captulo 12 de An introduction to R.
+ ylim = c(1, 5))
Tambin demo(graphics). abline(h = 0, lty = 1); abline(v = 0, lty = 2)
text(1, 4, "Algo de texto")
mtext("mtext", side = 1)
mtext("mtext en side 2", side = 2, line = -3,
+ cex = 2)

Uso y programacion de R p. 103/157 Uso y programacion de R p. 104/157


Variaciones de plot plot(x) Con text podemos representar caracteres de texto
z <- cbind(x,y) directamente:
plot(z) sexo <- c(rep("v", 20), rep("m", 30))
plot(y x) plot(x, y, type = "n")
plot(log(y + 1) x) # transformacion de y text(x, y, labels = sexo)
plot(x, y, type = "p")
plot(x, y, type = "l")
plot(x, y, type = "b")
plot(c(1,5), c(1,5))
legend(1, 4, c("uno", "dos", "tres"), lty = 1:3,
+ col = c("red", "blue", "green"),
+ pch = 15:17, cex = 2)

Uso y programacion de R p. 105/157 Uso y programacion de R p. 106/157

plot: pch, col, lty

plot(x, y, type = "n") Tipos de lneas:


points(x, y, pch = 3, col = "red") plot(c(0, 10), c(0, 10), type = "n", xlab ="",
Tipos de puntos: + ylab ="")
plot(c(1, 10), c(1, 3), type = "n", axes = FALSE, for(i in 1:10)
+ xlab = "", ylab="") + abline(0, i/5, lty = i, lwd = 2)
points(1:10, rep(1, 10), pch = 1:10, cex = 2, lty permite specificaciones ms complejas (longitud de los
+ col = "blue") segmentos que son alternativamente dibujados y no
points(1:10, rep(2, 10), pch = 11:20, cex = 2, dibujados).
+ col = "red") par controla muchos parmetros grficos. Por ejemplo, cex
points(1:10, rep(3, 10), pch = 21:30, cex = 2, puede referirse a los "labels" (cex.lab), otro, cex.axis, a la
+ col = "blue", bg = "yellow")
anotacin de los ejes, etc.
Hay muchos ms colores. Ver palette, colors.

Uso y programacion de R p. 107/157 Uso y programacion de R p. 108/157


Identif icacin interactiva de datos Mltiples grficos por ventana

> x <- 1:10 Podemos mostrar muchos grficos en el mismo dispositivo


> y <- sample(1:10) grfico. La funcin ms flexible y sofisticada es
> nombres <- paste("punto", x, ".", y, sep ="") split.screen, bien explicada en R para principiantes,
secc. 4.1.2 (p. 30).
>
> plot(x, y) Mucho ms sencillo es par(mfrow=c(filas, columnas))
> identify(x, y, labels = nombres) par(mfrow = c(2, 2))
locator devuelve la posicin de los puntos. plot(rnorm(10)
> plot(x, y) plot(runif(5), rnorm(5))
> locator() plot(runif(10)
> text(locator(1), "el marcado", adj = 0) plot(rnorm(10), rnorm(10))

Uso y programacion de R p. 109/157 Uso y programacion de R p. 110/157

Datos multivariantes Boxplots

Una "pairwise scatterplot matrix": Muy tiles para ver rpidamente las caractersticas de una
> X <- matrix(rnorm(1000), ncol = 5) variable,o comparar entre variables.
> colnames(X) <- c("a", "id", "edad", "loc", attach(Y)
+ "weight") boxplot(weight)
> pairs(X) plot(sexo, weight)
"Conditioning plots" (revelan, entre otros, interacciones): detach()
> Y <- as.data.frame(X) boxplot(weight sexo, data = Y,
> Y$sexo <- as.factor(c(rep("Macho", 80), + col = c("red", "blue"))
+ rep("Hembra", 120))) boxplot tiene muchas opciones; se puede modificar el
> coplot(weight edad | sexo, data = Y) aspecto, mostrarlos horizontalmente, en una matriz de
> coplot(weight edad | loc, data = Y) boxplots, etc. Vease la ayuda (?boxplot).
> coplot(weight edad | loc + sexo, data = Y)
La librera lattice permite lo mismo, y mucho ms, que coplot.
Ver secc. 4.6 de R para principiantes. Uso y programacion de R p. 111/157 Uso y programacion de R p. 112/157
Jittering en scatterplots Adicin de rectas de regresin

Los datos cuantitativos discretos pueden ser difciles de ver Podemos aadir muchos elementos a un grfico, adems de
bien: leyendas y lneas rectas:
dc1 <- sample(1:5, 500, replace = TRUE)
> x <- rnorm(50)
dc2 <- dc1 + sample(-2:2, 500, replace = TRUE,
> y <- rnorm(50)
+ prob = c(1, 2, 3, 2, 1)/9)
> plot(x, y)
plot(dc1, dc2)
> lines(lowess(x, y), lty = 2)
plot(jitter(dc1), jitter(dc2))
> plot(x, y)
Tambin til si slo una de las variables est en pocas > abline(lm(y x), lty = 3)
categoras. Podemos aadir otros elementos con "panel functions" en
otras funciones (como pairs, lattice, etc).

Uso y programacion de R p. 113/157 Uso y programacion de R p. 114/157

Otros
Lo ms sencillo es usar panel.car y Podemos modificar mrgenes exteriores de figuras y entre
scatterplot.matrix, en el paquete "car". figuras (vease ?par y bsquense oma, omi, mar, mai;
> library(car) ejemplos en An introduction to R, secc. 12.5.3 y 12.5.4.
> coplot(a edad | loc, panel = panel.car, Tambin grficos 3D: persp, image, contour;
+ data = X) histogramas: hist; grficos de barras: barplot; grficos
> scatterplot.matrix(X, diagonal = "density") de comparacin de cuantiles, usados para comparar la
distribucin de dos variables, o la disribucin de unos datos
frente a un estndard (ej., distribucin normal): qqplot,
qqnorm y, en paquete "car", qq.plot.
Notacin matemtica (plotmath) y expresiones de texto
arbitrariamente complejas.
Grficos tridimensionales dinmicos con XGobi y GGobi. (Ver
http://cran.r-project.org/src/contrib/PACKAGES.html#xgobi,
http://www.ggobi.org,
http://www.stat.auckland.ac.nz/~kwan022/pub/gguide.pdf).
Uso y programacion de R p. 115/157 Uso y programacion de R p. 116/157
Guardando los grficos Programacin en R

En Windows, podemos usar los mens y guardar con distintos Definicin de funciones
formatos.
Tambien podemos especificar donde queremos guardar el Argumentos
grfico:
> pdf(file = "f1.pdf", width = 8, height = 10)
> plot(rnorm(10))
Control de ejecucin: condicionales, loops
> dev.off()
Cuando algo va mal: traceback, browser,
O bien, podemos copiar una figura a un fichero: >
plot(runif(50)) debug
> dev.copy2eps()
unix.time, Rprof

Uso y programacion de R p. 117/157 Uso y programacion de R p. 118/157

Definicin de funciones Argumentos

Ya hemos definido varias funciones. Aqu una ms: otra.f <- function(a, b, c = 4, d = FALSE) {
my.f2 <- function(x, y) { + x1 <- a * z ...}
+ z <- rnorm(10) Los argumentos "a" y "b" tienen que darse en el orden debido
+ y2 <- z * y o, si los nombramos, podemos darlos en cualquier orden:
+ y3 <- z * y * x otra.f(4, 5)
+ return(y3 + 25) otra.f(b = 5, a = 4)
} Pero los argumentos con nombre siempre se tienen que dar
Lo que una funcin devuelve puede ser un simple nmero o despues de los posicionales
vector, o puede producir una grfica, o devolver una lista o un otra.f(c = 25, 4, 5) # error
mensaje. Los argumentos "c" y "d" tienen "default values". Podemos
especificarlos nosotros, o no especificarlos (i.e., usar los
valores por defecto).
args(nombre.funcion) nos muestra los argumentos (de
cualquier funcin).
Uso y programacion de R p. 119/157 Uso y programacion de R p. 120/157
Control de ejecucin: if

"z" es una "free variable": cmo se especifica su valor? Condicional: if


Lexical scoping. Ver documento Frames, environments,and if (condicion.logica) instruccion donde
scope in R and S-PLUS de J. Fox (en "instruccion" es cualquier expresin vlida (incluida una entre {
http://cran.r-project.org/doc/contrib/Fox-Companion/appendix.html ) y }).
seccin 10.7 en An introduction to R. Tambin
demo(scoping). if (condicion.logica) instruccion else
instruccion.alternativa.
". . . " permite pasar argumentos a otra funcin:
> f3 <- function(x, y, label = "la x", ...) { > f4 <- function(x) {
+ plot(x, y, xlab = label, ...) + if(x > 5) print("x > 5")
} + else {
> + y <- runif(1)
> f3(1:5, 1:5) + print(paste("y is ", y))
> f3(1:5, 1:5, col = "red") + }
+ }

Uso y programacion de R p. 121/157 Uso y programacion de R p. 122/157

Control de ejecucin: while, for

ifelse es una versin vectorizada: while (condicion.logica) instruccion


> #from Thomas Unternhrer, R-help, 2003-04-17 for (variable.loop in valores) instruccion
> odd.even <- function(x) { for(i in 1:10) cat("el valor de i es", i, "\n")
+ ifelse(x %% 2 == 1, "Odd", "Even")
continue.loop <- TRUE
+ }
x <- 0
mtf <- matrix(c(TRUE, FALSE, TRUE, TRUE), while(continue.loop) {
+ nrow = 2) + x <- x + 1
ifelse(mtf, 0, 1)
+ print(x)
+ if( x > 10) continue.loop <- FALSE
}
repeat, switch tambin estn disponibles.
break, para salir de un loop.

Uso y programacion de R p. 123/157 Uso y programacion de R p. 124/157


Cuando algo va mal

Cuando se produce un error, traceback() nos informa de la my.f2 <- function(x, y) {


secuencia de llamadas antes del crash de nuestra funcin. Util + z <- rnorm(10)
cuando se produce mensajes de error incomprensibles. + y2 <- z * y
Cuando se producen errores o la funcin da resultados + y3 <- z * y * x
incorrectos o warnings indebidos podemos seguir la + return(y3 + 25)
ejecucin de la funcin. }
browser interrumpe la ejecucin a partir de ese punto y
my.f2(runif(3), 1:4)
permite seguir la ejecucin o examinar el entorno; con "n" paso
debug(my.f2)
a paso, si otra tecla sigue ejecucin normal. "Q" para salir.
my.f2(runif(3), 1:4)
debug es como poner un "broswer" al principio de la funcin, y
undebug(my.f2)
se ejecuta la funcin paso a paso. Se sale con "Q".
# insertar un browser() y correr de nuevo
> debug(my.buggy.function)
> ...
> undebug(my.buggy.function)
Uso y programacion de R p. 125/157 Uso y programacion de R p. 126/157

unix.time y Rprof source y BATCH

Nuestro objetivo aqu no es producir las funciones ms Para la ejecucin no interactiva de cdigo.
eficientes, sino funciones que hagan lo que deben. Con source abrimos una sesin de R y hacemos >
Las adminiciones habituales sobre no optimizar y jams source("mi.fichero.con.codigo.R").
optimizar antes de tiempo. Con BATCH: % R CMD BATCH mi.fichero.con.codigo.R.
Pero a veces til saber cuanto dura la ejecucin de una source es en ocasiones ms til porque informa
funcin: unix.time(my.f2(runif(10000), rnorm(1000))). inmediatamente de errores en el cdigo. BATCH no informa,
Rprof: un profiler para ver cuantas veces es llamada cada pero no requiere tener abierta una sesin (se puede correr en
funcin y cuanto tiempo se usa en esa funcin. Ver la ayuda. el background).
Garbage collection: desde R 1.2.0 hay garbage collection. Se Ver la ayuda: R CMD BATCH -help.
puede ver el status con gc(), que sirve tambin para despejar Puede que necesitemos explcitos print statements o hacer
las cosas depues de operaciones con manejo de grandes source(my.file.R, echo = TRUE).
objetos.
sink es el inverso de source (manda todo a un fichero).

Uso y programacion de R p. 127/157 Uso y programacion de R p. 128/157


Otros Ejemplos

Se pueden crear paquetes, con nuestras funciones, que se


comporten igual que los dems paquetes. Ver Writing R
t-test-then-cluster fallacy
extensions.
R puede llamar cdigo compilado en C/C++ y F ORTRAN. Ver Validacin cruzada de un predictor
.C, .Call, .Fortran.
Lexical scoping importante en programacin ms avanzada. (con y sin "selection bias")
No hemos mencionado el "computing on the language" (ej.,
do.call, eval, etc). Ejercicio: mtodo de vant Veer at al.
R es un verdadero "object-oriented language". Dos
implementaciones, las S3 classes y las S4 classes.

Uso y programacion de R p. 129/157 Uso y programacion de R p. 130/157

t-test-then-cluster fallacy clustering: algoritmo

Truismo: un algoritmo de clustering siempre nos devuelve Buscamos funciones de clustering:


clusters. > help.search("cluster")
Lo que no est claro es como de fiables son esos clusters. > help.search("hierar cluster")
Si hacemos clustering con genes seleccionados con un test de > args(hclust) # una primera idea
la t, siempre nos salen magnficos resultados an con datos > ?hclust # cmo funciona hclust?
aleatorios. Vemoslo en accin. Usaremos hclust (aunque podramos usar cualquier otra).
Objetivo: usando datos aleatorios, replicar el proceso de:
Seleccionar genes.
Hacer clustering con esos genes.
Representar el cluster
Por sencillez, suponemos que tenemos slo dos clases de
sujetos.

Uso y programacion de R p. 131/157 Uso y programacion de R p. 132/157


Seleccin de genes Seleccin de genes

(En el siguiente ejemplo veremos otra forma de hacerlo). La probamos:


Queremos seleccionar aquellos genes para los que el p-valor > grupo1 <- 10
de un test de la t sea "significativo". > grupo2 <- 10
> genes <- 5000
gene.select <-function(x, class, threshold) {
> xmat <- matrix(rnorm(genes * (grupo1 + grupo2)),
+ p.values <- apply(x, 1, function(x) {
+ nrow = genes)
+ t.test(x class)$p.value})
> labels <- c(rep(0, grupo1), rep(1, grupo2))
+ return(which(p.values < threshold))
} > coco <- gene.select(xmat, labels, 0.05)
> length(coco)
> unix.time(gene.select(xmat, labels, 0.05))
> # muy lenta
Fijaos que usamos el formato de genes en filas y sujetos en
columnas.

Uso y programacion de R p. 133/157 Uso y programacion de R p. 134/157

La funcin t-test-then-. . . : Ejercicios

t.test.cluster <- function(data, labels, threshold, Usar seleccin de genes basndonos en adjusted p-values.
+ hang = -1) { (Usar librera multtest).
+ gene.select <- function(x, class, threshold) Usar otros algoritmos de clustering.
+ { ...} Usar tres clases en vez de dos (usar como estadstico una F o
+ genes.selected <- gene.select(data, labels, como test un ANOVA).
+ threshold)
+ data.reduced <- data[genes.selected, ,
+ drop = FALSE]
+ mi.cluster <- hclust(dist(t(data.reduced)) 2,
+ method = "average")
+ plot(mi.cluster, hang = hang)
}
A correr:
t.test.cluster(xmat, labels, 0.05, 0)
Uso y programacion de R p. 135/157 Uso y programacion de R p. 136/157
Cross-validation de un predictor Cross-validation: pasos

Objetivos: Dnde estn las funciones para knn y svm?


Usar validacin cruzada (cross-validation) para evaluar help.search("knn")
funcionamiento (error de prediccin) de un predictor. help.search("nearest neighb") # UK o USA?
Comparar los resultados de validacin cruzada teniendo en help.search("vector machine")
cuenta y sin tener en cuenta el selection bias (resultado de He "hecho trampa", porque e1071 no es un paquete que se
un prefiltrado de los genes). instale por defecto. Por eso, si no la tuviera instalada, no la
(Referencias: Ambroise & McLachlan, 2002 en hubiera encontrado. Solucin: ir a CRAN, y buscar entre los
http://www.pnas.org/cgi/content/abstract/99/10/656 y packages (y en R-help y
Simon et al., 2003, J. Nat. Cancer Institute, 95 : 1418.) http://finzi.psych.upenn.edu/search.html )
Usaremos dos predictores: knn (k-nearest neighbor) y svm Cdigo para seleccin de genes.
(support vector machines), porque funcionan bien, y son
populares (y estn implementados en R). Cdigo para cross-validation.
Por simplicidad, supondremos que tenemos una situacin con
dos clases (llamadas 0 y 1).
Uso y programacion de R p. 137/157 Uso y programacion de R p. 138/157

CV: svm
Con svm, necesitamos las predicciones del modelo. Vamos a Ojo, esta es la estructura habitual de sujetos en filas y
?svm y encontramos predict.svm. variables en columnas.
Las predicciones de clase para unos datos de test (test.data) Estamos seguros de predict.svm? Lo probamos o jugamos
con un predictor entrenado con unos datos de training con algunos ejemplos de la ayuda (no mostrado).
(training.data, cuyas clases son cl.train.data) se obtienen
entonces como:
fitted.svm <- svm(training.data, cl.train.data,
+ kernel = "linear")
predict(fitted.svm, test.data)
Pero eso se puede simplificar, porque nosotros no
necesitamos para nada "fitted.svm":
predict(svm(training.data, cl.train.data,
+ kernel = "linear"), test.data)

Uso y programacion de R p. 139/157 Uso y programacion de R p. 140/157


CV:Error rates CV:Seleccin de genes

Con predicciones, fcil obtener error rates. Error: todo aquel Coger k (k = 200?) genes con expresin ms distinta.
caso para el que predicho != real. Por si acaso hay Juzgamos "expresin ms distinta" con test de la t.
desviaciones sistemticas, desglosamos la situacin entre
predichos de clase 0 y observados de clase 1, y predichos de Podramos hacer:
clase 1 y observados de clase 0. t.statistic <- apply(train.data, 2,
Para cada conjunto de test tres columnas: predicho 0 y + function(x) {
observado 1, predicho 1 y observado 0, y la suma de las dos + abs(t.test(x cl.train.data)$statistic)})
anteriores. Una cuarta columna donde anotamos el nmero de Pero no es muy rpido. X <- matrix(rnorm(1000*50), nrow
casos en esa particin. Llamemos a esta matriz "cv.errors".
= 50)
Despues de examinar todas las particiones, el error de clases <- c(rep(0, 25), rep(1, 25))
prediccin ser:
unix.time(
sum(cv.errors[, 3])/sum(cv.errors[, 4]).
+ t.stat <- apply(X, 2, function(x) {
(Por eficiencia, retraso el nombrar las columnas hasta el final
+ abs(t.test(x clases)$statistic)})
del cdigo).
+ )
Uso y programacion de R p. 141/157 Uso y programacion de R p. 142/157

Podramos vivir con ello si fueramos a usar nuestra funcin Cargamos el paquete librera, y vemos la ayuda para saber
slo unas pocas veces. Pero yo la uso mucho en qu nos interesa:
simulaciones. Necesitamos algo ms rpido. > library(multtest)
Usaremos "mt.maxT", del paquete "multtest" (implementa el > ?mt.maxT
test de la t directamente en C, por lo que es mucho ms > # un ejemplo corto, para ver con
rpida.) > ## que nos quedamos:
mt.maxT sirve para obtener p-values ajustados para multiple > data(golub)
testing. Pero nosotros no estamos aqu interesados en el > tmp <- mt.maxT(golub[1:20, ], golub.cl, B = 1)
p-value, sino en el estadstico, que usamos slo como una > tmp # nos basta la primera columna o la 1a y 2a .
forma de ordenar los genes para su posterior seleccin.
Por eso, podemos usar mt.maxT sin permutaciones.
mt.maxT recibe los datos en la forma habitual de las
microarrays (sujetos en columnas, genes en filas). Habr que
trasponerlos.
Uso y programacion de R p. 143/157 Uso y programacion de R p. 144/157
Nuestra funcin es un simple "wrapper" a mt.maxT, incluyendo Traspongo los datos al llamar a mt.maxT.
el nmero de genes con el que nos queremos quedar (size) He dejado el antiguo cdigo que usa la funcin t.stat
(threshold no lo usamos aqu): directamente, por si algn da me hace falta. Y he puesto
> gene.select <- comentarios sobre lo que ocurre.
+ function(data, class,
+ size, threshold = NULL) {
+ ## t.stat <- apply(data, 2, function(x)
+ ## {abs(t.test(x class)$statistic)}) slow
+ tmp <- mt.maxT(t(data),class,B= 1)[,c(1, 2)]
+ selected <- tmp[seq(1:size), 1]
+ return(selected)
}

Uso y programacion de R p. 145/157 Uso y programacion de R p. 146/157

CV:Cdigo para cv

Si usamos, por ej., 10-fold cross-validation, lo que queremos El siguiente cdigo est sacado de Venables & Ripley, S
son 10 fracciones de los datos; entrenamos con las 9 primeras Programming, p. 175.
y testamos en la 10a restante; repetimos con las dems. > los.indices <- rep(1:knumber, length = N)
(Llamemos a 10 el "knumber"). > # now, reshuffle
Cdigo de cv. sencillo si asociamos cada sujeto a un nmero, > sample(los.indices, N, replace = FALSE)
de 1 a 10. Y ahora iteramos de 1 a 10. > # or sample(los.indices)
Cuando el iterador es, por ej., 3, los sujetos con el nmero 3 "los.indices" genera secuencias de 1 a knumber, y las repite
son del test set y todos los dems del training set. hasta que tenemos un total de nmeros igual al nmero de
Queremos que el tamao sea balanceado. sujetos. Por tanto, bastante balanceado. Y por ltimo, reshuffle
aleatoriamente.
Lo podemos simplificar:
index.select <-
+ sample(rep(1:knumber, length = N),
+ N, replace = FALSE)
Uso y programacion de R p. 147/157 Uso y programacion de R p. 148/157
CV: poniendo todo junto

Por ltimo facilitamos las cosas haciendo que leave-one-out no Ya tenemos todas las piezas. El esquema es:
requiera que recordemos el nmero de sujetos: Generar lista de sujetos de cada particin.
if(is.nlull(knumber)) { Para cada training set, hacer:
knumber <- length(y) Seleccin de genes
} Prediccin de los sujetos en el testing set usando los
N <- length(y) genes seleccionados.
index.select <- Media de errores de prediccin sobre el total de los testing
sample(rep(1:knumber, length = N),
sets.
N, replace = FALSE) Miremos el cdigo (eso, ver el cdigo).
"index.select" es, por tanto, la particin en la que est cada
sujeto.

Uso y programacion de R p. 149/157 Uso y programacion de R p. 150/157

Selection bias Cross-validation: KNN


Para no corregir el selection bias, la seleccin de genes se Todo es similar a svm, excepto porque usamos KNN.
hace antes de la particin de sujetos en training y testing sets. Con KNN tenemos que decidir cuantos neighbors usamos.
De esa forma, la seleccin de genes se hace con el total de los La funcin knn.cv devuelve las leave-one-out predictions
sujetos. para cada sujeto. Podemos utilizar esta funcin para
Por tanto, no se replica con honestidad el proceso de seleccionar el nmero de neighbors.
construccin del predictor. Para un rango de tamao de vecino, examinamos cual
Miremos el cdigo. produce el menor leave-one-out error, y usamos ese valor
como el nmero ptimo de vecinos.
Ese nmero ptimo se usa luego para predecir la clase del
testing set (i.e., unos datos que NO han sido usados en la
eleccin del nmero de vecinos).
Por tanto, tenemos un leave-one-out dentro de una
cross-validation.

Uso y programacion de R p. 151/157 Uso y programacion de R p. 152/157


KNN: nmero ptimo de vecinos CV: podemos simplificar?

select.k <- function(data, class, max.k = 20) { Las cuatro funciones son muy similares: casi todas las lneas
error.k <- rep(-9, max.k) de cdigo son idnticas.
for (i in 1:max.k) { Podramos usar un slo esqueleto bsico, y especificar si la
error.k[i] seleccin de genes es intra cross-validation.
<- length(which(class != Adems, pasar la funcin de prediccin (svm o knn) como un
knn.cv(data, class, k = i))) argumento.
} Lo ltimo es lo que se hace en el paquete "ipred".
return(which.min(error.k)) }
En nuestro caso no merece demasiado la pena, porque
probablemente usemos las funciones slo unas pocas veces.

Uso y programacion de R p. 153/157 Uso y programacion de R p. 154/157

Ejercicio: vant Veer et al.

vant Veer et al. (2002, Nature, 415:530536) describen un Pero. . . es la correlacin con el perfil de expresin medio, o la
mtodo supervisado en tres etapas. media de las correlaciones con los perfiles de expresin? Es la
Preseleccionar genes (ej., basado en un test de la t). La primera (su Fig.2b).
preseleccin deja un gran nmero de genes (en su caso, Y qu se hace si un gen tiene correlacin positiva con la
5000). prognosis y otro negativa? Cambiamos los signos?
Calcular correlacin entre outcome (clase) y expresin;
seleccionamos slo aquellos con corr.coeff. > 0.3 o < -0.3.
Ordenar genes en funcin del (valor absoluto?) del
coeficiente de correlacin.
El clasificador se optimiza aadiendo secuencialmente
conjuntos de 5 genes (los 5 con rango superior). Se evala
el clasificador usando leave-one-out.
La clasificacin se hace basndose en la correlacin del perfil
de la left-out-sample con "the mean expression levels of the
remaining samples from the good and poor prognosis".
Uso y programacion de R p. 155/157 Uso y programacion de R p. 156/157
Fin

Uso y programacion de R p. 157/157

También podría gustarte