You are on page 1of 40

Handouts

Tríptico R
Introducción al uso y programación del A quick introduction to ESS
sistema estadístico R
Ramón Dı́az-Uriarte
rdiaz@cnio.es

http://bioinfo.cnio.es/˜rdiaz

Unidad de Bioinformática
Centro Nacional de Investigaciones Oncológicas (CNIO)
Copyright
c 2003 Ramón Dı́az-Uriarte

Uso y programación de R – p. 1/157 Uso y programación de R – p. 2/157

Programa "Horario"

Introducción a R 1a mañana:
Introducción 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
Gráficos en R
Importación/Exportación de datos
2a mañana:
Programación en R
Gráficos en R
Ejemplos prácticos
Programación en R 2a tarde:
Ejemplos prácticos
Ejemplos prácticos
Uso y programación de R – p. 3/157 Uso y programación de R – p. 4/157

Introducción 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
Obtención e instalación 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).
correlación
Probablemente, S y R son los dos lenguajes más usados en
investigación en estadística. Otras virtudes en el folletillo.

Uso y programación de R – p. 5/157 Uso y programación de R – p. 6/157

Qué son R y S (II) ¿Cuánto cuesta R? R es "GNU S"

En pocas palabras, los grandes atractivos de R/S son: R es la implementación GNU de S.
La capacidad de combinar, sin fisuras, análisis FIlosofía y objetivos del proyecto GNU: www.gnu.org.
"preempaquetados" (ej., una regresión logística) con
Desarrollar un sistema completo y "libre" (donde "free is free
análisis ad-hoc, específicos para una situación: capacidad
as in freedom, not free as in beer").
de manipular y modificar datos y funciones.
Los gráficos de alta calidad (revelaciones de la visualización Algunos "GNUs famosos": Emacs, gcc, GNU/Linux, etc.
de datos y producción de gráficas para papers). R se distribuye con licencia GNU GPL o General Public
La comunidad de R es muy dinámica (ej., crecimiento en License (ver http://www.gnu.org/licenses/gpl.html .)
número de paquetes), integrada por estadísticos de gran La GPL no pone ninguna restricción al uso de R. Restringe su
renombre (ej., J. Chambers, L. Terney, B. Ripley, D. Bates, etc). distribución (ha de ser GPL).
Extensiones específicas a áreas nuevas (bioinformática, R se obtiene por 0 euros en http://cran.r-project.org
geoestadística, modelos gráficos).
Un lenguaje orientado a objetos.
Muy parecido a Matlab y Octave, y con sintaxis que recuerda a
C/C++. Uso y programación de R – p. 7/157 Uso y programación de R – p. 8/157

Obtención e instalación 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 distribución
Ejecutar el fichero. Instalará el sistema base y los paquetes
estándard.
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. Más adelante
también 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 programación de R – p. 9/157 Uso y programación de R – p. 10/157

Documentación sobre R (I) Documentación sobre R (II)

Los "manuales" de R, incluidos en todas las instalaciones. Son: Documentación 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. ¡Sólo 8
R data import/export. páginas!
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 también
http://www.stats.ox.ac.uk/pub/MASS3/Sprog .)

Uso y programación de R – p. 11/157 Uso y programación de R – p. 12/157

Documentación sobre R (III)

Documentación general: Estadística:
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 página 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 también
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 , marrón 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 programación de R – p. 13/157 Uso y programación de R – p. 14/157

Documentación 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 más adelante).
D. Bates. FAQ.
Regression modelling strategies, de F. Harrell. Site de Paul Johnson
Site con documentación sobre análisis para datos categóricos 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 misceláneos en página de J. Fox. hacer las búsquedas no sólo sobre las listas de email sino
(http://cran.r-project.org/doc/contrib/Fox-Companion/appendix.html .) también sobre la documentación (incluyendo paquetes).

Uso y programación de R – p. 15/157 Uso y programación de R – p. 16/157

> w > print(w) # teclear w y print(y) producen el mismo resultado. > que paquetes se cargan. Ver sección 10. Pero si siguiente).loc). (¿Cuánto habeis pagado por R?) Desde R. como en GNU/Linux (ver Pausarse antes de gritar "bug": véase FAQ. Se abrirá "Rgui".tar. "install. > Windows: > x <. (virtually) "everything is an object". hay un bug.packages()". Uso y programación de R – p.z. 18/157 Inicio de una sesión de R Una primera sesión GNU/Linux: > rnorm(5) # 5 numeros aleatorios de una distribucion normal (mean= 0. > summary(x) ## mostrar un "summary" de x (un summary "inteligente"). Hacer click dos veces en el icono. soluciones. con "install.y. Más cómodo. Se puede "customizar" como se inicia una sesión de R (ej.rnorm(5) # asignamos esos números a un objeto (un vector) llamado x.8 en > ## summary(x) TAMBIEN es un objeto. > ## o también: parecido a "R" en Unix o Linux. > Desde una "ventana del sistema" ejecutar "Rterm". An introduction to R.summary(x) Iniciar R desde de XEmacs. Permite instalar aunque uno no sea root (especificando el directorio). "update. mensajes. Uso y programación de R – p. sd = 1) > ## Hemos dicho que "#" indica el comienzo de un comentario? Teclear "R" en una shell. desde R.gz". > Iniciar R desde (X)Emacs (M-X R).packages()". 20/157 . GNU/Linux: "R CMD INSTALL paquete-x. > ## Los números se producen. 19/157 Uso y programación de R – p. etc. > w <. etc). sección 9.packages()". También permiten instalar no siendo root (especificar lib. Instalación de paquetes adicionales Antes de hacer preguntas comprobar si ya han sido Depende del sistema operativo contestadas. 17/157 Uso y programación de R – p. Windows: Las listas de ayuda son voluntarias: nadie puede exigir Desde la "GUI" o desde la interfaz de XEmacs. y se muestran (print). por favor reportese..

. savehistory). 22/157 R. hay coloreado de sintaxis (y completado de http://www. para nosotros aquí).glm) Pero aunque (X)Emacs es MUCHO más que un editor. Descargar XEmacs para Windows (la versión binaria para Windows. ?apropos apropos("normal") Una interfaz común para R en distintos sistemas operativos. (a la J.)" para paquetes requeridos. Ayuda incluida con el programa Usando R con (X)Emacs ?rnorm ¿Por qué usar R con XEmacs? help. SAS.socsi. XEmacs.) Instalar R (si no está ya instalado). Uso y programación de R – p. "Buena práctica estadística". Fox).. Arc. En resumen: WinEdt no está disponible para otros sistemas operativos. Fox "An introduction to ESS (. (ver también loadhistory.mcmaster.org/Download/win32 .org/contrib/extra/winedt ).. etc) y numéricos (ej.. ver documento J. Fox) Alternativa principal en Windows es WinEdt Toda la información está en (http://www. help. (X)Emacs con ESS no es "familiar" para los usuarios de Windows (pero no tanto con las modificaciones de J. Windows. Uso y programación de R – p. 23/157 Uso y programación de R – p. Problemas no resueltos en interacción R. demo(persp).winedt.com y http://www. mantenimiento de código ordenado y ?help. Problemas de información de como instalar y configurar ESS y XEmacs con licencia (por ej.search comentado. interacción con un buffer con R.search("normal") Colorea sintaxis. 24/157 .. las modificaciones de J.. no para Cygwin) de En GNU/Linux. ESS + XEmacs. 21/157 Uso y programación de R – p. paréntesis?) para Vim y Nedit.xemacs. etc. completa paréntesis. demo(graphics).start() Uso de scripts.. ?demo Una interfaz común para otros paquetes estadísticos (ej.r-project. demo(lm. http://cran. Fox. Si es posible. Octave). pero nada similar a la instalar todos los paquetes seleccionados por defecto (si no.ca/jfox/Books/Companion/ESS/ . XLispStat. Las últimas páginas de An Introduction to ESS + XEmacs for Pero: Windows Users of R tiene una clarísima y detallada WinEdt no es GPL ni gratuito (es shareware).

xemacs en el "home directory". como inicio de secuencia de teclas). Mis modificaciones están en mi página web (http://bioinfo. Funciona si nos movemos a otro sistema operativo/otra Para lo segundo: ya instalado por defecto en vuestras máquina. "getwd"). Para eso: sepa donde encontrar rterm. Copiar "init. con el estilo genuino de XEmacs.el. Crear un directorio . El icono de cada directorio inicia R en ese directorio. Copiar los demás ficheros de "fox-ess-.el para que XEmacs Separamos código. Ya se puede ejecutar XEmacs + ESS + R. directorio. También podemos editar init.el" provisto. etc.cnio. Seleccionar "crear iconos de acceso directo aquí".ca/jfox/Books/Companion/ESS/ .init. Uso y programación de R – p.el como init.exe)." a c:/Archivos de (Si nos olvidamos. máquinas.el" a "/. Listo. http://www. Uso y programación de R – p. search path the windows (o modificar init.init. 26/157 Modificaciones (XEmacs + ESS) (II) Modificaciones (XEmacs + ESS) (III) Si preferimos los keybindings de XEmacs: cambiar la linea Podríamos querer usar XEmacs y ESS de la forma "(defconst pc-behaviour-level 2)" a "(defconst "tradicional". Right-click en el icono de XEmacs. 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.z/etc/toolbar.el o fox. Para lo primero. Modificaciones (XEmacs + ESS) (I) Añadir c:/Archivos de Programa/R/rwxxxx/bin al Muy conveniente mantener cada proyecto separado.el y donde pone (setq ess-ask-for-ess-directory nil) poner (setq ess-ask-for-ess-directory t). pc-behaviour-level 0)" (Y algún otro cambio menor).xemacs".socsi..es/~rdiaz/#cursosR .zip" de queremos trabajar. 28/157 .). y arrastrar hasta el Descomprimir. 25/157 Uso y programación de R – p.y. datos.mcmaster. Abrir en el Explorador de Windows el/los directorios donde Descargar el fichero "fox-ess-config. copiar ramon. 27/157 Uso y programación de R – p. siempre podemos cambiar directorios con Programa/XEmacs/XEmacs-x.

Copiar RDU.Algunas limitaciones usando "modo windows": Si preferimos los keybindings de XEmacs: cambiar la linea No podemos usar shortcuts para evaluar línea.xemacs en home. 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). Para que indique en que fila y columna nos encontramos usar para guardarlos (C-x C-s). (X)Emacs. ESS + XEmacs bajo GNU/Linux R.gz de mi página y descomprimir.init.Windows. Debian). Si usamos el método "como en Windows". ESS precompilado (ej. menos!).xemacs/init. C-x 3).edu/statsoft/ess/).z/etc/toolbar.). No podemos usar shortcuts para abrir ficheros (C-x C-f). Uso y programación de R – p. 31/157 Uso y programación de R – p.el" provisto.Windows. (Y algún otro cambio menor). O editar el fichero init. 32/157 .init.y. Crear .el como init. región o "(defconst pc-behaviour-level 2)" a "(defconst pc-behaviour-level 0)’ buffer (C-c C-j. o para cambiar de ventana (C-x o). para mantener los En algunas distribuciones.el a Esto difiere del comportamiento habitual si no usamos el /. para dividir la pantalla en 2 (C-x el "custom.tar.gz directorios distintos. (http://software. 2.washington.biostat. No se aprende en 2 días. copiar ramon. Linux. 29/157 Uso y programación de R – p. para seleccionar el buffer que estamos editando Para lo primero. En proyectos diferenciados necesitaremos iniciar xemacs desde otras hay que instalar desde fichero tar. C-c C-b). Poner iconos (xpm) en su sitio (ej.like.. 30/157 R. /usr/lib/xemacs-x.es/~rdiaz/#cursosR .el o fox.cnio. (¡(X)Emacs mucho (http://bioinfo.Linux. ESS es un sistema grande y complejo con muchas Mis modificaciones están en mi página web opciones. (C-x b). Copiar también custom.init. tanto de ESS como de máquinas. C-c C-r.like. Para lo segundo: ya instalado por defecto en vuestras Limita un uso completo y sofisticado.) Uso y programación de R – p.el.el.el. Obtener xemacs-files.el. ESS + XEmacs bajo GNU/Linux (II) Obtener XEmacs y ESS.

etc. 34/157 Uso básico de ESS + XEmacs (III) (Cosas a probar) Iniciamos XEmacs en el directorio de nuestro interés. Buffer: lo que Xemacs está editando. el buffer. se introducen comandos (ej. Completar paréntesis.s" o ". toolbar: pues eso. Frame: la ventana de Xemacs. Uso básico de ESS + XEmacs (I) Uso básico de ESS + XEmacs (II) Tomado de An introduction to ESS + XEmacs for Windows users of R de J. 33/157 Uso y programación de R – p. Es preferible hacer explícito la salida de R via "q()" Uso y programación de R – p. es el fichero mismo. tex. Envío de una línea. Podemos instalar paquetes desde "ESS/R" (tenemos que estar en un buffer con código R). no Minibuffer: muestra mensajes. También se puede seleccionar para que "*scratch buffer*": donde introduciremos comandos y Xemacs haga copias periódicas (útil en caso de crash. Pero. Uso de "STOP" para detener un cálculo. así que otros buffers sólo por arriba. La extensión de un fichero ayuda a (X)Emacs a elegir el modo Podemos tener muchos otros buffers (ej. o C++. cpp. Window: cada una de las ventanas. Mode line: información sobre el buffer que está justo encima. 35/157 (en vez de usar el menú de "File/ExitR"). html? Uso y programación de R – p.. font. (Ojo: la numeración de la columna empieza por 0 Menu bar. column and row. por defecto). Guardar una figura como Metafile y pegarla en Word. Fox reserva el buffer inferior Envío de una región marcada.. Los cambios sólo se guardan si salvamos "C-s". estado del buffer. 36/157 .R" (o ". Dos importantes: Se crean ficheros "nombre˜ " que son copias del anterior Inferior R process: el buffer cuyo buffer name es "*R*". completando comandos. Edición de código. o seleccionar "Edit/FInd" en Menubar)..) código para R. ¿qué pasa si abrimos (o creamos) un fichero con extensión Py. Escribimos algo de código en R. Lo renombraremos lo-que-sea. Abrimos o creamos un fichero con código en R.R.. Trabajar directamente en *R*.S"). o LATEX). Uso y programación de R – p. usaremos ".r" o ". editando comandos. El buffer que estamos editando es lo que está en memoria. Fox. major mode. Para nuestros ficheros con código en R código HTML. o Python. o Perl. podemos editar de edición apropiado. Información sobre buffer name. Envío de un buffer entero. Salir de R. El fichero de configuración de J. para R.

. Interludio: guardando gráficas > x1 <.paciente <- + factor(c(rep("Enfermo". 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. x2.. col = c("red".paciente. x2.. > points(x1. 40/157 . 39/157 Uso y programación de R – p.paciente]. col = c("red". si nos hacen usar macros a "Alt"). ¡Recordad que formatos como pdf. 50). 37/157 Uso y programación de R – p. yo siempre uso dev.rnorm(100) > plot(x1.copy(). más sencillo > typo. type = "n". Para añadir figuras en páginas Web. ylab = "Expresión normalizada". x2) El menú ofrece otras opciones.paciente <. 50))) arrancar Rgui. > rug(x1) > Si queremos hacer uso de estas opciones. > x2 <. type = "n".. x2. xlab = "gen A". Window-céntrico (ej. rep("Sano". Para mantener una copia de la figura en formato no "C-r": incremental backward search. copiar el código. 50). Fox.2)) dev. pch = 19) > boxplot(x1 ˜ typo. 38/157 Shortcuts útiles en ESS y XEmacs Guardar la figura (en formato pdf o emf o lo que sea) es más Los siguientes funcionan tanto con como sin las útil que copiar al clipboard para: modificaciones de J. que piden inserción de figuras). "blue")[typo. ej. ylab = "gen B") > points(x1. xlab = "gen A". y guardar la figura como nos > plot(x1. 50))) > plot(x1. + xlab = "Tipo de paciente") > hist(x1) > hist(x2. o ps son más "portables" que metafile! Por defecto.rnorm(100) Hemos guardado una figura copiándola al portapapeles. en formato pdf) que podemos mandar por email.paciente]) > También podemos usar comandos como dev. > par(mfrow = c(2. "blue")[typo. ylab = "gen B") parezca. "M-Shift-5": query replace. > typo.copy2eps() y pdf(). x2. main = "Histograma del gen B") Uso y programación de R – p.copy).factor(c(rep("e". "M-g": Ir a linea. En GNU/Linux no hay un "File/Save As" para las figuras. Uso y programación de R – p. "C-s": incremental forward search. rep("s". etc. pero no funcionan bien. pdf() (ver ?dev.copy2eps().

c("a". order(resultado) > which(resultado < 0. loc = c(1. 43/157 Uso y programación de R – p. + rep("enfermo".30. vector Colección ordenada elementos del mismo tipo. El objeto más habitual para manejo de datos Acceso a elementos procedentes de experimentos. > my. 41/157 Uso y programación de R – p. 15).frame <- Ordenación + data. sujetos en tenemos dataB (con la técnica B). 1..frame(ID = c("gen0". "Hola") Operadores básicos > z1 <. 2.apply(data.matrix(rnorm(50 * 100).test(data[1. 44/157 . TRUE. ncol = 50) > clase <. + subj1 = c(10.value)) > hist(resultado).t.matrix(rnorm(50 * 100).dataB). + function(t. ncol = 50) > dataB <. medidas de expresión con la técnica A) del estadístico de la t. data frame Como array.test(x ˜ clase)$p. TRUE. 25. Elementos Generación de secuencias del mismo tipo. 125)) Uso y programación de R – p.7) > hist(correlaciones) > tmp$p.c(TRUE. Queremos seleccionar columnas. x[51:100])) > tmp <.) aquellos genes con alta correlación positiva.factor(c(rep("sano". 3). "genes" en filas. Un ejemplo más largo Segundo ejemplo Vamos a ordenar un conjunto de datos en función del p-value Además de data (ej. subj2 = c(NA. "b". pero permiten elementos (columnas) de distintos tipos. 42/157 Manejo de datos en R Tipos de objetos (I) Tipos de objetos (Casi) todo en R es un objeto. "genZ"). > correlaciones <.apply(cbind(data. 34. FALSE). 33). 1.value > resultado <.05) Uso y programación de R – p.c(1. La familia apply + + oncogen = c(TRUE. 20).data. (Simulamos los datos. 30))) + function(x) cor(x[1:50]. > data <. > x <. y <. "genB". ] ˜ clase) > order(correlaciones) > tmp > attributes(tmp) > which(correlaciones > 0. FALSE) array Generalización multidimensional de vector.

+ b = factor(c("a". 45/157 Uso y programación de R – p. x <. suelo nombrar data frames con la inicial en R es "case-sensitive". mayúscula. 4. attributes(w) + una. Si varias Hay nombres reservados ("function". attributes(y). x != X.1:15. números. 9) Las asignaciones se hacen con "<-".4. FALSE). "if". "b")))) is. x2 <. Por ej. El uso del ". 48/157 . length(x) list Un "vector generalizado". "c"’) (pero no es código muy difícil de leer.vector = 1:10. dim(y) componentes (que pueden ser otras listas). lo usara ocuparíamos muchísimo espacio). rm(c). 3.as. w <. tengan sentido —equilibrio entre longitud y frecuencia de uso. Cada lista está formada por y <. 8).array(x) componente puede ser de un tipo distinto.. uso razonable del ".lista <. + otra. y <. (Pero en estas transparencias.c(3. 2.matriz = matrix(rnorm(20).data." (más fácil luego usar clases). b = 5). separo Otras consideraciones: con ". Son unos mode(x). ncol = 4). mode(z) "contenedores generales". mode(y). x<-1:5 # Mal estilo x <. etc).1:5. tyepof(x2)." es diferente al de C++. pero las variables siempre en minúscula. porque hace el Mejor evitar nombres que R usa (ej.c(un.vector(x). is.list(a = 1:3.".frame(y). funciones hacen cosas parecidos a objetos distinto. c(7.function(f1) funciones Código. is.lista = c(a = 5.function(x) {return(2 * x)}.vector(y). typeof(x3) Los atributos podemos verlos. c <.palabra = "Hola". y es buen estilo el rodear "<-" por un espacio a cada lado. etc). attributes(y) + una. z <. f1 <.").c(1. > una.. y cada is. 5). 47/157 Uso y programación de R – p. y el punto (". No es bueno abusar. si no dramático si nos confundimos: podemos arreglarlo). pero también podemos cambiarlos. 46/157 Nombres de objetos Los nombres válidos para un objeto son combinaciones de Las "reglas" habituales de nombrar objetos en programación letras. Uso y programación de R – p.1:5 # Mucho mejor. x1 <. Sobre el uso de ". Uso y programación de R – p. x. nrow = 3.c(TRUE. x <. ncol = 5).matrix(5. Tipos de objetos (II) Atributos de los objetos factor Un tipo de vector para datos categóricos.". nombres que Los nombres no pueden empezar con un número. attributes(f1). (usar estilo consistente.

Es "intuitivo" si la Código más fácil de entender. Se aplican a vectores de devuelven un vector que contiene el elemento max. || tan. prod xor(y. sin. Uso y programación de R – p. mean. >. log(x. z <. %/%. diff.min. 0 + y. log10. /. -.y + z Es la forma natural de operar sobre objetos enteros. ∧. pmin. de momento –S4 classes dan un error)."numeric" Uso y programación de R – p. Entre vectores no siempre: cuidado. FALSE).x∧ 2. escalar) suele ser lo que queremos.max. mode(y) <.c(TRUE. 52/157 . max and min devuelven el máximo y el mínimo de un conjunto de números. x == 6.. log2. Más fácil hacer debugging.Operaciones aritméticas con vectores (I) Operaciones aritméticas con vectores (II) FUNDAMENTAL: R puede operar sobre vectores enteros de Operar sobre vectores enteros es MUCHO MEJOR que usar un golpe. devuelven un solo Las formas &&. <=. preciso. base). <. 49/157 Uso y programación de R – p. *. if (is. x >= 5. x < 5.. min longitud uno y sólo evaluan el segundo argumento si es en esa posición. operación es escalar con vector. as. ==. cumprod.5. >=.c(TRUE. 50/157 Operaciones aritméticas con vectores (III) Operadores comparativos y lógicos +. xor() y los parecidos &&. !.x/2. sqrt x <. 51/157 Uso y programación de R – p. which. loops: > x <. pmin usar dentro de if statements. %%. min(x) no tiene sentido si x no es numérico. y & z. TRUE) max. Pero también ocurre en Más sencillo de modificar y mantener.1:5 > x + x2 Más eficiente (en tiempo y memoria).numeric(y). w <. > x2 <. Si un elemento es más corto. z <. > x + 15 Más rápido de escribir (y no sólo porque muchas menos líneas!). !y. sum.numeric(x) && min(x) > 0) {lo que sea. || son "short-circuit operators" que se suelen número aunque les pasemos varios vectores. min. y | z pmax.1:10 Mucho más claro: > y <. var. != log. sd. cumsum. El reciclado cuando (vector. |. se "recicla". x != 5 Otras: y <. operaciones entre vectores. &. (R da un warning. range.. z) which. exp. pmax. cos.

Ver. 3. y) > sample(5.1:10 v <. 3) setdiff(y.c("bcA2". v) > sample(x. por ejemplo. de E. t. 16 de R para principiantes. 7:10.1 (p. min = 3. etc. replace = TRUE) union(v. to = 18. 4. to = 5. 3. F. replace = TRUE) intersect(v.x/sum(x) setdiff(w. to = 18. exponential. quantiles y función cumulativa de todas estas distribuciones). 34) de An introduction to R y p. y <. poisson. sección 8. x) > x <.1:5. beta. x <.1:10. seq(from = -7. y <. 7:10) Muestrear un vector (imprescindible en bootstrapping y union(x. by = 2)) Muchas funciones de distribución: lognormal. max = 59) z2 <.c("bcA1". gamma. w) Uso y programación de R – p. "blX1") > sample(x) w <.c(1. w) > sample(x. "bcA2". length = 2* length(x). by = 2) > rnorm(10.seq(from = 2. Uso y programación de R – p. sd = 18) x <. y <. w) > probs <. 53/157 Uso y programación de R – p. Operaciones de conjuntos Generación de secuencias aleatorias x <. "xA3") > sample(x.1:10. 2. y) cross-validation): > sample(5) intersect(x. binomial.c(1:5. 55/157 Uso y programación de R – p. χ2 . length = 30) > runif(15) x <. 54/157 Generación de secuencias: seq Números aleatorios: usar rFuncionDistribucion (con sus x <. 56/157 .-5:3 > rnorm(10) x <.seq(along(x)) > runif(8. (Con esas funciones podemos también obtener la densidad.seq(from = 2.c(1. mean = 13. Paradis. 5) parámetros). prob = probs) setdiff(v.

"patata")] expand.1:3. 57/157 Uso y programación de R – p. label = c("Sano". 58/157 Interludio: NA. Inf Podemos indexar un vector de cuatro formas: "NA" es el código de "Not available".x > 3 x[y] gl(3. También. rep(5. data frames. 18. y <.rep(5.0.grid(edad = c(10. etc). NaN. anteriores. y <. "b". x[y] gl(4.na(5/0) también asignarlos: x[c(1. por supuesto. 3)] <. Sustituir NA por. "patata") gl(3.c(1:3. 3)) x[x > 3] rep(x. arrays. p. 0/0 No solo podemos acceder (devolver) el/los valores. 59/157 Uso y programación de R – p. 2. 60/157 .na(v)] <. v <. rep(x.na(v). -5/0. Un vector lógico. 0: v[is.. 3).1:5. 25). 5) # como rep(1:3. sino is. rep(5. is. x[1].97 Uso y programación de R – p.c(1. v == NA # No funciona! Por qué? Un vector de cadenas de caracteres (character strings).c(1:5. loc = 1:3) Podemos combinar: z5 <. 3)) x[-c(1. podemos indexar un vector usando cualquier expresión o función que resulte un una de las cuatro Infinito y NaN (not a number). which(is. length = 8) y <. rep(x.ej. Generación de secuencias: rep Indexación de vectores rep(1. "Hembra"). NA) Un vector de enteros (integers) positivos. x[3] rep(1:3.nan(0/0). x) x > 3 rep(x. rep(8. "c".c("a". "Enfermo". 1. 5). 4. y) x <. 4)]. 79). 2) los elementos (de vectores. length = 20) #Ojo: gl genera factores names(x) <. sexo = c("Macho". 5/0. is. 5) Una de las gran virtudes de R es la flexibilidad en el acceso a x <.infinite(-5/0).na(v)) Un vector de enteros negativos. is. "d".c(25. Son distintos de NA. 3)) Uso y programación de R – p. "Muerto")) x[c("b". x[x > 3] <.

paste(LETTERS[1:5]. 3. x <. "frase".na. 8. 62/157 Vectores de caracteres Factores codigos <.no. 3. aov(y ˜ x) # error! Ver grep. y lo queremos usar para x <.rnorm(10).") mode(codigo. na. 2. 2.. 2:3. Python. sort(x1) Para "modelling functions" (ej. 3. 2).matrix(c(1.c(1. Si no. Otras muchas funciones de manipulación de caracteres. columna. which. 4). gsub.paste(c("A". R. 2. 2. Ordenando vectores xna <. 28016. which(x1 == min(x1)) > XNA y <. rank(x2) > XNA <. Uso y programación de R – p. 3. collapse ="") (aparentemente) numéricos en análisis estadísticos es una columna.c(5. pueden hacer poco necesario recurrir a Awk. 5) <. sep ="") codigo. match.paste(c("A". 3) mean(xna.postal) # mejor. columna.omit" o rank(x1) "na.rep(letters[1:5]. "B"). El usar códigos paste(c("una". sub. 1.4) Si tenemos un vector con caracteres. x) > X.paste(columna.b <. frecuente fuente de errores. nrow = 3) min(x1). sep = ".c(1. 2).c("uv") sabiamente.LETTERS[1:5].exclude" ("na. 3. Uso y programación de R – p.c(1. x1[order(x1)] Eliminar todos los NA: x2 <.postal) Pero no deberíamos usar el código postal en. necesitamos convertirlo en un factor. aov(y ˜ factor(x)) # funciona. 2:3.10:15. NA.factor(codigo.rm = TRUE) order(x1) Lo mismo con otras funciones. 63/157 Uso y programación de R – p.. order(y. collapse="") un análisis. por ej. NA. 1. "B"). regexpr. 4). NA. pmatch. sep = "") codigo. 4). 61/157 Uso y programación de R – p. que y <. substr("abcdef".c(28430.omit(XNA) order y sort admiten "decreasing = TRUE". 2. etc).postal <.na <.a.a <. o Perl. 28034).2. 64/157 . mean(xna) x <. un juntar <- ANOVA. como si fuera un vector numérico. no se deja.b. toupper.postal <. juntar <. residuos. substr(x. tolower. "tonta". lm) lo mejor es usar "na.exclude" más conveniente para generar predicciones.min(x1). codigos <.

67/157 Uso y programación de R – p.c(34. "bajo". summary(cut1) dos dimensiones.1:20. O queremos convertir un vector factor en numérico. pero matrix es más cómoda. "medio"). c(0.numeric(as. 8. Sólo difieren de los factor. 2/3. y usados con modelos lineales —treatment vs.array(9. "medio")) ftr1 ftr1 <. nrow = 5) # column-major-order.matrix(1:20.numeric(y) # Mal: lo veremos.lowest = TRUE) a1 <.cut(vv. 1/3. byrow = TRUE) a4 <. 1)).c(1. Eliminará muchos errores y es "buena práctica estadística".factor(x). 68/157 .factor(c("alto". 89. "alto")) Uso y programación de R – p.matrix(1:20. dim = c(5. 3).c(5. # los valores han sido recodificados.character(y)) # Bien factores lo que debe serlo. polinomial). pero podemos usar un número arbitrario. "medio". Con cut1 <. 4) Uso y programación de R – p. Ver también split(x. array y matrix proveen similar funcionalidad. + levels = c("bajo". un vector de números se convierte en R también cuenta con "ordered factors". quantile(vv. No as. a3 <. dim(a4) <.factor(c("alto". f): divide datos del vector x usando # como en F O R T R A N . factors "normales" en algunos análisis (tipo de contrastes x <. + include. Nos centraremos en arrays de vv <. 1000). 65/157 Uso y programación de R – p.cut(vv. "bajo". 7. los grupos definidos en f.4)) summary(cut2) a2 <. 3. y <. 2. Podemos fijar el orden de las etiquetas.A veces. cut2 <. al leer datos. ftr1 <. nrow = 5. Como medida de "higiene mental y analítica" convirtamos en as. 9) 2 dimensiones. 66/157 Matrices y arrays (I) Para discretizar datos: usar cut: Generalizaciones de vectores.

matrix(rnorm(20). Matrices y arrays (II) Indexado de arrays es similar a vectores. ] indexar con una matriz. a8 <. a12 <. x2 <.array[. a7 <. y su columna por el + o. a2 %*% t(a2) Uso y programación de R – p. ]. 1]).) Las matrices tiene atributos. solución colnames(a4) <. 3). 70/157 Matrices y arrays (III) Matrices rbind. Ordenar un array usando una de las columnas: a4[1. 4)]? El indexado con matrices se extiende también a arrays de más dos dimensiones. c("v1". cuando escribamos funciones (si no. producto de rownames(a4) <.array <. nos cbind(a4. 4). usamos Para evitar "dropping indices" usar rbind. . "v3")] a6 <. drop = FALSE] x1 <.array)[1]. 2].") matrices (%*%) y traspuesto (t): a4[. x2) Esto mismo se aplica a arrays de más de dos dimensiones. sep = ".array <. 69/157 Uso y programación de R – p. ] #es un vector! Para combinar vectores o arrays para obtener arrays.paste("id". ] > im <. su fila (primera dimensión) se especifica sample. rango. de forma a9 <.rows <- por el elemento en la primera columna. rbind(a4. Sólo mencionamos diag. c(2. a4[c(1. 3). En la matriz con los índices cada fila Selección aleatoria de filas: extrae un elemento. a4) "drop = FALSE" generalmente debe usarse.cbind(x1. a6) mean) : dim(X) must have a positive length".o.paste("v". 72/157 .cbind(x1. 4].matrix(rnorm(30).diag(6). a4[. a6) # no funciona encontraremos con errores como "Error in apply(a6. x2).array[sample(1:dim(o. c(2. a4[1. ncol = 4) Podemos usar los cuatro métodos para vectores y también o. 4)] o. + replace = TRUE).cbind(a2. 2. drop = FALSE]. 3. 71/157 Uso y programación de R – p. sep = "") de sistemas. En particular: Operaciones matriciales: muchas disponibles incluyedo attributes(a4) factorizaciones como svd y qr. 3.of.matrix(c(1. a4[1. determinantes. nrow = 2) > im > a4[im] > # Por qué difiere de a4[c(1. Uso y programación de R – p. elemento en la segunda columna. etc. cbind. cbind y otros a4[1. nrow = 5) defensiva.-17 attributes(a4) a4 %*% a2.array[order(o. 2.1:10. 1:4. 1:5.10:20 a4[. diag(a4) <.

