Introducción a R - Bioinformatics and Genomics Department at CIPF

Anuncio
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
Descargar