Introducción a R Buenos Aires , Oct 2011 GENOMICA UBA Francisco García fgarcia@cipf.es http://bioinfo.cipf.es/fgarcia Bioinformatics and Genomics Department Centro de Investigación Príncipe Felipe (CIPF) (Valencia, Spain) ¿Qué es R? R es un lenguaje y un entorno para computación estadística y de gráficos R se compone de un lenguaje y de paquetes de funciones precomputadas Es un lenguaje Orientado a Objetos. Sus elementos son objetos con propiedades y funciones de acceso. Se guarda en la memoria activa de R y son “portables” Ventajas de R Gran facilidad para combinar paquetes existentes con código propio y con otros lenguajes de programación Alta calidad de gráficos. Potente en el manejo de matrices y texto Una comunidad de usuarios amplia, dinámica y con estadísticos de prestigio: Grandes repositorios de paquetes (para casi cualquier cosa) Proyectos desarrollados en disciplinas concretas (Bioconductor) Mucha ayuda en la red Contribuir y compartir! Desventaja de R Funciona en la línea de comandos (?) Bionconductor Es un proyecto R específico en el área de Bioinformatica: http://www.bioconductor.org Actualmente contiene más de 450 paquetes de análisis de datos genómicos y de anotación Una gran cantidad de nuevos desarrollos estadísticos en bioinformática se hacen como paquetes de R que se depositan en Bioconductor Instalación de R Para instalar R hay que bajar un fichero ejecutable desde: http://www.r-project.org/ En esta página debemos clickar en download CRAN, escoger a continuación uno de los servidores (CRAN Mirrors) y después seguir los pasos según el sistema operativo. • Windows: bajarse el ejecutable e instalar • Linux: bajarse el tar.gz (R-2.6.0.tar.gz) y compilar Una vez instalado la distribución (y paquetes básicos) se pueden instalar paquetes adicionales > install.packages("maSigPro", repos="http://www.bioconductor.org") > source("http://bioconductor.org/biocLite.R") > biocLite () Inicio de la sesión en R Tras la instalación, podemos ejecutar el programa clickando el icono de R o desde el menú de programas También podemos abrir una consola y escribiendo R comenzaremos con una sesión: Documentación Manuales básicos que acompañan a R Introduction to R R language definition Writing R extensions R site: http://cran.r-project.org/ (Manuals -> Contributed) • “R para Principiantes”, the Spanish version of “R for Beginners”, translated by Jorge A. Ahumada. • A Spanish translation of “An Introduction to R” by Andrés González and Silvia González . • “Gráficos Estadísticos con R” by Juan Carlos Correa and Nelfi González. • “Generacion automatica de reportes con R y LaTeX” by Mario Alfonso Morales Rivera. Bioconductor site: http://www.bioconductor.org Ayuda Ayuda dentro de R > help(function) # cada función tiene su página de ayuda > help(package=”base”) # todas las funciones de un paquete > help.search(“character”) # buscar ayuda sobre un concepto > apropos(“character”) # fuzzy match >?lm > example(lm) # los ejemplos son muy útiles para entender las funciones Ayuda (en la red) FAQ @ CRAN o Bioconductor http://cran.r-prject.org/faqs.html http://www.bioconductor.org/docs/faqs Mailing lists de R o de Bioconductor R-help@stat.math.ethz.ch bioconductor@stat.math.ethz.ch Archivos de la listas de correo (en los sites de R y Bioconductor) En Google: R help cuestión Elementos básicos de R Objetos en R Vector: sucesión de elementos del mismo tipo > a <- c(1,2,3) ; b <- c(“uno”, “dos”, “tres”) > l <- c(“FALSE”, “FALSE”, “TRUE”) Matriz: es una disposición ordenada de elementos del mismo tipo organizados en filas y columnas > A <- matrix(c(1,2,3,4,5,6), nrow = 2, ncol = 3) # matriz 2x3 R es “case sensitive”. A y a son dos objetos distintos Los nombres pueden cotener letras, números, “.”,”_”, pero no empezar por número Objetos en R Data frame: es una concatenación de vectores que pueden ser de distinto tipo. También en forma de array > X <- data.frame(nums = c(1,2,3,4), letts = c(“uno”, “dos”, “tres”, “cuatro”)) Lista: colección de elementos (eg. Un vector + 2 matrices) > Lis <- list (c(a, A, X)) Factor: Es un vector para datos categóricos. Identifica las clases distintas > Fact <- factor (c(“uno”, “dos”, “uno”, “dos”)) Objetos en R Funciones realizan los “trabajos” estadísticos > CV <- function (x) { m <- mean(x) s <- sd(x) cv <- s/m return(cv) } Se pueden ver el código de cada función simplemente escribiéndola sobre la consola: > CV > sd Creación y gestión de datos Asignación de valor a una variable: > vec <- c(1,4,6) > nam <- “Mi variable” > nam2 <- c(“A”, “B”, “C”) > M <- matrix(c(1:6), nrow = 3, ncol = 2) > lista <- list(vec, nam, M) > cuadro <- data.frame(Numeros = vec, Letras = nam2) Recuperar valor > nam > print(nam) # impresión dentro de funciones Creación y gestión de datos Ver datos > ls() # lista variables en el espacio de trabajo > ls(pattern = ”m”) # lista variables que contienen “m” Propiedades de las variables > mode(vec) ; mode(nam) ; mode(M) ; mode(lista) ; mode(cuadro) > class(vec) ; class(nam) ; class(M) ; class(lista) ; mode(cuadro) > length(vec) ;length(nam) ; length(M) ;length(lista) ; length(cuadro) > dim(M) ; dim(vec) ; dim(nam) ; dim(lista) ; dim(cuadro) > attributes(M) ; attributes(nam) ; attributes(cuadro) > attr(M, “names”) <- “Nombre” > names(cuadro) ; names(M) Creación y gestión de datos Asignación de valor a una variable: > vec <- c(1,4,6) > nam <- “Mi variable” > nam2 <- c(“A”, “B”, “C”) > M <- matrix(c(1:6), nrow = 3, ncol = 2) > lista <- list(vec, nam, M) > cuadro <- data.frame(Numeros = vec, Letras = nam2) Recuperar valor > nam > print(nam) # impresión dentro de funciones Operaciones básicas Operadores +, -, *, /, X^2, log2(x), log(X, base = 2), sqrt(x) Las operaciones se aplican a todos los elementos de un vector (o matriz) independientemente, reciclando si es necesario. > x <- c(1,2,3,4) # o equivalente x <- c(1:4) > x * 2 > y <- c(10, 20) > x * y > M * y # las operaciones se ejecutan “column-wise” Operaciones lógicas Operadores ==, >=, <= , != # comparación |, &, xor(), ||, && # las dos últimas se usan en bucles is.na(), is.null(), is.matrix(),..., any(), all() # interrogación > a <- c(“A”, NA, “C”, “D”) ; b <- c(“A”, “C”, “C”, “F”) > a == b # la comparacion es elemento a elemento > is.na(a) > all(a == b) # interroga si todas las comparaciones son ciertas > any(a == b) # interroga si alguna de las comparaciones es ciertas Crear funciones Intervalo de confianza para una media, varianza desconocida IC.1<-function(data,nivel) { alfa = 1-nivel m = mean(data) sd = sd(data) n = length(data) gl = n-1 t = qt(1-alfa/2,n-1) E = t*sd/sqrt(n) output <- c(m-E,m+E) output } # nivel:=“nivel de confianza” # # # # # media muestral desviación típica muestral tamaño muestral grados de libertad 1-alfa/2 cuantil de una T con n-1 g.d.l. Leer y escribir datos > colegio <- read.table(file = ”colegio.txt”, sep = ”\t”, header = FALSE) # lee cualquier fichero > AFRICA <- read.delim(file = ”file.txt”) # lee un tab-delimited file library(foreign) #incluye read.spss > comercios <- read.spss*(“comercios.sav",to.data.frame =TRUE) # lee un spss library(gdata) #incluye read.excel > paises <- read.excel**(“Paises.xls”, sheet = 1) # lee un excel > write.table(cuadro, file = ”cuadro.txt”, col.names = TRUE) # escribe > save(cuadro, file = ”cuadro.RData”) # guarda en formato R > load(“cuadro.RData”) # carga fichero R > data(iris) # carga paquetes de datos disponibles Generación de datos > a <- c(1:20) # crea un vector de 1 al 10 > b <- seq(1, 10, 0.5) # vector del 1 al 10, en intervalos de 0.5 > c <- sequence(c(5, 10)) # crea una secuencia hasta el numero(s) indicado(s) > d <- rep(c(1:3), 5) # repite el primer argumento las veces del segundo > e <- rep(c(1:3), each = 5) # repite elemento por elemento > gl(2, 4, length = 16, labels = c(“FactorA”, “FactorB”)) factores # genera series de > expand.grid(Dosis = c(“Alta”, “Baja”), Temp = (“12h”, “24h”), Edad = c(10, 20)) # crea data.frames con todas las combinaciones de los elementos dados Generación de datos aleatorios rfunction (crea una muetra aleatoria de una distribucion dada) > rnorm(20, mean = 0, sd = 1) # 20 nums de una distribucion normal > runif(20, min = 0, max = 100)) # 20 nums entre 0 y 100 La función sample es usada en remuestreo > sample(c(1:15)) # toma una muestra de un vector SIN reemplazamiento > sample(c(1:15), replace = TRUE) # muestra CON reemplazamiento Mirar los datos > data(iris) > head(iris) > tail(iris) > names(iris) # muestra los nombres de las variables de iris > class(iris) # es um data frame > attach(iris) # pone las variables de iris en el espacio de trabajo > iris[“Sepal.Length”] # proporciona los valores de la variable Sepal Length > iris[1] # lo mismo > iris$Sepal.Length # obtiene los valores de la variable > detach(iris) # quita las columnas de iris de la memoria Algunas funciones elementales Estadística básica mean(), max(), min(), sd(), median(), summary > data <- runif(10, min = 2, max = 100) > mean(data) ; min(data) ; summary(data) Otras operaciones > sum(data) # suma todos los datos del vector > prod(data) # multiplica todos los elementos del vector > scale(data) # escala los datos (resta la media y divide por su sd) Algunas funciones elementales Conjuntos union(), setdiff(), intersect(), setequal(), is.element(), match(), unique() > A <- c(“B”, “A”, “C”, “D”) ; B <- c(“A”, “C”, “E”) > union(A, B) ; intersect(A, B) ; setdiff(A, B) ; setdiff(B, A) ; setequal(A, B) > is.element(B, A) ; is.element(B, A) # busca los elementos de A en B > match(A, B); match(B,A) # da la posición de cada elemento de A en B > unique(c(A, B)) # da los elementos unicos Ordenación > order(A) # da el orden de los elementos de A > sort(A) # reordena los elementos de A Manipulación básica de cadenas > A <- paste(“Codigo”, 1:3, sep = ”_”) > grep(“Codigo”, A) # encuentra la expresión “Codigo” en A > sub(“Codigo”, “Valor”, A) # reemplaza expresiones > nchar(A) # calcula el numero de caracteres de A > strsplit(A, “_”) # separa caracteres por el separador indicado > substr(A, 7, 8) # coge la cadena que comienza en la posicion 7 hasta la 8 Indexar y seleccionar > A <- runif(20, 1, 100) # generar 10 números al azar > round(A, 2) # redondea da dos decimales (mirar ?round) > A[10] # da el elemento en posicion 10 > A[A > 50] # da los elementos mayores de 50 > B <- A[1:10] # crea un nuevo objeto con los 50 primeros elementos de A > C <- A[11:20] > A[B > C] <- “mayor” # cambia al valor “mayor” todos aquellos elementos de A donde se cumple que cada valor de B es mayor que el correspondiente de C Los paréntesis se usan para indicar parámetros de función Los corchetes se usan para indicar condición del objeto Indexar y seleccionar (ejemplo) > A <- rnorm(1000,200,10) # generar una distribución normal de media 200 > hist(A, breaks = 20) # hacemos el histograma > h <- hist(A, breaks = 20) # guardamos el histograma # Queremos insertar una línea vertical en el intervalo de más frecuencia > h # vemos que info tiene el H3K27me objeto 3 counts mayor > max(h$counts) # el numero de > h$counts == max(h$counts) # proporciona el elemento máximo > h$breaks[h$counts == max(h$counts)] # ofrece el break donde está el máximo > vert.line <- h$breaks[h$counts == max(h$counts)] # asignamos el valor > abline (v = vert.line, col = “red”) # dibujamos la línea vertical Matrices > M <- matrix(c(1:6), nrow = 3, ncol = 2) > M2 <- cbind(A = c(1,2,3), B = c(4,5,6), C = c(8,9,10)) # ver rbind > rownames(M2) <- c(“primero”, “segundo”, “tercero”) # ver attributes(M2) > M2[,1] # da la primera columna > M2 [c(1:3),] # da las filas primera y tercera > M2[,”A”] # da la columna de colnames ”A” > M2[,”A”] <- M2[,”A”] *10 # hemos multiplicado la primera columna por 10 > t(M2) # transpuesta de una matriz > M2 * t(M2) # multiplica elemento a elemento > M2 %*% t(M2) # multiplicación matricial La función apply ejecuta una función sobre las filas o columnas de M > M <- matrix(runif(60,1,100), nrow = 10, ncol = 6) > medias.row <- apply(M,1,mean) > medias.col <- apply(M,2,mean) Bucles Permiten hacer una función muchas veces incluyendo condicionantes > Nombres <- c(“Ana”, “Juan”, “Maria”, “Susy”, “Pepe”) > Apellidos <- c(“Pérez”, “Gomez”, “Fernández”, “García”, “Hernández”) > Genero <- c(“M”, “V”, “M”, “M”, “V”) > for (i in 1:length(Nombres)) { if (Genero[i] == “M”) { print (paste (Nombres[i], Apellidos[i]), sep=” ”)) } else { print (paste (Apellidos[i], Nombre[i]), sep=”,”)) } } condición condición alternativa Gráficos básicos de R Gráficos La funcion básica es plot(). Incluye muchas modificaciones según el tipo de dato Una vez creado el gráfico se pueden añadir otros elementos: texto, líneas, leyendas par() controla los parámetros gráficos Layout,mfrow, screen.split controlan la apariencia de la pantalla El device gráfico puede ser la pantalla o un fichero (tipo pdf) plot() > M <- matrix(runif(600,1,100), nrow = 100, ncol = 6) > M <- apply(M, 2,sort) > plot(M[,1], M[,2], main =”Plot”, type =”l”, xlab = ”eje x”, ylab = ”eje y”) x y titulo tipo linea etiqueta eje x etiqueta eje y > a <- round (runif(24,1,100)) > points(M[a,3], M[a,4], cex = 0.5, col = “green”) # dibuja puntos a un tamaño de 0.5 > abline(a = 1, b =1, col = “red”) # diagonal en rojo > abline(h = 2, col = “blue”) # linea horizontal a valor de y = 2 > lines (lowess(M [,2], M[,1]), col=“brown”) # dibuja un suavizado de los datos > text(M[a,5], M[a,6], label = LETTERS[1:24]) # pone texto al plot > legend(100, 0, xjust = 1, yjust = 0, legend = c("black", "green"), pch = 19, posicion alineacion texto legenda simbolo col = c("black","green"), text.col = c("black","green"), bg = "gray90") # legenda color símbolo color texto color fondo plot() Gráficos exploratorios Preparamos los datos: > T1 = c(48.6,49.4,50.1,49.8,50.6, 50.8,47.1,52.5,49.0,46.7) > T2 = c(68.0,67.0,70.1,64.5,68.0,68.3,71.9,71.5,69.9,68.9,67.8,68.9) > T3 = c(67.5,62.5,64.2,62.5,63.9,64.8,62.3,61.4,67.4,65.4,63.2,61.2,60.5) > Mejoria = c(T1,T2,T3) # vector > Tratamiento = rep(1:3, c(10,12,13)) > Tratamiento = factor(Tratamiento,labels = c("Tratamiento I", "Tratamiento II", "Tratamiento III")) # factor > datos.Ej1 = data.frame(Mejoria,Tratamiento) # data frame Gráficos exploratorios Histograma >hist(T1, xlab = "% de mejoría", ylab = "Frecuencia", main = "") >title("Histograma % de mejoría tratamiento I") Diagrama de Caja y Bigote >boxplot(Mejoria ~ Tratamiento,xlab = "",ylab = "% Mejoría", col = "pink", las = 2, cex.lab = 0.7) Densidad >plot(density(T1), xlab = "% de mejoría", ylab = "Frecuencia", main = "") >title("Densidad % de mejoría Tratamiento I") Diagrama de puntos >dotchart(Mejoria,groups = Tratamiento, gcolor = c("red","blue","darkgreen"), main = "", cex = 0.7, xlab="% de mejoria”) Gráficos exploratorios Gráficos exploratorios Diagramas de dispersión > M <- matrix(rnorm(600), 100, 6) > colnames(M) <paste("variable", 1:6) > pairs(M) par() par() lista los parámetros gráficos. Se puede cambiar directamente antes de hacer ningún gráfico. Algunos ejemplos: cex, cex.axis, cex.main etc, regulan el tamaño de las letras la dirección de la anotaciones de los ejes lty , lwd tipo y ancho de línea Cómo se usa > par(bg = “yellow”) # fondo del plot amarillo > hist(T1, xlab = "% de mejoría", ylab = "Frecuencia", main = "") > par(bg = “white”) > ?par # para ver todas los parámetros gráficos que considera R Gráficos múltiples por pantalla Varias posibilidades: par(mfrow = c(nfilas, ncolumnas)) es la forma más sencilla layout(matrix(elementos,nfilas,ncolumnas)) perimte indicar el orden de los elementos en la pantalla Ejemplos > par(mfrow = c(2,2)) > for(i in 1:4) plot(density(rnorm(100,1,i)), col = i, main = paste(“Plot”,i)) > layout(matrix(c(4:1),2,2)) > for(i in 1:4) plot(density(rnorm(100,1,i)), col = i, main = paste(“Plot”,i)) Dispositivos gráficos Normalmente se obtienen los gráficos por pantalla. La device gráfica por pantalla se designa por X11. Para generar una nueva: > hist(T1, xlab = "% de mejoria", ylab = "Frecuencia", main = "") > X11() > plot(density(T1), xlab = "%", ylab = "Frecuencia", main = "" También se pueden llevar los gráficos a un fichero (pdf, postscript…) > pdf(“un_pdf.pdf”) # o similar postcript(“un_ps.ps”) > plot(runif(10,1,100), runif(10,1,100)+100, main = “Plot a pdf”) > dev.off() # cierra la ultima graphical device