Download Análisis de datos de microarrays
Document related concepts
no text concepts found
Transcript
Análisis de datos de microarrays Disenõ de Experimentos Alex Sánchez-Pla y M. Carme Ruı́z de Villa Departament d’Estadı́stica. Universitat de Barcelona. Facultat de Biologia. Avda. Diagonal 643. 08028 Barcelona. Spain. asanchez@ub.edu;mruiz_de_villa@ub.edu xx PID 00191030 Módulo 5 © FUOC • PID 00191030 • Módulo XXX Análisis de datos de microarrays Índice I Preliminares 3 1 Estudio de un caso: Análisis básico usando R . . . . . . . . . . . . . . . . . . 4 1.1 Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.1.1 Carga de los datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.1.2 1.2 Exploración de los datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Buscando los genes diferencialmente expresados . . . . . . . . . . . . . . . . . 15 1.2.1 Seleccionando los genes diferencialmente expresados . . . . . 17 1.2.2 Anotación de los resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Part I Preliminares 3 © FUOC • PID 00191030 • Módulo XXX 4 1. Estudio de un caso: Análisis básico usando R . 1.1 Introducción En este capı́tulo se llevará a cabo un ejemplo de cómo realizar un análisis de microarrays usandoR. A la vez que se introducen los conceptos básicos del análisi exploratorio (preliminar) en los microarrays se verá como puede usarse R para hacer dicha exploración. Los ejemplos que se presentaran más adelante en el curso se harán usando las librerı́as para análisis de microarrays del proyecto Bioconductor (www.bioconductor.org). El ejercicio se llevará a cabo con datos de un estudio depositado en la base de datos pública GEO (“Gene Expresion Omnibus”). El código del estudio es GDS2744 y puede accederse a él a través del enlace http://www.ncbi.nlm.nih.gov/sites/GDSbrowser?acc=GDS2744. Los datos pueden descargarse de la dirección: ftp://ftp.ncbi.nih.gov/pub/geo/DATA/SeriesMatrix/GSE7765/. Para facilitar el trabajo los datos se han extraido y depositado en la carpeta “data” que acopaña el material del texto. Consisten en un archivo de texto denominado "GSE7765-GPL96-series-matrix.txt". GPL96 indica el tipo de array utilizado ( hgu133-A).La base de datos GEO contiene un registro de “plataforma” para cada tipo de microarray, y de él puede descargarse la tabla de las anotaciones en donde se indica, para cada sonda el código “Entrez”, el sı́mbolo y otros identificadores habituales del gen asociado. La tabla de anotaciones se encuentra también en la carpeta “data” o puede descargarse de GEO: ftp://ftp.ncbi.nih.gov/pub/geo/DATA/SeriesMatrix/GSE7765/GSE7765-GPL96 series matrix.txt.gz GSE7765 indica la “serie” de muestras que se estudian. Ésta contiene 12 muestras de 12 arrays, 6 hibridados con la plataforma “GPL96” –modelo hgu133a–, los que se estudian en este ejemplo, y otros 6 con la plataforma “GPL97” – modelo hgu133b-. En cada caso tres de las muestras han sido tratadas con DMSO y otras tres con Dioxina- Análisis de datos de microarrays © FUOC • PID 00191030 • Módulo XXX Análisis de datos de microarrays 5 Nota importante acerca del diseño experimental Observando la información contenida en GEO ası́ como en el artı́culo original (enlazado también desde la misma dirección) se deduce que aunque se trata de 6 muestras se han realizado tan sólo tres experimentos independientes, por lo que en realidad se dispone de tres pares “control–tratamiento”. Esta caracterı́stica, que se comprobará en e análisis exploratorio posterior, es importante porque determina también que, para decidir si hay genes diferencialmente expresados será mejor hacerlo utilizando un test de datos apareados que suponiendo que los controles y los tratamientos son independientes. En lo que queda de ejercio se supondrá que las matrices de datos y las anotaciones se encuentra en un subdirectorio “data” que pende del directorio de trabajo. El archivo de anotaciones proporcionado se ha obtenido a partir del existente en GEO pero se ha manipulado un poco para eliminar artefactos que aparecen al importarlos. 1.1.1 Carga de los datos Los datos tı́picos de microarrays consisten en una matriz de expresión génica que tiene los genes en las filas y las muestras en las columnas. El archivo de datos que se obtiene de GEO no es una tabla simple, sino que contiene primero algunas filas de información general seguidas a partir de la lı́nea 67 de la matriz de expresión. La lectura de los datos se lleva a cabo como de costumbre. Se crean dos objetos: uno llamado “info”, con la información de la base de datos, y otro con la matriz de expresión. > # setwd(" ") # Escribir el directorio en el que se trabaja > datadir <- "./data" > info <-readLines(file.path(datadir,"GSE7765-GPL96_series_matrix.txt"), n=70) > x <-read.table(file.path(datadir,"GSE7765-GPL96_series_matrix.txt"), + skip=68, header=TRUE, sep="\t",row.names=1, nrows = 22283) > head(x) GSM188013 GSM188014 GSM188016 GSM188018 GSM188020 GSM188022 1007_s_at 15630.200 17048.800 13667.500 15138.800 10766.600 15680.800 1053_at 3614.400 3563.220 2604.650 1945.710 3371.290 3406.660 117_at 1032.670 1164.150 510.692 5061.200 452.166 400.477 121_at 5917.800 6826.670 4562.440 5870.130 3869.480 3680.440 1255_g_at 224.525 395.025 207.087 164.835 111.609 130.123 1294_at 799.786 839.787 592.434 593.632 431.526 332.962 © FUOC • PID 00191030 • Módulo XXX 6 Si se inspecciona la información contenida en la cabecera del archivo o bien la información disponible en GEO puede verse que las muestras impares corresponden a controles (DMSO) y las pares a tratamientos (Dioxina) a controles y tratamientos por lo que podemos etiquetar las columnas de x para trabajar cómodamente. > colnames(x) <- paste(rep(c("DMSO","Diox"),3),substr(colnames(x),7,9), + sep="") > colnames(x) [1] "DMSO013" "Diox014" "DMSO016" "Diox018" "DMSO020" "Diox022" Anotaciones En general se asume que los nombres de las filas de una matriz de expresión identifican las sondas, en este caso “probesets” o grupos de sondas de Affymetrix, con las que se interrogan los genes. Los identificadores de las sondas deben de asociarse de alguna forma con los de los genes, proceso que en general se denomina “anotación”. Para relacionar las sondas con los genes los desarrolladores de los chips –por ejemplo la empres Affymetrix– suelen proporcionar archivos de anotaciones, que no son más que tablas que asocian el nombre de cada sonda con algunos identificadores “oficiales”, donde por oficiales se entiende que corresponden a bases de datos utilizadas por la comunidad. La base de datos GEO contiene, ademas de datos de expresión, más de 9000 tablas de anotaciones, que denomina “platforms”. Si se conoce el nombre de la plataforma puede descargarse y utilizarse para inspeccionar los genes interesantes (de hecho cualquier gen) que aparecen en un estudio. El archivo ,”GPL96-annotations” contiene las anotaciones para los arrays de tipo HGU133-A utilizados en este estudio. Las primeras 26 lineas contienen una descripción de las columnas y las siguientes la anotación de cada grupo de sondas en una fila distinta. Para simplificar el proceso hemos extraı́do las anotaciones y las hemos grabado en el archivo “GPL96.annot.csv2” separado por puntos y comas. Asumiendo que los archivos se han descargado, descomprimido, y almacenado en el directorio “data” podemos leerlas ambas con las instrucciones siguientes: > infoAnots <-readLines(file.path(datadir,"GPL96.annot"), n=26) > head(infoAnots, n=25) Análisis de datos de microarrays © FUOC • PID 00191030 • Módulo XXX Análisis de datos de microarrays 7 [1] "^Annotation" [2] "!Annotation_date = Jul 29 2010" [3] "!Annotation_platform = GPL96" [4] "!Annotation_platform_title = [HG-U133A] Affymetrix Human Genome U133A Array" [5] "!Annotation_platform_organism = Homo sapiens" [6] "#ID = ID from Platform data table" [7] "#Gene title = Entrez Gene name" [8] "#Gene symbol = Entrez Gene symbol" [9] "#Gene ID = Entrez Gene identifier" [10] "#UniGene title = Entrez UniGene name" [11] "#UniGene symbol = Entrez UniGene symbol" [12] "#UniGene ID = Entrez UniGene identifier" [13] "#Nucleotide Title = Entrez Nucleotide title" [14] "#GI = GenBank identifier" [15] "#GenBank Accession = GenBank accession" [16] "#Platform_CLONEID = CLONE_ID from Platform data table" [17] "#Platform_ORF = ORF from Platform data table" [18] "#Platform_SPOTID = SPOT_ID from Platform data table" [19] "#Chromosome location = Entrez gene chromosome and location" [20] "#Chromosome annotation = Entrez gene chromosome annotation" [21] "#GO:Function = Gene Ontology Function term" [22] "#GO:Process = Gene Ontology Process term" [23] "#GO:Component = Gene Ontology Component term" [24] "#GO:Function ID = Gene Ontology Function identifier" [25] "#GO:Process ID = Gene Ontology Process identifier" > annot <-read.csv2(file.path(datadir,"GPL96.annot.csv2"), head=T) > dim(annot) [1] 22283 21 > head(annot[1:5, c(1:4)]) ID Gene.title Gene.symbol Gene.ID 1 1007_s_at discoidin domain receptor tyrosine kinase 1 DDR1 780 2 1053_at replication factor C (activator 1) 2, 40kDa RFC2 5982 heat shock 70kDa protein 6 (HSP70B') HSPA6 3310 3 117_at 4 121_at paired box 8 PAX8 7849 5 1255_g_at guanylate cyclase activator 1A (retina) GUCA1A 2978 > rownames(annot)<-annot$ID Con esta tabla es posible obtener información de cualquier gen seleccionado en el estudio para el que se disponga de anotaciones. © FUOC • PID 00191030 • Módulo XXX 1.1.2 Análisis de datos de microarrays 8 Exploración de los datos En general la matriz de datos que se obtiene de GEO habrá sido preprocesada o normalizada de alguna forma que estará descrita ela ficha del estudio. Para explorar la matriz de expresión puede hacerse como con cualquier objeto de R. > dim(x) # Dimensions [1] 22283 6 > names(x) # Vector of strings to name the columns [1] "DMSO013" "Diox014" "DMSO016" "Diox018" "DMSO020" "Diox022" > round(apply(x,2, summary)) # Column-wise summary statistics,3) DMSO013 Diox014 DMSO016 Diox018 DMSO020 Diox022 Min. 1st Qu. 1 1 2 2 1 1 327 317 192 233 172 169 Median 1146 1102 774 844 692 686 Mean 3459 3451 3364 3503 3438 3536 3rd Qu. 3052 3055 2968 2880 2853 2860 115400 112600 95910 115300 104000 119300 Max. Para simplificar puede hacerse un attach de la matriz de datos de forma que no haga falta usar “x$” para acceder a las columnas de x. > attach(x) The following object(s) are masked from 'x (position 4)': Diox014, Diox018, Diox022, DMSO013, DMSO016, DMSO020 Los datos de expresión suelen trabajarse en escala logarı́tmica en base 2. > logX <- log2(x) > round(apply(x,2, summary),3) # Column-wise summary statistics,3) © FUOC • PID 00191030 • Módulo XXX DMSO013 Min. Diox014 Análisis de datos de microarrays 9 DMSO016 Diox018 DMSO020 Diox022 7.350e-01 8.870e-01 2.009 2.452e+00 5.470e-01 8.060e-01 1st Qu. 3.266e+02 3.173e+02 191.800 2.328e+02 1.723e+02 1.694e+02 Median 1.146e+03 1.102e+03 773.900 8.445e+02 6.917e+02 6.861e+02 Mean 3.459e+03 3.451e+03 3364.000 3.503e+03 3.438e+03 3.536e+03 3rd Qu. 3.052e+03 3.055e+03 2968.000 2.880e+03 2.853e+03 2.860e+03 Max. 1.154e+05 1.126e+05 95910.000 1.153e+05 1.040e+05 1.193e+05 > round(apply(logX,2, summary),3) # Column-wise summary statistics,3) DMSO013 Diox014 DMSO016 Diox018 DMSO020 Diox022 Min. -0.443 -0.173 1.007 1.294 -0.871 -0.311 1st Qu. 8.352 8.310 7.584 7.863 7.429 7.405 Median 10.160 10.110 9.596 9.722 9.434 9.422 Mean 9.988 9.955 9.521 9.678 9.416 9.400 3rd Qu. 11.580 11.580 11.540 11.490 11.480 11.480 Max. 16.820 16.780 16.550 16.810 16.670 16.860 Una mirada a la distribución de los datos muestra como tomar logaritmos actúa simetrizando la curva: > opt <- par(mfrow=c(1,2)) > hist(x[,1], main="Escala original", xlab="Expression",) > hist(M.1 <- logX[,1], main="Escala logaritmica", xlab="Expresion") > par(opt) Escala logaritmica 1000 2000 Frequency 10000 0 0 5000 Frequency 15000 3000 20000 4000 Escala original 0 40000 100000 Expression > opt<- par(mfrow=c(3,2)) > for(i in 1:6){ 0 5 10 Expresion 15 © FUOC • PID 00191030 • Módulo XXX + + 10 hist(logX[,i], main=paste("Escala logaritmica. Array",i), xlab="Expresion") } > par(opt) 0 5 10 4000 15 0 5 10 15 Escala logaritmica. Array 3 Escala logaritmica. Array 4 Frequency 0 1500 1500 Expresion 3000 Expresion 0 5 10 15 5 10 15 Escala logaritmica. Array 5 Escala logaritmica. Array 6 Frequency 1500 0 0 5 10 2500 Expresion 3000 Expresion 0 1000 Frequency 2000 0 2000 Frequency 4000 Escala logaritmica. Array 2 0 Frequency Escala logaritmica. Array 1 Frequency Análisis de datos de microarrays 15 0 Expresion 5 10 15 Expresion Una representación muy habitual cuando se usan arrays de dos colores es comparar las expresiones de los dos canales –llamémosles “R” y “G” mediante un diagrama de dispersión (R G) o mediante un diagrama “MA-plot” que representa la log(R)+log(G) R ∼ expresión relativa frente a la intensidad media de cada gen log G 2 (este gráfico se discute con detalle más adelante). Con los arrays de un color pueden compararse dos arrays entre si pero lo que suele hacerse es comparar cada array con un “array promedio” obtenido tomando la mediana de las expresiones de cada gen en todos los arrays. En primer lugar se crea este array promedio > y<- medArray <- apply (x,1,median) > logY<- log2(y) A continuación tenéis un ejemplo de un scatterplot y un “MA-plot” del primer array frente al array medio. > opt<-par(mfcol=c(2,1)) > plot(X1<-x[,1], Y1<-medArray, + xlab="Intensidad (array 1)", + ylab="Intensidad (mediana)") > abline(0,1, col="yellow") > M.1<-log2(X1)-log2(Y1) © FUOC • PID 00191030 • Módulo XXX 11 Análisis de datos de microarrays > A.1 <- 0.5*(log2(X1)+log2(Y1)) > plot(A.1, M.1, + xlab="Intensidad media (A)", + ylab="Log Ratio (M)" ) > abline (h=0,col="yellow") 8e+04 0e+00 Intensidad (array 2) > par(opt) 0e+00 2e+04 4e+04 6e+04 8e+04 1e+05 5 0 −5 Log Ratio (M) Intensidad (array 1) 5 10 15 Intensidad media (A) Lo habitual es revisar totdos los arrays con el fin de detectar si alguno presenta un patrón distinto de los demás. > opt<- par(mfrow=c(3,2)) > for (i in 1:6){ + M <-logX[,i]-logY + A <- 0.5*(logX[,i]+logY) + plot(A, M, + xlab="Intensidad media (A)", + ylab="Log Ratio (M)", main= colnames(x)[i]) + abline (h=0,col="yellow") + } > par(opt) Otros gráficos muy utilizados són los diagramas de caja –o “boxplots”– ideales formarse una idea de si los datos necesitan un mayor preprocesado. La información del estudio indica que los arrays 1, 3 y 5 corresponden a un grupo y los arrays 2, 4 y 6 a otro, por lo que se colorean de forma distinta. > opt <- par(mfcol=c(1,2)) > boxplot(x, col=c(2,3,2,3,3,3),main="Valores de expresion\n 3 controles y 3 tratados", © FUOC • PID 00191030 • Módulo XXX 12 Análisis de datos de microarrays Figura 1. MAPlot. Diox014 0 Log Ratio (M) −6 −6 −4 −2 0 −2 −4 Log Ratio (M) 2 2 4 4 DMSO013 5 10 15 5 10 15 Intensidad media (A) DMSO016 Diox018 −2 0 Log Ratio (M) 0 −2 −6 −4 −4 Log Ratio (M) 2 2 4 4 Intensidad media (A) 5 10 15 5 10 15 Intensidad media (A) DMSO020 Diox022 0 Log Ratio (M) −2 −4 −10 −8 −6 −4 −2 Log Ratio (M) 0 2 2 4 4 Intensidad media (A) 5 10 15 5 10 Intensidad media (A) 15 Intensidad media (A) + ylab="Expresion", las=2, cex.axis=0.7, cex.main=0.7) > boxplot(logX, col=c(2,3,2,3,2,3), main="log(Valores de expresion) para\n + 3 controles y 3 tratados", ylab="Expresion", las=2, cex.axis=0.7, cex.main=0.7) > abline(0,0, col="black") > par(opt) log(Valores de expresion) para Valores de expresion 3 controles y 3 tratados 3 controles y 3 tratados 120000 15 100000 80000 Expresion Expresion 10 60000 40000 5 20000 0 Diox022 Diox018 DMSO020 Diox014 DMSO016 DMSO013 Diox022 Diox018 DMSO020 Diox014 DMSO016 DMSO013 0 Transformaciones de los datos Todos los gráficos realizados muestran una simetrı́a aceptable lo que sugiere que los datos se pueden analizar relativamente bien. En capı́tulos siguientes se dicutirá como transformar los datos adecuadamente para facilitar su análisis. En general “transformar los datos” es algo que tiene ventajas e inconvenientes. Las ventajas suelen consistir que los datos se colocan en una escala en la que puede ser posible apreciar caracterı́sticas no visibles anteriormente. El inconveniente es que © FUOC • PID 00191030 • Módulo XXX 13 debemos de asegurarnos que dichas caracterı́sticas son propias de los datos y no de la transformación. EN consecuencia el consejo general suele ser “transformar si hace falta, pero transformar lo mı́nimo posible”. En este ejemplo los boxplots muestran que los valores medios de cada array son ligeramente diferentes. Esto no se debe a la biologı́a del tema sino que es probablemente un artefecto técnico (unos arrays se iluminan más que otros, por ejemplo). EN consecuencia para asegurarnos de que este artefacto no afectará a una eventual comparación entre arrays decidimos centrar cada columna, lo que hacemis restándole su media. Esta transformación no afectará a la distribución de las expresiones pero facilitará que se puedan encontrar diferencias entre los grupos. > logX <- scale(logX, scale=F) Exploración multivariante En general se espera que microarrays pertenecientes a grupos homogéneos esten muy correlacionados entre si, aunque artefactos técnicos – derivados del proceso de producción – pueden introducir un sesgo que afecte esta homogeneidad. Una forma de comprobarlo es aplicar alguna técnica de visualización como un análisis de componentes principales o un dendrograma basado en una matriz de distancias entre los arrays. El análisis de componentes principales El análisis de componentes prin- cipales o PCA permite detectar si las muestras se agrupan por su similaridad – relacionada con el grupo al que pertenecen – o bien se producen agrupaciones inesperadas (o falta de ellas), lo que puede ser indicativo – aunque no necesariamente – de posibles efectos técnicos. > pcX<-prcomp(t(logX), scale=FALSE) # Ya se han escalado los datos > loads<- round(pcX$sdev^2/sum(pcX$sdev^2)*100,1) Una vez calculadas las componentes principales se suele realizar la representación de los datos en las dos o tres primeras componentes. En la representación gráfica siempre es conveniente mostrar el porcentaje de variabilidad explicada por cada componente. A menor porcentaje menor relavancia de la clasificación. > xlab<-c(paste("PC1",loads[1],"%")) > ylab<-c(paste("PC2",loads[2],"%")) > plot(pcX$x[,1:2],xlab=xlab,ylab=ylab, xlim=c(-150, 150)) Análisis de datos de microarrays © FUOC • PID 00191030 • Módulo XXX 14 > title("Componentes principales (PCA)") > text(pcX$x[,1],pcX$x[,2],colnames(x), pos=4) Componentes principales (PCA) 20 40 Diox022 DMSO020 DMSO013 0 Diox014 −20 −40 −80 −60 PC2 18.4 % DMSO016 Diox018 −150 −100 −50 0 50 100 150 PC1 48.7 % Sin embargo, los dendrogramas de un análisis de cluster también resultan informativos. > clust.euclid.average <- hclust(dist(t(x)),method="average") > plot(clust.euclid.average, hang=-1) > par(opt) DMSO020 DMSO016 Diox022 Diox014 DMSO013 Diox018 150000 Height 250000 350000 Cluster Dendrogram dist(t(x)) hclust (*, "average") Los dos gráficos anteriores sugieren que las muestras no se agrupan por tratamiento sinó que se agrupan por experimento lo que confirma la información de que se trata de tres pares de muestras obtenidas en tres experimentos independientes. Análisis de datos de microarrays © FUOC • PID 00191030 • Módulo XXX 1.2 15 Buscando los genes diferencialmente expresados En esta sección se asume que los datos ya han sido normalizados, de modo que podemos proceder a compararlos a ver si hay diferencias en las expresiones genicas entre dos condiciones. Existen paquetes que permiten la aplicación de las diferentes opciones de tests de expresión diferencial, ası́ como las correcciones para el problema del multiple testing. La matriz contiene los datos de dos tipos de lı́neas celulares: tratamiento y control. Esto datos pueden ser almacenados en un vector de etiquetas: logX.cl que indica cúal de los chips pertenece al grupo de tratamiento y cúal al grupo control. > logX.cl<-c(0,1,0,1,0,1) El siguiente bucle realiza una comparación de medias entre los dos grupos. Esta no es la mejor prueba que se podrı́a hacer aquı́. No obstante, mostramos este test con fines ilustrativos. > get.fc=function(x){sum(x[logX.cl==1]-x[logX.cl==0])/3} > fcs=apply(logX,1,get.fc) Un enfoque más razonable para comparar estos datos serı́a utilizar un test t– Student, usando por ejemplo la función t.test. Podemos adaptarlo a nuestras necesidades, teniendo en cuenta que los datos pueden considerarse apareados. > ttest=function(x){ + tt=t.test(x[logX.cl==0],x[logX.cl==1], paired=TRUE) + return(c(tt$statistic,tt$p.value))} Una vez preparada la función se aplica a cada gen usando apply: > ans=apply(logX,1,ttest) > ts<- ans[1,] > pvals<-ans[2,] Podemos estudiar la distribución de los valores de t obtenidos utilizando un histograma o un gráfico “qq-plot”. En todo caso no debemos olvidar que estamos observando la distribución de los estadı́sticos de test, no de los datos. El hecho por ejemplo de que en en el “qq-plot” aparezcan valores por encima o debajo de Análisis de datos de microarrays © FUOC • PID 00191030 • Módulo XXX 16 la lı́nea aparte de sugerir desviaciones de la distribución “t” sugiere que podrı́an aparecer muchos genes cuya expresión sea distinta entre ambas condiciones (es decir con valores muy altos o muy bajos de t). > hist(ts, breaks=40) 6000 4000 0 2000 Frequency 8000 10000 Histogram of ts −100 −50 0 50 100 2 4 ts > qqnorm(ts) > qqline(ts) 0 −50 −100 Sample Quantiles 50 100 Normal Q−Q Plot −4 −2 0 Theoretical Quantiles Análisis de datos de microarrays © FUOC • PID 00191030 • Módulo XXX 1.2.1 Análisis de datos de microarrays 17 Seleccionando los genes diferencialmente expresados Un gen se denomina diferencialmente expresado si su expresión es significativamente diferente entre dos condiciones. Ası́, podemos decidir que hay “expresión diferencial” si el p–valor del test es menor que un valor fijado. Normalmente este valor será menor que el habitual 0.05 o 0.01 debido al problema de multiplicidad de tests que también se discutirá más adelante. > for (i in c(0.01, 0.001, 0.0001, 0.00001, 0.000001, 0.0000001)) + print(paste("genes con p-valores menores que", i, length(which(pvals < i)))) [1] "genes con p-valores menores que 0.01 248" [1] "genes con p-valores menores que 0.001 20" [1] "genes con p-valores menores que 1e-04 2" [1] "genes con p-valores menores que 1e-05 0" [1] "genes con p-valores menores que 1e-06 0" [1] "genes con p-valores menores que 1e-07 0" En vez de basarnos tan sólo en el p valor podemos seleccionar los genes que tengan un p-valor no ajustado pequeño y una diferencia de medias (“fold–change”) de como mı́nimo 1. > selGenes<- which(pvals<0.01 & fcs > 1) > print(selGenes) 201195_s_at 204939_s_at 205623_at 206285_at 4466 5150 5811 6281 6513 208409_at 211531_x_at 212665_at 213839_at 213966_at 214235_at 13219 13345 13614 217686_at 218691_s_at 220505_at 723 7910 10937 12050 214852_x_at 214967_at 216588_at 14227 14342 15958 17051 220880_at 221880_s_at 51158_at 220812_s_at 20176 1.2.2 20244 21240 206755_at 206987_x_at 18055 19869 22068 Anotación de los resultados Obviamente los nombres de los grupos de sondas no son muy informativos. Ahora podemos recurrir a la tabla de anotaciones para saber más acerca de estos genes. La tabla de anotaciones contiene en su primera columna los nombres de las sondas. Si los utilizamos para localizar los genes seleccionados podremos disponer de información sobre éstos. © FUOC • PID 00191030 • Módulo XXX 18 Análisis de datos de microarrays > selAnots<- annot[names(selGenes),] Para concluir podemos preparar una tabla resumen de los resultados en donde combinemos los identificadores de los genes, los estadı́sticos de test y sus anotaciones. > selFC <- fcs[selGenes] > seltt <- ts[selGenes] > selp <- pvals[selGenes] > selGeneTitle<- substr(selAnots[,"Gene.title"],1,25) > selGeneSymbol <- substr(selAnots[,"Gene.symbol"],1,10) > selGeneID <- substr(selAnots[,"Gene.ID"],1,10) > result<- data.frame(foldChg=selFC, ttest= seltt, pvalue=selp, + Gene.Name=selGeneTitle, Gene.Symbol=selGeneSymbol, Gene.ID=selGeneID) > result<- result[order(result$pvalue),] > if(!(require(xtable))) install.packages("xtable") > require(xtable) > print(xtable(result)) © FUOC • PID 00191030 • Módulo XXX Análisis de datos de microarrays 19 foldChg ttest pvalue Gene.Name Gene.Symbol Gene.ID 216588 at 1.47 -33.95 0.00 ribosomal protein L7 pseu RPL7P12/// 100131085/ 204939 s at 2.48 -31.80 0.00 phospholamban PLN 5350 201195 s at 2.43 -25.64 0.00 solute carrier family 7 ( SLC7A5 8140 208409 at 1.29 -24.33 0.00 solute carrier family 14 SLC14A2 8170 214967 at 2.16 -22.90 0.00 218691 s at 1.87 -22.80 0.00 PDZ and LIM domain 4 PDLIM4 8572 211531 x at 1.02 -21.57 0.00 proline-rich protein BstN PRB2///PRB 653247///5 206987 x at 1.43 -21.12 0.00 fibroblast growth factor FGF18 8817 212665 at 1.55 -18.94 0.00 TCDD-inducible poly(ADP-r TIPARP 25976 221880 s at 1.14 -18.83 0.00 family with sequence simi FAM174B 400451 220880 at 1.21 -16.41 0.00 51158 at 1.30 -15.76 0.00 family with sequence simi FAM174B 400451 213966 at 1.97 -15.60 0.00 high-mobility group 20B HMG20B 10362 220812 s at 1.53 -15.04 0.00 HERV-H LTR-associating 2 HHLA2 11148 214852 x at 1.16 -14.40 0.00 vacuolar protein sorting VPS13A 23230 214235 at 1.58 -14.37 0.00 cytochrome P450, family 3 CYP3A5 1577 213839 at 1.02 -13.89 0.01 calmin (calponin-like, tr CLMN 79789 206285 at 1.15 -12.73 0.01 nephronophthisis 1 (juven NPHP1 4867 205623 at 3.19 -12.16 0.01 aldehyde dehydrogenase 3 ALDH3A1 218 206755 at 1.25 -10.54 0.01 cytochrome P450, family 2 CYP2B6 1555 217686 at 1.61 -10.35 0.01 protein tyrosine phosphat PTPN1 5770 220505 at 1.05 -10.12 0.01 chromosome 9 open reading C9orf53 51198