pero a10 <. matrices. 5)) variables (genes) en filas. edad = c(rep(20. Esta es (por buenas razones) la > set.cbind(d2. c("x1".2)]) prcomp(a10[. o guardar otros datos fenotípicos en otras data. x2. estad. colnames. g2 = rnorm(10)) Veremos ejemplos.frame útiles que las arrays. al hacer data.letters[1:10] as. g2 = rnorm(10)) datos de microarrays: los datos de microarrays generalmente tiene los sujetos (o casos o tumores) en columnas y las > d1$edad <. 5)) # error > d2 <.frame. -3]) Además. 3] <.cbind(x1. También dimnames(a10). multiv.data.c(rep(20. 5). 5))) > #OK Uso y programación de R – p. a9 <. 5). variables en columna. "x2")]) prcomp(a10[. Pero esta > ## del random number generator tructura es la traspuesta de la organización habitual de los > d1 <.c(rep(20. x3) Por estas razones.frames es sujetos (casos) en f ila. rep(40. Usar $ facilita el acceso y creación de nuevas columnas. rep(40. Permiten lo mismo que las arrays. c(1.frames también tienen rownames.frames ¿Y si son de distinto tipo? Podemos convertir matrices a data frames con x3 <. data. 73/157 Uso y programación de R – p. Podemos trasponer los > set.data. 76/157 .frames.frame(x1. > Esto no representa un problema.frame(g1 = runif(10). rep(40. no hallaremos el determinante de un attributes(a10) # pero nosotros no habíamos data frame que tenga factores) Pero si podemos hacer: # fijado los row.cbind(g1 = runif(10). Uso y programación de R – p.frames: $ y attach La estructura de las data. > d2[. 74/157 data.data. los "character vectors" son convertidos a factors (lo que es una ventaja). prcomp(a10[.frame(). 75/157 Uso y programación de R – p. 5). x3) se puede guardar/acceder a otra información.seed(1) # fijar la semilla organización de los datos usada en estadística. > d2 <.names library(mva) #aquí están func. x2. las data frames suelen ser objetos más ¡¡¡Pero yo no quería eso!!!. Quizás quería un data.seed(1) datos. El indexado y subsetting de data frames como el de arrays y Las data. (Por supuesto.

