Universidad de Granada Máster Oficial en Estadística Aplicada Trabajo Fin de Máster Análisis de datos en Bioinformática: Asociación entre mutaciones puntuales y patrones de expresión génica Autor: Daniel Parras Burgos Tutora UGR: Yolanda Román Montoya Tutor Genyo: Pedro Carmona Sáez Septiembre 2014 A Charlene, Por su paciencia y apoyo incondicional Índice 1. Introducción ............................................................................................................1 1.1 La Bioinformática...................................................................................................... 1 1.2 El material genético y los genes ................................................................................ 2 1.3 Expresión génica: El dogma central de la biología molecular .................................. 6 1.4 Alteraciones en el material genético: Polimorfismos de nucleótido simple (SNPs) y variaciones del número de copias (CNV) .................................................. 8 1.5 El genotipo .............................................................................................................. 10 1.6 La tecnología de PCR para medir expresión génica y genotipado .......................... 11 2. Objetivos ................................................................................................................17 3. Resultados esperados ............................................................................................17 4. Materiales y métodos .............................................................................................19 4.1 Flujo de trabajo del análisis de expresión diferencial: Método ................... 19 4.2 Selección de los genes endógenos más estables: Método „geNorm‟ ....................... 27 4.3 Asociación entre SNP/CNV y patrones de expresión génica .................................. 28 5. Resultados ...............................................................................................................31 5.1 Implementación de funciones en R para procesado y análisis de datos de qPCR .. 32 5.1.1 Carga de datos ......................................................................................... 32 5.1.2 Preparación de los datos .......................................................................... 37 5.1.3 Selección de los genes endógenos más estables ...................................... 42 5.1.4 Normalización: Cálculo de 5.1.5 Cálculo de .............................................................. 46 ...................................................................................... 47 5.1.6 El problema de los Undetermined ........................................................... 51 5.2 Estudio de la asociación entre SNP/CNV y patrones de expresión génica ............. 53 5.2.1 Función para el estudio de la asociación ................................................. 53 5.2.2 Análisis de asociación entre número de copias y expresión en cáncer de próstata ............................................................................................... 56 i 6. Conclusiones ...........................................................................................................62 7. Apéndices ................................................................................................................64 7.1 R y Bioconductor..................................................................................................... 64 7.1.1 Libro „ReadqPCR‟ ................................................................................... 65 7.1.2 Libro „NormqPCR‟ .................................................................................. 66 7.1.3 Libro „limma‟ .......................................................................................... 67 7.2 Funciones y código .................................................................................................. 68 7.2.1 Anexo 1 ................................................................................................... 68 7.2.2 Anexo 2 ................................................................................................... 77 7.2.3 Anexo 3 ................................................................................................... 82 8. Bibliografía y webgrafía .......................................................................................84 ii iii Análisis de datos en Bioinformática Daniel Parras Burgos 1. Introducción Durante los últimos años la investigación biomédica ha sufrido una enorme revolución gracias al desarrollo de metodologías analíticas de alto rendimiento. Estas nuevas técnicas están generando cantidades ingentes de datos que están permitiendo caracterizar y analizar los mecanismos moleculares asociados a distintas patologías. No obstante, la gran cantidad de datos generados hace necesario el desarrollo de metodologías eficientes para su almacenaje, análisis e interpretación. Esto ha conllevado a un desarrollo enorme del campo de la Bioinformática. Siendo éste el marco donde se plantea el presente trabajo, se tratará de desarrollar una solución analítica para el tratamiento y análisis de datos procedentes de experimentos de qPCR, en concreto, estudios de asociación entre expresión y genotipado. Este tipo de datos a menudo supone la manipulación de cientos e incluso miles de genes en muestras que pueden estar formadas por cientos de pacientes. Es por ello que el análisis e integración de estas grandes cantidades de datos sería en la práctica imposible sin las adecuadas herramientas informáticas y estadísticas. Por consiguiente, se desarrollarán una serie de funciones que efectuarán la carga apropiada de dichos datos así como llevarán a cabo la manipulación y extracción de información relevante de los mismos. La realización de estas tareas de la forma más automatizada posible facilitará que, en un futuro próximo, dichas funciones acaben siendo integradas en un paquete de software que está siendo desarrollado en el Centro Pfizer-Universidad de Granada-Junta de Andalucía de Genómica e Investigación Oncológica (GENYO) y que facilitará la labor científica de sus investigadores. 1.1 La Bioinformática Hasta fechas recientes, la investigación en Biología Molecular venía llevándose a cabo principalmente en laboratorios experimentales donde el estudio de los datos generados, relativos a unos pocos genes o proteínas, podía abordarse sin problemas por el propio investigador. Sin embargo, ante el crecimiento desmesurado en la generación de datos, se hizo necesario desarrollar una serie de herramientas computacionales que permitiesen la gestión y extracción 1 Análisis de datos en Bioinformática Daniel Parras Burgos de la información contenida en los mismos. Fue en este punto donde la Bioinformática comenzó a dar sus primeros pasos. La Bioinformática es, por tanto, la disciplina científica que engloba biología, computación y tecnologías de la información. Según la definición del Centro Nacional para la Información Biotecnológica (NCBI): “El fin último de este campo es facilitar el descubrimiento de nuevas ideas biológicas así como crear perspectivas globales a partir de las cuales se puedan discernir principios unificadores en Biología”. Entre las principales áreas de las que consta la Bioinformática, cabría destacar la del desarrollo de herramientas para el manejo de diversos tipos de información biológica, así como la del desarrollo de nuevos algoritmos y soluciones estadísticas para el análisis de grandes conjuntos de datos. El desarrollo de esta disciplina ha dado lugar, entre otros logros, al avance en la detección precoz y tratamiento de numerosas enfermedades mediante el estudio de la secuencia del ADN y las mutaciones que en ella suceden a partir de la información obtenida de bases de datos de secuencias genéticas, proteínas, mutaciones, etc. y del análisis y búsqueda de patrones en las mismas. Fue así como, por ejemplo, se descubrió que en el cromosoma 17 se encuentra el gen BRCA1, y que un cambio en uno de sus nucleótidos puede provocar cáncer de mama y de ovario. 1.2 El material genético y los genes El material genético El ácido desoxirribonucleico o ADN es la molécula que contiene la información genética utilizada por una célula para la síntesis de proteínas. Éste está constituido por una secuencia formada por la combinación de cuatro bases nitrogenadas diferentes: la adenina (A), la citosina (C), la guanina (G) y la timina (T). El ADN se estructura como una doble hélice con dos cadenas antiparalelas donde hay una complementariedad entre las bases que forman ambas cadenas, de forma que una adenina (A) sólo queda enfrentada con una timina (T) mientras que una citosina (C) sólo queda enfrentada con una guanina (G). Las uniones entre estas dos cadenas se mantienen por los enlaces moleculares que se establecen entre cada par de bases. 2 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 1: Diagrama de una cadena de ADN El ácido ribonucleico o ARN es un ácido nucleico de cadena sencilla compuesto por los nucleótidos adenina (A), citosina (C), guanina (G) y uracilo (U). Los 3 tipos principales de ARN son: mRNA: El ARN mensajero es el que transporta la información genética presente en los genes hasta los ribosomas, en el citoplasma, donde se realiza la traducción de esa información a una proteína. Constituye el molde para la síntesis de proteínas, siendo su secuencia de nucleótidos complementaria al mensaje genético de un segmento de ADN. tRNA: El ARN de transferencia transporta los aminoácidos en forma activa al ribosoma para la formación de enlaces peptídicos a partir de la secuencia codificada por el mRNA molde. rRNA: El ARN ribosómico o ribosomal es el componente principal de los ribosomas. Desempeña un papel tanto catalítico como estructural en la síntesis de proteínas. 3 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 2: Célula eucariota Las principales diferencias entre el ADN y el ARN son: Característica ADN ARN Forma Doble hélice Hélice Nucleótidos Adenina (A), Citosina (C), Adenina (A), Citosina (C), Guanina (G) y Timina (T) Guanina (G) y Uracilo (U) Azúcar Desoxirribosa Ribosa Función Síntesis de proteínas y Asiste al ADN en todas sus replicación funciones 4 Análisis de datos en Bioinformática Daniel Parras Burgos Los genes Los genes son fragmentos del ADN formados por una secuencia de A, C, G y Ts que codifican una molécula (proteína, ARN, etc.) con actividad biológica. Las dos funciones principales de los genes son: Contener la información genética, la cual se va transmitiendo de generación en generación Contener la información responsable de la formación de un organismo y su funcionalidad Una única cadena de ADN contiene miles de genes, cada uno de los cuales sintetiza una proteína concreta. Los seres humanos tienen alrededor de 20.000 genes. Algunos son pequeños, de una longitud de 300 bases mientras que otros pueden tener una longitud de millones. La longitud y secuencia de un gen determina el tamaño y la forma de la proteína que sintetiza, lo que a su vez determina la función que la proteína tendrá dentro del organismo. Figura 3: Diagrama de la síntesis de proteínas Es sabido que alteraciones en la secuencia que codifica los genes puede suponer que la molécula que codifica no funcione bien, pudiendo dar lugar al desarrollo de patologías. Será el estudio de estas alteraciones en forma de polimorfismos de nucleótido simple (SNPs) y variación del número de copias (CNV) las que constituirán el eje de este trabajo. 5 Análisis de datos en Bioinformática Daniel Parras Burgos 1.3 Expresión génica: El dogma central de la biología molecular Francis Crick y James D. Watson descubrieron en 1953 la estructura molecular del ADN. A partir de entonces, Crick comenzó a preguntarse cómo podía el ADN ser portador del código genético y a la vez expresarlo mediante la síntesis de proteínas, teniendo en cuenta que dicho ADN se encontraba dentro del núcleo de la célula mientras que las proteínas eran sintetizadas fuera del mismo. ADN ¿? Proteínas Fue entonces cuando el ARN surgió como el mejor candidato, el cual presentaba una estructura muy similar al ADN y era capaz de desplazarse desde el interior del núcleo al exterior. Por tanto, Crick postuló que el ADN generaba una copia similar de sí mismo, la cual era transportada hacia el citoplasma, donde tenía lugar la síntesis de proteínas. El proceso consiste en tres etapas: Replicación: En primer lugar, el ADN es replicado siguiendo el proceso habitual. Transcripción: Posteriormente, esta hebra es separada para que el ARN polimerasa pueda actuar y sintetizar una hebra complementaria, cambiando la timina por uracilo. Esto da lugar al ARN mensajero, el cual es llevado al citoplasma mientras que la hélice de ADN es cerrada de nuevo. Traducción: Una vez en el citoplasma el ARN se une al ribosoma, el cual lee la secuencia de nucleótidos y une aminoácidos para dar lugar a proteínas. Cada tres nucleótidos de la cadena de ARN forman una unidad funcional denominada codón. Existen 64 codones diferentes, de los que 61 acabarán traduciéndose a un aminoácido determinado mientras que los otros 3 son una señal de que la traducción a proteína ha concluido. Cada uno de estos 61 codones codifican uno de los 20 aminoácidos que componen las proteínas (diferentes codones pueden codificar el mismo aminoácido). El proceso de traducción se da lugar en los ribosomas, los cuales recibirán la molécula de ARN mensajero y leerán de tres en tres los nucleótidos que lo componen, colocando para cada triplete el aminoácido correspondiente. Así, el conjunto de todos los 6 Análisis de datos en Bioinformática Daniel Parras Burgos aminoácidos de una molécula de ARN mensajero traducida derivará en una proteína determinada. Figura 4: Dogma central de la biología molecular (1970) Sin embargo, Howard Temin descubrió años más tarde la transcriptasa inversa, una enzima de tipo ADN-polimerasa cuya función es sintetizar ADN de doble cadena utilizando como molde una molécula de ARN, lo que supuso la modificación del dogma central de la biología molecular. La encima transcriptasa inversa se encuentra presente en los retrovirus. Figura 5: Dogma central de la biología molecular modificado Así, la expresión génica es el medio por el que los organismos transforman la información codificada por los nucleótidos en las proteínas necesarias para su desarrollo y funcionamiento. A excepción de los genes constitutivos, que se expresan en todas las células del organismo y sintetizan proteínas que son indispensables para su funcionamiento general, la expresión de los demás genes depende de la función de la célula en un tejido concreto. Por ejemplo, genes que codifican proteínas responsables del transporte de oxígeno en los músculos se expresan en el tejido muscular pero no en linfocitos, donde se expresan genes responsables de la respuesta inmune. También puede suceder que los diferentes genes que constituyen una célula funcionen o dejen de hacerlo en diferentes momentos de la vida del organismo. 7 Análisis de datos en Bioinformática Daniel Parras Burgos La medición de la expresión génica generalmente se lleva a cabo cuantificando los niveles del producto del gen, que es con frecuencia una proteína. Dicha expresión también puede ser deducida a partir del nivel de ARN mensajero presente en la muestra. Es sabido que variaciones en la expresión génica pueden estar asociadas a ciertas enfermedades, de ahí la importancia de una medición precisa de la misma. Una técnica muy utilizada de medición de la expresión génica que utiliza el ARN mensajero para dicha cuantificación es la denominada transcripción inversa, seguida de la reacción en cadena cuantitativa de la polimerasa (qPCR), que será la empleada en este trabajo y se explicará con detalle más adelante. 1.4 Alteraciones en el material genético: Polimorfismos de nucleótido simple (SNPs) y variación del número de copias (CNV) Polimorfismos de nucleótido simple (SNPs) Un polimorfismo de nucleótido simple o SNP es una variación de un solo nucleótido en el material genético. Al conjunto de 23 cromosomas humanos se le denomina genoma, que a su vez está compuesto por 3000 millones de pares de bases. El cambio de una única base con respecto a la secuencia estándar se llama SNP. Figura 6: Polimorfismo de nucleótido simple 8 Análisis de datos en Bioinformática Daniel Parras Burgos Cuando el cuerpo humano produce nuevas células, generalmente no comete muchos errores, pero en ocasiones, cuando un fragmento del genoma se copia para crear una célula nueva, un par de bases cambia. Ésta es la menor alteración que puede sufrir la secuencia de ADN de un individuo, originándose por el intercambio recíproco de los nucleótidos: adenina, citosina, guanina y timina, lo cual sucede aproximadamente cada 100 a 1000 bases, en cantidad variable y distribución aleatoria a lo largo del genoma humano [1]. Para que una de estas variaciones sea considerada un SNP debe ocurrir en al menos el 1% de la población. Por otro lado, el 90% de la diversidad fenotípica humana, esto es, las características o rasgos observables de un individuo, proviene de las variaciones heredadas en un solo SNP. Es importante tener en cuenta que sólo algunos SNPs están localizados en zonas que codifican proteínas (SNPs codificantes o cSNPs) mientras que la mayoría no. De hecho, sólo del 3 al 5% del ADN humano corresponde a secuencias que codifican, pero constituyen un indicador de suma utilidad para detectar potenciales anomalías génicas. Por tanto, aunque muchos SNPs no tienen efecto sobre la función de la célula, una minoría podría influir en la predisposición a determinadas enfermedades, en la respuesta a bacterias, virus o toxinas e incluso en la respuesta a diferentes drogas y tratamientos. La estabilidad de los SNPs a lo largo de las generaciones los convierte en óptimos para hacer estudios de poblaciones. Por tanto, puesto que los SNPs son mutaciones que pueden afectar al funcionamiento de las moléculas codificadas por los genes en los que se hallan presentes, éstos tienen una relación directa con el desarrollo de ciertas enfermedades, de ahí la importancia de determinar qué SNPs están asociados a las mismas y la necesidad de desarrollar herramientas que permitan el establecimiento de dichas asociaciones. Variación del número de copias (CNV) La variación del número de copias (o CNV por las siglas en inglés de Copy Number Variation) se da cuando el número de copias de un gen en particular cambia de un individuo a otro en determinados segmentos de ADN iguales o mayores a 1 kb de bases. A raíz de las evidencias obtenidas tras la finalización del Proyecto Genoma Humano, se llegó a la conclusión de que el genoma experimenta ganancias y pérdidas de material. También se observó que algunos cánceres están asociados con un número elevado de copias de ciertos genes 9 Análisis de datos en Bioinformática Daniel Parras Burgos y que esta variación del número de copias contribuye al padecimiento de ciertas enfermedades. En el presente trabajo se considerará un número de copias de 2, 1 o ninguna copia. Es importante destacar que tanto la presencia de SNPs como la variación del número de copias puede variar la expresión génica, lo que, como se dijo en el apartado anterior, puede a su vez asociarse al padecimiento de ciertas enfermedades, de ahí la importancia de estudiar la relación existente entre SNP/CNV y patrones de expresión génica. 1.5 El genotipo El genotipo es el conjunto de genes que contiene un organismo heredado de sus progenitores. En humanos, la mitad de los genes se heredan del padre y la otra mitad de la madre. Los genes encargados de la transmisión de los caracteres de la herencia siempre permanecen en el núcleo de la célula, desde donde controlan la síntesis de proteínas. Por tanto, en el núcleo de cada célula se dispone de dos cadenas entrelazadas de ADN, cada una con la información procedente de cada uno de los progenitores. Para obtener el genotipo de una determinada fracción de dichas cadenas, en el lugar de un SNP, por ejemplo, se ha de observar qué nucleótido aporta cada una de ellas en esa posición y en la mitad de la cadena involucrada en la síntesis del ARN mensajero. Figura 7: Ejemplo de genotipo 10 Análisis de datos en Bioinformática Daniel Parras Burgos 1.6 La tecnología de PCR para medir expresión génica y genotipado Introducción En 1983, Kary B. Mullis desarrolló una nueva técnica que hizo posible la síntesis de grandes cantidades de un fragmento de ADN. A esta técnica se le dio el nombre de reacción en cadena de la polimerasa, aunque es más conocida como PCR por sus siglas en inglés. La PCR es un método que permite la amplificación de un fragmento particular de ADN de forma exponencial a través de una repetición de ciclos con fases de diferente duración y a diferentes temperaturas de incubación utilizando una enzima ADN polimerasa termoestable [3,4]. De este modo, se consigue duplicar el material de partida tras cada ciclo, llegando a copiar millones de veces un fragmento de ADN predeterminado por el investigador en un reducido periodo de tiempo. Una de sus principales características es su sensibilidad, pues en principio basta una única molécula para iniciar el proceso de replicación. Además, es muy robusta pues permite emplear productos biológicos diversos, como pueden ser tejidos conservados en parafina, raíces de cabellos, mucosas, sangre, etc. Esta técnica es fundamental para el análisis de datos de expresión génica y genotipado, pues para la obtención de los mismos se requiere una cantidad suficientemente grande de producto biológico que no siempre es de fácil obtención, haciéndose necesario disponer de una técnica que permita su replicación de un modo controlado, robusto y eficiente. ¿Cómo funciona la PCR? La reacción consta generalmente de 35-40 ciclos, cada uno de los cuales se divide en 3 pasos (véase figura 8): Desnaturalización: En primer lugar se comienza con la desnaturalización del ADN, que consiste en la ruptura de los puentes de hidrógeno que une las dos cadenas, sometiendo para ello a la muestra a una temperatura de unos 94ºC durante un minuto. 11 Análisis de datos en Bioinformática Daniel Parras Burgos Alineación del cebador: Seguidamente, se procede a la alineación de las cadenas desnaturalizadas del ADN con los denominados cebadores o primers, que son ADN sintético de hebra sencilla. Este proceso se lleva a cabo a una temperatura de unos 54ºC durante 45 segundos, permitiendo de este modo el apareamiento de dichos primers con las bases nitrogenadas (nucleótidos) complementarias de las cadenas de ADN ya separadas. Extensión del cebador: Por último, el tercer paso se efectúa a 72ºC, que es la temperatura a la que la polimerasa extiende la longitud de los primers, añadiendo los diferentes nucleótidos libres en el orden que le va dictando la secuencia de nucleótidos de la cadena que actúa como molde [5]. El tiempo de extensión depende del tamaño de la amplificación, debiendo tenerse en cuenta que para alargar 1000 nucleótidos se requiere 1 minuto aproximadamente. Figura 8: Esquema de la reacción en cadena de la polimerasa Comportamiento exponencial de la amplificación Una vez concluido el primer ciclo, el proceso se repite de nuevo, pero esta vez partiendo con un número de cadenas de ADN que es el doble de las que se disponían al inicio. De este modo, se va doblando el número de cadenas tras cada ciclo consiguiéndose un crecimiento exponencial. 12 Análisis de datos en Bioinformática Daniel Parras Burgos Teóricamente, tras 20 ciclos se obtendrían aproximadamente un millón de copias del fragmento de ADN inicial; tras 30 ciclos, se obtendrían algo más de mil millones. Sin embargo, en la práctica no se consigue este índice de crecimiento exponencial, quedando supeditada la cantidad final de producto conseguido al número de cadenas de las que se partieron así como al número de ciclos efectuados. Podría pensarse que mediante este método sería posible obtener una cantidad ilimitada de producto tan sólo efectuando de forma indefinida un ciclo tras otro. Sin embargo, al llegar a un número de ciclos alto, puede darse lugar a la amplificación de productos no deseados originados por alineaciones inespecíficas, por lo que es importante evitar que dicho número sea excesivamente elevado. Por regla general, el umbral utilizado es de 35-40 ciclos. Tras los primeros ciclos, la tasa de acumulación de producto se atenúa llegando a una fase meseta, pasándose de un índice de crecimiento exponencial a un índice aritmético hasta que, a partir del ciclo 35-40, se llega a una fase estacionaria. Si bien es cierto que, por lo general, cuando se llega a dicha fase estacionaria, la cantidad de ADN sintetizado es suficiente para su posterior utilización. PCR en tiempo real o qPCR La técnica de la PCR en tiempo real, PCR cuantitativa o simplemente qPCR permite cuantificar la cantidad de ADN generado en tiempo real mediante la utilización de una señal fluorescente que emite la propia sustancia sometida a replicación. Las principales diferencias entre la PCR tradicional y la PCR cuantitativa se muestran en la siguiente tabla: PCR tradicional PCR cuantitativa Medida Al final del proceso En tiempo real Resultado Cualitativo Cuantitativo Sensibilidad Baja Alta La PCR cuantitativa permite detectar en tiempo real la amplificación del fragmento de ADN de interés. Para llevar a cabo dicha detección se recurre a otro fragmento de ADN, denominado 13 Análisis de datos en Bioinformática Daniel Parras Burgos sonda, el cual lleva adherido dos moléculas, una que emite fluorescencia (reporter) y otra que la inhibe (quencher). Figuras 9 y 10: Sonda antes y después de emitir fluorescencia De este modo, la polimerasa irá avanzando completando con nucleótidos libres la cadena de hebra simple hasta alcanzar la sonda. En este momento, la polimerasa romperá dicha sonda sustituyendo los nucleótidos con los que ésta se había unido a la cadena y liberando así la molécula que emite fluorescencia, que quedará fuera del influjo de la molécula que la inhibía. Con cada ciclo, un número cada vez mayor de reporters quedarán libres de modo que, al ser estimulados con la luz de un láser, éstos acabarán emitiendo suficiente fluorescencia como para ser detectada por el fluorómetro del termociclador mientras la reacción de la PCR se está llevando a cabo. El termociclador es la máquina que realiza todo el proceso de la PCR (figura 11). Figura 11: Termociclador de qPCR 7300 De esta manera, si se empieza con una muestra clínica que tenía sólo una copia de ADN, podría tomar 40 ciclos o más antes de que haya suficiente cantidad de replicaciones como para ser detectadas por el fluorómetro. Si la muestra original contenía 32 veces más copias del ADN en 14 Análisis de datos en Bioinformática Daniel Parras Burgos cuestión, entonces la detección ocurriría en 5 ciclos menos de PCR. Del mismo modo, si en la muestra original hubiera 1024 secuencias más de ADN, entonces la señal fluorescente sería detectada 10 ciclos antes. Así, la cantidad de ADN en la muestra clínica es determinada en referencia al ciclo de PCR en la que la curva de fluorescencia cruza el umbral de detección. Por tanto, tras cada ciclo, la fluorescencia emitida crecerá de forma exponencial mientras el termociclador hace lecturas en tiempo real de la misma, suministrando dicha información a la computadora a la que se encuentra conectado. Como se mencionó con anterioridad, tales lecturas se efectúan mediante un láser que estimula los reporters que han quedado libres tras cada replicación, de modo que cuando la fluorescencia emitida es suficientemente intensa, ésta será detectada y registrada. Aplicaciones de la qPCR La PCR en tiempo real es muy utilizada para cuantificar la carga viral en la sangre de pacientes con el VIH, hepatitis B y otros virus. Pero el VIH es un virus de ARN, no tiene ADN, por lo que en estos casos el proceso de replicación sería algo diferente. El ARN del virus se puede cuantificar después de que haya sido copiado y convertido en ADN de doble cadena. Para ello, en primer lugar, el ARN viral es liberado y una cadena de ADN complementario se sintetiza a partir del mismo usando transcriptasa reversa purificada, tal como lo hace en la replicación natural. Después, el ARN inicial es degradado mediante una enzima, dejando únicamente la cadena de hebra simple recién sintetizada. El siguiente paso se produce cuando una polimerasa y un primer generan una cadena de ADN complementario, tal como en la reacción de PCR. Al final de este proceso, el ARN viral de una sola cadena se ha convertido en ADN de doble cadena, que tiene la misma secuencia de bases de nucleótidos, por lo que ahora se podría proceder a la reacción de PCR tal y como se describió en el apartado correspondiente. Entre otras de las aplicaciones que la PCR en tiempo real tiene en medicina cabe destacar: Cuantificación de expresión génica Control de eficacia de fármacos Detección de patógenos Diagnóstico de tumores Discriminación alélica (polimorfismos) 15 Análisis de datos en Bioinformática Daniel Parras Burgos De las cuales, la cuantificación de expresión génica y los polimorfismos ya fueron tratados anteriormente. 16 Análisis de datos en Bioinformática Daniel Parras Burgos 2. Objetivos El principal objetivo de este trabajo es, por una parte, el de la implantación de un flujo de trabajo para el tratamiento y análisis de datos procedentes de qPCR, y por otra el del desarrollo de unas funciones de análisis que sean capaces de integrar datos de genotipado/número de copias y de expresión generados con dicha tecnología. Los objetivos desglosados quedarían como sigue: Estudio de los fundamentos del procesamiento de datos de expresión y genotipado/número de copias obtenidos con la tecnología de qPCR Utilización de libros de R específicos para el análisis de datos de qPCR Desarrollo de una funcionalidad analítica en el entorno estadístico de R para evaluar la asociación de polimorfismos/número de copias y patrones de expresión usando el test Anova Prueba de esta metodología con datos de diferentes proyectos generados en la Unidad de Genómica del Centro Pfizer-Universidad de Granada-Junta de Andalucía de Genómica e Investigación Oncológica (GENYO) 3. Resultados esperados Los resultados esperados tras la realización de este trabajo será el de un flujo de análisis usando diferentes libros de R para el procesamiento de datos de qPCR en el contexto del análisis integrado de datos de genotipado/número de copias y de expresión. Es de esperar llevar a cabo esta implementación a partir de varias funciones de R que permitan el análisis automático de los mismos. La funcionalidad se restringirá al análisis de los datos obtenidos directamente de la máquina de qPCR, procediendo posteriormente a la implementación de la función para la integración y aplicación del test Anova o t-test a los datos de genotipado/número de copias y de expresión así como a la generación de boxplots que permitan visualizar las asociaciones obtenidas. 17 Análisis de datos en Bioinformática Daniel Parras Burgos Esta funcionalidad tendrá una destacada importancia en un paquete de software que se está implementando en la Unidad de Bioinformática de GENYO para análisis de experimentos de qPCR, que incluirá la lectura, preparación de los datos, selección de los genes endógenos más estables para normalizar, normalización y cálculo de , entre otros, y que podrá gestionar la mayoría de formatos de datos de qPCR, además del considerado en el presente trabajo. 18 Análisis de datos en Bioinformática Daniel Parras Burgos 4. Materiales y métodos 4.1 Flujo de trabajo del análisis de expresión diferencial: Método El flujo de trabajo del análisis de expresión diferencial comienza con la obtención de los datos de expresión mediante la tecnología qPCR, que son proporcionados a través de un fichero de texto plano que genera la propia máquina de qPCR. A continuación, ha de crearse el archivo „phenodata‟, en el que se debe especificar qué muestras constituyen casos y qué otras constituyen controles. Seguidamente, se procede a cargar los datos en R mediante una función de lectura específica del libro „ReadqPCR‟ (véase apéndice 7.1.1), la cual creará un objeto de tipo qPCRBatch. Una vez se tienen los datos en el formato adecuado, se obtendrán los genes endógenos más estables mediante el método „geNorm‟, del que hay una función implementada en el libro „NormqPCR‟ (véase apéndice 7.1.2). Esta función proporcionará, además, los gráficos necesarios para decidir el número de genes endógenos que deberán utilizarse en la normalización. Se procederá entonces a la normalización propiamente dicha mediante otra función del libro „NormqPCR‟, que devolverá una matriz con los datos de expresión normalizados de todos los genes para todas las muestras. Para finalizar, se utilizará la función correspondiente del libro „limma‟ (véase apéndice 7.1.3) para obtener los así como los p-valores asociados, y se presentarán los resultados de una forma adecuada. 19 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 12: Flujo de trabajo del análisis de expresión diferencial El método Los dos métodos más utilizados para analizar datos procedentes de la qPCR son la cuantificación absoluta y la cuantificación relativa. La cuantificación absoluta determina el número de copias de entrada, normalmente relacionando la señal PCR con una curva estándar. Ésta debería utilizarse en situaciones en las que fuera necesario determinar el número total de copias obtenidas. Si bien es cierto, en algunas situaciones puede no ser necesaria la obtención de este número total de copias, siendo suficiente determinar el cambio relativo en la expresión del gen. Por ejemplo, puede ser más relevante determinar que la expresión de un determinado gen es 3,2 veces mayor al aplicar cierto tratamiento que obtener que, para dicho tratamiento, la expresión de ese mismo gen se incrementó de 1000 copias a 3200 copias. Por otro lado, la cuantificación de los cambios relativos en la expresión génica utilizando datos procedentes de la qPCR requiere ciertas ecuaciones, consideraciones y la comprobación de estas consideraciones para analizar los datos adecuadamente. De este modo, el método será descrito y posteriormente utilizado para calcular los cambios relativos en la expresión génica a partir de experimentos basados en la qPCR. 20 Análisis de datos en Bioinformática Daniel Parras Burgos Desarrollo del método ¿Qué es el ? En el apartado de la PCR se explicó que las muestras de ADN eran sometidas a una serie de ciclos que constaban de 3 fases de longitud y temperatura variables. Con ello se conseguía doblar la cantidad de producto (cadenas de ADN) tras cada uno de dichos ciclos. Es tarea del investigador establecer el umbral a partir del cual se considera que las muestras emiten suficiente fluorescencia, de modo que un determinado gen se expresará más o menos dependiendo del ciclo en que se alcance dicho umbral. Por ejemplo, en la figura 13 se observa que el gen correspondiente a la curva violeta ha alcanzado el umbral en el ciclo 29, mientras que el correspondiente a la curva roja lo ha hecho en el ciclo 31,5. Esto implica que, en principio, el primero se expresa más que el segundo pues ha alcanzado el umbral de fluorescencia en un ciclo inferior. El es, por tanto, el ciclo en que se alcanza el umbral de fluorescencia establecido por el investigador. Por regla general, si un determinado gen no supera dicho umbral al cabo de 35-40 ciclos (a criterio del investigador), al asociado se le asigna el valor “Undetermined”, o bien el valor del ciclo máximo, por ejemplo, 40, lo que implicará que el gen en cuestión se ha expresado muy poco o no se ha expresado en absoluto. 21 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 13: Curvas de la qPCR Derivación En primer lugar se definirán algunos conceptos a modo de glosario para facilitar la comprensión de lo que sigue. Genes target: Son los genes procedentes tanto de tejidos sanos como de tejidos afectados por la enfermedad bajo estudio Genes endógenos, controles endógenos o housekeeping genes: Son los genes procedentes tanto de tejidos afectados como de tejidos sanos que, por su estabilidad a la hora de expresarse, se emplearán en la normalización de los genes target, haciendo comparables las muestras target y las muestras control Muestras target: Son las muestras procedentes de tejido afectado por la enfermedad bajo estudio Calibradores o muestras control: Son las muestras procedentes de tejido sano. Las muestras target serán comparadas con las muestras control para determinar cuánto más se expresan las primeras con respecto a las segundas 22 Análisis de datos en Bioinformática Daniel Parras Burgos La ecuación que describe la amplificación exponencial de la PCR es , donde es el número de cadenas de ADN alcanzado en el ciclo número de cadenas de ADN inicial, ciclos. El ciclo umbral ( de la reacción, es la eficiencia de la amplificación y es el es el número de ) indica el ciclo y la fracción de ciclo en el que la cantidad de producto ha alcanzado el umbral fijado. Así donde y es el número de cadenas de ADN umbral, es el ciclo umbral de la amplificación es una constante. Por otro lado, se tiene una ecuación similar para la reacción de los genes endógenos (aquellos que se utilizarán para la normalización) donde es el número de cadenas de ADN umbral para dichos genes endógenos, número inicial de cadenas de ADN, umbral de la amplificación y Al dividir entre es la eficiencia de la amplificación, es el es el ciclo es una constante. se obtiene la expresión Utilizando sondas TaqMan (véanse figuras 9 y 10) para la amplificación en tiempo real, los valores exactos de y dependen de varios factores, como pueden ser el tinte utilizado para el reporter, las propiedades de fluorescencia de la sonda, la eficiencia de escisión de la sonda, la pureza de la misma así como el establecimiento del umbral de fluorescencia. Por tanto, la constante no tiene por qué ser igual a 1. Asumiendo que las eficiencias para los genes target y para los genes endógenos son las mismas, se tiene 23 Análisis de datos en Bioinformática donde Daniel Parras Burgos es igual a la cantidad normalizada de los genes target ( )y diferencia en los ciclos umbrales entre los genes target y los genes control ( Despejando es igual a la ). , se obtiene El paso final consiste en dividir de cualquier muestra por el de la muestra control o calibrador (cb): Nótese que . Por tanto, el fold-change (o veces que más se expresa) de un gen target normalizado utilizando genes endógenos con respecto a un calibrador viene dado por la expresión Selección de controles endógenos y calibrador Un control endógeno es un gen cuya expresión se mantiene relativamente constante en las condiciones del experimento (entre diferentes tejidos, durante el tratamiento o estimulación, etc) y que está presente en todos los tipos celulares. Sirve para corregir diferencias de expresión relacionadas con diferencias en la cantidad de ARN total de las muestras. No existe un control endógeno idóneo para todos los tipos de experimentos. Es, por tanto, tarea del investigador decidir qué gen o genes endógenos varían lo menos posible en unas condiciones experimentales determinadas. Es posible que para el mismo tejido pero diferentes condiciones experimentales, el gen endógeno a utilizar deba ser diferente. Entre los controles endógenos más utilizados, se encuentran 24 Análisis de datos en Bioinformática Beta-actina GAPDH Beta-2-microglobulina TATA box binding protein (TBP) Ciclofilina (varios tipos, mejor la ciclofilina B) 18S rRNAs Receptor de transferrina HPRT Ribosomal protein, large PO Phosphoglycerate kinase 2 (PGK2) Factor de elongación 1 alpha β-glucuronidasa Daniel Parras Burgos Al proceso de eliminación de estas variaciones debidas a las condiciones experimentales mediante el uso de genes endógenos se le llama normalización. Una vez normalizada una muestra target y una muestra control (calibrador), estas son comparables entre sí, siendo posible determinar el fold-change asociado. Para la normalización puede disponerse de un único gen endógeno para todas las muestras o de un conjunto de ellos, de los que habría que calcular su expresión media. En este trabajo se va a hacer uso de una tercera opción, la cual consiste en, de entre una lista de genes endógenos, seleccionar aquéllos más estables, procediendo posteriormente a obtener su expresión media. En cuanto al calibrador, éste depende del tipo de experimento de expresión génica a llevar a cabo. El diseño más simple consiste en utilizar un control no tratado (si se están comparando, 25 Análisis de datos en Bioinformática Daniel Parras Burgos por ejemplo, tejidos de pacientes que han sido tratados o no con un determinado fármaco), o bien, un control de tejido sano (si se están comparando tejidos de pacientes con alguna enfermedad con tejidos de pacientes sanos). Será éste último el calibrador a utilizar en el presente trabajo. Utilizando el método , los datos son presentados, por tanto, como el fold-change en la expresión génica normalizada con uno o varios controles endógenos y relativo a un calibrador o muestra control. Para la muestra control, será igual a cero y por tanto será igual a uno, por lo que el fold-change en la expresión génica relativa a la muestra control es igual a uno, por definición. Para la muestra target, la evaluación de indicará el fold-change en la expresión génica relativa a la muestra control. En el ejemplo mostrado en la figura 14, se tiene que la muestra control está constituida por tejido humano procedente del cerebro mientras que la muestra target procede del riñón. La columna c-myc se corresponde con los (número de ciclos de la qPCR hasta que alcanzaron el umbral de fluorescencia establecido) del gen target y la columna GADPH corresponde con los se del control endógeno. Figura 14: Aplicación del método a muestras procedentes de cerebro y riñón Como se observa, en la tercera columna se obtiene el , que resulta de la diferencia entre la primera y la segunda columna. Los valores así obtenidos son los datos normalizados. 26 Análisis de datos en Bioinformática Daniel Parras Burgos A continuación se calcula la media de las 6 muestras de cada tipo de tejido obteniendo un valor de 6,93 para la muestra control así como un valor de 4,47 para la muestra target. Seguidamente se procede a calcular el , que viene a ser la diferencia entre los dos valores anteriores (−2,47). Por último, se calcula , es decir, , obteniendo de este modo el fold-change asociado. Por tanto, se concluiría que el gen c-myc se expresa 5,5 veces más en el tejido procedente del riñón que en el tejido procedente del cerebro. 4.2 Selección de los genes endógenos más estables: Método ‘geNorm’ El libro „NormqPCR‟ consta de una función que realiza la selección de los genes endógenos más estables. Esta función tiene implementado un método que lleva a cabo esta selección, denominado „geNorm‟. Es práctica común entre los investigadores utilizar un único gen endógeno para la normalización, sin embargo, la expresión de dichos genes endógenos puede variar considerablemente llevando a errores relativamente grandes en una proporción significativa de muestras [7]. Para solventar este problema, se calcula la media geométrica de un número determinado de genes endógenos, los cuales han de presentar la mayor estabilidad de entre todos los genes endógenos disponibles. Para precisar qué genes son los que presentan una mayor estabilidad, Vandesompele et al. desarrollaron una medida basada en el principio de que el ratio de expresión de dos controles endógenos ideales es idéntico en todas las muestras, al margen de las condiciones experimentales o el tipo de células. De este modo, en la práctica, la variación en los ratios de expresión de dos genes endógenos refleja el hecho de que uno (o ambos) de dichos genes no se expresa de forma constante, por lo que un incremento en la variación del ratio se corresponde con un decrecimiento en la estabilidad de la expresión. Para llevar a cabo este proceso, se determina la variación (ratio) entre cada par de genes endógenos con todos los demás genes endógenos, calculando a continuación los logaritmos en base 2 de dichos ratios de expresión (1). Seguidamente, se obtiene la desviación estándar de cada (2), para finalmente llegar a la medida M de la estabilidad del control endógeno, que se 27 Análisis de datos en Bioinformática Daniel Parras Burgos define como la media de la variación entre cada par de genes endógenos de un gen endógeno en particular con todos los demás (3). (1) dadas m muestras, para los niveles de expresión de n controles endógenos. (2) (3) Asumiendo que los controles endógenos son no co-regulados, se lleva a cabo un procedimiento iterativo en el que, tras cada iteración, se excluye aquel gen con el mayor valor de M, iniciando una y otra vez el proceso sin considerar los genes excluidos hasta que sólo quedan los dos genes endógenos con un menor valor de M, es decir, con una mayor estabilidad. Posteriormente, se establece un ranking con los genes endógenos ordenados de mayor a menor estabilidad. 4.3 Asociación entre SNP/CNV y patrones de expresión génica Introducción La expresión de un gen puede verse afectada por la presencia de SNPs en su secuencia o por el número de copias del mismo, lo que puede constituir una de las causas por las que se dé lugar al desarrollo de patologías o factores que predispongan a ellas. Siendo la disponibilidad de funciones o software específico para este tipo de análisis muy limitado, el objetivo que se pretende alcanzar en este apartado será el de suplir en parte esta carencia mediante la implementación de una función que lleve a cabo el estudio de dicha asociación. 28 Análisis de datos en Bioinformática Daniel Parras Burgos Metodología Para llevar a cabo un estudio de asociación SNP/CNV y patrones de expresión génica, se consideran dos matrices, una de datos de expresión génica de cierto número de genes, así como una segunda matriz en la que se presentan o bien los polimorfismos de dichos genes con sus genotipos correspondientes (SNPs) o bien los genes con su número de copias (CNV). De esta manera, se lleva a cabo la comparación entre las dos matrices mediante contrastes de hipótesis para evaluar las diferencias significativas entre patrones de expresión en base a genotipos o en base al número de copias. Como ejemplo práctico del procedimiento a llevar a cabo, considérese la figura 15. Los datos de genotipado de cada SNP pueden constar de 3 pares de bases diferentes (SNP 1), 2 pares de bases diferentes (SNP 2), o sólo 1 par. Para el gen 1 y SNP 1, se habrían de agrupar los datos de expresión de cada genotipo según la correspondencia gen y muestra. Es decir: AT: 2,55 , 4,2 , 4,55 y 4,69 AA: 3,56 , 1,8 , 2,11 y 1,1 TT: 4,9 , 1,42 , 0,3 y 2,89 Seguidamente, se procedería a realizar un ANOVA sobre esos grupos para comprobar si existen diferencias significativas entre sus medias, proporcionando el p-valor correspondiente. Para el gen 1 y SNP 2 se procedería de forma análoga, sólo que en esta ocasión habría únicamente dos grupos a comparar, por lo que habría que utilizar un t-test. También pueden darse situaciones en las que sólo hay un genotipo, en cuyo caso no se efectuaría ningún análisis. 29 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 15: Ejemplo de datos de genotipado y de expresión Como se ha visto, puede haber tres categorías como máximo (AA, AT y TT en el SNP 1 del ejemplo) en el caso de los SNPs, al igual que sucede en el caso del número de copias (0, 1 o 2 copias). Es por ello que la función desarrollada en el apartado 5.2.1 puede ser utilizada indistintamente tanto para SNPs como para CNV. 30 Análisis de datos en Bioinformática Daniel Parras Burgos 5. Resultados Dentro de la categoría de resultados, el presente trabajo se divide en dos apartados principales, el relativo al procesado y análisis de datos de qPCR y un segundo apartado relativo al estudio de la asociación entre SNP/CNV y patrones de expresión génica. Si bien la línea de trabajo es la correspondiente a la asociación entre SNP/CNV y patrones de expresión génica, se hace necesario realizar un estudio detallado del análisis de expresión diferencial como paso previo, pues los datos de expresión serán utilizados en el estudio de dicha asociación y habrán de ser tratados con anterioridad. Es por ello que, en primer lugar, se llevará a cabo la carga de los datos de expresión en R, sometiéndolos a un control de calidad para tratar los missing values, para, posteriormente, proceder a su normalización. Los datos resultantes de este proceso constituirán una parte de los datos de entrada requeridos en el estudio de la asociación entre SNP/CNV y patrones de expresión génica. Además, para concluir el análisis de expresión diferencial, se obtendrán los resultados a partir de los datos normalizados. Estos resultados constituirán un elemento clave para los investigadores a la hora de decidir qué genes pueden tener una mayor implicación en el desarrollo de determinadas patologías. 31 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 16: Diagrama simplificado del flujo de trabajo 5.1 Implementación de funciones en R para procesado y análisis de datos de qPCR 5.1.1 Carga de datos Como ya se mencionó en el flujo de trabajo del análisis de expresión diferencial, los ficheros de texto plano con los datos de expresión son proporcionados por la máquina que efectúa la qPCR. En este caso concreto, han sido proporcionados dos ficheros de texto plano de longitud idéntica (figuras 17 y 18), cada uno de los cuales contiene 12 muestras. Se dispone de muestras target, con la cadena “CIRUGÍA” en su identificador, y de muestras control, con la cadena “CONTROL” en su identificador. Cada una de las muestras contiene los datos de expresión de 224 genes (target y endógenos). Las columnas relevantes en el análisis a realizar son: 32 Análisis de datos en Bioinformática Sample Name: Relativa a las muestras (cirugía o control) Target Name: Relativa a los genes bajo estudio Type: Relativa al tipo de genes (target o endógenos) Ct: Relativa a la expresión génica (ciclo umbral) Daniel Parras Burgos Figura 17: Principio del fichero NLY26v2 33 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 18: Final del fichero NMV13v2 Reordenando los datos de ambos ficheros, la configuración de los mismos sería: Fichero NLY26v2 Gen 1 3d_CONTROL_1_t3 Gen 2 … Gen 223 Gen 224 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 12d_CONTROL_1_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 3d_CONTROL_2_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 12d_CONTROL_2_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 3d_CONTROL_3_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 12d_CONTROL_3_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 3d_CIRUGIA_1_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 12d_CIRUGIA_1_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 3d_CIRUGIA_2_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 12d_CIRUGIA_2_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 3d_CIRUGIA_3_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 12d_CIRUGIA_3_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 34 Análisis de datos en Bioinformática Daniel Parras Burgos Fichero NMV13v2 Gen 1 Gen 2 … Gen 223 Gen 224 1d_CONTROL_1_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 7d_CONTROL_1_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 1d_CONTROL_2_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 7d_CONTROL_2_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 1d_CONTROL_3_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 7d_CONTROL_3_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 1d_CIRUGIA_1_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 7d_CIRUGIA_1_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 1d_CIRUGIA_2_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 7d_CIRUGIA_2_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 1d_CIRUGIA_3_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 7d_CIRUGIA_3_t3 Rn00562020_m1 Rn00564115_m1 … Rn00821155_g1 Rn00821325_g1 Donde unos genes son tipo target y otros son tipo control o endógenos, todos ellos con su correspondiente . Como paso previo a la entrada de datos en R, se habrían de eliminar manualmente las primeras filas (de la 1 a la 19) así como las últimas (de la 3093 a la 3097) de ambos archivos, pues se trata de información relativa al experimento proporcionada por la máquina de qPCR que carece de utilidad aquí. Nótese que las referencias seguidas del símbolo # hacen alusión al código integrado en cinco funciones que pueden ser consultadas en el anexo 1. En primer lugar se procede a la carga de datos en R. Se ha contemplado la posibilidad de que sea proporcionado un único fichero de datos de expresión. También se han unido los datos de los dos ficheros en un solo data.frame tras seleccionar las cuatro columnas de interés, que posteriormente han sido renombradas, tres de ellas de acuerdo al criterio de lectura de datos del libro „ReadqPCR‟ (Sample, Detector y Cq). #Lectura de datos del fichero NLY26v2.txt #Selección de columnas del fichero NLY26v2.txt #Lectura de datos del fichero NMV13v2.txt 35 Análisis de datos en Bioinformática Daniel Parras Burgos #Selección de columnas del fichero NMV13v2.txt #Unión de los dos ficheros #Renombrado de columnas Los datos cargados quedan, por tanto, como sigue: Sample … Detector … Type … Cq … 6096 7d_CIRUGIA_3_t3 Rn01525670_m1 Target Undetermined 6097 7d_CIRUGIA_3_t3 Rn01483978_m1 Target Undetermined 6098 7d_CIRUGIA_3_t3 Rn00573260_m1 Target 22.607 6099 7d_CIRUGIA_3_t3 Rn00563499_m1 Target 26.295 6100 7d_CIRUGIA_3_t3 Target 25.662 6101 7d_CIRUGIA_3_t3 Rn00560865_m1 Endogenous Control 19.501 6102 7d_CIRUGIA_3_t3 Rn00572482_m1 Target 27.264 6103 7d_CIRUGIA_3_t3 Target 23.466 6104 7d_CIRUGIA_3_t3 Rn00667869_m1 Endogenous Control 19.493 … Rn00570857_s1 Rn00585470_s1 … … … Como ya se mencionó, es necesario crear un archivo denominado „phenoData‟ (figura 19) en el que se especifique qué muestras constituyen casos (codificación 1) y qué muestras constituyen controles (codificación 0). Además, se ha de proporcionar un identificador para cada muestra (columna Class). Figura 19: Archivo „phenoData‟ 36 Análisis de datos en Bioinformática Daniel Parras Burgos Para la entrada de estos datos en R, se utiliza la misma función que con los datos de expresión. #Lectura y ordenación del archivo ‘phenoData’ Sample Class Type X12d_CIRUGIA_1_t3 X12d_CIRUGIA_1_t3 12d_CIRUGIA 1 X12d_CIRUGIA_2_t3 X12d_CIRUGIA_2_t3 12d_CIRUGIA 1 X12d_CIRUGIA_3_t3 X12d_CIRUGIA_3_t3 12d_CIRUGIA 1 X12d_CONTROL_1_t3 X12d_CONTROL_1_t3 12d_CONTROL 0 X12d_CONTROL_2_t3 X12d_CONTROL_2_t3 12d_CONTROL 0 X12d_CONTROL_3_t3 X12d_CONTROL_3_t3 12d_CONTROL 0 X1d_CIRUGIA_1_t3 X1d_CIRUGIA_1_t3 1d_CIRUGIA 1 X1d_CIRUGIA_2_t3 X1d_CIRUGIA_2_t3 1d_CIRUGIA 1 X1d_CIRUGIA_3_t3 X1d_CIRUGIA_3_t3 1d_CIRUGIA 1 X1d_CONTROL_1_t3 X1d_CONTROL_1_t3 1d_CONTROL 0 X1d_CONTROL_2_t3 X1d_CONTROL_2_t3 1d_CONTROL 0 X1d_CONTROL_3_t3 X1d_CONTROL_3_t3 1d_CONTROL 0 X3d_CIRUGIA_1_t3 X3d_CIRUGIA_1_t3 3d_CIRUGIA 1 X3d_CIRUGIA_2_t3 X3d_CIRUGIA_2_t3 3d_CIRUGIA 1 X3d_CIRUGIA_3_t3 X3d_CIRUGIA_3_t3 3d_CIRUGIA 1 X3d_CONTROL_1_t3 X3d_CONTROL_1_t3 3d_CONTROL 0 X3d_CONTROL_2_t3 X3d_CONTROL_2_t3 3d_CONTROL 0 X3d_CONTROL_3_t3 X3d_CONTROL_3_t3 3d_CONTROL 0 X7d_CIRUGIA_1_t3 X7d_CIRUGIA_1_t3 7d_CIRUGIA 1 X7d_CIRUGIA_2_t3 X7d_CIRUGIA_2_t3 7d_CIRUGIA 1 X7d_CIRUGIA_3_t3 X7d_CIRUGIA_3_t3 7d_CIRUGIA 1 X7d_CONTROL_1_t3 X7d_CONTROL_1_t3 7d_CONTROL 0 X7d_CONTROL_2_t3 X7d_CONTROL_2_t3 7d_CONTROL 0 X7d_CONTROL_3_t3 X7d_CONTROL_3_t3 7d_CONTROL 0 5.1.2 Preparación de los datos Los ficheros de datos de expresión presentan algunas filas con el campo Detector (relativo a los genes) en blanco (véase figura 18), situación que se presenta cuando las placas utilizadas para realizar la qPCR se han dejado con algunos pocillos vacíos. Dichas filas han de ser eliminadas. 37 Análisis de datos en Bioinformática Daniel Parras Burgos Otro de los criterios de lectura de datos del libro „ReadqPCR‟ es la ausencia de espacios en sus campos, por lo que éstos son eliminados de la única cadena en la que se hallan presentes: Endogenous control. Por último, se sustituyen los valores Undetermined, que como se recordará, corresponden a genes que se han expresado muy poco o que no se han expresado en absoluto, por el valor NA, para que puedan ser interpretados por la función correspondiente del libro „ReadqPCR‟. #Eliminación de filas con campo vacío en genes #Eliminación de espacio en ‘Endogenous Control’ #Cambio de ‘Undetermined’ por valor NA Sample … Detector … Type … Cq … 6096 7d_CIRUGIA_3_t3 Rn01525670_m1 Target NA 6097 7d_CIRUGIA_3_t3 Rn01483978_m1 Target NA 6098 7d_CIRUGIA_3_t3 Rn00573260_m1 Target 22.607 6099 7d_CIRUGIA_3_t3 Rn00563499_m1 Target 26.295 6100 7d_CIRUGIA_3_t3 Target 25.662 6101 7d_CIRUGIA_3_t3 Rn00560865_m1 EndogenousControl 19.501 6102 7d_CIRUGIA_3_t3 Rn00572482_m1 Target 27.264 6103 7d_CIRUGIA_3_t3 Target 23.466 6104 7d_CIRUGIA_3_t3 Rn00667869_m1 EndogenousControl 19.493 … Rn00570857_s1 Rn00585470_s1 … … … Creación de objetos de tipo ‘qPCRBatch’ Un objeto de tipo qPCRBatch pertenece a la clase S4 y ha sido diseñado para almacenar información de valores crudos relativos a la información génica procedente de diferentes muestras, así como información fenotípica de las mismas. La función de lectura read.qPCR del libro ReadqPCR permite crear un objeto de tipo qPCRBatch. Para ello, el fichero de datos de entrada debe contener las columnas que se muestran a continuación y una separación entre campos utilizando tabulación. Las dos primeras columnas son opcionales, y deben ser proporcionadas juntas o no ser proporcionadas. 38 Análisis de datos en Bioinformática Daniel Parras Burgos Well: Relativa al pocillo, representa la posición del gen en la placa. Si esta información es dada, será utilizada para comprobar que las placas son del mismo tamaño, así como para hacer representaciones gráficas con el objeto de detectar efectos espaciales o problemas de otro tipo. Plate: Se trata de un identificador de la placa en la que el experimento o parte del experimento ha sido llevado a cabo. La información del identificador de la placa y del pocillo debe ser proporcionada junta con identificadores únicos, es decir, no puede tenerse la información de una placa y de un determinado pocillo más de una vez (salvo en el caso de replicados técnicos). Sample: Es la muestra analizada. Cada muestra debe contener los mismos genes con el objeto de combinar y comparar muestras de forma efectiva además de formar una matriz válida de datos de expresión. Detector: Es el identificador del gen bajo estudio. Los genes deben ser idénticos en cada muestra. Cq: Es el valor del ciclo umbral ( ) de un determinado gen en una muestra concreta. En referencia a las columnas opcionales well y plate, éstas no han podido ser incluidas, pues los ficheros de datos proporcionados (véanse figuras 17 y 18) no contenían la columna plate. Continuando con el flujo de trabajo, se crea un archivo con los datos de expresión preparados para ser utilizado como uno de los argumentos de entrada de la función de lectura. #Creación de nuevo fichero de datos para lectura desde libro ‘ReadqPCR’ Es en este momento cuando puede procederse a la creación del objeto de tipo qPCRBatch utilizando como argumento el archivo recién creado qPCR.txt y el archivo phenoData.txt. Este objeto contiene los datos en una estructura reconocible por las funciones del libro „NormqPCR‟ que se utilizarán un poco más adelante, de ahí su importancia. #Lectura de datos desde libro ‘ReadqPCR’ 39 Análisis de datos en Bioinformática Daniel Parras Burgos Se muestra a continuación un resumen de la información contenida en el objeto de tipo qPCRBatch que acaba de crearse. Como se observa, se dispone de un total de 224 genes y 24 muestras. qPCRBatch (storageMode: lockedEnvironment) assayData: 224 features, 24 samples element names: exprs protocolData: none phenoData sampleNames: X12d_CIRUGIA_1_t3 X12d_CIRUGIA_2_t3 ... X7d_CONTROL_3_t3 (24 total) varLabels: Sample Class Type varMetadata: labelDescription featureData: none experimentData: use 'experimentData(object)' Annotation: También es posible acceder a dicha información mediante la orden correspondiente. Se muestra un fragmento de los datos relativos a la expresión de los genes en las distintas muestras. X12d_CIRUGIA_1_t3 X12d_CIRUGIA_2_t3 X12d_CIRUGIA_3_t3 Rn00432087_m1 28.030 27.674 27.864 Rn00432095_m1 30.374 30.449 NA Rn00439932_m1 26.766 25.245 25.505 Rn00487426_g1 26.713 25.984 25.785 Rn00488400_m1 NA NA 31.025 Rn00516184_m1 26.176 25.404 25.604 Rn00560714_m1 29.766 28.822 30.912 Rn00560865_m1 21.418 20.226 19.905 Rn00561129_m1 NA 28.983 NA Rn00561138_m1 25.920 26.663 25.024 Rn00561423_m1 28.877 28.369 27.932 … … … … Como se observa, hay presentes algunos genes sin un valor en su expresión. El investigador habrá de asignar a estos genes un valor (que generalmente oscilará entre 35-40), indicando de 40 Análisis de datos en Bioinformática Daniel Parras Burgos este modo que su expresión es muy baja ya que no llegaron al umbral de fluorescencia en un número suficientemente bajo de ciclos. Para ello se utiliza la función replaceNAs. Se ha contemplado también la existencia de replicados técnicos (varios datos de expresión para un mismo gen y muestra) para los que existe una función, combineTechReps, que calcula la media aritmética de sus valores, aunque no será necesaria su utilización con los datos en los que se basa esta parte del trabajo. Estas dos funciones, replaceNAs(qPCRBatch, ...) y combineTechReps(qPCRBatch, ...), pertenecen al libro „NormqPCR‟ (véase apéndice correspondiente). #Cambio de NAs a un valor numérico en qPCRBatch #Combinación de replicados técnicos mediante media aritmética Por otro lado, es necesario crear otro objeto de tipo qPCRBatch relativo únicamente a los genes endógenos. Éste será necesario para la selección de los genes endógenos más estables mediante la función correspondiente del libro ‘NormqPCR’. Desafortunadamente, el libro ‘ReadqPCR’ no proporciona ninguna función que realice este paso de forma automática, por lo que se hará a partir de unas órdenes específicas que, a partir de los datos cargados en R ya preparados, obtienen un subconjunto de todos los genes endógenos mediante la selección de aquellas filas con la cadena EndogenousControl en la columa Type. #Selección de genes endógenos para creación de objeto qPCRBatch Por último, se crea un data.frame con las columnas requeridas para la creación del objeto de tipo qPCRBatch (Sample, Detector y Cq) a partir de los datos seleccionados anteriormente. Al igual que antes, se crea un archivo con los datos de expresión preparados y se procede a la creación del nuevo objeto. En esta ocasión no es necesario utilizar un archivo „phenoData‟. #Creación de data.frame con los datos de genes endógenos #Creación de nuevo fichero de datos de controles endógenos para lectura desde libro ‘ReadqPCR’ #Lectura de datos desde libro ‘ReadqPCR’ Los datos así cargados tienen el siguiente aspecto: 41 Análisis de datos en Bioinformática … … … Daniel Parras Burgos … … … Muestra_14 Muestra_15 Muestra_16 Muestra_17 Muestra_18 Rn00560865_m1 24.139 23.874 21.493 20.404 21.552 Rn00584431_g1 25.043 25.508 23.471 22.440 23.756 Rn00590475_m1 24.922 26.484 24.095 23.314 24.095 Rn00667869_m1 21.836 22.503 20.689 19.753 21.384 Rn00820751_g1 40.000 22.678 22.025 22.159 22.364 Rn00835638_m1 26.851 27.806 26.077 25.799 25.718 Rn01418995_g1 24.414 24.579 24.391 23.576 24.282 Rn01455646_m1 27.908 30.164 27.793 25.755 27.530 Rn01474008_gH 25.990 25.802 25.021 25.867 26.225 Rn01474701_m1 40.000 40.000 31.521 28.168 29.749 Rn01511686_g1 24.765 25.072 23.212 21.784 22.786 Rn01527840_m1 24.585 24.479 23.383 23.467 23.894 Rn01775763_g1 18.628 18.913 18.812 19.458 19.804 … … … … … … Por tanto, una vez finalizado este proceso, se dispone de dos objetos de tipo qPCRBatch, uno para todos los datos de expresión y otro únicamente para los datos de expresión de genes endógenos. 5.1.3 Selección de los genes endógenos más estables Se lleva a cabo a continuación lo expuesto en el apartado 4.2 de Materiales y métodos. Para ello, se emplea la función selectHKs(qPCRBatch, ...) del libro „NormqPCR‟ para obtener los genes endógenos más estables a partir del método „geNorm‟. La salida de esta función se emplea para crear un listado en formato data.frame ordenado por estabilidad de los 13 genes endógenos presentes en los datos. #Elección de genes más estables para normalización (geNorm) rank Muestra 1 1 Rn00835638_m1 2 1 Rn01527840_m1 3 2 Rn01418995_g1 42 Análisis de datos en Bioinformática 4 3 Rn00590475_m1 5 4 Rn01455646_m1 6 5 Rn01474008_gH 7 6 Rn00560865_m1 8 7 Rn01775763_g1 9 8 Rn00584431_g1 10 9 Rn01474701_m1 Daniel Parras Burgos 11 10 Rn00820751_g1 12 11 Rn00667869_m1 13 12 Rn01511686_g1 Ahora que se dispone de los genes endógenos ordenados por estabilidad, se ha de proceder a determinar el número de ellos que es necesario utilizar para calcular la media que finalmente se utilizará en la normalización. Para ello, se recurre a dos gráficas. La primera muestra la media de la estabilidad en la expresión (M) de los controles endógenos tras cada eliminación sucesiva del gen endógeno más inestable. #Gráfico "Estabilidad en la expresión (M)" Como se puede ver en la figura 20, tras la eliminación de los 6 o 7 primeros controles endógenos más inestables, el valor de M se estabiliza. Esta gráfica es útil para observar cómo afectan los controles endógenos más inestables a la estabilidad en conjunto de todos ellos cuando están presentes. 43 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 20: Estabilidad en la expresión (M) Sin embargo, se necesita un criterio más objetivo a la hora de determinar cuántos de los controles endógenos más estables son necesarios para la normalización. Para ello, se obtiene una segunda gráfica (figura 21) que muestra la variación de los controles endógenos (V) para un número diferente de los controles endógenos más estables. #Gráfico "Variación de los controles endógenos (V)" Ésta ha de interpretarse de derecha a izquierda. Como se observa, con los 4/5 o 5/6 primeros controles endógenos más estables se obtiene la menor variación posible en la estabilidad. Sin embargo, los autores de este método (Vandesompele et al.) establecen un valor límite de 0,15 por debajo del cual la inclusión de un control endógeno adicional para la normalización no es necesaria. Por tanto, en este caso sería suficiente con utilizar los 2 o 3 controles endógenos más estables para normalizar, ya que su variación asociada (la columna más a la derecha) se encuentra por debajo de dicho valor límite de 0,15. 44 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 21: Variación de los controles endógenos (V) 45 Análisis de datos en Bioinformática Daniel Parras Burgos 5.1.4 Normalización: Cálculo de Tras la aplicación del método „geNorm‟, se ha obtenido que es suficiente con utilizar los 2/3 genes endógenos más estables. Estos se corresponden con los identificadores: Rn00835638_m1 Rn01527840_m1 Rn01418995_g1 Ahora, es posible proceder a la normalización de todos los genes mediante una función a la que hay que proporcionar el objeto de tipo qPCRBatch con todos los genes, una lista con los controles endógenos previamente seleccionados y el tipo de media que se aplicará a los mismos. De este modo, se obtendrá un pseudo-control endógeno en cada muestra que se sustraerá a los valores de expresión de todos los genes de la muestra. Este proceso se llevará a cabo en las 24 muestras, completando así la normalización. #Función para normalización Por comodidad, se ofrece la posibilidad de indicar un número entero para que se seleccionen automáticamente los n primeros controles endógenos más estables del ranking en lugar de tener que introducir manualmente sus identificadores. #Normalización utilizando los n primeros genes de ranks o los genes indicados Finalmente, se obtiene un objeto de tipo qPCRBatch, a cuya matriz con todos los genes normalizados se accede mediante la orden exprs. Se muestra a continuación un fragmento de dicha matriz, con los 6 primeros genes normalizados ( X12d_CIRUGIA_1_t3 X12d_CIRUGIA_2_t3 ) de las 6 primeras muestras. X12d_CIRUGIA_3_t3 Rn00432087_m1 2.888603 2.9839834 3.766936 Rn00432095_m1 5.232603 5.7589834 15.902936 Rn00439932_m1 1.624603 0.5549834 1.407936 46 Análisis de datos en Bioinformática Daniel Parras Burgos Rn00487426_g1 1.571603 1.2939834 1.687936 Rn00488400_m1 14.858603 15.3099834 6.927936 Rn00516184_m1 1.034603 0.7139834 1.506936 X12d_CONTROL_1_t3 X12d_CONTROL_2_t3 X12d_CONTROL_3_t3 Rn00432087_m1 3.3893824 3.4328887 2.9316995 Rn00432095_m1 14.5103824 15.3668887 4.7076995 Rn00439932_m1 0.5693824 0.4518887 0.7736995 Rn00487426_g1 1.2763824 0.8418887 0.7386995 Rn00488400_m1 14.5103824 6.0928887 5.6726995 Rn00516184_m1 0.8353824 1.4158887 1.1826995 … … … … 5.1.5 Cálculo de El primer paso consiste en crear una matriz de contraste donde se especifique qué muestras representan casos y qué muestras controles. Esta matriz se obtiene a partir del archivo „phenoData‟, donde está contenida dicha información. #Creación de la matriz de contraste CONTROL CASO X12d_CIRUGIA_1_t3 0 1 X12d_CIRUGIA_2_t3 0 1 X12d_CIRUGIA_3_t3 0 1 X12d_CONTROL_1_t3 1 0 X12d_CONTROL_2_t3 1 0 X12d_CONTROL_3_t3 1 0 X1d_CIRUGIA_1_t3 0 1 X1d_CIRUGIA_2_t3 0 1 X1d_CIRUGIA_3_t3 0 1 X1d_CONTROL_1_t3 1 0 X1d_CONTROL_2_t3 1 0 X1d_CONTROL_3_t3 1 0 X3d_CIRUGIA_1_t3 0 1 X3d_CIRUGIA_2_t3 0 1 X3d_CIRUGIA_3_t3 0 1 47 Análisis de datos en Bioinformática X3d_CONTROL_1_t3 1 0 X3d_CONTROL_2_t3 1 0 X3d_CONTROL_3_t3 1 0 X7d_CIRUGIA_1_t3 0 1 X7d_CIRUGIA_2_t3 0 1 X7d_CIRUGIA_3_t3 0 1 X7d_CONTROL_1_t3 1 0 X7d_CONTROL_2_t3 1 0 X7d_CONTROL_3_t3 1 0 Daniel Parras Burgos Seguidamente, se utilizan las cinco funciones del libro „limma‟ descritas en el apéndice 7.1.3 para crear un archivo con los coeficientes ( ) que se utilizarán para obtener el fold-change de cada gen, así como con los resultados de los test estadísticos efectuados para comprobar la significación de los mismos. #Obtención de los ddCt y los p-values asociados Para la obtención de los coeficientes, la función constrasts.fit resta internamente la media de los valores de expresión normalizados de los genes de las muestras control a la de las muestras target. Como ejemplo, se obtendrá el coeficiente del primero de los 224 genes del estudio („Rn00432087_m1‟). Para ello, se dispone de todos los valores de expresión normalizados para este gen. La media de los valores de expresión en las muestras target (en morado) es 2,4194, mientras que la media de los valores de expresión en las muestras control (en naranja) es 4,0538. Al calcular la diferencia entre el primero y el segundo resulta el valor final del , −1,6344. coeficiente X12d_CIRUGIA_1_t3 X12d_CIRUGIA_2_t3 X12d_ CIRUGIA_3_t3 Rn00432087_m1 2.888603 2.9839834 3.766936 X12d_CONTROL_1_t3 X12d_CONTROL_2_t3 X12d_CONTROL_3_t3 Rn00432087_m1 3.3893824 3.4328887 2.9316995 X1d_CIRUGIA_1_t3 X1d_CIRUGIA_2_t3 X1d_CIRUGIA_3_t3 2.4175078 1.879207 X1d_CONTROL_1_t3 X1d_CONTROL_2_t3 X1d_CONTROL_3_t3 Rn00432087_m1 Rn00432087_m1 1.8528733 3.008944 14.424029 2.817641 48 Análisis de datos en Bioinformática X3d_CIRUGIA_1_t3 Rn00432087_m1 Daniel Parras Burgos X3d_CIRUGIA_2_t3 X3d_CIRUGIA_3_t3 1.8004297 2.4640726 1.393864 X3d_CONTROL_1_t3 X3d_CONTROL_2_t3 X3d_CONTROL_3_t3 Rn00432087_m1 1.44562 3.4791614 1.549276 X7d_CIRUGIA_1_t3 X7d_CIRUGIA_2_t3 X7d_CIRUGIA_3_t3 1.9880263 3.2601177 X7d_CONTROL_1_t3 X7d_CONTROL_2_t3 X7d_CONTROL_3_t3 Rn00432087_m1 Rn00432087_m1 2.3376187 5.2575898 3.312888 3.596014 Efectivamente, se comprueba en la tabla mostrada a continuación que el valor obtenido coincide con el proporcionado por las funciones del libro „limma‟. Esta tabla muestra la siguiente información para cada uno de los genes del estudio: A: Media de todos los valores de expresión del gen en cuestión Coef: Coeficiente t: Estadístico t-Student p.value: p-valor asociado al estadístico t-Student p.value.adj: p-valor asociado al método “BH” de Benjamini y Hochberg, más conservador que el anterior F: Estadístico F de Snedecor F.p.value: p-valor asociado al estadístico F de Snedecor A Coef t p.value p.value.adj F F.p.value 1 3.24 -1.634 -1.67 0.10757 0.156322 2.80 0.10757 2 10.21 -2.734 -1.47 0.15465 0.202783 2.16 0.15465 3 1.53 -0.018 -0.04 0.96744 0.967444 0.00 0.96744 4 1.28 -1.178 -3.03 0.00580 0.030370 9.20 0.00580 5 11.05 -1.381 -0.74 0.46732 0.526024 0.55 0.46732 6 1.21 -0.670 -2.59 0.01606 0.047956 6.73 0.01606 49 Análisis de datos en Bioinformática Daniel Parras Burgos De estos datos, serán de interés únicamente los relativos al coeficiente , al p-valor asociado al estadístico t-Student y al p-valor asociado al método “BH” de Benjamini y Hochberg. Para finalizar, se recoge la información de interés en una única tabla en la que cada gen aparece acompañado de su (fold-change), p-valor asociado al estadístico t-Student y p-valor asociado al método “BH”. Siguiendo con el ejemplo del primer gen, su fold-change se calcula simplemente con la operación , lo que implica que dicho gen se expresa aproximadamente 3 veces más en las muestras target que en las muestras control. En relación a los p-valores asociados, estos indican que los contrastes han resultado no significativos, por lo que este gen no será, en principio, considerado por el investigador. #Obtención de la tabla de resultados con los 2^-ddCt y los p-values Gene_ID Fold_Change p-value p-value_adj. 1 Rn00432087_m1 3.103723 0.10757 0.156322 2 Rn00432095_m1 6.652977 0.15465 0.202783 3 Rn00439932_m1 1.012555 0.96744 0.967444 4 Rn00487426_g1 2.262629 0.00580 0.030370 5 Rn00488400_m1 2.604488 0.46732 0.526024 6 Rn00516184_m1 1.591073 0.01606 0.047956 Por último, para facilitar la búsqueda de los genes que más se expresan, se reordena la tabla anterior de mayor a menor fold-change. #Reordenación de la tabla de resultados Gene_ID Fold_Change p-value p-value_adj. 68 Rn00578115_m1 76.74495448 0.00022 0.017730 92 Rn00585310_m1 56.57136199 0.01282 0.043504 50 Rn00569848_m1 33.66085693 0.00194 0.020900 133 Rn01410330_m1 30.48441594 0.00759 0.034743 183 Rn01507680_g1 28.68053439 0.00357 0.023660 … 102 Rn00596271_s1 … … … 0.37814200 0.06975 0.121263 50 Análisis de datos en Bioinformática Daniel Parras Burgos 224 Rn03993554_g1 0.32737136 0.02105 0.056631 128 Rn01286286_g1 0.15636614 0.13780 0.186141 26 Rn00563924_m1 0.11195571 0.09711 0.148997 162 Rn01470643_m1 0.07100183 0.01188 0.042240 5.1.6 El problema de los Undetermined Como ya se ha comentado anteriormente, cuando un gen se expresa muy poco o bien no se expresa, se le asigna el valor Undetermined a su expresión. Sin embargo, un valor Undetermined también puede significar que la máquina de qPCR no ha podido medir dicha expresión. Aunque una de las pautas de actuación es sustituir dichos valores por uno numérico a elección del investigador (que ha sido la táctica aquí empleada), esta forma de actuar puede suponer un problema y llevar a conclusiones inexactas en determinadas situaciones. Para ilustrarlo, considérese el caso hipotético en que los siguientes valores correspondiesen a los valores de expresión sin normalizar del primer gen. Considérese también que a los valores Undetermined se les asignase un valor de 40 y que tras la normalización, los valores de expresión de todas las muestras experimentasen el mismo grado de variación. En este escenario, la media obtenida para las muestras target sería considerablemente más baja que la obtenida para las muestras control, lo que implicaría que dicho gen se estaría expresando mucho más en las primeras con respecto a las segundas (fold-change muy alto). Si dichos valores Undetermined se deben a que no fue posible medir su expresión, entonces se estaría proporcionando un resultado que probablemente no se corresponde con la realidad. X12d_CIRUGIA_1_t3 Rn00432087_m1 28.030 X12d_CIRUGIA_2_t3 X12d_CIRUGIA_3_t3 27.674 27.864 X12d_CONTROL_1_t3 X12d_CONTROL_2_t3 X12d_CONTROL_3_t3 Rn00432087_m1 Undetermined Undetermined Undetermined X1d_CIRUGIA_1_t3 X1d_CIRUGIA_2_t3 X1d_CIRUGIA_3_t3 27.528 26.122 Rn00432087_m1 26.276 X1d_CONTROL_1_t3 Rn00432087_m1 X1d_CONTROL_2_t3 X1d_CONTROL_3_t3 29.625 Undetermined 27.075 X3d_CIRUGIA_1_t3 X3d_CIRUGIA_2_t3 X3d_CIRUGIA_3_t3 26.732 27.834 X3d_CONTROL_1_t3 X3d_CONTROL_2_t3 X3d_CONTROL_3_t3 Rn00432087_m1 24.762 51 Análisis de datos en Bioinformática Daniel Parras Burgos Rn00432087_m1 Undetermined Undetermined 26.566 X7d_CIRUGIA_1_t3 X7d_CIRUGIA_2_t3 X7d_CIRUGIA_3_t3 25.504 27.753 Rn00432087_m1 27.451 X7d_CONTROL_1_t3 X7d_CONTROL_2_t3 X7d_CONTROL_3_t3 Rn00432087_m1 Undetermined Undetermined Undetermined Desafortunadamente, éste es un problema de difícil solución, pues no es posible determinar el motivo por el que al valor de expresión de un gen se le asignó la etiqueta Undetermined. Sin embargo, es posible proporcionar al investigador, para cada gen, el porcentaje de muestras que presentan este valor, de modo que, si dicho porcentaje es lo suficientemente alto, el gen en cuestión pueda ser descartado como de interés, aunque se haya obtenido para él un fold-change alto y un p-valor inferior a 0,05. En esta línea y para comodidad del investigador a la hora de evaluar los resultados, se ha decidido que sea éste quien introduzca un valor en forma de tanto por ciento de modo que, si el porcentaje de Undetermined de las muestras target o de las muestras control lo superan, se marcará al gen en cuestión con un flag. Así, de un solo vistazo, será posible determinar qué genes cumplen con el requisito impuesto por el investigador. #Flags cuando se alcanza un porcentaje mínimo de NAs Se trata de un procedimiento sencillo en el que, para cada gen, se realiza un conteo de Undetermined (tras haber sido convertidos a NA), diferenciando entre muestras target y muestras control. Posteriormente, se comprueba si el porcentaje de Undetermined de alguno de de esos grupos supera el valor establecido por el investigador, almacenando los flags en un vector que se añadirá a los resultados de expresión diferencial. Por tanto, para un porcentaje máximo del, por ejemplo, 50% de Undetermined en muestras target o en muestras control, la presentación final de resultados quedaría como sigue: Gene_ID Fold_Change p-value p-value_adj. +NAs 68 Rn00578115_m1 76.74495448 0.00022 0.017730 92 Rn00585310_m1 56.57136199 0.01282 0.043504 X 50 Rn00569848_m1 33.66085693 0.00194 0.020900 X 133 Rn01410330_m1 30.48441594 0.00759 0.034743 X 183 Rn01507680_g1 28.68053439 0.00357 0.023660 52 Análisis de datos en Bioinformática … Daniel Parras Burgos … … … 102 Rn00596271_s1 0.37814200 0.06975 0.121263 224 Rn03993554_g1 0.32737136 0.02105 0.056631 128 Rn01286286_g1 0.15636614 0.13780 0.186141 26 Rn00563924_m1 0.11195571 0.09711 0.148997 162 Rn01470643_m1 0.07100183 0.01188 0.042240 X Así, de entre los 5 genes que más se expresan, el primero y el quinto serían considerados de interés y sujetos, a criterio del investigador, a un estudio más exhaustivo, pues éstos se están expresando unas 76 y 28 veces más, respectivamente, en las muestras target con respecto a las muestras control, ambos con un p-valor inferior a 0,05 y un porcentaje de Undetermined menor o igual al 50%. 5.2 Estudio de la asociación entre SNP/CNV y patrones de expresión génica 5.2.1 Función para el estudio de la asociación Para la creación de la función ExprPolymCNV para el estudio de la asociación entre SNP/CNV y patrones de expresión génica, fueron proporcionados dos formatos estándar de archivos de datos, tanto de genotipado como de expresión. En el archivo de la figura 22, se proporcionan los datos de expresión ya normalizados para un número arbitrario de muestras y genes. En este archivo no puede haber datos faltantes. Figura 22: Formato estándar de datos de expresión 53 Análisis de datos en Bioinformática Daniel Parras Burgos En el archivo de la figura 23, se proporcionan los datos de genotipado para un número también arbitrario de muestras y genes, cada uno de los cuales con los identificadores de los polimorfismos asociados bajo estudio. Como se observa, aquí sí puede haber datos faltantes en forma de espacios en blanco o Undetermined. Figura 23: Formato estándar de datos de genotipado Las referencias seguidas del símbolo # a partir de este punto hacen alusión al código integrado en la función ExprPolymCNV que puede ser consultada en el anexo 2. En primer lugar, tras la lectura en R de los dos archivos, se procede a ordenar las columnas de ambos para facilitar su manipulación posterior. Seguidamente, se realiza una selección de los genes que están presentes en ambos ficheros, eliminando el resto. Se actúa del mismo modo con las muestras, dejando únicamente aquéllas que son comunes a los dos ficheros. Con este filtro, son eliminados aquellos datos a los que no es posible efectuar el análisis, pues para cada genotipo de cada polimorfismo de cada gen de cada muestra del archivo de SNPs se ha de tener la expresión correspondiente a ese mismo gen en esa muestra en el archivo de datos de expresión. #Lectura de datos del fichero de datos expresión #Lectura de datos del fichero de polimorfismos/CNV #Ordenación de columnas #Eliminación de genes que no están en ambos ficheros #Eliminación de muestras que no están en ambos ficheros 54 Análisis de datos en Bioinformática Daniel Parras Burgos Posteriormente, se procede a agrupar los datos de expresión de acuerdo a como se explicó en el apartado 4.3 de Materiales y métodos. También se lleva a cabo un conteo de las veces que aparece cada genotipo en cada uno de los polimorfismos, esto es, el tamaño de cada uno de los grupos sobre los que se efectuará el ANOVA o el t-test, de manera que aparezca en la presentación de resultados, a modo informativo, junto al p-valor asociado a cada polimorfismo. Esto se hace con el objeto de alertar al investigador en caso de que el tamaño de alguno de los grupos sea excesivamente pequeño. Se genera además un archivo en formato pdf con los boxplots calculados a partir de los grupos formados para cada polimorfismo. #Selección de dCt por grupos #Creación de pdf para guardar boxplots #Obtención de niveles Una vez se han agrupado correctamente los datos de expresión de cada genotipo según la correspondencia gen y muestra, se procede a crear el gráfico de boxplots y a efectuar el ANOVA o el t-test. El campo „p-valor‟ de aquellos polimorfismos que consten de un único genotipo se marcará con una „X‟. #ANOVA o t-test #Boxplots #Caso en que sólo hay 1 nivel (no hay grupos que comparar) Para finalizar, se crea una tabla de resultados que muestra los genes del estudio, sus polimorfismos, el p-valor asociado a cada uno de ellos y las veces que se repite cada genotipo. #Creación de la tabla de resultados #Obtención del número de cada genotipo para cada snp genes snps p.values genotipos_CNV 1 RNASEL RS486907 0.495601 CC = 6 CT = 10 TT = 3 2 RNASEL RS56250729 X TT = 20 RS627928 0.466315 AA = 4 AC = 11 CC = 5 4 ELAC2 RS11545302 0.812333 CC = 4 CT = 9 TT = 7 5 ELAC2 RS17552022 0.35192 CT = 6 TT = 13 3 RNASEL 55 Análisis de datos en Bioinformática Daniel Parras Burgos 6 ELAC2 RS5030739 0.405653 CC = 15 CT = 3 7 ELAC2 RS4792311 0.467912 AA = 4 AG = 8 GG = 8 8 MSR1 RS3747531 0.009349 CC = 1 CG = 1 GG = 18 Figura 24: boxplots asociados a los polimorfismos RS486907 y RS627928 del gen RNASEL 5.2.2 Análisis de asociación entre número de copias y expresión en cáncer de próstata Se recolectaron una serie de muestras de sangre y biopsia prostática de un grupo de pacientes en el Área de Urología del Hospital Universitario Virgen de las Nieves, Granada. Con ellas y mediante la tecnología qPCR, se obtuvieron los valores de expresión de las mismas así como el número de copias correspondiente, ambos datos relativos al gen de interés „GSTM1‟. Se proporcionaron, por tanto, dos ficheros: el primero conteniendo los datos del número de copias (figura 25) y el segundo los datos de expresión de dicho gen de interés, así como del gen endógeno „GADPH‟ (figura 26). 56 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 25: Datos del número de copias del gen „GSTM1‟ Figura 26: Datos de expresión de los genes „GSTM1‟ y „GADPH‟ Normalización y creación de los archivos de entrada de la función ExprPolymCNV Puesto que los datos de expresión no se hallan normalizados, éste será el primer paso a dar. 57 Análisis de datos en Bioinformática Daniel Parras Burgos De tratarse del mismo formato que el empleado en el apartado 5.1 de procesado y análisis de datos de qPCR, el cual era más complejo, habría de utilizarse las siguientes funciones en el proceso de normalización (consúltese anexo 1): qPCR.read: Para la creación del objeto de tipo qPCRBatch de datos de expresión qPCR.hks: Para la obtención de los genes endógenos más estables para la normalización qPCR.norm: Para la obtención de los datos de expresión normalizados Sin embargo, en este caso se dispone de un formato que requiere un proceso de normalización diferente, aunque más sencillo. Para ello se utilizarán una serie de órdenes auxiliares (consúltese anexo 3) para llevarlo a cabo. Para explicarlo, se tomará como ejemplo la primera muestra de los datos de expresión proporcionados. EXB01_12 GSTM1 27,88736916 EXB01_12 GSTM1 27,84934425 EXB01_12 GSTM1 Undetermined EXB01_12 GADPH Undetermined EXB01_12 GADPH 29,8006897 EXB01_12 GADPH 29,93411255 Con este formato, sólo se dispone de un gen endógeno para normalizar („GADPH‟) y por tanto no es necesario hacer una selección de los genes endógenos más estables. Además, cada muestra dispone de datos de expresión para „GSTM1‟ y para „GADPH‟, de manera que se normalizará del siguiente modo: Se tomarán los valores de expresión de las tres réplicas del gen endógeno „GADPH‟ y se calculará la media. A petición del investigador, los Undetermined serán eliminados, por lo que si sólo se dispusiera de dos valores, también se calcularía la media; si sólo se dispusiera de un valor, se tomaría éste directamente; y si no se dispusiera de ninguno, es decir, si las tres réplicas fueran Undetermined, se desecharía la muestra. 58 Análisis de datos en Bioinformática Por tanto, en este Daniel Parras Burgos caso se obtendría un valor para normalizar de (29,8006897+29,93411255)/2 = 29,867401125. A continuación, se restaría esta cantidad a los valores de expresión del gen target „GSTM1‟, resultando los valores: −1,980031965 −2.018056875 Para terminar, se calcularía la media de estos valores, obteniéndose (−1,980031965 −2.018056875)/2 = −1,99904442. Éste sería, por tanto, el valor de expresión normalizado del gen target „GSTM1‟ para la muestra „EXB01_12‟. Una vez se ha normalizado el gen target en todas las muestras, se crea un archivo en el formato estándar de datos de expresión (figura 27). Figura 27: Archivo en formato estándar de datos de expresión normalizados En cuanto al archivo que contiene los datos de número de copias, tan solo hay que adaptarlo al formato estándar mediante otra serie de órdenes auxiliares (anexo 3). El archivo resultante se muestra en la figura 28. 59 Análisis de datos en Bioinformática Daniel Parras Burgos Figura 28: Archivo en formato estándar de datos de número de copias Ahora que se dispone de los archivos de datos de expresión normalizados y de número de copias, ambos en formato estándar, puede procederse a la ejecución de la función ExprPolymCNV para la obtención de los resultados de asociación. Resultados Para la obtención de resultados, basta con ejecutar la función ExprPolymCNV con los identificadores de los ficheros de texto plano que contienen los datos de expresión normalizados y de número de copias. ExprPolymCNV (file_expr = "geneExpression.txt", file2 = "CNV.txt") Obteniéndose la siguiente salida. Como se observa, en esta ocasión los resultados se refieren a un único gen, aunque la función está diseñada para tratar un número ilimitado de ellos. > ExprPolymCNV(file_expr = "geneExpression.txt", file2 = "CNV.txt") genes snps p.values genotipos_CNV 1 GSTM1 GSTM1 0.00654 0 = 93 1 = 80 2 = 15 El archivo en formato pdf generado proporciona los boxplots asociados. 60 Análisis de datos en Bioinformática Daniel Parras Burgos 61 Análisis de datos en Bioinformática Daniel Parras Burgos 6. Conclusiones En primer lugar se explicó el funcionamiento y las tareas a desarrollar de cinco funciones, las cuales estaban a su vez basadas en funcionalidad específica proporcionada por los libros de análisis de expresión diferencial „ReadqPCR‟, „NormqPCR‟ y „limma‟. Las cabeceras de tales funciones, que pueden ser consultadas en su totalidad en el anexo 1, son: qPCR.read (file1, file2 = NA, phenofile, replicates = FALSE, valuesNAs = NA, flagNAs) qPCR.read_endo (file1, file2 = NA, valuesNAs = NA) qPCR.hks (file1, file2 = NA, valuesNAs = NA, showgraphs = TRUE) qPCR.norm (qPCRBatch, hkgs, calc) qPCR.ddCq (..., rankgenes = 0, file1, file2 = NA, phenofile, replicates = FALSE, valuesNAs = NA, flagNAs) Con ellas se pretendía automatizar en la medida de lo posible un análisis de expresión diferencial completo, desde la lectura de los datos de expresión en R (funciones 1 y 2), pasando por la obtención de los genes más estables para normalizar (función 3) y la normalización propiamente dicha (función 4), hasta la obtención de los resultados del análisis (función 5). De esta manera, se proporciona también una herramienta para llevar a cabo únicamente el proceso de normalización, cuando lo que se pretende es realizar un estudio de la asociación entre SNP/CNV y patrones de expresión génica, en los casos en los que el formato de los datos proporcionados coincide con el considerado en la misma. Si el formato de los datos es distinto, es posible recurrir a una serie de órdenes auxiliares, como las que se muestran en el anexo 3, para llevar a cabo dicho proceso de normalización, sólo en aquellos casos en que los datos de expresión proporcionados no estén ya normalizados. Así, con los archivos de datos de expresión y de genotipado/número de copias en formato estándar, se ofrece otra herramienta que automatiza este análisis SNP/CNV-Expresión, cuya función puede ser también consultada en el anexo 2 y presenta la siguiente cabecera: 62 Análisis de datos en Bioinformática Daniel Parras Burgos ExprPolymCNV (file_expr, file2, pdfpath = "C:") Por tanto, se consideran cumplidos los objetivos así como alcanzados los resultados esperados, ambos presentados al inicio de este trabajo. 63 Análisis de datos en Bioinformática Daniel Parras Burgos 7. Apéndices 7.1 R y Bioconductor El lenguaje y entorno de programación R R es un lenguaje y entorno de programación para análisis estadístico y gráfico, desarrollado por Robert Gentleman y Ross Ihaka en la Universidad de Auckland en 1993. Se trata de un proyecto GNU de software libre derivado del lenguaje de programación S. Desde su creación, R ha sufrido un constante crecimiento gracias a los trabajos de investigadores provenientes de multitud de ramas del conocimiento. Las aportaciones continuas y desinteresadas de funciones y paquetes de propósito general o específico perfilan a R como un entorno dinámico formado por una comunidad activa y adherida a la filosofía del software libre [8]. Este programa es ampliamente utilizado en investigación por la comunidad estadística, siendo también muy popular en otros ámbitos, como la Bioinformática, la investigación biomédica y las matemáticas financieras. Entre las principales características de R cabe destacar: Una amplia variedad de herramientas estadísticas y gráficas de gran calidad de diseño Un manejo efectivo de datos así como un fácil almacenamiento de los mismos Un lenguaje de programación orientado a objetos, completo y bien diseñado que incluye estructuras de control condicionales, bucles, funciones recursivas y una gran facilidad para la entrada y salida de datos Un amplio repositorio de funciones y libros para el análisis estadístico de datos Una gran sencillez en la utilización de las funciones ya implementadas así como un manejo intuitivo de las herramientas disponibles para la implementación de nuevas funciones 64 Análisis de datos en Bioinformática Daniel Parras Burgos Extensiones específicas a nuevas áreas, como la Bioinformática, la geoestadística, modelos gráficos, etc. Bioconductor Bioconductor es un proyecto de código abierto basado en el lenguaje de programación R para el análisis de datos en genómica. Fue creado en el año 2001 con el propósito de desarrollar e integrar software para el análisis estadístico de datos de laboratorio en biología molecular. Se trata de una iniciativa para la creación colaborativa de software extensible a los ámbitos de la biología computacional y la Bioinformática. Entre las metas que persigue, cabe mencionar: Fomentar el desarrollo colaborativo y el uso extendido de software innovador Reducir las barreras de acceso a la investigación científica interdisciplinar Promover la reproducibilidad remota de los resultados en la investigación [9] En el presente trabajo se utilizarán diversos libros de R genéricos, así como 3 libros específicos para el análisis de expresión diferencial, disponibles en el repositorio de Bioconductor: ReadqPCR: Para la entrada de datos de expresión en R NormqPCR: Para la normalización de los datos de expresión limma: Para la realización de contrastes y la obtención de resultados 7.1.1 Libro ‘ReadqPCR’ El libro „ReadqPCR‟ puede ser descargado e instalado en R a través de los siguientes comandos: source("http://bioconductor.org/biocLite.R") 65 Análisis de datos en Bioinformática Daniel Parras Burgos biocLite("ReadqPCR") Este libro, creado por James Perkins, Matthias Kohl y Nor Izayu Abdul Rahman, proporciona diversas funciones para leer datos crudos de experimentos de qPCR procedentes de diferentes plataformas. El objetivo es convertir dichos datos en un objeto de tipo qPCRBatch, que será uno de los soportados por las funciones a utilizar en la selección de los genes endógenos más estables y en la normalización, pertenecientes al libro „NormqPCR‟. La función de lectura utilizada de este libro es: read.qPCR (filename, phenoData, …) 7.1.2 Libro ‘NormqPCR’ El libro „NormqPCR‟ puede ser descargado e instalado en R a través de los siguientes comandos: source("http://bioconductor.org/biocLite.R") biocLite("NormqPCR") Este libro, también creado por James Perkins, Matthias Kohl y Nor Izayu Abdul Rahman, proporciona varias funciones, de entre las cuales son utilizadas: replaceNAs (qPCRBatch, ...): Para reemplazar los valores NA por un valor numérico determinado combineTechReps (qPCRBatch, ...): Para calcular la media de los valores de expresión de los replicados técnicos selectHKs (qPCRBatch, ...): Para la selección de los genes endógenos más estables deltaCt (qPCRBatch, hkgs, ...): Para la normalización, utilizando para ello un número determinado de genes endógenos seleccionados (housekeeping genes) 66 Análisis de datos en Bioinformática Daniel Parras Burgos 7.1.3 Libro ‘limma’ El libro „limma‟ puede ser descargado e instalado en R a través de los siguientes comandos: source("http://bioconductor.org/biocLite.R") biocLite("limma") Este libro fue concebido para el análisis de la expresión génica y está dotado con multitud de funciones, de entre las cuales son utilizadas: lmFit (object, design, …): Para ajustar un modelo lineal a cada gen dada una matriz de datos de expresión normalizados makeContrasts (..., levels): Construye la matriz de contraste correspondiente a los contrastes especificados contrasts.fit (fit, contrasts, …): Dado un modelo lineal ajustado de datos de expresión, calcula una estimación de los coeficientes y los errores estándar asociados para un conjunto dado de contrastes ebayes (fit, …): Obtiene varios test estadísticos en base a la salida de la función anterior write.fit (fit, file, adjust, …): Crea un archivo con los datos obtenidos de la función anterior 67 Análisis de datos en Bioinformática Daniel Parras Burgos 7.2 Funciones y código 7.2.1 Anexo 1 library(ReadqPCR) library(NormqPCR) library(limma) library(plyr) library(RColorBrewer) qPCR.read <- function(file1, file2 = NA, phenofile, replicates = FALSE, valuesNAs = NA, flagNAs){ #Lectura de datos del fichero 1 datos1 <- read.table(file=file1, header = TRUE, sep = "\t", dec = ".", fill = TRUE) #Selección de columnas del fichero 1 sample <- datos1[,colnames(datos1) == "Sample"] target <- datos1[,colnames(datos1) == "Detector"] type <- datos1[,colnames(datos1) == "Type"] cq <- datos1[,colnames(datos1) == "Ct"] datos1 <- data.frame(sample, target, type, cq) #Lectura y ordenación del archivo phenoData phenodata <- read.table(file = phenofile, header = TRUE, sep = "") phenodata <- phenodata[order(as.vector(phenodata$Sample)),] rownames(phenodata) <- phenodata[,1] if(!is.na(file2)){ #Lectura de datos del fichero 2 datos2 <- read.table(file=file2, header = TRUE, sep = "\t", dec = ".", fill = TRUE) #Selección de columnas del fichero 2 sample <- datos2[,colnames(datos2) == "Sample"] target <- datos2[,colnames(datos2) == "Detector"] 68 Análisis de datos en Bioinformática Daniel Parras Burgos type <- datos2[,colnames(datos2) == "Type"] cq <- datos2[,colnames(datos2) == "Ct"] datos2 <- data.frame(sample, target, type, cq) #Unión de los dos ficheros datos <- NULL datos <- rbind(datos1, datos2) }else{ datos <- datos1 } #Renombrado de columnas colnames(datos) <- c("Sample","Detector","Type","Cq") #Eliminación de filas con campo vacío en genes datos <- datos[datos[,2] != "",] # Eliminación de espacio en ‘Endogenous Control’ dat <- as.vector(datos[,3]) datos[,3] <- as.factor(gsub(" ", "", datos[,3])) #Cambio de ‘Undetermined’ por valor NA dat <- as.vector(datos[,4]) for(i in 1:length(datos[,4])){ if(dat[i] == "Undetermined") dat[i] <- NA } datos[,4] <- as.numeric(dat) #Creación de nuevo fichero de datos para lectura desde libro 'ReadqPCR' write.table(datos,"qPCR.txt", quote=FALSE, sep="\t", row.names=FALSE) 69 Análisis de datos en Bioinformática Daniel Parras Burgos #Lectura de datos desde libro 'ReadqPCR' qPCRBatch.qPCR <- read.qPCR("qPCR.txt", phenoData = AnnotatedDataFrame(phenodata)) #Cambio de NAs a un valor numérico en qPCRBatch if(is.numeric(valuesNAs)) qPCRBatch.qPCR <- replaceNAs(qPCRBatch.qPCR, newNA = valuesNAs) #Combinación de replicados técnicos mediante media aritmética if(replicates) qPCRBatch.qPCR <- combineTechReps(qPCRBatch.qPCR) #Flags cuando se alcanza un porcentaje mínimo de NAs flagNAs <- flagNAs/100 flags <- NULL for(i in 1:length(featureNames(qPCRBatch.qPCR))){ casosNAs <- 0 ncasos <- 0 controlesNAs <- 0 ncontroles <- 0 gen <- datos[datos$Detector == featureNames(qPCRBatch.qPCR)[i],] gen <- gen[order(as.vector(gen$Sample)),] gen[,5] <- phenodata[,colnames(phenodata) == "Type"] for(j in 1:length(gen[,1])){ if(gen[j,5]==1){ ncasos <- ncasos + 1 if(is.na(gen[j,4])) casosNAs <- casosNAs + 1 }else{if(gen[j,5]==0){ ncontroles <- ncontroles + 1 if(is.na(gen[j,4])) controlesNAs <- controlesNAs + 1 }} } ifelse(casosNAs/ncasos > flagNAs || controlesNAs/ncontroles > flagNAs, flags[i] <- "X", flags[i] <- "") 70 Análisis de datos en Bioinformática Daniel Parras Burgos } qPCRBatch <- list() qPCRBatch[[1]] <- qPCRBatch.qPCR qPCRBatch[[2]] <- flags return(qPCRBatch) } qPCR.read_endo <- function(file1, file2 = NA, valuesNAs = NA){ #Lectura de datos del fichero 1 datos1 <- read.table(file=file1, header = TRUE, sep = "\t", dec = ".", fill = TRUE) #Selección de columnas del fichero 1 sample <- datos1[,colnames(datos1) == "Sample"] target <- datos1[,colnames(datos1) == "Detector"] type <- datos1[,colnames(datos1) == "Type"] cq <- datos1[,colnames(datos1) == "Ct"] datos1 <- data.frame(sample, target, type, cq) if(!is.na(file2)){ #Lectura de datos del fichero 2 datos2 <- read.table(file=file2, header = TRUE, sep = "\t", dec = ".", fill = TRUE) #Selección de columnas del fichero 2 sample <- datos2[,colnames(datos2) == "Sample"] target <- datos2[,colnames(datos2) == "Detector"] type <- datos2[,colnames(datos2) == "Type"] cq <- datos2[,colnames(datos2) == "Ct"] datos2 <- data.frame(sample, target, type, cq) 71 Análisis de datos en Bioinformática Daniel Parras Burgos #Unión de los dos ficheros datos <- NULL datos <- rbind(datos1, datos2) }else{ datos <- datos1 } #Renombrado de columnas colnames(datos) <- c("Sample","Detector","Type","Cq") #Eliminación de filas con campo vacío en genes datos <- datos[datos[,2] != "",] #Eliminación de espacio en ‘Endogenous Control’ dat <- as.vector(datos[,3]) datos[,3] <- as.factor(gsub(" ", "", datos[,3])) #Cambio de ‘Undetermined’ por valor NA dat <- as.vector(datos[,4]) for(i in 1:length(datos[,4])){ if(dat[i] == "Undetermined") dat[i] <- NA } datos[,4] <- as.numeric(dat) #Selección de genes endógenos para creación de objeto qPCRBatch datos_endo <- datos[datos[,3]=="EndogenousControl",] datos_endo <- datos_endo[order(datos_endo$Detector),] #Cambio de NAs a un valor numérico en genes endógenos dat <- as.vector(datos_endo[,4]) for(i in 1:length(datos_endo[,4])){ if(is.na(dat[i])) dat[i] <- valuesNAs 72 Análisis de datos en Bioinformática Daniel Parras Burgos } datos_endo[,4] <- as.numeric(dat) #Creación de data.frame con los datos de genes endógenos rep <- count(datos_endo,"Detector") genes_endo <- data.frame() k <- 1 for(i in 1:length(rep[,1])){ for(j in 1:rep[i,2]){ genes_endo[k,1] <- paste(c("Muestra_",j), collapse="") k <- k+1 } } genes_endo[1:length(datos_endo[,2]),2] <- datos_endo[1:length(datos_endo[,2]),2] genes_endo[1:length(datos_endo[,2]),3] <- datos_endo[1:length(datos_endo[,2]),4] colnames(genes_endo) <- c("Sample","Detector","Cq") #Creación de nuevo fichero de datos de controles endógenos para lectura desde libro 'ReadqPCR' write.table(genes_endo,"qPCR_endo.txt", quote=FALSE, sep="\t", row.names=FALSE) #Lectura de datos desde libro 'ReadqPCR' qPCRBatch.qPCR_endo <- read.qPCR("qPCR_endo.txt") return(qPCRBatch.qPCR_endo) } qPCR.hks <- function(file1, file2 = NA, valuesNAs = NA, showgraphs = TRUE){ #Creación del objeto qPCRBatch de genes endógenos llamando a su función de lectura qPCRBatch.qPCR_endo <- qPCR.read_endo(file1, file2, valuesNAs) 73 Análisis de datos en Bioinformática Daniel Parras Burgos #Elección de genes más estables para normalización (geNorm) selecthks <- selectHKs(qPCRBatch.qPCR_endo, method = "geNorm", Symbols = featureNames(qPCRBatch.qPCR_endo), minNrHK = 2, log = FALSE, trace = FALSE) ranks <- data.frame(c(1, 1:(length(featureNames(qPCRBatch.qPCR_endo))-1))) ranks[2] <- selecthks$ranking names(ranks) <- c("rank", "Muestra") if(showgraphs){ #Gráfico "Estabilidad en la expresión (M)" #Valores máximo y mínimo en el eje y ymax <- signif(max(selecthks$meanM), digits=3) ymin <- signif(min(selecthks$meanM), digits=3) par(mfrow=c(2,1)) matplot(selecthks$meanM, type = "b", ylab = "Media de la estabilidad en la expresión (M)", xlab = "Número restante de controles endógenos", axes = FALSE, pch = 19, col = "blue", ylim = c(ymin, ymax), lty = 1, lwd = 2, main = "Estabilidad en la expresión (M)") axis(1, at = 1:(length(featureNames(qPCRBatch.qPCR_endo))-1), labels = as.character(length(featureNames(qPCRBatch.qPCR_endo)):2)) axis(2, at = seq(ymin, ymax, by = 0.01), labels = seq(ymin, ymax, by = 0.01)) box() abline(h = seq(ymin, ymax, by = 0.01), lty = 2, lwd = 1, col = "grey") legend("topright", legend = "Muestra", fill = "blue") #Leyenda leyenda <- NULL for(i in length(featureNames(qPCRBatch.qPCR_endo)):3){ elem <- paste(c(i-1,"/",i), collapse="") leyenda <- cbind(leyenda,elem) 74 Análisis de datos en Bioinformática Daniel Parras Burgos } #Gráfico "Variación de los controles endógenos (V)" mypalette <- heat.colors(length(featureNames(qPCRBatch.qPCR_endo)), alpha = 1) barplot(selecthks$variation, beside = TRUE, col = mypalette, space = c(0, 2), names.arg = "Muestra", ylab = "Variación (V)", main = "Variación de los controles endógenos (V)") legend("topright", legend = leyenda,fill = mypalette, ncol = 2) abline(h = seq(0.05, 0.25, by = 0.05), lty = 2, col = "grey") abline(h = 0.15, lty = 1, col = "black") } return(ranks) } #Función para normalización qPCR.norm <- function(qPCRBatch, hkgs, calc){ return(deltaCq(qPCRBatch = qPCRBatch, hkgs = hkgs, calc = calc)) } qPCR.ddCq <- function(..., rankgenes = 0, file1, file2 = NA, phenofile, replicates = FALSE, valuesNAs = NA, flagNAs){ #Creación de los objetos qPCRBatch llamando a función de lectura qPCRBatch <- qPCR.read(file1, file2, phenofile, replicates, valuesNAs, flagNAs) qPCRBatch.qPCR <- qPCRBatch[[1]] flags <- qPCRBatch[[2]] 75 Análisis de datos en Bioinformática Daniel Parras Burgos #Creación de la matriz de contraste aux <- as.matrix(pData(qPCRBatch.qPCR)$Type) design <- cbind(ifelse(aux == 1, 0, 1),aux) colnames(design) <- c("CONTROL","CASO") rownames(design) <- sampleNames(qPCRBatch.qPCR) #Normalización utilizando los n primeros genes de ranks o los genes indicados if(rankgenes>0){ ranks <- qPCR.hks(file1, file2, valuesNAs = valuesNAs, showgraphs = FALSE) hkgs <- ranks[1:rankgenes,2]} else{ hkgs <- as.character(list(...)) } qPCRBatch.norm <- qPCR.norm(qPCRBatch = qPCRBatch.qPCR, hkgs = hkgs, calc="geom") #Obtención de los ddCt y los p-values asociados lmF <- lmFit(exprs(qPCRBatch.norm), design) cont.matrix <- makeContrasts(CASO-CONTROL, levels=design) cont.fit <- contrasts.fit(lmF, cont.matrix) eBa <- eBayes(cont.fit) write.fit(eBa, file="limma.txt", adjust="BH") #Obtención de la tabla de resultados con los 2^-ddCt y los p-values limma <- read.table(file="limma.txt", header = TRUE, sep = "\t", dec = ".") ddCt <- data.frame(featureNames(qPCRBatch.qPCR),2^(-limma$Coef),limma$p.value, limma$p.value.adj,flags) colnames(ddCt) <- c("Gene_ID","Fold_Change","p-value","p-value_adj.","+NAs") #Reordenación de la tabla de resultados ddCt <- ddCt[order(ddCt$Fold_Change, decreasing=TRUE),] return(ddCt) } 76 Análisis de datos en Bioinformática Daniel Parras Burgos 7.2.2 Anexo 2 ExprPolymCNV <- function(file_expr, file2, pdfpath = "C:"){ #Lectura de datos del fichero de datos expresión datos1 <- read.table(file=file_expr, header = TRUE, sep = "\t", dec = ",", fill = TRUE) #Lectura de datos del fichero de polimorfismos/CNV datos2 <- read.table(file=file2, header = TRUE, sep = "\t", fill = TRUE) #Ordenación de columnas temp <- data.frame(datos1[,1:1]) names(temp) <- names(datos1)[1] temp2 <- data.frame(datos1[,2:length(datos1[1,])]) temp2 <- temp2[,order(names(temp2))] datos1 <- data.frame(temp,temp2) temp <- data.frame(datos2[,1:2]) temp2 <- data.frame(datos2[,3:length(datos2[1,])]) temp2 <- temp2[,order(names(temp2))] datos2 <- data.frame(temp,temp2) #Eliminación de genes que no están en ambos ficheros a <- levels(datos1[,1]) b <- levels(datos2[,1]) c <- setdiff(a,b) d <- setdiff(b,a) e <- union(c,d) if(length(e) > 0){ for(i in 1:length(e)){ datos1 <- datos1[datos1[,1] != e[i],] datos2 <- datos2[datos2[,1] != e[i],] } 77 Análisis de datos en Bioinformática Daniel Parras Burgos } #Eliminación de muestras que no están en ambos ficheros a <- names(datos1)[2:length(names(datos1))] b <- names(datos2)[3:length(names(datos2))] c <- setdiff(a,b) d <- setdiff(b,a) e <- union(c,d) if(length(e) > 0){ for(i in 1:length(e)){ datos1 <- datos1[,names(datos1) != e[i]] datos2 <- datos2[,names(datos2) != e[i]] } } #Selección de dCt por grupos p.values <- genes <- snps <- genotipos_CNV <- NULL #Creación de pdf para guardar boxplots pdf(paste(pdfpath, "/boxplots.pdf", sep="")) for(i in 1:length(datos2[,1])){ v1 <- v2 <- v3 <- NULL level1 <- level2 <- level3 <- 0 #Obtención de niveles fac <- NULL for(m in 3:length(datos2[1,])){ if(datos2[i,m] != "" & datos2[i,m] != "Undetermined") fac <- rbind(fac, as.character(datos2[i,m])) } 78 Análisis de datos en Bioinformática Daniel Parras Burgos fac <- as.factor(fac) pos_datos1 <- which(datos1[,1]==as.character(datos2[i,1])) if(length(levels(fac))>=1 & length(levels(fac))<=3){ for(j in 3:(length(datos2[1,]))){ if(length(levels(fac))==1){level1 <- level1 + 1 }else{if(datos2[i,j]==levels(fac)[1]){ v1 <- c(v1, datos1[pos_datos1,j-1]) level1 <- level1 + 1 }else{if(datos2[i,j]==levels(fac)[2]){ v2 <- c(v2, datos1[pos_datos1,j-1]) level2 <- level2 + 1 }else{if(length(levels(fac))==3 & datos2[i,j]==levels(fac)[3]){ v3 <- c(v3, datos1[pos_datos1,j-1]) level3 <- level3 + 1 }}}} } } #ANOVA o t-test if(length(levels(fac))==3){ lista <- list(v1,v2,v3) names(lista) <- levels(fac) muestras <- c(lista[[1]],lista[[2]],lista[[3]]) grupos <- as.factor(c(rep(1,length(lista[[1]])),rep(2,length(lista[[2]])),rep(3,length(lista[[3]])))) 79 Análisis de datos en Bioinformática Daniel Parras Burgos pAnova <- summary(aov(muestras~grupos)) p.value <- pAnova[[1]]$"Pr(>F)" p.values <- c(p.values,round(p.value[!is.na(p.value)],6)) }else{if(length(levels(fac))==2){ lista <- list(v1,v2) names(lista) <- levels(fac) pT.test <- t.test(v1,v2) p.value <- pT.test$p.value p.values <- c(p.values,round(p.value[!is.na(p.value)],6)) }} #Boxplots if(length(levels(fac))==3 || length(levels(fac))==2){ boxplot(lista,col=c("cornsilk","cornsilk2","cornsilk3"),names=names(lista), ylab="dCt",main=paste(datos2[i,1],"/",datos2[i,2])) } #Caso en que sólo hay 1 nivel (no hay grupos que comparar) if(length(levels(fac))==1){p.values <- c(p.values,"X")} #Creación de la tabla de resultados genes <- c(genes,as.character(datos2[i,1])) snps <- c(snps,as.character(datos2[i,2])) #Obtención del número de cada genotipo para cada snp if(length(levels(fac))==3){ genotipos_CNV [i] <- paste(levels(fac)[1],"=",level1," ",levels(fac)[2],"=",level2," ", levels(fac)[3],"=",level3)} if(length(levels(fac))==2){ genotipos_CNV [i] <- paste(levels(fac)[1],"=",level1," ",levels(fac)[2],"=",level2)} 80 Análisis de datos en Bioinformática Daniel Parras Burgos if(length(levels(fac))==1){ genotipos_CNV [i] <- paste(levels(fac)[1],"=",level1)} } dev.off() results <- data.frame(genes,snps,p.values,genotipos_CNV) return(results) } 81 Análisis de datos en Bioinformática Daniel Parras Burgos 7.2.3 Anexo 3 file1 <- "MJ_01_result.txt" file2 <- "GSTM1.txt" endogeno <- "GADPH" target <- "GSTM1" #Lectura de datos de expresión datos1 <- read.table(file=file1, header = TRUE, sep = "\t", dec = ",", fill = TRUE) #Eliminación de ‘Undetermined’ y cambio de comas por puntos datos1 <- datos1[datos1$Ct!="Undetermined",] dat <- as.vector(datos1$Ct) dat <- gsub(",",".",dat) datos1$Ct <- as.numeric(dat) #Media de los endógenos de cada muestra // Normalización // Media de replicados muestras <- unique(datos1$Sample) media_endo <- NULL media_muestra <- NULL for(i in 1:length(muestras)){ media_endo[i] <- mean(datos1[datos1$Sample==muestras[i] & datos1$Detector==endogeno,grep("Ct", colnames(datos1))]) media_muestra[i] <- mean(datos1[datos1$Sample==muestras[i] & datos1$Detector==target,grep("Ct", colnames(datos1))]-media_endo[i]) } muestras <- muestras[!is.na(media_muestra)] media_muestra <- media_muestra[!is.na(media_muestra)] 82 Análisis de datos en Bioinformática Daniel Parras Burgos #Data.frame de datos de expresión df <- NULL df <- data.frame() df <- rbind(df, media_muestra) colnames(df) <- muestras df <- cbind(target, df) colnames(df)[1] <- "Gen" #Lectura de datos de SNP/CNV datos2 <- read.table(file=file2, header = TRUE, sep = "\t", dec = ",", fill = TRUE) #Data.frame de datos de SNP/CNV df2 <- NULL df2 <- data.frame() df2 <- rbind(df2, as.vector(datos2$CN.Predicted)) colnames(df2) <- datos2$Sample.Name df2 <- cbind(target, df2) df2 <- cbind(target, df2) colnames(df2)[1] <- "Gen" colnames(df2)[2] <- "Snp" #Escritura de los data.frame write.table(df,"geneExpression.txt", quote=FALSE, sep="\t", dec = ",", row.names=FALSE) write.table(df2,"CNV.txt", quote=FALSE, sep="\t", row.names=FALSE) 83 Análisis de datos en Bioinformática Daniel Parras Burgos 8. Bibliografía y webgrafía [1] Wang DG, Fan JB, Siao CJ, et al. “Large-scale identification, mapping and genotyping of single nucleotide polymorphisms in the human genome”. Science, 1998; 280:1077-82 [2] Rodríguez Sánchez IP, Barrera Saldaña HA. “La reacción en cadena de la polimerasa a dos décadas de su invención” Ciencia Uanl. Julio-Septiembre 2004; Vol. VII, No. 3: 323-335 [3] Mullis KB. “The unusual origin of the polymerase chain reaction”. Sci Am, 1990; 262 (4): 56-61, 64-5 [4] Templeton NS. “The polymerase chain reaction. History, methods, and applications” Diagn Mol Pathol. 1992; 1 (1): 58-72 [5] Baumforth KR, Nelson PN, Digby JE, O‟Neil JD, Murray PG. “Demystified… the polymerase chain reaction” Mol Pathol. 1999; 52 (1): 1-10 [6] Kenneth J. Livak y Thomas D. Schmittgen. “Analysis of Relative Gene Expression Data Using Real-Time Quantitative PCR and the Method”. Elsevier Science, 2001; 402-408 [7] Jo Vandesompele, Katleen De Preter, Filip Pattyn, Bruce Poppe, Nadine Van Roy, Anne De Paepe y Frank Speleman. “Accurate normalization of real-time quantitative RT-PCR data by geometric averaging of multiple internal control genes”. Genome Biology, 2002 [8] Paula Elosua. “Introducción al entorno R”. Argitalpen Zerbitzua, 2011; 13 [9] Robert C Gentleman, Vincent J Carey, Douglas M Bates, Ben Bolstad, Marcel Dettling, Sandrine Dudoit, Byron Ellis, Laurent Gautier, Yongchao Ge, Jeff Gentry, Kurt Hornik, Torsten Hothorn, Wolfgang Huber, Stefano Iacus, Rafael Irizarry, Friedrich Leisch, Cheng Li, Martin Maechler, Anthony J Rossini, Gunther Sawitzki, Colin Smith, Gordon Smyth, Luke Tierney, Jean YH Yang y Jianhua Zhang. “Bioconductor: open software development for computational biology and bioinformatics”. Genome Biology, 2004; 5:R80 84 Análisis de datos en Bioinformática Daniel Parras Burgos [10] James Perkins y Matthias Kohl. “ReadqPCR: Functions to load RT-qPCR data into R”. Manual de referencia, 2013 [11] James Perkins y Matthias Kohl. “NormqPCR: Functions for normalisation of RTqPCR data”. Manual de referencia, 2013 [12] Gordon Smyth, Matthew Ritchie, Jeremy Silver, James Wettenhall, Natalie Thorne, Davis McCarthy, Di Wu, Yifang Hu, Wei Shi, Belinda Phipson, Alicia Oshlack, Carolyn de Graaf, Mette Langaas, Egil Ferkingstad, Marcus Davy, Francois Pepin y Dongseok Choi. “Linear Models for Microarray Data”. Manual de referencia, 2002 http://www.unav.es/genetica/bioinfo/concepto.html http://www.brain-dynamics.es/es/actividad/desarrollo-software-y-hardware http://es.wikipedia.org/wiki/R_(lenguaje_de_programaci%C3%B3n) http://www.r-project.org/ http://www.cica.es/Software/r.html http://medmol.es/glosario/47/ http://es.wikipedia.org/wiki/%C3%81cido_ribonucleico http://www.slideshare.net/aeroscristh/dogma-central-de-la-biologa-molecular-21797001 http://biocelular.wikispaces.com/Dogma+central+de+la+biologia+molecular http://reconceptualizandolaexperiencia.wordpress.com/2009/12/22/74/ http://es.wikipedia.org/wiki/Transcriptasa_inversa http://medmol.es/glosario/66/ 85 Análisis de datos en Bioinformática Daniel Parras Burgos http://www.ecured.cu/index.php/Genotipo http://es.wikipedia.org/wiki/Variaci%C3%B3n_en_el_n%C3%BAmero_de_copias http://www.genome.gov/GlossaryS/index.cfm?id=40 http://es.wikipedia.org/wiki/Expresi%C3%B3n_g%C3%A9nica http://www.news-medical.net/health/Gene-Expression-Measurement-(Spanish).aspx http://www.medic.ula.ve/idic/docs/clases/complementarioII_tema10.pdf http://www.ikerkuntza.ehu.es/p083-8991/es/contenidos/informacion/expresion_genica/ es_genomica/adjuntos/PCR%20a%20tiempo%20Real.pdf http://www.monografias.com/trabajos64/pcr-tiempo-real/pcr-tiempo-real2.shtml http://www.uclm.es/profesorado/mdsalvador/58109/teoria/anova_un_factor-lectura.pdf 86