80/157 . variables usando su localización explícita y completa. g2) # en vez de plot(d1$g1.25 > edad > edad # usando la que está antes > plot(g1. ] O usar subset subset(d3. la actualización no es dinámica: > d1$g3 <. > g1 > edad <. por masking. Precauciones con attach() Si usamos mucho los datos de un data. d1$g2) search() #el search path Además. que sea igual a una variable. 77/157 > edad # y esto qué? Uso y programación de R – p. Uso y programación de R – p. semanas) mejor evitar attach() y acceder siempre a las id1 = c(rep("a".frame(g1 = runif(10). !(id1 %in% c("a". 78/157 subset En "entornos confusos" (ej. 3). rep("c". g2 = rnorm(10). "b"))) Por supuesto. subset también permite la selección de variables (columnas). distinto en otra. 79/157 Uso y programación de R – p. podemos usar reglas más complejas (ej.frame. podemos Con attach() ponemos el data frame nombrado en el acceder a ellos directamente: search path (en la posición 2). 2). "b")). el argumento "select"."nueva columna" > d1 # aquí está > g3 # pero aquí no > detach() # detach(d1) aquí es equivalente > attach(d1) > g3 Uso y programación de R – p. y no missing en una tercera). > attach(d1) Cierto cuidado.data.. rep("d".. 3)))) Los que no son "a" ni "b" d3[!(d3$id1 %in% c("a". rep("b". 2). un análisis que se prolonga 2 d3 <.

cosas) t(apply(ax. aggregate. por.f1 <. numérica.apply(ax.rm = TRUE)) ?merge + else { + tmp <. mean) loops (además de más claro. señalarlo. Si es una variable list(id = datos[. sample) dos. mean. na. 1. 81/157 Uso y programación de R – p.apply(ax.f1) un vector o a una matriz (la "s" es de "simplify").character(tmp[1])) + } } Uso y programación de R – p. na. listas.cosas <.cosas)) Uso y programación de R – p.collapse. ncol = 5) Operar con apply generalmente mucho más eficiente que medias. var(y)))} apply(ax.25)} especificar el "margin". 2. queremos "colapsar" por clon.function(x) { return(2*x .por.d. sólo debería haber FUN = colapsar) un valor: devolver ese (si hay más valores. etc).unique(x) + if(length(tmp) > 1) return("¡varios!") + else return(as.aggregate(datos. 1. etc.apply(ax. mi.columna <. sapply intenta simplificar el resultado a mi.rm = TRUE) sapply. etc Escenario: un data frame (datos). + return(median(x. lapply son como apply pero no hay que mi. 1.na <.cnioid <.simple <.fila <. arrays. pero lapply siempre devuelve una lista.apply(ax. más fácil.collapse.matrix(rnorm(20. hallar la mediana.por.apply(ax. 1. dos. clon (cnioID).si. 83/157 Uso y programación de R – p. 1.apply(ax.collapse. mean) sample. 1. Ambas pueden aplicarse a mas.cnioid[. + {return(2*x -25)}) media.) d.fila <. varias réplicas del mismo d.function(x) { # Asegurarse que se ha echo lo que queríamos!!! + if(is.cnioid <.f1.by. si categórica. dos.por. 82/157 La familia apply ax <. 84/157 .function(y) + {return(c(mean(y). "cnioID"]).by. function(x) vectores. -1] colapsar <.by. 1.numeric(x)) Otras funciones para objetivos similares: ver ?reshape.rows <.

2. sd(x1). 85/157 Uso y programación de R – p. y facilitan posteriores modificaciones y aplicaciones. p..data * parameters[. 1. sd) > tapply(Days. matemáticamente equivalente) hacer: + function(y) sqrt( (var(y)/length(y)))) > z.2)). Age) + parameters[. table Una forma tonta de generar datos de distribuciones normales > # see MASS. mean). list(Sex. A outer se pueden pasar funciones mucho más complejas. 3) median(d1) > # cor. > round(cor(m1). 1. function(x) > attach(quine) + rnorm(10000. sd) Uso y programación de R – p. 1]. lapply y tapply son funciones muy > cor. por ej. apply(data2. 2]) + > table(Sex.test hace otra cosa apply.data. median(m1). sd = 2:12) > data(quine) # absentismo escolar > data <. 86/157 Miscel. mean) Este es un ejemplo tonto.as. > mean(x1). intentemos tabla. 1.. por supuesto. mean). apply(data.t(apply(parameters.multiplicación <. fácil de > cor(apply(m1. Ver FAQ. Age). mean(d1). m1[. Un ejemplo inútil de apply tapply. Uso y programación de R – p. outer) Algunas funciones directamente hacen un "apply".. Uso y programación de R – p. sd(d1).test(m1[. x[2]))) > tapply(Days. 1. 11:20. 38 con una media y desviación típicas dadas: > library(MASS) > parameters <. ?image # y otro ejemplo outer requiere funciones vectorizadas (apply no). nrow = 11) Una tabla > data2 <. 87/157 7.data <.(z. rank)) # corr. Es más sencillo (y > tapply(Days. outer se usa en el ejemplo de persp. 88/157 .matrix(1:20. 1] > > apply(data2.19 para más detalles. Age). Dos funciones que se aplican directamente sobre matrices: > m1 <.matrix(rnorm(10000 * 11). "*") substituirlo por algún miembro de la ilustre familia apply. (cov. list(Sex.frame(m1) > cor(m1) #demasiados dígitos . ?persp # y ejecutemos el primero ejemplo par(mfrow(1.outer(11:15. 2]) útiles que contribuyen a hacer el código más legible. mean) > apply(data. ncol = 5) > cov(m1) > d1 <.cbind(mean = -5:5. x[1]. Age. cor. 1. Cada vez que vayamos a usar un "loop" explícito. sapply. rangos (Spearman) entender.

89/157 Uso y programación de R – p. cambiarse de forma (reshape). + rep("c".lista[[4]] etc.data. 3)))) > my.lista <.means = las.lista # hemos eliminado el "slot" maximum El indexado y selección de casos pueden usar números.vars <.lista$factor.vars. tipos especiales de listas. + factor. Las listas son contenedores sin estructura determinada.frames son. 90/157 Resumen (y apología de R) > una.. > una. subsecciones de datos. factores.clases <. casos. + las. Por tanto muy flexibles.table(x[. + id1 = c(rep("a".lista) Podemos preparar código que repita las mismas operaciones con datos semejantes (i.list(cucu = 25.fun <. 92/157 .frame(g1 = runif(10). > unlist(otra.lista Una vez que los datos están en R.mean(x[. una.lista <. rep("b".elemento = "una frase") Uso y programación de R – p.e.NULL > una.classes = tabla.lista) Podemos seleccionar variables. 3]) + return(list(row. además. 2). una.lista. drop = FALSE) > una. en realidad. etc.list(NULL). maximum = max. > una. 3).total <. juntarse.fun(d3) Uso y programación de R – p.lista <. 91/157 Uso y programación de R – p.function(x) { Muchas funciones devuelven listas: devuelven un conjunto de resultados de distinta longitud y distinto tipo. -3]) + las.lista) > otra.medias. > una. Interludio: listas Las data.var(x[.max(x[. rep("d".c(una.clases)) } > my.fun(d3). > una.lista) flexible. pero sin estructura. su manipulación es muy > attributes(una. > unlist(una.my. > d3 <. names(una. de acuerdo con criterios arbitrarios (que usan. > length(una.lista.lista[4] # por qué sale el nombre? condiciones que pueden implicar a un número arbitrario de variables y casos).lista).vars = las.lista[[3]] <.total. g2 = rnorm(10).lista) con sencillez). otro.classes > una.lista[[3]] <.lista Los data frames y las matrices pueden separarse. 2). -3]) + max. podemos automatizar el proceso > unlist(otra. -3]) + tabla. etc. una.medias <. cadenas de caracteres. + row.

org/src/contrib/PACKAGES.".. Importando y exportando datos Podemos verificar "on-the-fly" que estas transformaciones hacen lo que queremos que hagan (mirando selectivamente read. 96/157 . 93/157 Uso y programación de R – p.fichero". separado por tabuladores.) Uso y programación de R – p. header = TRUE. Por tanto. Con ficheros muy grandes..read. Si el carácter decimal no es un punto sino.table. datos en Excel habrán de ser exportados o salvados desde Excel como texto.table("mi. (Para usuarios de GNU/Linux: con ficheros de Excel de read. En Queremos leer un fichero simple. S3 (ver package foreign (http://cran. + comment.r-project.image leerlos en R. Ver R data import/export. directamente datos en formato binario Excel. Perl).html#foreign ). o "emulando" el proceso en unos datos artificiales más pequeños). sep = "" Hay funciones para importar datos en formato binario de SAS.data. write..frame <.csv) pero son casos específicos de read. 94/157 Importando datos Importando datos: read. con otro programa (Python.table los resultados. puede ser necesario un preprocesado de los datos my. Otro separador habitual de columnas es sep = " ". Stata. Gnumeric generalmente es más rápido que OpenOffice. + . Perl) para luego volver a save. por el momento. una coma. data Uso y programación de R – p. por ej.table R es un tanto inflexible en la importación de datos.table Por tanto. usar: dec = ". Hay funciones especializadas para otros ficheros (ej. Minitab. Python.char = "") SPSS. También de bases de datos. formas sencillas de importar (nrows). Gnumeric parece atragantarse. una vez que los datos están en R. ocasiones. Se pueden saltar lineas (skip) o leer un número fijo de líneas No hay. 95/157 Uso y programación de R – p. tamaño moderado. no hay muchas razones para exportarlos y hacer la selección y manipulación con otros lenguajes (ej.

Usar count.guardados. para ser usados en otras sesiones de R..names = FALSE. sep = "" Datos pueden compartirse entre sesiones de R en distintos + col. 98/157 Exportando datos Guardando datos Lo más sencillo es exportar una tabla. Cuidado también con líneas extra al final del fichero. +  . 100/157 .frame. Importamos en R con read. El "default" es "#" lo que puede Lo mejor es exportar desde Excel como fichero de texto causar problemas si ese carácter se usa en nombres (como en separado por tabuladores. 97/157 Uso y programación de R – p. scan es una función más general.RData". a1. pero de uso más Salvamos como texto (sólo salvamos una de las hojas).RData") El fichero ". write.table.data.nombre. problema. ¿Queremos row. funciones.names como TRUE o como > a1 <. 99/157 Uso y programación de R – p.image(file = "un.output. Muchos errores de lectura relacionados con distinto número de Poner una última columna con datos arbitrarios (ej.RData" > save. file = "mi.char.letters[10:20] > save("unos.txt".names y col.image() # salvado como ".RData") Podemos salvar todos los objetos con > save.datos. etc. Uso y programación de R – p.datos.names = TRUE) sistemas operativos. a3) Los leemos con > load("unos. a2. Dos formas de minimizar problemas: defecto usa NA y el que no haya valor —columna vacía). Importando de Excel Ojo con comment.table(my. Usar "NA" para missing. Guardar datos.fields para examinar donde está el columna llena de 2s). muchos ficheros de arrays).1:10 > a3 <. Ojo con las últimas columnas y missing data (Excel elimina los Podemos especificar el código para "missing data" (por "trailing tabs"). sólo necesaria en ocasiones especiales o cuando escasos de memoria.salvados. complicado.RData" es cargado al iniciarse R.rnorm(10) FALSE? > a2 <. una columnas.row. Uso y programación de R – p.

5). abline(h = 0. + ylim = c(1. side = 1) mtext("mtext en side 2". 4) Sólo examinaremos la superficie. los capítulos 3 y 7 de An R + sub = "subtítulo". El sistema permite desde simples plots a figuras de calidad # Modificado de "Introductory statistics with R" para incluir en artículos y libros. "Algo de texto") mtext("mtext". plot() función gráfica básica. 5)) También demo(graphics). 103/157 Uso y programación de R – p. 4. 0. plot Se cargan con load(nombre. x <. 101/157 Uso y programación de R – p. Cargando built-in data Gráf icos R. line = -3. incorporan ficheros con datos. Identificación datos rm(list = ls()) # borrar todo del workspace Datos multivariantes ## para ver efectos de siguientes comandos Jittering library(multtest) Adición rectas regresión data(golub) Boxplots # o data(golub. lty = 1). 104/157 . main = "Título principal". package = "multtest") si no Otros gráficos # hemos attached la librería Guardando gráficos search() ?golub Uso y programación de R – p.fichero). 0. abline(v = 0. y <. side = 2. + cex = 2) Uso y programación de R – p.runif(50. el capítulo 12 de An introduction to R. 102/157 Introducción a los gráf icos plot() R incluye muchas y variadas funciones para hacer gráficos. 4). R para principiantes. de Modern applied statistics with S. y. Más detalles en el capítulo 4 plot(x.runif(50. y muchos paquetes. el capítulo 4 de + ylab = "y label". xlab = "x label". and S-PLUS companion to applied regression. xlim = c(-1. lty = 2) text(1.

y.Variaciones de plot plot(x) Con text podemos representar caracteres de texto z <.y) directamente: plot(z) sexo <. y.c(rep("v". type = "b") plot(c(1. lty = i. + pch = 15:17. axes = FALSE. type = "n") plot(log(y + 1) ˜ x) # transformacion de y text(x. "green"). 107/157 Uso y programación de R – p. col. labels = sexo) plot(x. y. puede referirse a los "labels" (cex.5).cbind(x. Hay muchos más colores. dibujados). i/5. ylab="") + abline(0. rep("m". cex = 2) Uso y programación de R – p. type = "p") plot(x. pch = 11:20. 30)) plot(y ˜ x) plot(x. y. type = "n". xlab ="". Por ejemplo. 10). pch = 3. type = "n". 10). pch = 1:10. c(0. rep(1. Uso y programación de R – p. etc. 10). y. a la + col = "blue". lty permite specificaciones más complejas (longitud de los + col = "blue") segmentos que son alternativamente dibujados y no points(1:10.lab). "tres"). type = "n") Tipos de líneas: points(x. cex. cex points(1:10. Tipos de puntos: + ylab ="") plot(c(1. y. for(i in 1:10) + xlab = "". "dos". 108/157 . lty plot(x. otro. cex = 2. c(1. rep(2.5)) legend(1. y. 105/157 Uso y programación de R – p. c(1. 10). rep(3.axis. pch = 21:30. "blue". 20). 106/157 plot: pch. bg = "yellow") anotación de los ejes. Ver palette. cex = 2. cex = 2. 10). 3). lwd = 2) points(1:10. 10). col = "red") plot(c(0. + col = c("red". + col = "red") par controla muchos parámetros gráficos. colors. 4. type = "l") plot(x. c("uno". lty = 1:3.

y) plot(runif(5). 4. y mucho más. > Y$sexo <.".paste("punto". ". data = Y) boxplots. sep ="") split. La función más flexible y sofisticada es > nombres <. weight) "Conditioning plots" (revelan.frame(X) boxplot(weight ˜ sexo. y. rnorm(10)) Uso y programación de R – p.matrix(rnorm(1000).c("a". 109/157 Uso y programación de R – p. > coplot(weight ˜ edad | loc + sexo.2 (p. bien explicada en R para principiantes. Identif icación interactiva de datos Múltiples gráficos por ventana > x <. data = Y) La librería lattice permite lo mismo.data. mostrarlos horizontalmente. 111/157 Uso y programación de R – p. secc. rnorm(5)) > locator() plot(runif(10) > text(locator(1).sample(1:10) gráfico. interacciones): detach() > Y <.o comparar entre variables. 112/157 . "el marcado".as. "edad".1. 4.screen. attach(Y) + "weight") boxplot(weight) > pairs(X) plot(sexo. "id". que coplot. 2)) locator devuelve la posición de los puntos. columnas)) > identify(x. etc. Vease la ayuda (?boxplot). Ver secc. entre otros.6 de R para principiantes. 30).as. "loc". + col = c("red". > > plot(x. 120))) boxplot tiene muchas opciones. labels = nombres) par(mfrow = c(2. Uso y programación de R – p. plot(rnorm(10) > plot(x. "blue")) + rep("Hembra". ncol = 5) variable. x. y. en una matriz de > coplot(weight ˜ edad | loc.factor(c(rep("Macho".1:10 Podemos mostrar muchos gráficos en el mismo dispositivo > y <. 110/157 Datos multivariantes Boxplots Una "pairwise scatterplot matrix": Muy útiles para ver rápidamente las características de una > X <. adj = 0) plot(rnorm(10). 80). se puede modificar el > coplot(weight ˜ edad | sexo. > colnames(X) <. data = Y. y) Mucho más sencillo es par(mfrow=c(filas. data = Y) aspecto.

además de bien: leyendas y líneas rectas: dc1 <. qq.rnorm(50) + prob = c(1.rnorm(50) dc2 <. contour. replace = TRUE) > x <. en el paquete "car".stat. replace = TRUE.. Jittering en scatterplots Adición de rectas de regresión Los datos cuantitativos discretos pueden ser difíciles de ver Podemos añadir muchos elementos a un gráfico. 113/157 Uso y programación de R – p. 500. figuras (vease ?par y búsquense oma.ac. Uso y programación de R – p.car.3 y 12.pdf). 115/157 Uso y programación de R – p. Podemos añadir otros elementos con "panel functions" en otras funciones (como pairs.car y Podemos modificar márgenes exteriores de figuras y entre scatterplot.matrix. y) plot(dc1. y). y) También útil si sólo una de las variables está en pocas > abline(lm(y ˜ x). 3. 500. Notación matemática (plotmath) y expresiones de texto arbitrariamente complejas.5.4. diagonal = "density") de comparación de cuantiles. o la disribución de unos datos frente a un estándard (ej. secc.dc1 + sample(-2:2. jitter(dc2)) > plot(x. omi. gráficos de barras: barplot. + data = X) histogramas: hist. 1)/9) > plot(x.org/src/contrib/PACKAGES. en paquete "car".ggobi.auckland.5. 2. distribución normal): qqplot. mai.matrix(X.html#xgobi. usados para comparar la distribución de dos variables. qqnorm y. gráficos > scatterplot. http://www. 2.org. También gráficos 3D: persp. 116/157 . lty = 3) categorías. lty = 2) plot(jitter(dc1). panel = panel. 114/157 Otros Lo más sencillo es usar panel. http://www. > y <. lattice. > coplot(a ˜ edad | loc.plot.sample(1:5. 12.r-project. etc). > library(car) ejemplos en An introduction to R. Gráficos tridimensionales dinámicos con XGobi y GGobi.nz/~kwan022/pub/gguide. Uso y programación de R – p. mar. image. (Ver http://cran. dc2) > lines(lowess(x.

Rprof Uso y programación de R – p..off() Cuando algo va mal: traceback.function(a.copy2eps() unix. b. 5) # error mensaje. podemos darlos en cualquier orden: + y3 <.z * y o. Tambien podemos especificar donde queremos guardar el Argumentos gráfico: > pdf(file = "f1. loops > dev. d = FALSE) { my.e.f2 <.funcion) nos muestra los argumentos (de cualquier función). browser. width = 8. a = 4) } Pero los argumentos con nombre siempre se tienen que dar Lo que una función devuelve puede ser un simple número o despues de los posicionales vector. podemos usar los menús y guardar con distintos Definición de funciones formatos. c = 4. Aquí una más: otra.rnorm(10) Los argumentos "a" y "b" tienen que darse en el orden debido + y2 <. Uso y programación de R – p. 5) + return(y3 + 25) otra.} + z <. O bien. y) { + x1 <. si los nombramos. Guardando los gráficos Programación en R En Windows. o puede producir una gráfica.f(4. 118/157 Definición de funciones Argumentos Ya hemos definido varias funciones. 119/157 Uso y programación de R – p. podemos copiar una figura a un fichero: > plot(runif(50)) debug > dev. 117/157 Uso y programación de R – p. 4.a * z .f(b = 5..f(c = 25. usar los valores por defecto). 120/157 .. height = 10) > plot(rnorm(10)) Control de ejecución: condicionales.pdf". Los argumentos "c" y "d" tienen "default values".function(x. args(nombre.z * y * x otra.time. o no especificarlos (i. Podemos especificarlos nosotros. o devolver una lista o un otra.f <.

. Control de ejecución: if "z" es una "free variable": ¿cómo se especifica su valor? Condicional: if Lexical scoping. . i.org/doc/contrib/Fox-Companion/appendix. para salir de un loop. Fox (en "instruccion" es cualquier expresión válida (incluida una entre { http://cran. "Odd".runif(1) > f3(1:5.loop <.logica) instruccion > #from Thomas Unternährer. 121/157 Uso y programación de R – p. "Even") continue. Ver documento Frames..alternativa. 1) + print(x) + if( x > 10) continue. . Uso y programación de R – p. 0. for ifelse es una versión vectorizada: while (condicion.and if (condicion.x + 1 ifelse(mtf. 124/157 .loop in valores) instruccion > odd. 1:5.. break.even <. label = "la x".FALSE } repeat.r-project.) + if(x > 5) print("x > 5") } + else { > + y <. También demo(scoping). TRUE). xlab = label.function(x) { + plot(x.function(x) { for(i in 1:10) cat("el valor de i es". "\n") + ifelse(x %% 2 == 1. .logica) instruccion donde scope in R and S-PLUS de J. y)) > f3(1:5. 2003-04-17 for (variable. y.TRUE + } x <. environments.logica) instruccion else instruccion. FALSE. 123/157 Uso y programación de R – p. ". if (condicion. 122/157 Control de ejecución: while. . switch también están disponibles.matrix(c(TRUE.html ) y }). col = "red") + } + } Uso y programación de R – p. R-help.loop <. " permite pasar argumentos a otra función: > f3 <.7 en An introduction to R.0 mtf <.function(x.. while(continue. sección 10. 1:5) + print(paste("y is ".) { > f4 <. TRUE. y.loop) { + nrow = 2) + x <.

codigo.0 hay garbage collection.. el background). Se Ver la ayuda: R CMD BATCH -help. sink es el inverso de source (manda todo a un fichero). echo = TRUE).function(x. puede ver el status con gc().R").z * y * x incorrectos o warnings indebidos podemos seguir la + return(y3 + 25) ejecución de la función. + y2 <.buggy.f2) se ejecuta la función paso a paso. y) { secuencia de llamadas antes del crash de nuestra función.buggy.fichero.function) > . 125/157 Uso y programación de R – p. traceback() nos informa de la my.z * y Cuando se producen errores o la función da resultados + y3 <. Ver la ayuda. Con BATCH: % R CMD BATCH mi.fichero.2. eficientes. my. 1:4) permite seguir la ejecución o examinar el entorno.function) Uso y programación de R – p.. 126/157 unix. sino funciones que hagan lo que deben.file. BATCH no informa. Rprof: un profiler para ver cuantas veces es llamada cada pero no requiere tener abierta una sesión (se puede correr en función y cuanto tiempo se usa en esa función. que sirve también para despejar Puede que necesitemos explícitos print statements o hacer las cosas depues de operaciones con manejo de grandes source(my. 1:4) debug es como poner un "broswer" al principio de la función.con. Cuando algo va mal Cuando se produce un error. 127/157 Uso y programación de R – p.rnorm(10) cuando se produce mensajes de error incomprensibles. optimizar antes de tiempo. Garbage collection: desde R 1.R. > undebug(my. objetos. # insertar un browser() y correr de nuevo > debug(my. si otra tecla sigue ejecución normal.f2 <. "Q" para salir. Pero a veces útil saber cuanto dura la ejecución de una source es en ocasiones más útil porque informa función: unix.con. Con source abrimos una sesión de R y hacemos > Las adminiciones habituales sobre no optimizar y jamás source("mi. 128/157 .f2(runif(10000).codigo. y undebug(my. rnorm(1000))).f2) a paso. inmediatamente de errores en el código.f2(runif(3). con "n" paso debug(my. Uso y programación de R – p.R. Se sale con "Q". Util + z <. } browser interrumpe la ejecución a partir de ese punto y my.time y Rprof source y BATCH Nuestro objetivo aquí no es producir las funciones más Para la ejecución no interactiva de código.f2(runif(3).time(my.

Ver Writing R t-test-then-cluster fallacy extensions. con nuestras funciones. Usaremos hclust (aunque podríamos usar cualquier otra). Objetivo: usando datos aleatorios. > help. Lexical scoping importante en programación más avanzada. Uso y programación de R – p. Veámoslo en acción. 130/157 t-test-then-cluster fallacy clustering: algoritmo Truismo: un algoritmo de clustering siempre nos devuelve Buscamos funciones de clustering: clusters.Fortran. etc). R es un verdadero "object-oriented language".search("cluster") Lo que no está claro es como de fiables son esos clusters. Representar el cluster Por sencillez.C. > help. do. Dos implementaciones. (con y sin "selection bias") No hemos mencionado el "computing on the language" (ej. Hacer clustering con esos genes.search("hierar cluster") Si hacemos clustering con genes seleccionados con un test de > args(hclust) # una primera idea la t. siempre nos salen magníficos resultados aún con datos > ?hclust # cómo funciona hclust? aleatorios.Call. replicar el proceso de: Seleccionar genes. Ver Validación cruzada de un predictor .. Uso y programación de R – p. . Otros Ejemplos Se pueden crear paquetes. Ejercicio: método de van’t Veer at al. 132/157 . suponemos que tenemos sólo dos clases de sujetos. . eval. 129/157 Uso y programación de R – p. R puede llamar código compilado en C/C++ y F ORTRAN. las S3 classes y las S4 classes. que se comporten igual que los demás paquetes. 131/157 Uso y programación de R – p.call.

5000 gene. + threshold) + data. labels. rep(1. La probamos: Queremos seleccionar aquellos genes para los que el p-valor > grupo1 <.select(data. labels. .values <. threshold) Usar otros algoritmos de clustering.05)) > # muy lenta Fijaos que usamos el formato de genes en filas y sujetos en columnas. 0. Uso y programación de R – p. 135/157 Uso y programación de R – p.cluster <.gene.10 > genes <...function(x.data[genes.reduced <.select <.select <-function(x.select(xmat.hclust(dist(t(data. 134/157 La función t-test-then-. hang = hang) } A correr: t.reduced))∧ 2.function(data. class.05. > grupo2 <.selected <. + p.select(xmat. 136/157 .cluster(xmat. grupo2)) + return(which(p. 1. 133/157 Uso y programación de R – p.value}) > labels <. como test un ANOVA).cluster <. Usar selección de genes basándonos en adjusted p-values. . + drop = FALSE] + mi. + { .c(rep(0. 0. Selección de genes Selección de genes (En el siguiente ejemplo veremos otra forma de hacerlo). class.test(x ˜ class)$p. 0) Uso y programación de R – p. labels. labels.cluster. + method = "average") + plot(mi.selected.matrix(rnorm(genes * (grupo1 + grupo2)).} Usar tres clases en vez de dos (usar como estadístico una F o + genes. grupo1). function(x) { + nrow = genes) + t. + hang = -1) { (Usar librería multtest). + gene. threshold) { > xmat <. labels.test.apply(x.05) > length(coco) > unix. threshold.values < threshold)) } > coco <.gene.time(gene. 0.test. : Ejercicios t.10 de un test de la t sea "significativo". .

test..data.data. supondremos que tenemos una situación con dos clases (llamadas 0 y 1).svm? Lo probamos o jugamos con un predictor entrenado con unos datos de training con algunos ejemplos de la ayuda (no mostrado).search("vector machine") cuenta y sin tener en cuenta el selection bias (resultado de He "hecho trampa". + kernel = "linear").svm(training.search("nearest neighb") # UK o USA? Comparar los resultados de validación cruzada teniendo en help. 137/157 Uso y programación de R – p. Por simplicidad.psych. Cross-validation de un predictor Cross-validation: pasos Objetivos: ¿Dónde están las funciones para knn y svm? Usar validación cruzada (cross-validation) para evaluar help.data. no la (Referencias: Ambroise & McLachlan. porque nosotros no necesitamos para nada "fitted. (support vector machines). si no la tuviera instalada. Nat.search("knn") funcionamiento (error de predicción) de un predictor.html ) Usaremos dos predictores: knn (k-nearest neighbor) y svm Código para selección de genes. 140/157 .svm": predict(svm(training. 139/157 Uso y programación de R – p. 138/157 CV: svm Con svm.data) Uso y programación de R – p.data.) http://finzi. 2002 en hubiera encontrado. cl.data) ¿Estamos seguros de predict. cuyas clases son cl. Por eso. Cancer Institute.upenn.data. Las predicciones de clase para unos datos de test (test. variables en columnas. instale por defecto. + kernel = "linear") predict(fitted.train.svm <. Solución: ir a CRAN.svm. Vamos a Ojo. 2003. J. (training. y son populares (y están implementados en R). help.data) se obtienen entonces como: fitted.svm.org/cgi/content/abstract/99/10/656 y packages (y en R-help y Simon et al. porque funcionan bien. esta es la estructura habitual de sujetos en filas y ?svm y encontramos predict. 95 : 14–18.data) Pero eso se puede simplificar.train. y buscar entre los http://www. Uso y programación de R – p. necesitamos las predicciones del modelo.edu/search. Código para cross-validation. test.pnas. cl. porque e1071 no es un paquete que se un prefiltrado de los genes).train.

> library(multtest) Usaremos "mt.statistic <. 25).apply(X. t.test(x ˜ cl. nrow casos en esa partición.errors[.data)$statistic)}) anteriores. Llamemos a esta matriz "cv. Uso y programación de R – p.apply(train. 2. 2. sino en el estadístico. 25)) predicción será: unix. + ) Uso y programación de R – p. Una cuarta columna donde anotamos el número de Pero no es muy rápido. + t. 143/157 Uso y programación de R – p.train. 142/157 Podríamos vivir con ello si fueramos a usar nuestra función Cargamos el paquete librería. caso para el que predicho != real. predicho 1 y observado 0. y la suma de las dos + abs(t. del paquete "multtest" (implementa el > ?mt. y vemos la ayuda para saber sólo unas pocas veces. Error: todo aquel Coger k (k = 200?) genes con expresión más distinta.maxT(golub[1:20.errors".maxT recibe los datos en la forma habitual de las microarrays (sujetos en columnas. Pero nosotros no estamos aquí interesados en el > tmp <. Por si acaso hay Juzgamos "expresión más distinta" con test de la t. retraso el nombrar las columnas hasta el final + abs(t. podemos usar mt. por lo que es mucho más > # un ejemplo corto.cl.c(rep(0. genes en filas).maxT sirve para obtener p-values ajustados para multiple > data(golub) testing. ]. desviaciones sistemáticas. el error de clases <. desglosamos la situación entre predichos de clase 0 y observados de clase 1. function(x) { (Por eficiencia. forma de ordenar los genes para su posterior selección. 144/157 .stat <. Habrá que trasponerlos. = 50) Despues de examinar todas las particiones. golub. 4]). B = 1) p-value.maxT". rep(1. Por eso. y predichos de Podríamos hacer: clase 1 y observados de clase 0.errors[.data. para ver con rápida. 3])/sum(cv. que usamos sólo como una > tmp # nos basta la primera columna o la 1a y 2a .mt. fácil obtener error rates.matrix(rnorm(1000*50).test(x ˜ clases)$statistic)}) del código).time( sum(cv. Para cada conjunto de test tres columnas: predicho 0 y + function(x) { observado 1.maxT sin permutaciones.maxT test de la t directamente en C. mt. CV:Error rates CV:Selección de genes Con predicciones.) > ## que nos quedamos: mt. Necesitamos algo más rápido. X <. 141/157 Uso y programación de R – p. Pero yo la uso mucho en qué nos interesa: simulaciones.

stat (threshold no lo usamos aquí): directamente. 145/157 Uso y programación de R – p. length = N) (Llamemos a 10 el "knumber"). y las repite son del test set y todos los demás del training set.stat <. el número de genes con el que nos queremos quedar (size) He dejado el antiguo código que usa la función t. class.Nuestra función es un simple "wrapper" a mt.c(1. sujetos.. + N. reshuffle Código de cv.mt. > # now. sencillo si asociamos cada sujeto a un número. replace = FALSE) Uso y programación de R – p.indices" genera secuencias de 1 a knumber. 147/157 Uso y programación de R – p. repetimos con las demás.. > los. y testamos en la 10a restante. 1] + return(selected) } Uso y programación de R – p.select <. Lo podemos simplificar: index.tmp[seq(1:size). 175. hasta que tenemos un total de números igual al número de Queremos que el tamaño sea balanceado. length = N). incluyendo Traspongo los datos al llamar a mt. replace = FALSE) de 1 a 10. 146/157 CV:Código para cv Si usamos.test(x ˜ class)$statistic)}) slow + tmp <. threshold = NULL) { + ## t. reshuffle aleatoriamente.class.rep(1:knumber.indices) Cuando el iterador es. 2.apply(data. por ej. 3. los sujetos con el número 3 "los. comentarios sobre lo que ocurre. > sample(los.maxT.maxT(t(data).B= 1)[. p. N. 10-fold cross-validation. function(x) + ## {abs(t. por si algún día me hace falta.select <- + sample(rep(1:knumber. Y ahora iteramos de 1 a 10. lo que queremos El siguiente código está sacado de Venables & Ripley.indices. 2)] + selected <. Por tanto. + function(data. + size. Y por último. 148/157 . Y he puesto > gene. por ej. bastante balanceado. > # or sample(los. S son 10 fracciones de los datos.maxT.indices <. entrenamos con las 9 primeras Programming.

nlull(knumber)) { Para cada training set.select <. N. hace antes de la partición de sujetos en training y testing sets. Para un rango de tamaño de vecino. la selección de genes se hace con el total de los La función knn. index. Por tanto. produce el menor leave-one-out error. y usamos ese valor como el número óptimo de vecinos. 151/157 Uso y programación de R – p. if(is. por tanto. ver el código). 150/157 Selection bias Cross-validation: KNN Para no corregir el selection bias. Uso y programación de R – p. Podemos utilizar esta función para Por tanto.e. Media de errores de predicción sobre el total de los testing sample(rep(1:knumber. tenemos un leave-one-out dentro de una cross-validation. sets. 149/157 Uso y programación de R – p. De esa forma.length(y) genes seleccionados. "index. replace = FALSE) Miremos el código (eso. la selección de genes se Todo es similar a svm. Uso y programación de R – p. hacer: knumber <. examinamos cual Miremos el código. 152/157 . Con KNN tenemos que decidir cuantos neighbors usamos. construcción del predictor.length(y) Selección de genes } Predicción de los sujetos en el testing set usando los N <.. unos datos que NO han sido usados en la elección del número de vecinos). para cada sujeto. CV: poniendo todo junto Por último facilitamos las cosas haciendo que leave-one-out no Ya tenemos todas las piezas.cv devuelve las leave-one-out predictions sujetos. no se replica con honestidad el proceso de seleccionar el número de neighbors. excepto porque usamos KNN. El esquema es: requiera que recordemos el número de sujetos: Generar lista de sujetos de cada partición. Ese número óptimo se usa luego para predecir la clase del testing set (i. la partición en la que está cada sujeto.select" es. length = N).

154/157 Ejercicio: van’t Veer et al. La primera (su Fig. seleccionamos sólo aquellos con corr. preselección deja un gran número de genes (en su caso. 156/157 . ¿Y qué se hace si un gen tiene correlación positiva con la 5000).cv(data. } Lo último es lo que se hace en el paquete "ipred". La clasificación se hace basándose en la correlación del perfil de la left-out-sample con "the mean expression levels of the remaining samples from the good and poor prognosis".k[i] selección de genes es intra cross-validation. Ordenar genes en función del (valor absoluto?) del coeficiente de correlación. KNN: número óptimo de vecinos CV: ¿podemos simplificar? select. Se evalúa el clasificador usando leave-one-out. 153/157 Uso y programación de R – p.k)) } En nuestro caso no merece demasiado la pena.function(data. pasar la función de predicción (svm o knn) como un knn. ¿es la correlación con el perfil de expresión medio.k <. return(which. . porque probablemente usemos las funciones sólo unas pocas veces.k = 20) { Las cuatro funciones son muy similares: casi todas las líneas error.coeff.k) de código son idénticas. 415:530–536) describen un Pero. (2002. class. class.3 o < -0.rep(-9. Uso y programación de R – p.min(error.. > 0. y especificar si la error. for (i in 1:max. prognosis y otro negativa? ¿Cambiamos los signos? Calcular correlación entre outcome (clase) y expresión. van’t Veer et al. media de las correlaciones con los perfiles de expresión? Es la Preseleccionar genes (ej. max. 155/157 Uso y programación de R – p. basado en un test de la t). k = i))) argumento.length(which(class != Además. <.3.2b). Nature.k) { Podríamos usar un sólo esqueleto básico.k <. o la método supervisado en tres etapas. El clasificador se optimiza añadiendo secuencialmente conjuntos de 5 genes (los 5 con rango superior). . max. Uso y programación de R – p.

Fin Uso y programación de R – p. 157/157 .