You are on page 1of 166

Aprendizaje estructural bayesiano de

redes de regulación génica


utilizando técnicas heurísticas

Tesis de Ingeniería en Informática

Mariano Pablo Oranges


mariano.pablo.oranges@gmail.com
Padrón N◦ 79356

Directora
Lic. Adriana Echeverría

Buenos Aires
Julio 2017
Agradecimientos
A mi padres, Vicente y Rosa, quienes me han insistido en que me reciba.

A mi esposa Geraldine, quien me ha acompañado con amor y cariño en este


arduo y a la vez graticante camino.

A mi hijo Juan Pablo, quien me refresca la memoria día a día acerca de lo


maravilloso de la vida.

A mi hermana Florencia, por su apoyo incondicional.

A mis compañeros de la facultad, Guille, Jimena, Julia, Ale, Maxi, Gabriel,


Ernesto, Mariela y Andrés, cuya amistad ha trascendido los límites de la
facultad.

A mi directora de tesis, Lic. Adriana Echeverría, por su guía durante este proceso
y por bajarme los pies a la tierra.

ii
Índice general

1. Introducción 1
1.1. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3. Organización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

2. Redes de regulación génica 5


2.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.1. Células . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.1.2. Transmisión de la información hereditaria . . . . . . . . . 6
2.1.3. Replicación del ADN y síntesis de proteínas . . . . . . . . 7
2.1.3.1. Transcripción . . . . . . . . . . . . . . . . . . . . 8
2.1.3.2. Traducción . . . . . . . . . . . . . . . . . . . . . 8
2.2. Genes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1. Redes de genes . . . . . . . . . . . . . . . . . . . . . . . . 9
2.2.1.1. Características fundamentales de las redes de genes 10
2.2.2. Regulación génica . . . . . . . . . . . . . . . . . . . . . . 13
2.3. Modelado de redes de genes . . . . . . . . . . . . . . . . . . . . . 14
2.3.1. Motivaciones . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3.2. Estrategias de modelado . . . . . . . . . . . . . . . . . . . 16
2.3.2.1. Desde un punto de vista físico . . . . . . . . . . 17
2.3.2.2. Desde el punto de vista de las inuencias entre
transcripciones de ARN . . . . . . . . . . . . . . 17
2.3.3. Validación de modelos . . . . . . . . . . . . . . . . . . . . 18
2.4. Datos experimentales . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.1. Datos genómicos . . . . . . . . . . . . . . . . . . . . . . . 19
2.4.2. Datos transcriptómicos, proteómicos y metabolómicos . . 20
2.4.3. Datos interactómicos . . . . . . . . . . . . . . . . . . . . . 20
2.4.4. Datos funcionales . . . . . . . . . . . . . . . . . . . . . . . 21

3. Modelos de redes de regulación génica 22


3.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2. Modelos de red . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2.1. Redes de mundo pequeño y libre de escala . . . . . . . . . 24
3.2.2. Grafos dirigidos y no dirigidos . . . . . . . . . . . . . . . 25

iii
ÍNDICE GENERAL

3.2.2.1. Descripción del modelo . . . . . . . . . . . . . . 25


3.2.3. Modularidad, motivos y otras características estructurales 26
3.3. Modelos discretos . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3.1. Redes booleanas . . . . . . . . . . . . . . . . . . . . . . . 28
3.3.1.1. Supuestos . . . . . . . . . . . . . . . . . . . . . . 28
3.3.1.2. Descripción del modelo . . . . . . . . . . . . . . 29
3.3.1.3. Fortalezas y limitaciones . . . . . . . . . . . . . . 30
3.3.2. Lógica generalizada . . . . . . . . . . . . . . . . . . . . . 31
3.3.2.1. Supuestos . . . . . . . . . . . . . . . . . . . . . . 31
3.3.2.2. Descripción del modelo . . . . . . . . . . . . . . 32
3.3.2.3. Fortalezas y limitaciones . . . . . . . . . . . . . . 33
3.3.3. Redes de Petri . . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.3.1. Descripción del modelo . . . . . . . . . . . . . . 34
3.3.3.2. Fortalezas y limitaciones . . . . . . . . . . . . . . 34
3.3.4. Basados en reglas . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.4.1. Descripción del modelo . . . . . . . . . . . . . . 35
3.3.4.2. Fortalezas y limitaciones . . . . . . . . . . . . . . 36
3.3.5. Lógica continua . . . . . . . . . . . . . . . . . . . . . . . . 36
3.3.5.1. Supuestos y descripción del modelo . . . . . . . 37
3.3.5.2. Fortalezas y limitaciones . . . . . . . . . . . . . . 38
3.4. Modelos continuos . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4.1. Ecuaciones diferenciales ordinarias y en diferencias . . . . 38
3.4.1.1. Supuestos . . . . . . . . . . . . . . . . . . . . . . 38
3.4.1.2. Descripción del modelo . . . . . . . . . . . . . . 39
3.4.1.3. Fortalezas y limitaciones . . . . . . . . . . . . . . 41
3.4.2. Redes neuronales . . . . . . . . . . . . . . . . . . . . . . . 41
3.4.2.1. Descripción del modelo . . . . . . . . . . . . . . 41
3.4.3. Modelos espaciales . . . . . . . . . . . . . . . . . . . . . . 42
3.5. Modelos híbridos . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.5.1. Fortalezas y limitaciones . . . . . . . . . . . . . . . . . . . 43
3.6. Modelos estocásticos . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.6.1. Redes bayesianas . . . . . . . . . . . . . . . . . . . . . . . 44
3.6.1.1. Descripción del modelo . . . . . . . . . . . . . . 45
3.6.1.2. Fortalezas y debilidades . . . . . . . . . . . . . . 47
3.6.2. Ecuaciones estocásticas maestras . . . . . . . . . . . . . . 47
3.6.2.1. Descripción del modelo . . . . . . . . . . . . . . 47
3.6.2.2. Fortalezas y debilidades . . . . . . . . . . . . . . 48
3.6.3. Otros modelos estocásticos . . . . . . . . . . . . . . . . . 48
3.7. Resumen de propiedades . . . . . . . . . . . . . . . . . . . . . . . 49
3.7.1. Discusión . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

4. Aprendizaje estructural en redes de regulación génica 52


4.1. Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
4.2. Características del aprendizaje estructural . . . . . . . . . . . . . 54
4.2.1. Ambiente . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
4.2.2. Proceso de aprendizaje . . . . . . . . . . . . . . . . . . . . 54

iv
ÍNDICE GENERAL

4.2.2.1. Aprendizaje incremental y no incremental . . . . 55


4.2.3. Evaluación del aprendizaje . . . . . . . . . . . . . . . . . 55
4.3. Características comparativas entre algoritmos . . . . . . . . . . . 57
4.4. Algoritmos basados en interacción física . . . . . . . . . . . . . . 57
4.5. Algoritmos basados en interacción por inuencia . . . . . . . . . 58
4.5.1. Algoritmos de agrupamiento . . . . . . . . . . . . . . . . 59
4.5.2. Algoritmos estocásticos . . . . . . . . . . . . . . . . . . . 59
4.5.2.1. Computación evolutiva . . . . . . . . . . . . . . 59
4.5.2.2. Algoritmos bayesianos . . . . . . . . . . . . . . . 62
4.5.3. Algoritmos de asociación . . . . . . . . . . . . . . . . . . 64
4.5.4. Algoritmos basados en ecuaciones diferenciales ordinarias 65
4.6. Rendimiento de algoritmos . . . . . . . . . . . . . . . . . . . . . 66
4.7. Requerimientos de los datos . . . . . . . . . . . . . . . . . . . . . 67
4.7.1. La maldición de la dimensión (Efecto Hughes) . . . . . . 67
4.7.2. Restricciones al modelo . . . . . . . . . . . . . . . . . . . 67
4.7.3. Número y variedad de los puntos de datos . . . . . . . . . 67
4.7.4. Discretización de los datos . . . . . . . . . . . . . . . . . . 68
4.8. Aprendizaje estructural bayesiano en redes de regulación génica . 68
4.8.1. Algoritmos estructurales bayesianos basados en restricciones 69
4.8.2. Algoritmos estructurales bayesianos basados en puntaje . 70
4.8.2.1. Criterios de selección . . . . . . . . . . . . . . . 70
4.8.2.2. Ordenamiento . . . . . . . . . . . . . . . . . . . 71
4.8.3. Algoritmo K2 . . . . . . . . . . . . . . . . . . . . . . . . . 71
4.8.3.1. Supuestos . . . . . . . . . . . . . . . . . . . . . . 72
4.8.3.2. Descripción . . . . . . . . . . . . . . . . . . . . . 72
4.8.3.3. Pseudocódigo . . . . . . . . . . . . . . . . . . . . 73
4.8.3.4. Análisis . . . . . . . . . . . . . . . . . . . . . . . 73
4.8.4. Búsqueda basada en ordenamiento . . . . . . . . . . . . . 74
4.8.4.1. Descripción . . . . . . . . . . . . . . . . . . . . . 74
4.8.4.2. Pseudocódigo . . . . . . . . . . . . . . . . . . . . 74
4.8.4.3. Análisis . . . . . . . . . . . . . . . . . . . . . . . 76

5. Experimentación 77
5.1. Herramientas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.1.1. GeneNetWeaver . . . . . . . . . . . . . . . . . . . . . . . 77
5.1.2. Entorno y lenguaje de programación R . . . . . . . . . . . 78
5.1.3. Amazon Web Services . . . . . . . . . . . . . . . . . . . . 79
5.1.4. Orange . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.2. Metodología . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
5.2.1. Generación de datos . . . . . . . . . . . . . . . . . . . . . 81
5.3. Diseño de la solución . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3.1. Generalidades . . . . . . . . . . . . . . . . . . . . . . . . . 84
5.3.2. Arquitectura . . . . . . . . . . . . . . . . . . . . . . . . . 85
5.3.3. Optimizaciones . . . . . . . . . . . . . . . . . . . . . . . . 85
5.3.3.1. Conteo de ocurrencias . . . . . . . . . . . . . . . 85
5.3.3.2. Funciones de puntaje . . . . . . . . . . . . . . . 86

v
ÍNDICE GENERAL

5.3.3.3. Lista de soluciones tabú . . . . . . . . . . . . . . 87


5.4. Ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

6. Resultados y conclusiones 89
6.1. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.2. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3. Trabajo Futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Apéndice A. Código fuente 102

Glosario 143

Referencias 147

vi
Índice de guras

2.1. Esquema de una célula eucariota . . . . . . . . . . . . . . . . . . 6


2.2. Esquema del ADN de doble hélice . . . . . . . . . . . . . . . . . 7
2.3. Proceso de síntesis de proteínas . . . . . . . . . . . . . . . . . . . 8
2.4. Red de genes de una célula de levadura . . . . . . . . . . . . . . 10
2.5. Conectividad en una red génica de levadura . . . . . . . . . . . . 12
2.6. Niveles del proceso regulatorio . . . . . . . . . . . . . . . . . . . 18
2.7. Análisis de sistemas de regulación génica . . . . . . . . . . . . . . 19

3.1. Red regular, de mundo pequeño y aleatoria . . . . . . . . . . . . 25


3.2. Ejemplo de grafo dirigido . . . . . . . . . . . . . . . . . . . . . . 26
3.3. Ejemplos de algunos motivos de regulación . . . . . . . . . . . . 27
3.4. Ejemplo de una red booleana . . . . . . . . . . . . . . . . . . . . 29
3.5. Ejemplo de una red de lógica generalizada . . . . . . . . . . . . . 33
3.6. Ejemplo de una red de Petri . . . . . . . . . . . . . . . . . . . . . 35
3.7. Espacio de estados de un modelo de lógica continua . . . . . . . 37
3.8. Ejemplo de una red neuronal prealimentada . . . . . . . . . . . . 42
3.9. Ejemplo de una red bayesiana . . . . . . . . . . . . . . . . . . . . 46

4.1. Estrategia general para el aprendizaje de sistemas de control


transcripcional . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.2. Diagrama de inuencias entre concentraciones de productos de
expresión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
4.3. Parámetros de un modelo bayesiano . . . . . . . . . . . . . . . . 63
4.4. Parámetros de un modelo de ecuaciones diferenciales . . . . . . . 66

5.1. Captura de pantalla de la aplicación GeneNetWeaver . . . . . . . 78


5.2. Captura de pantalla de RStudio . . . . . . . . . . . . . . . . . . . 79
5.3. Captura de pantalla de la consola de EC2 . . . . . . . . . . . . . 80
5.4. Captura de pantalla de Orange . . . . . . . . . . . . . . . . . . . 80
5.5. Evaluación de los métodos propuestos . . . . . . . . . . . . . . . 81
5.6. Red Drerio-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.7. Red Ecoli-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
5.8. Red Levadura-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
5.9. Ejemplo de árbol de decisión alternativo . . . . . . . . . . . . . . 86

vii
ÍNDICE DE FIGURAS

5.10. Ejemplos de árboles de decisión alternativos adicionales al árbol


principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

6.1. Gráco mosaico para la red Drerio-1 . . . . . . . . . . . . . . . . 93


6.2. Gráco mosaico para la red Ecoli-1 . . . . . . . . . . . . . . . . . 94
6.3. Gráco mosaico para la red Levadura-1 . . . . . . . . . . . . . . 95
6.4. Sensibilidad en la red Drerio-1 . . . . . . . . . . . . . . . . . . . 97
6.5. Sensibilidad en la red Ecoli-1 . . . . . . . . . . . . . . . . . . . . 98
6.6. Sensibilidad en la red Levadura-1 . . . . . . . . . . . . . . . . . . 98

viii
Índice de cuadros

2.1. Reguladores transcripcionales en distintos organismos. . . . . . . 15

3.1. Propiedades de los formalismos de modelado presentados . . . . . 51

5.1. Conjuntos de datos utilizados en la experimentación . . . . . . . 84

6.1. Resultados de los experimentos para la red Drerio-1 . . . . . . . 90


6.2. Resultados de los experimentos para la red Ecoli-1 . . . . . . . . 90
6.3. Resultados de los experimentos para la red Levadura-1 . . . . . . 90
6.4. Puntajes de correlación entre log BDeu y los parámetros de los
algoritmos para el conjunto de datos de 2000 entradas de la red
Drerio-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.5. Puntajes de correlación entre log BDeu y los parámetros de los
algoritmos para el conjunto de datos de 8000 entradas de la red
Ecoli-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
6.6. Puntajes de correlación entre log BDeu y los parámetros de los
algoritmos para el conjunto de datos de 16000 entradas de la red
Levadura-1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
6.7. Resultados de los experimentos para la red Drerio-1 utilizando
solamente el método de discretización por intervalos . . . . . . . 96
6.8. Resultados de los experimentos para la red Ecoli-1 utilizando
solamente el método de discretización por intervalos . . . . . . . 96
6.9. Resultados de los experimentos para la red Levadura-1 utilizando
solamente el método de discretización por intervalos . . . . . . . 96

ix
Índice de algoritmos

1. Algoritmo SHD . . . . . . .
. . . . . . . . . . . . . . . . . . . . . 56
2. Algoritmo genético bayesiano
abstracto . . . . . . . . . . . . . . . 61
3. Algoritmo K2 . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . 73
4. Algoritmo OS . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . 75
5. Algoritmo mejores_padres . . . . . . . . . . . . . . . . . . . . . 76
6. Algoritmo ganancia . . . . . . . . . . . . . . . . . . . . . . . . . . 76

x
Capítulo 1

Introducción
Desde la década de 1950, los programas de investigación en biología
molecular se han dirigido hacia la comprensión de los sistemas biológicos a
nivel de sus componentes más fundamentales, como los genes, proteínas y
células. Sin embargo, más recientemente, el nuevo campo de la biología de
sistemas ha establecido programas que pretenden revertir esta tendencia
reduccionista. Uno de sus primeros objetivos es emplear modelos
computacionales para integrar diversas fuentes de datos experimentales en una
descripción de los organismos en tanto sistemas biológicos.
Actualmente, los investigadores en biología molecular tienen acceso a
tecnologías experimentales sosticadas capaces de recoger grandes cantidades
de información de los procesos genéticos, la cual es muy vasta como para ser
procesada y manipulada manualmente [Gea04]. Por ello, se ha incrementado
en los últimos años el uso de patrones de detección, aprendizaje automático y
técnicas de minería de datos. Asimismo, se construyen modelos de estos
sistemas sobre la base de teoría y formalismos matemáticos. Estos modelos
ayudan a esclarecer intuiciones, manejar datos y asistir en el desarrollo de un
entendimiento teórico de los organismos biológicos.
De esta manera, uno de los desafíos más fascinantes en la biología actual es
la tarea de descifrar cómo los genes controlan el desarrollo de organismos
complejos, siendo ésta una línea de investigación joven [Gea04][MG]. La
tendencia apunta hacia técnicas basadas en fuentes de datos de diversa
procedencia, con un enfoque cada vez más físico y detallista. Este enfoque se
centra en la búsqueda de todas las interacciones reales que tienen lugar entre
los genes. De hecho, el éxito de los resultados está directamente relacionado
con la calidad y cantidad de los datos disponibles aunque, afortunadamente,
cada vez existen más y mejores repositorios.
Otro desarrollo de las últimas décadas es el campo de los sistemas complejos,
el cual está interesado en la descripción y análisis de sistemas constituidos por un
gran número de partes interactuantes. Éstos existen en muchos dominios, desde
la ecología y biología hasta las redes de comunicación e ingeniería, haciendo que
se enfaticen los estudios interdisciplinarios.

1
CAPÍTULO 1. INTRODUCCIÓN

Ambas áreas, sistemas complejos y biología de sistemas, tienen mucho que


ganar una de otra: la biología de sistemas puede beneciarse de las herramientas
y conocimientos teóricos generados a partir del estudio de sistemas complejos en
otros dominios, mientras que los sistemas complejos tienen mucho que aprender
del progreso realizado en el campo de los sistemas biológicos.

1.1. Motivación
El estudio de las redes de genes también llamadas redes de regulación
génica o sistemas regulatorios de la expresión génica es importante para
comprender los procesos celulares y la evolución de las especies, pero sobre
todo, abre una puerta para la lucha contra aquellas enfermedades en las que la
genética juega un papel fundamental [MG]. Por ejemplo, si un gen está
directamente relacionado con el crecimiento tumoral de algún tipo de cáncer, y
existe otro gen cuyo producto estimula la expresión de ese gen, entonces se
podría buscar un fármaco que anulara la actividad de dicho producto o del gen
que lo produce.
La estrategia abordada por muchas propuestas de referencia en la
literatura consiste en la aplicación de ingeniería inversa a partir de los datos
disponibles, es decir, la obtención de forma automática de un modelo sin
previo conocimiento sobre dichos datos a nivel biológico. Debido a la gran
cantidad de datos disponibles, se hace imprescindible la utilización de recursos
computacionales que permitan realizar la tarea de reconstruir una red de genes
a partir de datos de forma eciente. Es, entonces, deseable encontrar aquellos
algoritmos que maximicen la utilización de los recursos disponibles y estudiar
de qué manera características propias de los datos (como su número o las
relaciones que plantean) impactan sobre dichos algoritmos.

1.2. Objetivos
La tesis tendrá dos objetivos generales, a saber: el estudio de las técnicas
más sobresalientes de modelado de redes de genes, y en particular aquellas que
permiten la reconstrucción estructural de una red a partir de datos utilizando
técnicas bayesianas; y, en segundo lugar, un análisis comparativo de un
determinado grupo de algoritmos y sus parámetros sobre la base de los
resultados arrojados por un conjunto de experimentos realizados sobre datos
generados computacionalmente.
Para llevar a cabo el primer objetivo, se estudiarán técnicas de modelización
y reconstrucción de redes de genes basadas en general, para luego profundizar en
el enfoque bayesiano. Se analizarán y seleccionarán algoritmos representativos y
se estudiarán estructuras de datos y recursos computacionales, como los árboles
o la memoria caché, que permitan maximizar su rendimiento.
El segundo objetivo de la tesis girará en torno a la ejecución de tres tareas
principales. Primeramente, se generará un conjunto de redes de regulación

2
CAPÍTULO 1. INTRODUCCIÓN

génica sobre el cual trabajar, para luego obtener datos experimentales de


expresión génica, utilizando el banco de pruebas informático GeneNetWeaver.
Seguidamente, se experimentará con un determinado conjunto de algoritmos
implementados en el lenguaje de programación R sobre los datos generados
anteriormente. Por último, se analizarán los resultados obtenidos en términos
de conabilidad y rendimiento de cada algoritmo.

1.3. Organización
El capítulo 2, revisado por la Dra. en Ciencias Biológicas
Emma D. O'Brien E., provee una introducción básica a los procesos biológicos
que están involucrados en la regulación de genes. Cuando un gen se expresa, la
información almacenada en el genoma de un organismo se transcribe y se
traduce en proteínas, las cuales se encuentran también bajo control
regulatorio, dando como resultado complejas redes de genes que interactúan
entre sí. Se presentan, entonces, características fundamentales de estas redes
así como también de los procesos de regulación. Este capítulo introduce
asimismo algunos conceptos de modelado a la vez que presenta información
referida a los diferentes tipos de datos experimentales y repositorios
disponibles.

En tanto, el capítulo 3 presenta algunos de los principales enfoques en el


modelado de redes de regulación génica. En primer lugar, se describen los
modelos de red o topológicos como una primera forma de modelar las redes de
regulación génica, a la luz de los importantes hallazgos realizados en el campo
de la teoría de redes. A continuación, se analizan los modelos de activación
lógicos, en los cuales las variables de estado toman uno de un número de
valores discretos para luego describir los modelos de activación continuos, en
los cuales las variables de estado toman la forma de concentraciones continuas.
Luego, se describen y mencionan algunos modelos híbridos. Todos estos
modelos de sistemas de regulación asumen que los genes se expresan a una
velocidad constante. Sin embargo, los procesos biológicos involucrados son
inherentemente ruidosos, y un número de formalismos se han desarrollado para
permitir incorporar en los modelos este aspecto de la regulación. De esta
manera, se esbozan ciertas implicaciones acerca de estocasticidad y el ruido a
la vez que se presentan algunos de los modelos estocásticos utilizados para
abordar estas cuestiones. En particular, se describe con profundidad el modelo
bayesiano.
Seguidamente, el capítulo 4 detalla diferentes estrategias de inferencia en
redes de regulación. En particular, se describen las características propias del
aprendizaje estructural bayesiano, y se introducen algunos algoritmos bayesianos
con particular detalle, dado que son aquellos que resultan de interés al presente
trabajo.

3
CAPÍTULO 1. INTRODUCCIÓN

El capítulo 5 está dedicado a la experimentación. En él, se especican


los objetivos de la misma y los algoritmos utilizados durante dicho proceso.
Asimismo, se describen las herramientas y metodología adoptadas, las decisiones
de diseño relacionadas con la implementación y detalles de la ejecución de los
experimentos.

Finalmente, en el capítulo 6 se presentan los resultados obtenidos durante


la experimentación, las conclusiones de la tesis y, en último término, se exponen
algunas sugerencias de trabajo futuro.

4
Capítulo 2

Redes de regulación génica*

2.1. Introducción
Los genes son considerados los bloques de construcción básicos de la vida
ya que brindan a todos los organismos conocidos los productos biológicos
usualmente proteínas que necesitan para vivir. En tanto sistemas
biológicos, las redes que forman los genes son increíblemente complejas. Este
capítulo tiene por objetivo presentar los elementos y procesos biológicos
involucrados en la regulación de genes, de manera de permitir una mejor
comprensión de los capítulos siguientes.

2.1.1. Células
La célula es la unidad básica estructural, funcional y biológica de todos los
organismos vivos conocidos. La mayoría de éstos están constituidos por una sola
célula; otros, como los seres humanos, son enormes ciudades pluricelulares en
las que grupos de células realizan funciones especícas y se relacionan mediante
elaborados sistemas de comunicación [Alb+08].
Todas las células poseen una membrana conocida como membrana plasmática
o simplemente membrana celular, que la separa del ambiente en el que vive y
la cual es responsable del intercambio entre la célula y el exterior. En tanto,
se denomina citoplasma al material que se encuentra dentro o encerrado por la
membrana plasmática y fuera de la región donde se aloja el material genético,
del cual se hablará con mayor detalle posteriormente.
En un tipo particular de células, las células eucariotas (ver gura 2.1), existe
adicionalmente un orgánulo membranoso que suele encontrarse en el centro de
las mismas llamado núcleo celular. A diferencia de estas últimas, las células
procariotas carecen de dicho núcleo.
A lo largo de su vida, la célula debe responder a una gran cantidad de
señales provenientes del ambiente [Gea04]. Las bacterias, constituidas por una
* Capítulo revisado por la Dra. en Ciencias Biológicas Emma D. O'Brien E.

5
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

Figura 2.1. Esquema de una célula eucariota (adaptada de [Com06])

sola célula, son capaces de detectar y moverse hacia fuentes de nutrientes, a


la vez que reaccionan a cambios en la temperatura y la acidez. Las células de
organismos multicelulares también responden a señales químicas emitidas por
células vecinas en el organismo.
Además de responder a señales externas, las células atraviesan un proceso
de crecimiento, replicación y división, denominado ciclo celular. Este ciclo
representa un reloj interno para la célula, en donde la misma crece, se replica y
se divide.

2.1.2. Transmisión de la información hereditaria


Se estima que en la actualidad existen más de 8.7 millones tal vez más de
especies sobre la Tierra [Mor+11]. Cada especie es diferente, y cada una se
reproduce a sí misma con exactitud, dando lugar a una progenie perteneciente
a la misma especie. Es el organismo progenitor quien aporta la información
que especica con gran detalle las características que tendrá su descendencia.
En todos los casos desde una bacteria solitaria al agregado de más de 1013
células que forman el cuerpo humano cada organismo se ha originado por
división celular a partir de una sola célula. Por tanto, la célula es el vehículo a
través del cual se transmite la información hereditaria que dene a cada especie.
Todas las células vivas de la Tierra, sin ninguna excepción conocida,
guardan dicha información hereditaria en forma de moléculas de
Ácido DesoxirriboNucleico (ADN) de doble cadena, dos largos polímeros
paralelos no ramicados formados por cuatro tipo de monómeros llamados
nucleótidos, apodados A, T, C y G (adenina, timina, citosina y guanina). Estos
monómeros están unidos entre sí formando una larga secuencia lineal que
codica la información genética de la célula. En la gura 2.2 puede observarse
el ADN de doble hélice, en donde las dos cadenas se enroscan una alrededor de
la otra en una disposición helicoidal, una estructura resistente que puede
acomodar cualquier secuencia de nucleótidos sin alterar su estructura básica.
En las células eucariotas, dicho material está separado del resto del
ambiente celular y encerrado en el núcleo mientras que en las células

6
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

Figura 2.2. Esquema del ADN de doble hélice (obtenida de [Alb+08])

procariotas el material genético se encuentra disperso en el citoplasma, aunque


no en forma de doble hélice. En el núcleo de las células animales y vegetales,
las moléculas de ADN se almacenan en unas estructuras llamadas cromosomas
[MG].
Aunque lo anteriormente descrito es universal para todos los organismos, las
diferencias entre ellos estriban en el número de cromosomas para cada ser vivo,
y las combinaciones de los cuatros nucleótidos con sus bases A, C, G y T en
cada molécula de ADN, de la misma manera que combinando las letras de un
alfabeto es posible formar las distintas palabras que pertenecen a un idioma.
Como se mencionó anteriormente, las células deben responder a señales
provenientes del exterior. El ADN desempeña un rol fundamental en estos
procesos de respuesta ya que le indica a la célula cómo interactuar [Gea04].
Asimismo, éste también es susceptible de responder a las diferentes fases del
ciclo celular: las señales que le indican a una célula cuándo pasar de la fase de
crecimiento a la de replicación y de la de replicación a la de división están
controladas por un subconjunto de monómeros del ADN que coordinan y
regulan sus tiempos internos.

2.1.3. Replicación del ADN y síntesis de proteínas


Con el objeto de llevar a cabo la función de transporte de información, el
ADN tiene que replicarse a sí mismo y a su vez expresar la información que
contiene mediante la síntesis de otras moléculas de la célula [Alb+08]. El
proceso, esquematizado en la gura 2.3, comienza con la transcripción de
diferentes segmentos de la secuencia de ADN, seguido de un proceso más
complejo denominado traducción, que tiene por resultado la generación o
síntesis de proteínas, gracias a las cuales las células pueden realizar la mayor
parte de sus funciones [MG]. Asimismo, existen modicaciones
post-transcripcionales, procesos de degradación del ARN [VG01], y muchos
otros. A continuación, se describen los dos procesos principales, transcripción
y traducción, con cierto nivel de detalle para permitir una mejor comprensión
de los temas que se tratan en los capítulos siguientes.

7
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

Figura 2.3. Proceso de síntesis de proteínas (adaptada de [Alb+08])

2.1.3.1. Transcripción

El ADN contiene regiones de regulación, las cuales controlan cuándo ciertas


secuencias son activadas; y regiones codicantes, las que especican las formas
de las proteínas que producirán cuando ocurra dicha activación [Gea04]. Una
región de regulación contiene sitios de unión o de enlace a los cuales se unen
proteínas especiales conocidas como factores de transcripción. Estas proteínas
se ensamblan en grupos a unos sitios de la secuencia denominados promotores,
que indican donde la transcripción ha de comenzar. Ellas pueden ejercer un
control positivo llamado inducción  o negativo llamado
represión  sobre la actividad del promotor, aumentando o disminuyendo la
velocidad de transcripción.
Cuando se cumplen ciertas condiciones de activación para una secuencia
en particular, una enzima denominada ARN polimerasa se une al complejo de
factores de transcripción y la correspondiente región codicante es entonces
desenrrollada y utilizada como molde para la síntesis de moléculas cortas de
otro polímero relacionado llamado Ácido RiboNucleico (ARN) [OR02]. En el
proceso, generalmente se transcribe sólo una de las dos hebras del ADN [MG].

2.1.3.2. Traducción

Durante este proceso, las moléculas de ARN se unen a otra molécula de


gran tamaño denominada ribosoma, la cual lee una molécula de ARN en

8
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

tripletes conocidos como codones. Cada codón permite generar uno de veinte
aminoácidos posibles, los cuales se encuentran unidos según el orden
especicado por el ARN. Esta nueva cadena de aminoácidos se dobla en una
compleja estructura tridimensional de proteínas. Si bien las formas de
regulación mejor conocidas ocurren a nivel transcripcional, se sabe que la
regulación génica ocurre también en la etapa de traducción y en otras etapas
de la síntesis de proteínas.
En los organismos procariotas, al carecer la célula de membrana nuclear, el
proceso de traducción comienza inmediatamente después de la obtención de las
moléculas de ARN en el proceso de transcripción. En los eucariotas, en tanto,
los ARN transcritos a partir de los genes se transportan desde el núcleo hasta el
citoplasma, a través de la membrana nuclear, para comenzar entonces el proceso
de traducción.

2.2. Genes
Generalmente, las moléculas de ADN son muy largas y contienen la
especicación de miles de proteínas [Alb+08]. Cada uno de los segmentos de
ADN que se transcriben en diferentes moléculas del ARN representa un gen.
Sin embargo, las moléculas de ARN transcritas a partir de un mismo segmento
de ADN pueden ser procesadas de diferentes maneras, generando una colección
de versiones alternativas de cada proteína. Entonces, un gen se dene de una
forma general como un fragmento de la secuencia de ADN que corresponde a
una sola proteína o a una colección de variantes de una proteína. Asimismo, se
dene genoma al conjunto de genes existente a la vez que se denomina
expresión génica a dicho proceso de generación o síntesis de elementos
funcionales a partir del material genético.
De esta manera, y de acuerdo a lo esbozado anteriormente, en todas las
células, la expresión de determinados genes está regulada: cada célula
ajusta la velocidad de transcripción y de traducción de diferentes genes de
forma independiente y de acuerdo con sus necesidades, en lugar de sintetizar el
catálogo completo de posibles proteínas en todo momento. En diferentes tipos
celulares, caracterizados éstos por el conjunto de genes activos que determinan
las propiedades funcionales de la célula, este proceso se produce a diferentes
velocidades, con controles de inicio y nal diferentes y con distintas moléculas
reguladoras auxiliares.

2.2.1. Redes de genes


Las proteínas reguladoras son en sí mismas productos de la expresión
genética y también se encuentran bajo control regulatorio [Gea04]. Esto da
lugar a redes de genes, las cuales representan las complejas interacciones
reguladas que existen entre los genes. La gura 2.4 muestra una red de
genes en una célula de levadura, coloreados según el comportamiento celular
que gobiernan. En líneas generales, cuando una proteína codicada por un gen

9
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

A se une a una secuencia reguladora de un gen B, entonces probablemente el


gen A actúe como regulador del gen B [Alb+08].

Figura 2.4. Red de genes de una célula de levadura (adaptada de


[Alb+08])

2.2.1.1. Características fundamentales de las redes de genes

Las redes de genes son substancialmente mejor conocidas hoy en día que a
nales del siglo XX. A continuación se enumeran ciertas características de las
redes génicas que, aunque pocas en número, resultan ser una poderosa guía de
modelo y diseño [Fil05]:

Las redes de genes pueden entenderse como sistemas complejos, cuyo


campo está interesado en aquellos sistemas constituidos por una gran
cantidad de componentes que interactúan entre sí [Gea04]. Una

10
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

característica fundamental compartida por todos ellos es que pueden


describirse como una red en donde los nodos son los componentes y las
aristas representan las interacciones entre ellos. Si bien cada componente
individual en el sistema puede parecer relativamente simple,
frecuentemente emerge un comportamiento complejo como resultado de
las interacciones existentes entre el gran número de componentes
sencillos. En el contexto de las redes de regulación génica, las partes del
sistema son los genes y las proteínas, mientras que las propiedades
emergentes de interés incluyen comportamientos oscilatorios, formación
de patrones, robustez y otros fenómenos de control complejos.

Si bien todas estas redes presentan un alto grado de complejidad, éste es


considerablemente más alto en las células de los organismos
multicelulares que en aquellos que están constituidos por una sola célula,
como las bacterias [Gea04].

La topología de las redes de regulación suele ser dispersa; esto es, existe un
pequeño número de aristas por nodo, mucho menor que la totalidad de los
nodos de la red. Esta propiedad de dispersión es utilizada usualmente para
reducir el espacio de búsqueda durante la inferencia de redes, tal y como
se verá en el capítulo 4, Aprendizaje estructural en redes de regulación
génica.
De acuerdo con el trabajo de Guelzim et al. realizado sobre redes de
genes de levadura [Gue+02] y la publicación de Jeong et al. basada en 43
organismos provenientes de los 3 dominios biológicos [Jeo+00], el número
de proteínas reguladoras por gen regulado sigue una distribución
exponencial mientras que el número de genes regulados por proteína
reguladora se ajusta a una ley de potencias (ver gura 2.5). Esta
propiedad hace que estas redes también sean conocidas como redes libres
de escala, en las cuales aparecen concentradores o hubs, los cuales son
nodos altamente conectados y que intervienen en gran parte de la
regulación general.

11
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

Figura 2.5. Conectividad en una red génica de levadura. El


gráco de la izquierda muestra la distribución de puntos de
conectividades de llegada y su interpolación, representadas en
una escala semilogarítmica; en tanto, a la derecha se observa la
distribución de puntos de conectividades de salida y su forma
interpolada, en una representación logarítmica (adaptada de
[Gue+02])
Asimismo, estas redes pueden ser vistas en tanto sistemas dinámicos, es
decir, como sistemas que evolucionan con el tiempo. Los dos conceptos
fundamentales en la descripción de sistemas dinámicos son:

• Estado
Un estado del sistema es una descripción de las propiedades de cada
componente en un punto en el tiempo. En un modelo de red de
regulación génica, esta caracterización puede incluir niveles de
activación de los genes, concentración de especies químicas o bien el
número y ubicación de moléculas individuales, dependiendo del
nivel de resolución del modelo. Un concepto relacionado es el de
espacio de estados, es decir, el conjunto total de posibles estados en
los que puede encontrarse el sistema. El espacio de estados de un
sistema tendrá una dimensión igual al número de componentes del
mismo.
• Transición
Los estados en un espacio de estados están vinculados entre sí por
transiciones, las cuales describen cómo se actualizan los estados del
sistema. El conjunto de transiciones que puedan aplicarse a un
estado dado determinarán el posible estado o estados a los cuales el
sistema puede moverse. El camino de un sistema a través del
espacio de estados en el tiempo es conocido generalmente como la
trayectoria del sistema.
Las redes de regulación son muy robustas ante uctuaciones en sus
parámetros, y existe una fuerte indicación de que sólo determinadas
topologías pueden garantizar dicha robustez. De hecho, es la propiedad

12
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

de libre de escala la que asegura la robustez de estas redes ante cambios


topológicos aleatorios [Jeo+00][Das+00].

El ruido es una parte integral de la redes de genes, ya que existen


propiedades emergentes de las reacciones bioquímicas, las cuales son
estocásticas por naturaleza. Las redes suelen controlar el ruido mediante
retroalimentación, aunque, en ciertos casos, el ruido mejora ciertas
características funcionales de las redes, por lo que puede tener un rol
importante en la evolución de la red [MA97][Vil+02].

2.2.2. Regulación génica


Los mecanismos particulares de regulación de la expresión génica varían de
una especie a otra. Hasta la fecha, estos mecanismos han sido estudiados de
forma detallada en varios organismos, como por ejemplo en la bacteria
Escherichia coli. El conocimiento de los mecanismos de regulación en las
bacterias ha servido como base para estudiar la compleja regulación de la
expresión génica en organismos eucariotas, incluyendo la del hombre. A
continuación se explican algunos de los principios de control génico mejor
conocidos [Alo07][MG]:

Se ha comprobado que la expresión o transcripción de los genes de


organismos procariotas como las bacterias puede estar regulada o no. Los
genes que responden a mecanismos de regulación son llamados inducibles
mientras que aquellos cuya expresión no está regulada se denominan
constitutivos.
La expresión de los genes en organismos procariotas está regulada a nivel
de síntesis o transcripción de ARN, aunque también existe regulación de
la expresión a nivel de traducción. En ambos tipos de regulación, la
actividad de los promotores (principalmente su unión a la ARN
polimerasa) es modulada durante el proceso de transcripción por la
unión de proteínas especícas los factores de transcripción
mencionados anteriormente a regiones cercanas a los promotores. En el
caso del proceso de traducción, la existencia de concentraciones
diferentes de proteínas codicadas por un mismo grupo de genes
explicaría la regulación a nivel de traducción del ARN.

En general, la regulación génica puede dividirse en dos tipos: positiva, si la


expresión génica aumenta signicativamente, o negativa, si dicha expresión
disminuye.
En su versión más simple, la regulación génica ocurre cuando un factor
de transcripción Y regula un gen X sin interacciones adicionales. En este
caso, cuando comienza la transcripción, la concentración del producto de
expresión de X aumenta y converge a un nivel estable. Cuando la
producción naliza, dicha concentración decae exponencialmente.

13
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

Adicionalmente, existen procesos de autoregulación, tanto positiva como


negativa. La primera, conocida como autoregulación positiva o positive
autoregulation (PAR), ocurre cuando un factor de transcripción acentúa
su propia tasa de producción mientras que la segunda, conocida como
autoregulación negativa o negative autoregulation (NAR), se presenta
cuando dicha producción es reprimida por el propio gen. Esta forma de
regulación es frecuente; por ejemplo, en la bacteria Escherichia coli, el
70 % de los reguladores controla su propia expresión.
Los organismos procariotas también tienen la capacidad de regular
simultáneamente varios genes a través de algunas moléculas comunes.
Los mecanismos de control individuales capacitan al organismo para
responder de forma especíca a las condiciones ambientales mientras que
los de regulación conjunta permiten al organismo coordinar grupos de
respuestas.

Las células de organismos superiores tienen mecanismos de regulación


génica que comparten elementos generales con las bacterias. Sin
embargo, entre las células de organismos unicelulares y pluricelulares hay
una diferencia importante: la heterogeneidad tanto morfológica como
funcional de las células existentes en los primeros. Debido a esto, existen
mecanismos de control precisos de la expresión génica en las diferentes
células del organismo, de modo que éstas realicen sus funciones de
manera adecuada. Por tanto, la regulación de la expresión génica en
eucariotas es bastante más complicada y se sabe menos de ella.

Actualmente, los proyectos de secuenciación que han permitido la


obtención de varios genomas (incluyendo el humano), ha contribuido al avance
en la comprensión de estas redes de control de la expresión génica a nivel
celular. Mediante diversas técnicas es posible monitorear simultáneamente la
cantidad de ARN transcrito que se produce a partir de cada gen, y observar
cómo cambia el patrón completo de actividad génica a través del tiempo. Este
enfoque proporciona una forma de revelar el sistema completo de relaciones de
control y regulación que rigen la expresión génica, para cualquier organismo
cuya secuencia genómica sea conocida.

2.3. Modelado de redes de genes


A lo largo de los últimos 50 años, ha existido una tendencia creciente hacia
el uso de formalismos matemáticos y computacionales en la enunciación de
modelos de sistemas de regulación en biología [Gea04]. La estructura de estos
sistemas es frecuentemente compleja, ya que suelen contener múltiples ciclos
de retroalimentación entrelazados e interacciones no lineales. La complejidad
estructural, combinada con los diversos períodos de tiempo en los que actúan
los diferentes procesos biológicos, hace dicultoso desarrollar intuiciones sobre

14
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

cómo operan los sistemas regulados. El modelado puede proveer una forma
válida de vericar estas intuiciones durante el proceso de formulación de
hipótesis.
Adicionalmente, los modelos formales son complementados frecuentemente
con simulaciones por computadora, en donde se construye el modelo y luego
se lo utiliza para realizar algún tipo de predicción sobre el comportamiento
del sistema. De esta manera, la ejecución de simulaciones utilizando modelos
basados en sistemas conocidos puede validar la utilización de un determinado
enfoque. Es más, dichas simulaciones también pueden resultar una guía valiosa
a la hora de realizar estudios futuros, permitiendo realizar experimentos por vía
computacional in silico , que de otra manera serían costosos, consumirían
tiempo o directamente no serían factibles de realizar en un ambiente controlado
fuera del contexto biológico (por ejemplo, en soluciones), esta última técnica
denominada in vitro.
Recopilar los elementos que forman parte de un sistema regulador es el
primer paso para desarrollar cualquier modelo de cierta complejidad, y no
siempre es una tarea fácil [MG]. El descubrimiento de los componentes que
integran los sistemas regulados es el resultado de proyectos de secuenciación
genómica, que han permitido la secuenciación completa (o de gran parte) del
ADN de varios organismos. Estos componentes deben representarse como una
base de datos de elementos de regulación, o bien como un conjunto de
términos ontológicos de procesos de regulación pertenecientes a un conjunto de
genes determinado.
La comparación de las bases de datos pertenecientes a diferentes
organismos puede dar una idea de la complejidad de los procesos de
transcripción y también pueden servir para predecir la presencia o ausencia de
rutas metabólicas determinadas. El número de reguladores transcripcionales
conocidos o predichos en organismos eucariotas varía desde 300 en la levadura
hasta 1000 en el ser humano (ver cuadro 2.1).

Número Número de
Organismo
de genes reguladores
levadura 6682 312 (4,7 %)
mosca 13525 492 (3,6 %)
ser humano 22287 1034 (4,6 %)

Cuadro 2.1. Reguladores transcripcionales en distintos organismos.

2.3.1. Motivaciones
Existen diversas motivaciones que incentivan el desarrollo de un modelo
[Gea04]. Esta motivación puede ser desde la intención de obtener valores
cuanticables para algún aspecto del sistema que pueda ser validado

15
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

experimentalmente hasta la exploración de principios de control celular de alto


nivel. Si bien los modelos existentes pueden superponerse a lo largo de varias
de estas categorías, a continuación, se mencionan algunas de ellas:
Modelos construidos para sistemas especícos
Muchos intentos de modelar interacciones de regulación se enfocan en
sistemas pequeños y bien conocidos que pueden ser modelados a mano
sobre la base de conocimiento empírico disponible. Generalmente, estos
modelos son altamente eles al sistema biológico subyacente, en donde
cada componente del modelo se corresponde con un elemento particular en
el sistema biológico. Se utilizan simulaciones numéricas y por computadora
para realizar predicciones sobre sistemas que son demasiado complejos
como para obtener una solución analítica.
Modelos fenomenológicos de mecanismos biológicos
Otro enfoque, a un nivel de abstracción algo mayor, es utilizar sistemas de
componentes generalizados para reproducir comportamientos biológicos
observados, como la morfogénesis o la formación de patrones. En estos
modelos, si bien no existe una correlación directa entre sus componentes y
los del sistema biológico, se preserva el comportamiento de alto nivel del
sistema.
Modelos generales de clases de redes
Otros investigadores, en lugar de enfocarse en sistemas individuales, han
caracterizado el comportamiento de clases de redes con propiedades
estructurales y dinámicas particulares. Estos enfoques permiten la
simulación de un conjunto de redes mucho mayor y más complejo. Una
técnica común consiste en generar un gran número de redes al azar
gobernadas por un conjunto de reglas y observar las propiedades
estadísticas del comportamiento global.
Modelos de red inferidos a partir de datos experimentales
El rápido crecimiento en la disponibilidad de datos experimentales en los
últimos años ha permitido a los cientícos enfocarse en técnicas que son
capaces de construir modelos de sistemas regulados más grandes y menos
comprendidos de manera automática. Los avances en este enfoque se
centran en los formalismos utilizados para modelar los sistemas y los
algoritmos de aprendizaje que permiten derivar el modelo a partir de la
información disponible.

El próximo capítulo, Modelos de redes de regulación génica, brinda una


descripción de los métodos de modelado comúnmente utilizados.

2.3.2. Estrategias de modelado


En general, se pueden distinguir dos vías para modelar redes de regulación
[MG]:

16
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

2.3.2.1. Desde un punto de vista físico

El enfoque físico intenta identicar factores de transcripción, y las zonas de


ADN a las que se unen. Por lo tanto, esta propuesta trata de identicar
interacciones reales que controlan la síntesis de ARN. Una ventaja de este
enfoque, entonces, es que el proceso de modelado resulta más sencillo ya que se
tienen en cuenta sólo los factores de transcripción como elementos reguladores.
Sin embargo, es insuciente para describir otros mecanismos de control en la
regulación.

2.3.2.2. Desde el punto de vista de las inuencias entre


transcripciones de ARN

El segundo enfoque intenta identicar inuencias regulatorias entre


transcripciones de ARN (o entre conjunto de transcripciones). Generalmente,
esta estrategia no describe verdaderas interacciones moleculares, sino que
interpreta que ciertos elementos transcripcionales actúan como entradas
cuyos cambios de concentración pueden explicar los cambios en otros que
actúan como salida, donde cada elemento puede actuar como entrada
(regulador transcripcional) y como salida.
Está claro que los elementos de transcripción ejercen su efecto
indirectamente a través de la acción de proteínas y también de metabolitos.
Este enfoque intenta capturar implícitamente los eventos regulatorios que
tienen lugar a nivel de las proteínas o espacio proteómico  y a nivel de los
metabolitos o espacio metabolómico . En la gura 2.6 pueden observarse
los diferentes niveles del proceso regulatorio. La ventaja más importante de
este enfoque es la capacidad de captar los mecanismos indirectos de regulación
sin que tengan que ser medidos explícitamente. La desventaja es que el modelo
resultante puede ser difícil de interpretar, y por consiguiente difícil de integrar
o de enriquecer con investigaciones adicionales. Además, la descripción
implícita de factores ocultos relacionados con la regulación puede aumentar el
error en la predicción.

La elección entre un enfoque físico o de inuencias depende de varios


factores. En algunos casos puede depender de las preferencias del investigador
a la hora de responder a determinadas cuestiones biológicas, pero sobre todo
viene dada por los datos disponibles y la información de partida. En general,
la estrategia física requiere más información y datos muy especícos. Por
tanto, este método es preferido cuando son conocidos aquellos genes que
potencialmente codican factores de transcripción, y aquellos que son
regulados por un factor de transcripción común. Si bien sólo se encuentran
disponibles para algunos organismos, también podría ser de ayuda la
utilización de datos de secuenciación e información sobre interacciones
proteína-ADN.
La estrategia de inuencias requiere datos menos especícos y más
generales. Esto es debido a que el proceso de inferencia no está restringido a

17
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

Figura 2.6. Niveles del proceso regulatorio (adaptada de [MG])

ciertos componentes de la red de regulación. Este modelo es ventajoso cuando


se intenta predecir la respuesta global de un sistema biológico ante un estímulo
y es el método elegido en la mayoría de las propuestas de modelado de redes
de regulación génica.

2.3.3. Validación de modelos


Una vez llevada a cabo la implementación de un modelo, se impone un
análisis de su validez. En general, es posible validar un modelo comparando
sus resultados con información disponible en la literatura y en bases de datos,
a diferentes niveles (ver sección 2.4, Datos experimentales). Para llevar a cabo
esta tarea, suelen combinarse estos datos experimentales con herramientas
informáticas que, comenzando con un modelo inicial sugerido a partir del
conocimiento de los mecanismos regulatorios y niveles de expresión
disponibles, permitan simular el comportamiento del sistema bajo un conjunto
de condiciones experimentales [DJ02]. Luego el grado de adecuación de un
modelo puede obtenerse comparando las predicciones con los perles de

18
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

expresión genética observados. Si no coinciden, y los datos son considerados


conables, entonces el modelo debe ser revisado. De esta manera, las
actividades de construcción y revisión del modelo, de simulación del
comportamiento del sistema y de prueba de las predicciones resultantes se
repiten hasta que se obtiene un modelo adecuado (ver gura 2.7).

Figura 2.7. Análisis de sistemas de regulación génica. Las cajas


representan las actividades, los óvalos recursos de información, y las
echas ujos de información (adaptada de [DJ02])

Adicionalmente, pueden utilizarse medidas para evaluar el rendimiento de


la red, como son la precisión, la sensibilidad, la medida F y el índice Jaccard
[MG].

2.4. Datos experimentales


Actualmente, existen diferentes repositorios de datos disponibles, que se
utilizan para la generación de los modelos [MG]. Muchos de estos datos suelen
ser pre-procesados antes de ser utilizados. A continuación, se describen algunos
de estos repositorios de acuerdo a los datos que proporcionan.

2.4.1. Datos genómicos


El estudio de los genomas permite a los investigadores comparar genes entre
especies diferentes, así como estudiar regiones que puedan ser potencialmente
importantes. Hoy en día, se conoce el genoma completo de alrededor de miles de
virus, bacterias y eucariotas, y pueden ser consultados en bases de datos como
GenBank [Gena].
El análisis de secuencias genómicas persigue fundamentalmente la
búsqueda de genes y de sus regiones de regulación. Por tanto, el objetivo es
detectar la relación entre patrones secuenciales y la expresión de los genes. Si
bien es complicado predecir correctamente regiones de regulación a partir de
una secuencia, ya que éstas por sí solas no pueden explicar la interacción entre
genes o cómo actúan en la célula, existen bases de datos que almacenan

19
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

perles de estas regiones como Transfac [Tra] y Jaspar [Jas]. Con ellas, los
investigadores tienen la posibilidad de acceder a una librería de patrones, y
comprobar la frecuencia de aparición de dichos patrones en una secuencia
determinada.

2.4.2. Datos transcriptómicos, proteómicos y


metabolómicos
A diferencia de la información genómica, los datos transcriptómicos,
proteómicos y metabolómicos varían a lo largo del tiempo y dependen de
factores del entorno. La utilización de este tipo de datos otorga una visión
directa de la expresión de los genes y permite analizar y modelar redes
regulatorias y su comportamiento.
El término transcriptómico hace referencia al estudio de los niveles de ARN
en una población de células. Es un tipo de dato muy utilizado en la
reconstrucción de redes de regulación debido a que la expresión génica está
controlada en su mayor parte por reguladores transcripcionales (combinación
de factores de transcripción), y por procesos post-transcripcionales. La
tecnología más utilizada para la obtención de este tipo de datos es el
chip de ADN o DNA microarray, que es capaz de almacenar los niveles de
expresión de miles de genes simultáneamente [Che+96][Loc+96][Sch+95]. El
modelado de estas redes suele estar basado en este tipo de experimentos
debido al número de repositorios públicos que se encuentran disponibles. Entre
ellos, es posible mencionar ArrayExpress [Arr], Gene Expression Omnibus
[Genb] y la base de datos Stanford Microarray Database [Smd], las cuales
almacenan información en crudo y normalizada de este tipo de datos.
La utilización de este tipo de datos implica la adopción de un modelo basado
en inuencias, presentado anteriormente, por lo que las propuestas derivadas de
esta estrategia asumen la simplicación de que la expresión de los genes puede
ser descrita exclusivamente a través de las concentraciones de ARN transcrito.
También es importante tener en cuenta que en este modelo no existe distinción
entre genes y las proteínas que éstos producen (factores de transcripción, en
muchos casos).

2.4.3. Datos interactómicos


Como se ha comentado anteriormente, descubrir interacciones entre genes a
partir de datos de expresión no es una tarea fácil. Es por esto que la investigación
del conjunto de interacciones que relacionan el conjunto de genes, proteínas y
moléculas también llamado interactoma  de distintos sistemas biológicos
adquiere un papel importante.
En cuanto a las interacciones proteína-ADN, cabe destacar las que ocurren
entre factores de transcripción y las regiones reguladoras en los promotores.
Experimentos a gran escala permiten obtener tales interacciones. A partir de
estos datos se pueden predecir qué genes regulan un determinado factor de
transcripción. En tanto, las interacciones proteína-proteína juegan un rol más

20
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA

importante en la señalización intercelular, y pueden ser identicadas sin mucha


dicultad a través de la experimentación.
Existe gran cantidad de información disponible sobre interacciones
moleculares. Pathguide (también llamada metadatabase) proporciona una
descripción de más de 500 bases de datos accesibles en línea [Pat].

2.4.4. Datos funcionales


Proyectos como Gene Ontology [Genc], KEGG [Keg] y MIPS [Mew+02]
intentan formalizar grupos funcionales y rutas de genes. El proyecto Gene
Ontology proporciona una descripción consistente de genes y productos de
éstos, mediante una estructura en árbol de ontologías. Para ello, utiliza tres
grandes categorías: componentes celulares, procesos biológicos y funciones
moleculares. Un producto puede estar asociado o localizado en uno o más
componentes celulares por ejemplo, el núcleo, estar activo en uno o más
procesos biológicos por ejemplo, en señales de traducción, y llevando a
cabo una o más funciones moleculares por ejemplo, una actividad
catalítica. Sobre la base de esta información, la relación entre dos genes
puede ser valorada en función de las coincidencias comunes: cuanta más
información compartan, mayor será la asociación funcional entre ambos.
Existe otro tipo de información que no está directamente relacionada con
funciones biológicas, pero que, sin embargo, debería tenerse en cuenta para
establecer relaciones entre genes. Por ejemplo, la base de datos de proteínas
Cluster of Orthologous Groups [Cog] proporciona una clasicación logenética,
o de relaciones de parentesco, de proteínas, basándose en el supuesto de que
aquellos genes o mejor dicho, las proteínas que codican con un mismo
perl logenético podrían tener una misma funcionalidad.

21
Capítulo 3

Modelos de redes de
regulación génica

3.1. Introducción
Si bien existen discrepancias entre los diferentes autores, es posible
mencionar cinco categorías principales en el modelado de redes de genes
[Gea04]:

Modelos de red, cuyo principal interés está puesto en la estructura de


las redes y su evolución, y en segundo lugar en su dinámica;

Modelos discretos, en donde las variables de estado toman uno de un


número discreto de valores;

Modelos continuos, en los cuales cada variable de estado toma valores


continuos;

Modelos híbridos, en los cuales ciertos eventos del sistema se modelan


de manera discreta mientras que otros se expresan como valores continuos;
y
Modelos estocásticos, en los cuales cada estado es una distribución de
probabilidad de conguraciones posibles.

Dentro de estas categorías primarias, los modelos pueden distinguirse a su


vez de acuerdo con su tratamiento del tiempo y el espacio. Muchos de los modelos
que se interesan puramente en la dinámica intracelular es decir, la regulación
dentro de la célula omiten cualquier referencia a la regulación que tiene lugar
en el dominio espacial. Otros modelos reconocen el hecho de que las células
tienen estructuras espaciales complejas e incluyen retrasos de tiempo debido a
la difusión y el transporte molecular. Algunos, como aquellos que investigan la
formación de patrones, modelan disposiciones espaciales de grupos de células,

22
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

que pueden tener dos o tres dimensiones y pueden ser representadas tanto por
un diseño reticular como en un espacio continuo.
Similarmente, la evolución del comportamiento de un sistema en la
dimensión temporal puede modelarse de manera discreta o continua. Cuando
el tiempo es medido discretamente, como suele ocurrir cuando el modelo es
simulado o resuelto numéricamente, surge la necesidad de denir si las
variables de estado son actualizadas todas al mismo tiempo
 sincrónicamente  o de manera independiente  asincrónicamente .
Ciertos modelos se interesan únicamente en las propiedades estructurales
estáticas y no incluyen la dimensión temporal mientras que otro número de
modelos está interesado en investigar cómo evolucionan las redes de regulación
teniendo en cuenta el tiempo como variable.

A continuación, se presentan los tipos de modelos mencionados


anteriormente junto con algunas de las estrategias más conocidas en cada caso.

3.2. Modelos de red


Los modelos de red, también llamados modelos topológicos, se centran en
describir la estructura de la red, es decir, la forma en que los elementos
individuales están conectados. Caracterizan relaciones entre genes y
posiblemente su naturaleza, pero no su dinámica: el tiempo no es modelado y,
por tanto, no pueden realizarse simulaciones sobre ellos.
En estos modelos, existen diferentes tipos de redes en función de los
elementos reguladores a considerar, y de las interacciones entre éstos; y con
ello varía el tipo de interacción que puede presentarse entre dos nodos unidos
por una arista. Así, por ejemplo, existen redes donde los nodos del grafo
representan genes, y donde una arista dirigida del gen A al gen B signica que
A produce un factor de transcripción que actúa sobre el promotor del gen B .
Otro tipo de red podría ser aquella en la que una arista de A a B signique
que una alteración del gen A, como una mutación, altere la expresión del
gen B . También son bien conocidas las redes moleculares, en las que los nodos
representan proteínas, y una arista (no dirigida) entre dos proteínas representa
la unión entre ambas. Un enfoque diferente establece que dos genes están
conectados en base a la similitud de sus secuencias; e incluso existen redes que
relacionan genes en función de que aparezcan con frecuencia en publicaciones
cientícas.
Se han hecho observaciones importantes en las topologías de las redes
regulatorias. Por ejemplo, en la levadura, algunos autores, como Albert et al.
[AJB00], han propuesto la existencia de concentradores en una red, los cuales
permitirían hacerla más tolerante a fallos aleatorios en alguno de sus
componentes.
La mayoría de los métodos de modelado y simulación de redes de regulación
génica que se describirán posteriormente hacen uso de un enfoque  de abajo
hacia arriba  o  bottom up  [Gea04]. Éstos toman como punto de partida las

23
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

interacciones entre los elementos individuales del sistema y luego observan el


comportamiento global que ocurre cuando el sistema es resuelto o simulado.
Recientemente, ha aumentado el interés en los enfoques  de arriba hacia abajo 
o  top down , los cuales se focalizan primero que nada en el sistema genético
visto como una red [Bra03].
Es posible decir que la verdadera razón para estudiar la topología de las redes
es la de preparar el terreno para el siguiente paso: la construcción de modelos más
detallados. Evidentemente, antes de construir un modelo, es necesario conocer
qué genes producen interacciones y cuáles son mutuamente independientes.

3.2.1. Redes de mundo pequeño y libre de escala


Dado un gran conjunto de elementos, es posible conectarlos en un número de
formas diferentes [Gea04]. En un extremo, cada elemento puede estar conectado
a sus vecinos espacialmente más cercanos, conformando una red conocida como
retículo regular. En el otro extremo, los pares de elementos pueden ser conectados
al azar, formando redes aleatorias. En ausencia de información más detallada
respecto a la arquitectura de los sistemas biológicos, parecería razonable utilizar
un enfoque aleatorio, el cual permitiría, además, el uso de resultados relativos a
las propiedades de los grafos aleatorios. Sin embargo, las redes reales, sean redes
sociales, de telecomunicaciones o redes de genes, no están conectadas al azar.
Redes de mundo pequeño y redes libre de escala son dos enfoques
relacionados, recientemente propuestos, que ofrecen modelos más
representativos. A continuación, se describen ambos brevemente.

Redes de mundo pequeño [Wat99]


Se obtienen cuando una pequeña porción de los enlaces existentes en una
retícula al azar son cableados de manera aleatoria (ver gura 3.1). Las
redes resultantes tienen dos propiedades importantes. Primero, la
distancia promedio entre dos nodos cualesquiera en la red es muy corta,
como lo es en una red aleatoriamente conectada. Segundo, el número de
nodos cuyos vecinos son también vecinos de otro llamado coeciente de
agrupamiento o clustering coecient  es alto. Resulta que este modelo
es una descripción razonable de un número de redes que existen de
manera natural.
Redes de escala libre
Este enfoque se caracteriza por un decaimiento potencial de la
probabilidad de que un nodo interactúe con otros k nodos, de acuerdo
con P (k) ∼ k −γ [Gea04]. Esta propiedad estructural proviene de una
dinámica de crecimiento llamada acoplamiento preferencial o preferential
attachment, por la cual la red crece a partir de agregar sucesivamente
nuevos nodos a un número pequeño de nodos iniciales. Un nodo nuevo
tiene la probabilidad de estar conectado a cada nodo existente
dependiendo del número de conexiones que dicho nodo ya posea.
Entonces, es más probable que aquellas redes con un mayor número de

24
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

conexiones atraigan más nodos, mientras que aquellas conectadas


mínimamente permanezcan de esa forma.

Figura 3.1. Red regular, de mundo pequeño y aleatoria. Las redes son
generadas comenzando con un retículo regular (izquierda) y cableando
nuevamente una porción de enlaces de manera aleatoria. Cuando todos
los enlaces atraviesan este proceso, el resultado es una red aleatoria
(derecha). Para valores intermedios, el resultado es una red de mundo
pequeño (centro), la cual se encuentra altamente agrupada, como un
retículo regular, y a su vez presenta una corta distancia entre nodos,
como en una red aleatoria (adaptada de [Gea04])

3.2.2. Grafos dirigidos y no dirigidos


Probablemente una de las formas más sencillas de modelar una red de
regulación génica es mirarla como un grafo [DJ02].

3.2.2.1. Descripción del modelo

Un grafo dirigido G se dene como una tupla <V, E>, donde V es el


conjunto de vértices y E es el conjunto de aristas. Una arista dirigida es una
tupla <i, j>, donde i es la cabeza y j es el extremo de la arista. Los vértices
de un grafo dirigido se corresponden con los genes u otros elementos de interés
en el sistema de regulación, mientras que las aristas denotan interacción entre
genes.
La representación de una red de regulación a través de un grafo puede
generalizarse de distintas maneras. Los vértices y aristas pueden ser
etiquetadas, por ejemplo, para mostrar las interacciones entre los genes. Las
aristas pueden ser etiquetadas entonces con + ó - para indicar si un gen i es
activado o inhibido por un gen j . También pueden usarse hipergrafos para

25
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

Figura 3.2. Ejemplo de grafo dirigido: (a) representación de una


red de regulación génica mediante un grafo dirigido; (b) denición
de la red; y (c)(d) representación de una red de regulación génica
con interacciones cooperativas mediante un hipergrafo (adaptada de
[DJ02])

representar situaciones en donde múltiples proteínas regulan la expresión de


un gen. La gura 3.2 muestra redes de regulación de 3 genes.
Se pueden llevar a cabo una serie de operaciones sobre estos grafos para
realizar predicciones biológicamente relevantes acerca de los sistemas de
regulación. Una búsqueda de caminos entre dos genes, por ejemplo, puede
revelar una falta de interacciones de regulación o proporcionar pistas acerca de
la redundancia en la red. Por otra parte, ciclos en la red indican relaciones de
retroalimentación que son importantes para la homeostasis y la diferenciación
celular. Ciertas características de conectividad global de una red, como la
media y la distribución del número de reguladores por gen, dan una indicación
de su complejidad. Los subgrafos poco conectados señalan módulos funcionales
del sistema de regulación cuyo comportamiento podría considerarse de manera
aislada. De la comparación de las redes de regulación de diferentes organismos
podría ser posible establecer en qué medida las partes de las redes de
regulación se han conservado en términos evolutivos.

3.2.3. Modularidad, motivos y otras características


estructurales
La noción de agrupamiento en un modelo de red se corresponde
intuitivamente con la idea de módulos funcionales en la redes de regulación
[Gea04]. Se ha sugerido que es importante considerar a los módulos funcionales
en las organizaciones biológicas, debido a que involucran una pequeña fracción
de componentes de la red que trabajan juntos de una manera relativamente

26
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

autónoma y, como tales, representan una posible forma de reducir la


complejidad de las redes de regulación [Har+99]. La evidencia empírica sugiere
que estas subestructuras de control independientes realmente existen. También
se ha sugerido que los módulos funcionales pueden ser una de las unidades
sobre las que opera la evolución.
Una forma de investigar la modularidad en redes consiste en combinar
jerárquicamente pequeños módulos funcionales en unidades progresivamente
más grandes. Otro enfoque sugiere la identicación de motivos de regulación
o motifs, es decir, patrones de interacción repetidos que ocurren con mayor
regularidad que la esperada en una red aleatoria [Alo07][Mil+02] (ver gura
3.3).

Figura 3.3. Ejemplos de algunos motivos de regulación (adaptada de


[MG])

Una vez conocida la topología de una red, el siguiente paso consiste en


estudiar los mecanismos de interacción entre los diferentes elementos que la
integran. Por ejemplo, si un promotor está relacionado con un solo factor de
transcripción, interesa conocer si éste es un activador o un represor. Si, por el

27
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

contrario, son varios factores de transcripción los que pueden unirse a un


promotor, no sólo interesa saber lo que hace cada uno, sino también cómo
interactúan.

3.3. Modelos discretos


La característica que dene a los modelos clasicados como discretos o
lógicos es que sus variables de estado se miden discretamente [Gea04], es decir,
se basan en la presunción de que un gen tiene un número nito de estados. Si
bien esto representa con frecuencia un alto nivel de abstracción respecto a la
biología real, los modelos que se describen a continuación han provisto una
serie de conocimientos teóricos y han tenido una inuencia signicativa en el
pensamiento acerca de las redes de regulación. En particular, el modelo de red
booleano ha sido fundamental en la denición de sistemas biológicos complejos.

3.3.1. Redes booleanas


Uno de los primeros enfoques para el modelado de grandes redes de genes
fue considerar a un sistema de regulación génica como una red de elementos
lógicos [Gea04]. El modelo dinámico más simple (red booleana sincrónica) fue
utilizado en la década de 1960 por Stuart Kauman [Kau69]. Puede observarse
una de estas redes en la gura 3.4.

3.3.1.1. Supuestos

Este enfoque realiza ciertas suposiciones que permiten simplicar el análisis y


reducir masivamente los requerimientos computacionales al realizar simulaciones
de grandes sistemas regulados [Gea04]. Entre ellas, se destacan:

La activación de un gen puede representarse por un interruptor booleano


que puede ser encendido o apagado. De hecho, un gen puede expresarse o
no, y no existe la posibilidad de niveles de activación intermedios. Esta
suposición es razonable cuando el gen pasa la mayor parte de su tiempo,
o bien en un estado base cero, o bien en un estado de saturación positivo,
y el tiempo requerido para cambiar de estado es despreciable respecto a
la escala de tiempo del modelo.

El control regulatorio sobre un gen, plasmado en las interacciones entre


factores de transcripción. puede describirse por una combinación de reglas
booleanas, como lo son Y, O y NO.
Los eventos en el sistema pueden considerarse sincrónicos, esto es, los
estados de todos los genes pueden actualizarse simultáneamente a cada
paso de tiempo.
La validez de las suposiciones mencionadas y el valor del enfoque booleano
en general han sido altamente cuestionadas, particularmente por la comunidad

28
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

Figura 3.4. Ejemplo de una red booleana: (a) el esquema de la red;


(b) las reglas de actualización; (c) la tabla de transición de estados que
muestra cómo la activación de la red en el tiempo t + 1 depende de la
activación en el tiempo t; y (d) el espacio de estados de la red, con dos
estados a los que tiende a evolucionar el sistema (000 y 111) y un ciclo
límite con un período de 2 (adaptada de [Gea04])

biológica, donde se aprecia una falta de conexión entre los resultados de


simulación y las hipótesis empíricamente comprobables.

3.3.1.2. Descripción del modelo

En el modelo más sencillo, llamado modelo de Kauman, existen dos


parámetros de importancia [Gea04]: el número de elementos en la red n y el
número de entradas que regulan la actividad de cada elemento k . Cada uno de
los n elementos es asociado con una tabla de reglas especicando las salidas
para cada una de las 2k posibles combinaciones de entrada. Las tablas de
reglas para cada elemento pueden denirse de diferentes formas: pueden ser
jas en el tiempo llamado modelo templado o quenched model , lo cual

29
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

ocurre usualmente cuando se simula una sola red; o, alternativamente, un


nuevo conjunto de reglas puede generarse a cada paso llamado modelo
recocido o annealled model , lo cual simplica el análisis teórico del
comportamiento de la red.
Conforme avanza el tiempo, la red navega a través de un espacio de estados
llamado trayectoria, cambiando de un estado a otro [MG]. Para una red de
n genes, existe un número nito de 2n posibles estados diferentes [MG]. Cada
elemento en la red se actualiza simultáneamente y el estado en el tiempo t + 1
puede ser determinado en función del tiempo t [Gea04]. Eventualmente, todos
los estados iniciales alcanzan un estado estacionario o un ciclo de estados,
también llamado atractor puntual o atractor dinámico, respectivamente
[DJ02]. Los estados que no son parte de un atractor son llamados estados
transitorios. El conjunto de estados atractores y estados transitorios que
conducen al atractor constituyen la denominada cuenca de atracción. Para
redes sencillas, los atractores y sus cuencas de atracción en el espacio de
estados pueden calcularse a mano, mientras que para sistemas más grandes
suelen utilizarse programas de computadora.

3.3.1.3. Fortalezas y limitaciones

Las mayores fortalezas del modelo de red booleano son su tratabilidad


analítica y la facilidad y eciencia con las que puede simularse [Gea04]. Las
principal limitación del modelo es su falta de aplicabilidad a los sistemas
biológicos. Existen algunas cuestiones problemáticas relacionadas con la
conectividad y el sincronismo; asimismo, es conocido que ciertos genes tienen
diferentes efectos de regulación dependiendo de su nivel de expresión y en
algunas situaciones el período de tiempo en el que el gen cambia puede ser
signicativo, lo cual plantea objeciones sobre la validez de alguna de las
suposiciones antes mencionadas.
De acuerdo con [Ban+07], la mayor parte del trabajo realizado en redes
booleanas asume que los datos han sido ya discretizados en variables binarias.
Debido a que los errores experimentales suelen ser considerables, el proceso de
discretización no es trivial, por lo que deben elegirse una prueba de signicación
y un umbral de conanza apropiados.
Mientras que la representación booleana puede ser suciente para un
producto que tiende a presentarse, o bien en exceso, o bien en cantidades
signicativas, aquellos productos cuya concentración varía de manera continua
pueden requerir una función continua que permita capturar su dinámica más
adecuadamente [Gea04]. Un número de investigadores también ha demostrado
que no existe una correlación directa entre el comportamiento dinámico de los
modelos booleanos y sus correspondientes sistemas continuos, lo cual sugiere
una pérdida cualitativa de información comportamental.

30
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

3.3.2. Lógica generalizada


Si bien el formalismo de lógica generalizada para modelar redes de
regulación génica tiene sus orígenes en áreas similares a las del modelo
booleano, se distingue por varias características [Gea04]:
Es intrínsecamente asincrónico;
Permite que las variables tomen múltiples valores lógicos; y
Permite una denición más sosticada de las interacciones lógicas,
involucrando umbrales y otros parámetros.
Este enfoque otorga una serie de herramientas con las cuales se puede
caracterizar y analizar redes derivadas de interacciones conocidas o de
patrones de expresión génica medidos en términos de sus estados estacionarios
dinámicos.

3.3.2.1. Supuestos

Este modelo admite lógica multivariada basándose en el hecho de que cuando


un elemento particular actúa en más de un contexto, no puede asumirse que los
umbrales requeridos para cada una de esas acciones sea el mismo [Gea04]. Por
ejemplo, un producto X puede tener un efecto sobre un gen Y cuando alcanza
el nivel de concentración c1 y también tener un efecto adicional sobre el gen Z
cuando alcanza una concentración c2 .
Este formalismo también permite una forma considerablemente más
sosticada de actualización lógica que el modelo booleano. El primer
renamiento es la introducción de parámetros lógicos, los que permiten
ponderar las interacciones entre genes. El argumento detrás de esta
complicación es que los genes pueden expresarse en diferentes grados en
diferentes circunstancias y entonces esto puede afectar la expresión de otro gen
de diversas maneras. El segundo renamiento tiene que ver con la posibilidad
de que algunos estados estacionarios de un sistema, particularmente los
inestables, puedan ser ubicados en valores umbrales. En este sentido, se
introducen valores lógicos para los umbrales, así como también para los niveles
de expresión por abajo y por encima de dichos umbrales.
A diferencia de las redes booleanas, en donde el tiempo es medido de
manera discreta, este formalismo utiliza tiempo continuo, permitiendo
actualizaciones asincrónicas de los elementos. Es importante notar que la
forma de asincronismo utilizada es determinística en el orden de actualización.
En lugar de un conjunto determinístico de reglas de transición de estados, el
modelo de lógica generalizada dene un conjunto de funciones que permiten
relacionar los estados actuales con sus estados imagen, o con el estado hacia el
cual el sistema tendería a moverse si se llevaran a cabo las actualizaciones de
todas las variables. Esta transición incluye dos retrasos de tiempo, uno que
describe el período entre que un gen se enciende y su producto alcanza niveles
funcionales y otro que describe el período de tiempo entre que un gen se apaga
y sus productos se encuentran bajo los niveles funcionales.

31
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

3.3.2.2. Descripción del modelo

El primer paso en la construcción de una descripción lógica de un sistema


es especicar el grafo de interacciones positivas y negativas entre los elementos
lógicos [Gea04]. A partir de este diagrama, pueden inferirse ecuaciones lógicas
y su correspondiente tabla de transición de estados, la cual, a diferencia del
enfoque de red booleana presentado anteriormente, no contiene transiciones
determinísticas.
Este formalismo utiliza variables discretas x̂i , llamadas variables lógicas,
que son abstracciones de las reales concentraciones xi [DJ02]. Si un elemento
elemento i inuencia otros p elementos del sistema, entonces puede tener hasta
p umbrales σi :
(1) (2) (p)
σi < σi < ... < σi (3.1)
Los posibles valores de x̂i se denen comparando las concentraciones xi con
los umbrales de inuencia del elemento i sobre otros elementos del sistema de
regulación. Dados estos umbrales, x̂i puede asumir los valores 0, ..., p y se denen
como:
(1)
x̂i = 0, si xi < σi (3.2)
(1) (2)
x̂i = 1, si σi < xi < σi
...
(p)
x̂i = p, si xi > σi
De esta manera, el vector x̂ denota el estado lógico del sistema de regulación.
El patrón de interacciones regulatorias en el sistema se describe entonces por
ecuaciones lógicas de la forma:
X̂i (t) = bˆi (x̂(t)), 1 ≤ i ≤ n (3.3)

donde X̂i es la imagen de x̂i y bˆi es una generalización del tipo de función
utilizada en el formalismo de redes booleanas, ya que las variables lógicas
pueden adquirir ahora más de dos valores posibles. Esta imagen es el valor
hacia el cual x̂i tiende cuando el estado lógico del sistema es x̂. De esta
manera, existen estados lógicos estacionarios donde el sistema permanece una
vez que se encuentra en ellos mientras que en el resto de los casos se trata de
estados lógicos transitorios.
Debido al carácter inherentemente asincrónico de este modelo, en el
escenario de una transición que involucra el cambio de estado de dos genes, la
probabilidad de que ambos se actualicen simultáneamente es
innitesimalmente pequeña [Gea04]. Por lo tanto, uno de las dos posibles
transiciones ocurrirá primero, dependiendo del retraso de tiempo para dicho
elemento, y determinará el siguiente estado. Realizar este proceso para todos
los estados resulta en un grafo de transición, a partir del cual pueden
identicarse estados estacionarios así como también posibles ciclos. La gura
3.5 muestra un ejemplo de red de lógica generalizada, su tabla de transición de
estados y su diagrama de estados asociado.

32
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

Figura 3.5. Ejemplo de una red de lógica generalizada: (a) el diagrama


de red con dos interacciones negativas y una positiva; (b) las reglas
de actualización lógicas; (c) la tabla de transición de estados donde
se puede apreciar que hay dos estados 100 y 101 que tienen como
imagen a sí mismos, representando los estados estacionarios hacia los
cuales el sistema eventualmente se moverá; y (d) el grafo de transiciones
(adaptada de [Gea04])

3.3.2.3. Fortalezas y limitaciones

El formalismo de lógica generalizada es una herramienta poderosa para


analizar redes cuyas interacciones son bien conocidas, permitiendo que puedan
determinarse los posibles comportamientos cualitativos de un sistema de
manera rigurosa [Gea04]. El proceso puede ser automatizado
computacionalmente y se ha demostrado su efectividad en la inferencia de
redes de genes utilizando datos de expresión génica. La inclusión explícita de
retrasos de tiempo permite tener una imagen más precisa del sistema biológico
que las redes booleanas sincrónicas.
Una de las limitaciones principales de este enfoque es que, debido a que ha

33
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

sido diseñado a partir del análisis detallado de un número relativamente pequeño


de sistemas de interacciones bien caracterizadas, su escalabilidad es limitada. De
esta manera, este enfoque no resulta ser tan apropiado para la exploración de
diferentes clases de comportamiento y de grandes sistemas menos conocidos.

3.3.3. Redes de Petri


Las redes de Petri son una extensión del modelo de grafos que ha sido
utilizada con éxito en muchas áreas, como por ejemplo en el modelado de redes
de regulación, permitiendo una representación cuantitativa sencilla del proceso
dinámico [MG]. Las redes de Petri fueron desarrolladas en la década de 1960
por Carl Adam Petri, y están formadas por grafos dirigidos que contienen dos
tipos de nodos: lugares y transiciones [Mur89].

3.3.3.1. Descripción del modelo

Los arcos sólo conectan lugares hacia nodos de transición y viceversa. La


dinámica del modelo se introduce con el concepto de token. Cada lugar puede
contener tokens mientras que cada arco tiene un peso que determina cuántos
tokens se necesitan para una transición a través de él. Intuitivamente, puede
imaginarse que los tokens viajan a través de un arco si hay suciente número
de ellos en el nodo de origen (el número de tokens es mayor o igual que el peso
del arco) y los nodos de transición determinan la tasa de intercambio a través
del recorrido. En el caso más simple, un nodo de transición se dispara siempre.
En el caso de redes de genes, los lugares representan genes, y los nodos de
transición representan relaciones de activación-represión (ver gura 3.6).

3.3.3.2. Fortalezas y limitaciones

La utilidad de este modelo radica en que no necesita información detallada


sobre las velocidades de las reacciones, las cuales son, normalmente, difíciles de
obtener. Sin embargo, muchas veces se hace imprescindible para comprender la
función de una ruta metabólica completa, y por tanto, es un dato que el modelo
debería de tener en cuenta.

3.3.4. Basados en reglas


El resto de los formalismos mencionados en este capítulo, ya sean continuos
o discretos, estáticos o dinámicos, determinísticos o estocásticos, poseen una
noción restringida del estado de un sistema [DJ02]. De hecho, puede considerarse
que el estado de un sistema de regulación está dado por la concentración o el
número de moléculas de proteínas, ARN, metabolitos, y otras especies en un
cierto punto en el tiempo. Los formalismos basados en el conocimiento o en
reglas, desarrollados en el campo de la inteligencia articial, permiten que una
variedad más rica de conocimiento sobre el sistema pueda expresarse en un único
modelo.

34
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

Figura 3.6. Ejemplo de una red de Petri y la red de regulación génica


que representa (tomada de [MG])

3.3.4.1. Descripción del modelo

Básicamente, los formalismos basados en reglas consisten en dos


componentes: un conjunto de hechos y un conjunto de reglas, los cuales son
guardados en una base de conocimiento.
Los hechos expresan cierto conocimiento acerca de los objetos del sistema
de regulación. Cada objeto es caracterizado a partir de ciertas propiedades que
toman valores desde dominios bien denidos. Estos objetos usualmente están
estructurados en una jerarquía de clases. Por ejemplo, la clase Secuencia-ADN
podría denirse como aquellos objetos con propiedades tales como topología
y disposición-en-hebras. Una secuencia especíca de ADN podría tener el
valor circular para topología y monocatenaria para
disposición-en-hebras. Asimismo, la clase Secuencia-ADN podría denirse
como una subclase de la clase Secuencia.
En tanto, las reglas en la base de conocimiento consisten de dos secciones: una
sección de condiciones y una sección de acciones. Las condiciones se expresan
en términos de propiedades de los objetos mientras que las acciones operan
sobre los objetos, por ejemplo, cambiando el valor de una propiedad a un objeto
existente. Un ejemplo de una regla que describe bajo que condiciones la enzima

35
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

ADN polimerasa I se unirá al ADN de una bacteria es:

SI ((rango-temperatura es 0-a-45)
Y (rango-fuerza-iónica es 0.001-a-0.3)
Y (rango-PH es 6.0-a-9.5))
ENTONCES (actividad de ADN-Polimerasa-I es Union-ADN)

Las simulaciones basadas en reglas consisten en repetir el proceso de buscar


coincidencias entre los hechos de la base de conocimiento y las secciones de
condiciones de las reglas y llevar a cabo las acciones correspondientes. Una
estrategia de control determina el orden en el cual se evalúan las reglas y resuelve
los conictos que aparecen cuando existen varias reglas que coinciden con los
hechos al mismo tiempo. Estas estrategias de control varían desde una selección
aleatoria a esquemas de prioridad complejos.
Asimismo, estas simulaciones pueden realizarse en modo encadenamiento
hacia adelante, también conocido como forward-chaining, o hacia atrás o
backward-chaining. En el caso del modo encadenamiento hacia adelante, como
lo es el ejemplo citado anteriormente, se deducen los hechos implicados por el
conjunto de reglas y hechos iniciales existentes en la base de conocimiento. En
el caso del modo encadenamiento hacia atrás, los hechos son conclusiones a ser
explicadas, por lo que la simulación procede en orden inverso. Los hechos se
hacen corresponder con las secciones de acciones de las reglas de manera de
alcanzar todas las posibles combinaciones de hechos que puedan llevar a las
conclusiones.

3.3.4.2. Fortalezas y limitaciones

La capacidad para lidiar con una variedad más rica de conocimiento


biológico de una manera más intuitiva es la principal ventaja de este
formalismo. En detrimento, se presentan ciertas dicultades inherentes al
mantenimiento de la consistencia de una base de conocimientos y el problema
de incorporar información cuantitativa [DJ02]. Aunque se han realizado
intentos para integrar conocimiento simbólico y numérico en un único
formalismo, estos enfoques no pueden competir con los modelos continuos que
se discutirán posteriormente.

3.3.5. Lógica continua


La lógica continua suele referirse a modelos de sistemas regulados en los
cuales la activación de un gen es considerada también booleana, pero donde el
tratamiento analítico es más similar al utilizado en los modelos continuos que
a los mencionados en los enfoques anteriores [Gea04]. En este caso, los estados
del sistema medibles son de naturaleza cualitativa, en comparación con los
verdaderos enfoques continuos donde los estados del sistema son
frecuentemente cuantitativos. Estos modelos de lógica continua han sido
utilizados por enfoques conjuntos para determinar clases de comportamiento y

36
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

en enfoques de simulación cualitativa con el objeto de modelar el


comportamiento de ciertos sistemas.
Esta metodología permite generar sistemas susceptibles de ser analizados, a
la vez que permite la existencia de complejos patrones dinámicos. La motivación
detrás de este formalismo está dada por encontrar las posibles dinámicas en la
red, dada cierta estructura lógica asociada a la misma.

3.3.5.1. Supuestos y descripción del modelo

La función de actualización del sistema ha adoptado un número de funciones


diferentes [Gea04]. Una característica común entre ellas es su forma sigmoidal,
forma que resulta verosímil a la luz de la evidencia experimental. Debido a la no
linealidad de dichas funciones, y de manera de simplicar el análisis matemático,
usualmente son reemplazadas por funciones escalonadas discontinuas.
Si se considera al espacio de estados como un hipercubo n -dimensional,
entonces el mismo puede entenderse dividido por hiperplanos umbral en
volúmenes que representan los estados cualitativos del sistema, es decir,
espacios en donde el sistema se comporta de una manera cualitativamente
diferente (ver gura 3.7). Las transiciones entre espacios cualitativos vecinos
ocurren toda vez que una solución que comienza en una región termina en otra
región.

Figura 3.7.Espacio de estados de un modelo de lógica continua, en


donde pueden observarse los volúmenes denidos por los diferentes
umbrales de activación (adaptada de [Gea04])

37
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

3.3.5.2. Fortalezas y limitaciones

Una de las principales ventajas de utilizar modelos bajo este formalismo es


que el tiempo puede incorporarse de manera continua [Gea04]. Una desventaja
es que los métodos analíticos suelen escalar pobremente, limitando el análisis a
pequeños sistemas (de dos o tres genes interactuantes), promoviendo la
utilización de simplicaciones no realistas o el uso de simulación numérica, lo
cual requiere, por lo general, de la introducción de cierto tipo de discretización
temporal.
Asimismo, si bien este formalismo permite que las dinámicas de sistemas de
regulación complejos sean tratables al análisis matemático, se omiten muchas
características complejas de los sistemas biológicos reales, incluyendo retrasos
de tiempo y su estructura espacial.

3.4. Modelos continuos


Todos los formalismos mencionados en la sección anterior comparten el
supuesto que las variables de estado pueden ser representadas de manera
discreta. En realidad, si bien es cierto que, en un cierto punto en el tiempo, un
gen es o no es transcrito, los niveles de activación, la velocidad de
transcripción y las concentraciones de los productos pueden variar de manera
continua [Gea04]. Esta sección describe una serie de enfoques para modelar
redes de regulación génica en los cuales se utiliza una representación continua
para las variables de estado.

3.4.1. Ecuaciones diferenciales ordinarias y en diferencias


Siendo posiblemente el formalismo más extendido para modelar sistemas
dinámicos en la ciencia y la ingeniería, las ecuaciones diferenciales ordinarias
han sido ampliamente utilizadas a la hora de analizar sistemas de regulación
génica [DJ02]. Este formalismo modela la concentración de ARNs, proteínas, y
otras moléculas mediante variables dependientes del tiempo que asumen
números reales no negativos. De esta manera, las interacciones de regulación
toman la forma de relaciones funcionales y diferenciales entre las
concentraciones de las variables del sistema. Mientras que otros modelos como
las redes booleanas o redes de Petri se concentran en expresar propiedades
estáticas de los sistemas, estas ecuaciones proporcionan una descripción
detallada de los aspectos dinámicos de las redes de regulación [MG].

3.4.1.1. Supuestos

En estos casos, suelen realizarse algunos supuestos que simplican el análisis


de los procesos biológicos que se modelan [Gea04] [MG]:

El control de la expresión de un gen reside en la regulación de la


transcripción del gen. Se sabe que este supuesto es incorrecto, debido a

38
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

que dicho control puede ser ejercido en otros niveles, incluyendo el


procesamiento y traducción del ARN que se realizan luego de la
transcripción.

Los genes se expresan y las proteínas se producen a una velocidad


constante y determinística. Nuevamente, este supuesto tampoco es
siempre válido. La producción y el movimiento de moléculas individuales
puede ser importante en algunos sistemas, a la vez que puede existir
cierto grado de aleatoriedad. Los modelos estocásticos, que se describen
en la sección 3.6, Modelos estocásticos, se desarrollaron para reducir la
dependencia con este supuesto.

La lógica de control entre los genes es lineal. El nivel de expresión de un


gen en un instante depende linealmente de los niveles de expresión de
todos los genes en un instante anterior. No obstante, y como se observará
posteriormente, para cada gen pueden añadirse términos adicionales que
indiquen la inuencia de otras sustancias.

3.4.1.2. Descripción del modelo

La base de muchas descripciones de sistemas regulados basadas en ecuaciones


diferenciales o en diferencias son ecuaciones químicas de velocidad o cinéticas
[Gea04], las cuales expresan la tasa de producción de un componente del sistema
como una función de las concentraciones de otros componentes [DJ02]. Estas
ecuaciones de velocidad tienen la forma matemática
dxi
= fi (x), 1 ≤ i ≤ n (3.4)
dt
donde x = [x1 , ..., xn ]0 ≥ 0 es el vector de concentraciones de proteínas, ARNs,
o pequeñas moléculas y fi : Rn → R una función de actualización, usualmente
no lineal.
La tasa de producción o síntesis del elemento i depende de las
concentraciones x, posiblemente incluyendo xi , mientras que fi puede
extenderse para incluir concentraciones de componentes de entrada externos a
la célula. También pueden representarse retrasos de tiempo discretos, propios
del tiempo requerido para completar la transcripción, traducción o difusión
hacia el lugar de acción de la proteína:
dxi
= fi (x1 (t − τi1 ), ..., xn (t − τin )), 1 ≤ i ≤ n (3.5)
dt
En este caso, las variables τi1 , ..., τin > 0 representan los retrasos de tiempo
discretos.
Por ejemplo, considere un sistema de regulación simple en el cual el factor
de transcripción X se une a un sitio de enlace Y0 para convertirse en un sitio
enlazado Y1 a una velocidad k1 y se disocia a una velocidad k−1 . El sitio enlazado
da lugar a la producción de un producto P y un sitio de enlace Y0 a una velocidad

39
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

k2 . El sistema puede representarse mediante las siguientes ecuaciones cinéticas:


k
(3.6)
1
−−*
X + Y0 ) −− Y1
k−1

k
Y1 −−2→ P + Y0
las cuales pueden traducirse en el siguiente conjunto de ecuaciones diferenciales:
dx
= −k1 xy0 + k−1 y1 (3.7)
dt
dy0
= −k1 xy0 + k−1 y1 + k2 y1
dt
dy1
= k1 xy0 − k−1 y1 − k2 y1
dt
dp
= k 2 y1
dt

En tanto, el modelo básico de una ecuación en diferencias es de la forma


[MG]:
g1 (t + ∆t) − g1 (t) = (w11 g1 (t) + . . . + w1n gn (t))∆t (3.8)
...
gn (t + ∆t) − gn (t) = (wn1 g1 (t) + . . . + wnn gn (t))∆t
donde gi (t + ∆t) es el nivel de expresión del gen i en el instante t + ∆t, y wij
representa el peso de la inuencia del gen j sobre la expresión del gen i, con
i, j = 1 . . . n.
Las ecuaciones en diferencias son similares a las ecuaciones diferenciales, sólo
que el cambio de concentración se produce de manera discreta, y contemplan
la diferencia temporal entre dos instantes consecutivos como un incremento
innitesimal (∆t tiende a 0) [MG].

Así como ocurre en los modelos de lógica continua presentados en la


sección 3.3.5, Lógica continua, la no linealidad de las funciones de
actualización ocasiona que las soluciones analíticas no pueden alcanzarse. En
algunos casos, pueden establecerse propiedades cualitativas, como la existencia
de estados estacionarios, ciclos límite y puntos críticos. Otra forma de
sobrellevar esta situación es mediante la utilización de funciones escalonadas, o
alguna otra forma de función lineal denida a trozos [DJ02].
Finalmente, en algunas ocasiones es posible utilizar técnicas numéricas para
resolver estos conjuntos de ecuaciones, en donde la solución exacta se aproxima
calculando valores para cada una de las variables de estado en una serie de pasos
discretos de tiempo.

40
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

3.4.1.3. Fortalezas y limitaciones

El conjunto de estos enfoques presenta varias ventajas. En principio, la


representación de las interacciones de regulación es más detallada, lo cual
permite obtener una descripción más precisa del sistema físico asociado
[Gea04]. Además, existe un cuerpo teórico amplio en lo que se reere a
sistemas dinámicos que puede utilizarse para analizar estos modelos.
Entre las desventajas, es posible mencionar que su análisis y resolución
pueden implicar un mayor costo computacional que los modelos discretos,
especialmente para sistemas de gran tamaño; y que dependen de parámetros
numéricos que a menudo son difíciles de obtener de manera experimental
[MG].

3.4.2. Redes neuronales


Las redes neuronales articiales son modelos matemáticos de procesamiento
de información originalmente inspirados en redes de neuronas existentes en el
cerebro [Gea04]. Estas redes puede servir en la modelización de una red de genes.

3.4.2.1. Descripción del modelo

Típicamente, una red neuronal consiste en una colección de nodos, algunos


de los cuales pueden ser designados como nodos entrada y otros como nodos
salida, conectados por aristas con peso. Cada nodo contiene una función de
transferencia que transforma al conjunto ponderado de señales de entrada en
una señal de salida. Estas redes pueden ser entrenadas para que coincidan con
patrones de activación particulares a través de diferentes procesos de
aprendizaje. En la gura 3.8 puede observarse un ejemplo de estas redes.
La entrada regulada del gen i, notada como gi , es denida como la suma de
las entradas ponderadas modicadas por el umbral de activación del gen θ:
X
gi = wij yj + θ (3.9)
j

donde wij representa la fortaleza de la interacción de regulación entre los genes


i y j.
El nivel de activación de un gen es determinado sobre la base de esta entrada
regulada y su degradación:
dxi
= αi fi (gi ) − γi xi (3.10)
dt
donde xi es la concentración del gen i, αi y γi representan velocidades de
activación y degradación del gen i, respectivamente, mientras que fi es la
función de transferencia sigmoidal mencionada anteriormente.

41
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

Figura 3.8. Ejemplo de una red neuronal pre-alimentada. Los nodos


son divididos en nodos de entrada, nodos de salida y nodos ocultos, lo
que aumenta signicativamente las habilidades computacionales de la
red. Esta estructura básica puede ser alterada modicando el número
de nodos en una capa, el número de capas y los vínculos entre los nodos
(adaptada de [Gea04])

3.4.3. Modelos espaciales


Muchos de los modelos mencionados hasta el momento no incluyen ninguna
consideración acerca del espacio físico en el cual ocurre la regulación entre genes
[Gea04]. Sin embargo, existen al menos dos posibles situaciones en donde la
información espacial puede ser importante:

Todas los eventos de regulación involucran la interacción física entre


moléculas. Algunas moléculas están presentes sólo en muy pequeñas
cantidades, mientras que todas tienen un tamaño de varios órdenes de
magnitud menores que el de la célula. Por ello, una molécula puede
requerir cierto tiempo o asistencia de algún mecanismo adicional antes
de que pueda situarse en una posición que le permita actuar. Por
ejemplo, mientras las moléculas de ARN se transcriben a partir del ADN
en el núcleo de la célula, ellas deben ser transportadas a través de la
membrana nuclear hacia el citoplasma antes de que el proceso de
transcripción pueda comenzar. Si bien incluir la ubicación y el momento
de cada molécula se volvería rápidamente irrealizable desde un punto de
vista computacional, algunos modelos incorporan retrasos de tiempo
para permitir la difusión y transporte de las moléculas.

Los modelos que incorporan interacciones entre células pueden requerir


información espacial. Por ejemplo, especicar los procesos morfogenéticos

42
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

que transforman una única célula en un organismo completo requiere de


un aumento sustancial en la complejidad regulatoria. También introduce
nuevos temas como la comunicación intracelular y los procesos mecánicos
de desarrollo, como lo son la migración y la adherencia celular.

Un modelo muy conocido es el de las ecuaciones reacción-difusión. Este


modelo matemático permite describir cómo una o más sustancias distribuidas
en el espacio cambian bajo la inuencia de dos procesos: reacciones químicas
locales en las que las sustancias se transforman las unas en las otras, y el
proceso de difusión, que provoca que las sustancias se expandan en el espacio.
El resultado de este proceso es una conguración estable en la que la
composición química es no uniforme.

3.5. Modelos híbridos


En el mundo real, los sistemas presentan aspectos continuos y discretos. En
general, las concentraciones son expresadas como valores continuos, mientras
que la unión de un factor de transcripción al ADN es expresado como un
evento discreto se une o no [MG]. Por ello, en los últimos tiempos, se han
desarrollado algunos modelos que utilizan un enfoque híbrido para modelar
redes de regulación génica.
Los aspectos continuos o discretos a tener en cuenta dependerán del nivel
de detalle del modelo a diseñar [MG]. Por ejemplo, a nivel celular, las
concentraciones pueden expresarse en número de moléculas, y por tanto puede
considerarse como un dato discreto. Sin embargo, si se tiene en cuenta el
equilibrio termodinámico al modelar la unión proteína-ADN, la variable que
describe el estado debería considerarse continua.
Existen muchos aportes que integran aspectos discretos y dinámicos en un
solo modelo. Por ejemplo, Goss y Pecoud proponen en [GP98] una extensión de
las redes de Petri en la que incluyen retrasos estocásticos en las transiciones,
para, de esta manera, aportar más conocimiento sobre la dinámica del sistema .
En tanto, Matsuno et al. denen un concepto de redes de Petri híbridas o Hybrid
Functional Petri Nets que contienen lugares continuos y transiciones continuas
[Mat+06]. En esta propuesta, los lugares pueden almacenar números reales, y
los nodos de transición se disparan a velocidad constante.

3.5.1. Fortalezas y limitaciones


La principal ventaja del nivel de abstracción mencionado es la claridad con
la cual pueden representarse, simularse computacionalmente y validarse
empíricamente redes complejas. El principal costo asociado es la pérdida de
muchas de las técnicas analíticas aplicables a modelos continuos o lógicos más
puros.

43
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

3.6. Modelos estocásticos


Como se describió en la sección 2.1.3, Replicación del ADN y síntesis de
proteínas, la activación de los genes es controlada por señales moleculares,
algunas de las cuales son proteínas producidas por otros eventos de
transcripción [Gea04]. Generalmente, los genes se activan cuando la
concentración de estas moléculas supera un cierto umbral. Si bien, y con el
objeto de simplicar, muchos modelos matemáticos asumen que las proteínas
son producidas a una velocidad constante, la evidencia sugiere que en realidad
se producen de manera estocástica en pequeñas ráfagas [MA97]. Entonces, el
tiempo que una concentración necesita para alcanzar su umbral crítico variará
de manera estocástica. Esta variabilidad en el tiempo de retraso puede resultar
en diferencias signicativas en el tiempo de eventos similares a lo largo de una
población homogénea de células, siendo posible que células individuales tomen
diferentes ramas de una misma ruta de regulación.
Los eventos estocásticos en la expresión de genes tienen varias
implicaciones [Gea04]. En primer lugar, sistemas idénticos provistos con
entradas similares pueden producir diferentes salidas como resultado de
elementos estocásticos en los mecanismos de regulación. En segundo lugar, la
evolución de las redes de regulación génicas ha sido conducida en parte por el
requerimiento de producir salidas determinísticas sobre la base de un sistema
construido a partir de componentes ruidosos que operan en un ambiente
ruidoso. No siempre los sistemas de regulación son capaces de producir
resultados ordenados a partir de puntos de entrada caóticos, si bien existen
muchos de ellos, por lo cual las técnicas de modelado determinísticas pueden
resultar insucientes a la hora de capturar algunas de las dinámicas propias de
estos sistemas.

3.6.1. Redes bayesianas


Las redes bayesianas [DJ02][Fri+00][Hec96][MG], también llamadas redes de
creencia o redes causales, son modelos grácos de relaciones probabilísticas entre
un conjunto de variables. En el caso particular de las redes génicas, se parte de
la idea de que la expresión de los genes puede ser descrita mediante variables
aleatorias que siguen una distribución de probabilidad, asumiendo entonces que
las relaciones que rigen el proceso de regulación tienen características aleatorias
y de ruido.
A diferencia del concepto clásico de probabilidad, conocida como probabilidad
física, en donde las probabilidades son jas y el experimentador supone todos
los conjuntos de datos que pueden ser generados a partir de ellas, en el enfoque
bayesiano los datos son jos y el experimentador trabaja con todos los posibles
valores de probabilidad a partir de los cuales podrían haberse generado dichos
datos.
Cuando se construyen estas redes sólo a partir de conocimiento previo, las
probabilidades serán bayesianas. Cuando el aprendizaje se realiza a partir de
datos, las probabilidades serán físicas (y sus valores desconocidos).

44
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

3.6.1.1. Descripción del modelo

En este formalismo, la estructura de una red de regulación génica es


modelada por un grafo dirigido acíclico, en donde los vértices representan
genes u otros elementos signicativos. Las relaciones de acceso en un grafo
acíclico dirigido constituyen un orden parcial, de manera tal que existen nodos
que anteceden a otros en el grafo, dando lugar a padres y a hijos.
En una primera interpretación, un arco entre el nodo A y el nodo B podría
indicar el hecho de que A causa B. Ahora bien, como cualquier conjunto de
nodos puede ser observado es decir, a cualquier conjunto de nodos puede
asignársele evidencia, las redes bayesianas se utilizan tanto en lógica causal
(de causas conocidas a efectos desconocidos) como en razonamiento
diagnóstico (de efectos conocidos a causas desconocidas), o cualquier
combinación de ellos. Asimismo, estas redes soportan la poderosa noción de
 eliminación de explicaciones o  explaining away : si un nodo es observado,
entonces sus padres se convierten en dependientes, ya que son causas rivales
para explicar el valor del nodo hijo.
Las redes bayesianas hacen uso del teorema de Bayes, cuya ecuación es:

p(D|Xi )p(Xi ) p(D|Xi )p(Xi )


p(Xi |D) = = Pn ,1 ≤ i ≤ n (3.11)
p(D) k=1 p(D|Xk )p(Xk )

donde p(Xi ) es conocida como la probabilidad a priori de Xi , p(D|Xi ) es la


probabilidad del conjunto de datos D en la hipótesis de Xi y p(Xi |D) es la
probabilidad a posteriori de Xi .
Un enfoque común, usualmente adoptado por conveniencia, es asumir que la
distribución a priori es una distribución beta :

Γ(α + β) α−1
p(Xi ) = Beta(Xi |α, β) = X (1 − Xi )β−1 (3.12)
Γ(α)Γ(β) i

donde α > 0 y β > 0 son los parámetros de la distribución beta y Γ(·) es la


función Gamma. Se utiliza esta función ya que, entre otras razones, la
distribución a posteriori también resulta ser beta.
Entonces, dada una estructura, se dene una distribución condicional para
cada variable Xi
p(Xi | X1 , ... , Xi−1 ) (3.13)
Dichas distribuciones condicionales tienen como restricción que la red no
contenga ciclos o bucles de retroalimentación, siendo ésta la principal limitación
del modelo bayesiano. El grafo y dichas distribuciones condicionales denen
conjuntamente la red bayesiana, especicando inequívocamente una distribución
de probabilidad conjunta

p(X) = p(X1 , ..., Xn ) (3.14)

Las redes bayesianas modelan dependencias probabilísticas entre variables


y no causalidad, es decir, aquellos vértices que apuntan directamente a un

45
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

nodo a través de una sola arista conocidos como padres no son


necesariamente también las causas directas de su comportamiento. De todas
formas, cada artista puede interpretarse como un vínculo causal si se asume
que se cumple la suposición o condición causal de Markov, la cual arma que
una variable Xi es condicionalmente independiente de cualquier otra variable,
excepto los objetivos de Xi , dadas sus causas directas (padres). Esto es, dada
una relación padre-hijo entre los nodos del grafo, cada nodo es independiente
de sus no descendientes. Entonces, las distribuciones condicionales pueden
escribirse como
p(Xi | X1 , ... , Xi−1 ) = p(Xi | padres(Xi )) (3.15)
Gracias a dicho supuesto, a la aplicación de la regla de la cadena de
probabilidades y por propiedades de las independencias condicionales, la
distribución de probabilidad conjunta esbozada en 3.14 puede entonces
descomponerse como
n
Y
p(X) = p(Xi | padres(Xi )) (3.16)
i=1

La gura 3.9 muestra un ejemplo de esta descomposición. Sin embargo, se


desconoce si esta suposición representa una buena aproximación de lo que ocurre
en las redes biológicas reales.

Figura 3.9. Ejemplo de una red bayesiana. Puede observarse el grafo


correspondiente y la distribución de probabilidad conjunta asociada a
la red (adaptada de [DJ02])

Como se mencionó anteriormente, existe un orden parcial de los elementos


en los grafos dirigidos acíclicos. Entonces, una forma de especicar la
estructura de una red bayesiana es ordenando las variables de alguna manera
para luego determinar aquellos conjuntos que satisfacen la ecuación 3.15 para
cada Xi . Este enfoque presenta serios inconvenientes, ya que si las variables
son ordenadas descuidadamente, la estructura resultante puede no revelar
muchas independencias condicionales entre las variables.
Una vez construida la red bayesiana, usualmente es necesario determinar las
probabilidades existentes entre las variables; a este proceso se lo conoce como
inferencia probabilística.

46
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

3.6.1.2. Fortalezas y debilidades

La principal ventaja de las redes bayesianas es que, como se mencionó al


comienzo del capítulo, reejan la naturaleza estocástica de los sistemas de
regulación. Además, pueden ser utilizadas cuando no se tiene a disposición un
conocimiento completo del sistema en cuestión. Sin embargo, esta propiedad
hace que los modelos resultantes sean difíciles de interpretar, y que el efecto de
activación o inhibición de los factores de transcripción no sea siempre evidente.
Aunque las redes bayesianas resultan ser interpretaciones intuitivas de las
redes de regulación, tienen la desventaja de dejar implícitos aspectos dinámicos
de la regulación entre genes. Hasta cierto punto, esto puede ser superado a través
de generalizaciones como las redes bayesianas dinámicas, las cuales permiten
relaciones de retroalimentación entre los genes a modelar. Numerosos trabajos,
como [MM99], [Mur02] y [Per+03], tratan en profundidad este tipo particular
de redes bayesianas.

3.6.2. Ecuaciones estocásticas maestras


Si bien el formalismo de ecuaciones diferenciales (descrito en la sección
3.4.1, Ecuaciones diferenciales ordinarias y en diferencias) permite describir a
la regulación génica en gran detalle, existe un número de suposiciones
implícitas que no son válidas a nivel molecular [DJ02].
Las ecuaciones diferenciales presuponen que las concentraciones de las
sustancias varían continua y determinísticamente; ambas suposiciones pueden
ser cuestionables en el caso de los sistemas regulación. En primer lugar, el
pequeño número de moléculas de algunos de los componentes del sistema no
permite sostener esa suposición; sólo puede haber algunas pocas decenas de
moléculas de un factor de transcripción en el núcleo celular y sólo una
molécula de ADN que tenga un determinado gen. En segundo lugar, el cambio
determinístico presupuesto por el uso del operador diferencial d/dt puede ser
cuestionado debido a uctuaciones en la sincronización de los eventos
celulares, como los retrasos de tiempo entre el comienzo y el n del proceso de
transcripción. Como consecuencia, dos sistemas de regulación con las mismas
condiciones iniciales podrían nalmente alcanzar diferentes estados, fenómeno
reforzado por el número de pequeñas moléculas involucrado en el proceso.

3.6.2.1. Descripción del modelo

En lugar de considerar un enfoque continuo y determinístico, algunos autores


han propuesto el uso de modelos estocásticos discretos para modelar sistemas
de regulación génica [DJ02]. En dichos modelos, se toman cantidades discretas
X de moléculas como variables de estado mientras que una distribución de
probabilidad conjunta p(X, t) expresa la probabilidad de que al tiempo t una
célula contenga X1 moléculas de una primera especie, X2 moléculas de una
segunda especie, etc.

47
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

La evolución en el tiempo de la función p(X, t) puede especicarse como


sigue:  
m
X Xm
p(X, t + ∆t) = p(X, t) 1 − αj ∆t) + βj ∆t (3.17)
j=1 j=1

donde m es el número de reacciones que pueden ocurrir en el sistema, αj ∆t es


la probabilidad de que la reacción j ocurra en el intervalo [t, t + ∆t] dado que el
sistema se encuentra en el estado X en el tiempo t, y βk ∆t es la probabilidad
de que la reacción k lleve al sistema al estado X a partir de otro estado en el
intervalo [t, t + ∆t].
Reacomodando 3.17, y tomando el límite ∆t → 0, se obtiene la ecuación
maestra : m
∂ X
p(X, t) = (βj − αj p(X, t)) (3.18)
∂t j=1

De esta manera, mientras que la ecuación 3.4 describe cómo cambia el estado
del sistema con el tiempo, esta última describe la probabilidad de que el sistema
cambie de un estado a otro en el tiempo.

3.6.2.2. Fortalezas y debilidades

Aunque la ecuación maestra provee una mirada más intuitiva de los procesos
estocásticos que gobiernan la dinámica del sistema de regulación, resulta más
complejo de resolverla por métodos analíticos que la ecuación determinística de
velocidad. Asimismo, también resulta compleja cualquier simulación numérica
sobre la misma debido al número de variables independientes que contiene.

3.6.3. Otros modelos estocásticos


Se han desarrollado otros enfoques dedicados a modelar eventos estocásticos
en la expresión genética [Gea04]:

Ecuaciones diferenciales estocásticas


Las ecuaciones diferenciales estocásticas extienden las ecuaciones
diferenciales tradicionales que representan la dinámica de las reacciones e
incluyen un término de ruido νi (t):

dxi
= fi (xi ) + νi (t) (3.19)
dt

Esta ecuación, conocida como la ecuación de Langevin, puede


desarrollarse en una forma alternativa que describe la evolución de la
función de densidad de probabilidad. Esas ecuaciones son generalmente
complejas para ser resultas por técnicas analíticas o numéricas, de
manera que suele utilizarse el método Monte Carlo.

48
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

Una característica fundamental de los enfoques basados en ecuaciones


diferenciales estocásticas es que tratan las concentraciones moleculares
como variables continuas.
Simulación estocástica
Una técnica frecuentemente utilizada es simular el sistema un número de
veces y estimar la función de densidad de probabilidad. Se han
desarrollado diversos enfoques que permiten la simulación estocástica de
esas ecuaciones.
El problema principal de este enfoque, y del anterior, es la eciencia.
Ejecutar múltiples simulaciones de sistemas que contienen un número
alto de reacciones es computacionalmente costoso. Al respecto, un
importante área de investigación es el desarrollo de enfoques multiescala.
Estos modelos son capaces de resolver problemas físicos que tienen
importantes características en múltiples niveles, particularmente
múltiples escalas espaciales y/o temporales.
Redes de Petri estocásticas

Redes neuronales estocásticas

3.7. Resumen de propiedades


Los formalismos presentados permiten modelar a los sistemas de regulación
génica de diferentes maneras. El cuadro 3.1, tomado y ampliado a partir de
[DJ02], compara los diferentes enfoques.

3.7.1. Discusión
Hasta hace poco tiempo, los estudios de modelado y simulación han
utilizado de manera predominante modelos determinísticos y de grano grueso a
medio, como los modelos lógicos o las ecuaciones diferenciales [DJ02]. Si bien
se han empleado modelos cuantitativos, las conclusiones obtenidas a partir de
ellos han sido más bien cualitativas. Esto se debe, en primer lugar, al hecho de
que los mecanismos de reacción bioquímicos subyacentes a las interacciones de
regulación no son conocidos o lo son de manera incompleta, lo cual signica
que no pueden construirse modelos cinéticos más detallados. En segundo lugar,
la información cuantitativa de los parámetros cinéticos y de las
concentraciones moleculares no se encuentra disponible con frecuencia; como
consecuencia, es difícil aplicar métodos tradicionales de análisis numérico.
Los pocos estudios de modelado y simulación que utilizan modelos de grano
no se han restringido a redes de regulación de tamaño pequeño y de relativa
complejidad, caracterizadas éstas por medios experimentales. Además de la falta
de información relevante que permita construir modelos y vericar predicciones,
el uso de modelos estocásticos de grano no se ha visto obstaculizado por la
complejidad computacional inherente a los problemas de simulación.

49
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

En algún lugar entre los dos extremos del espectro se encuentra el modelo
bayesiano. Este modelo pertenece a una familia de modelos exibles e
interpretables conocida como modelos grácos, los cuales representan de
manera compacta las relaciones de probabilidad entre las variables de interés
en forma de grafo. En particular, el modelo bayesiano representa un
compromiso razonable entre los que son muy especícos y aquellos demasiado
abstractos.
De esta manera, el presente trabajo está centrado en el modelo bayesiano,
por diversas razones:

Su capacidad de descubrir relaciones causales entre genes. Aprender


acerca de las relaciones causales es importante cuando se trata de
adquirir conocimiento acerca de un dominio de problema durante un
análisis exploratorio y cuando se desea hacer predicciones con respecto a
futuras acciones.

Puede lidiar con ruido presente en los datos. El modelo bayesiano resulta
especialmente apropiado para reconstruir redes de genes a partir de datos
de expresión, teniendo en cuenta el ruido inherente a estas redes.

Puede lidiar con el problema frecuente de datos no conocidos o conocidos


de manera incompleta. Cuando algunas de las entradas no es observada,
la mayoría de los modelos producen predicciones imprecisas debido a que
no tienen en cuenta las relaciones de correlación entre las variables de
entrada.

En conjunto con técnicas estadísticas bayesianas, puede facilitar la


combinación de conocimiento del dominio con los datos. Cuando se
realizan análisis en el mundo real, es primordial el conocimiento previo o
de dominio, especialmente cuando los datos escasean o son inasequibles.

La combinación de métodos bayesianos con redes bayesianas y otros tipos


de modelos ofrece un enfoque eciente y probo para evitar el sobreajuste
de datos. Los modelos pueden ser suavizados de manera de que toda la
información disponible pueda ser utilizada.

Por otro lado, la construcción del modelo correcto que describa los aspectos
relevantes del sistema al nivel de granularidad deseado demanda métodos que
sean soportados computacionalmente. Al respecto, pueden mencionarse dos
enfoques en pleno crecimiento: por un lado, los modelos pueden componerse a
partir del conocimiento sobre las interacciones de regulación que existen en
bases de datos y bases de conocimiento, como se ilustró, por ejemplo, en el
modelo basado en reglas; por otro lado, los modelos pueden inducirse a partir
de datos de expresión génica a través de diferentes métodos. En el próximo
capítulo, Aprendizaje estructural en redes de regulación génica, se explorarán
diferentes técnicas de inferencia de redes basadas en este último enfoque,
haciendo especial hincapié en los algoritmos bayesianos.

50
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA

De grano
Estático, Discreto, Determinístico, Cualitativo, grueso,
Dinámico Continuo Estocástico Cuantitativo medio, no
Redes de Estático - Determinístico Cualitativo Grano grueso
mundo pequeño
y libre de escala
Grafos Estático - Determinístico Cualitativo Grano grueso
Redes Dinámico Discreto Determinístico Cualitativo Grano grueso
booleanas
Lógica Dinámico Discreto Determinístico Cualitativo Grano medio
generalizada
Redes de Petri Dinámico Discreto Determinístico Cualitativo Grano medio
Basados en Dinámico Discreto Determinístico Cualitativo
Grano medio
reglas y no
Lógica continua Dinámico Discreto Determinístico Cualitativo Grano medio
Discreto Grano medio
EDOs y EEDs Dinámico
Continuo
Determinístico Cuantitativo
y no
Redes Dinámico Continuo Determinístico Cuantitativo
Grano medio
neuronales y no
Estático Grano medio
Espaciales Dinámico
Continuo Determinístico Cuantitativo
y no
Discreto Grano medio
Híbridos Dinámico
Continuo
Determinístico Cuantitativo
y no
Redes Estático Discreto
Estocástico Cuantitativo Grano grueso
bayesianas Dinámico Continuo
Ecuaciones Dinámico Discreto Estocástico Cuantitativo Grano no
estocásticas
maestras
Cuadro 3.1. Propiedades de los formalismos de modelado presentados
(adaptada y ampliada a partir de [DJ02])

51
Capítulo 4

Aprendizaje estructural en
redes de regulación génica

4.1. Introducción
Ingenieros y cientícos han desarrollado técnicas de aprendizaje en los
campos de ciencia de la computación, ingeniería, y estadística, las cuales son
conocidas como aprendizaje automático, identicación de sistemas y
aprendizaje estadístico, respectivamente. De allí que los investigadores han
propuesto enfoques para inferir los mecanismos de control celular;
especialmente a partir del surgimiento de la tecnología de chip de ADN, la
cual, tal y como se ha mencionado anteriormente, permite al experimentador
obtener la concentración de miles de transcripciones de ARN al mismo tiempo.
Dicha información ofrece la posibilidad de inferir un modelo de los sistemas de
control transcripcionales que operan en las células.
La investigación actual ha permitido una expansión dramática de los
enfoques de aprendizaje y su aplicación a los datos experimentales. De todas
formas, el desarrollo de estos métodos permanece como un área de
investigación activa y desaante. Los desafíos provienen principalmente dada
la naturaleza de la información, típicamente ruidosa, multidimensional, y
signicativamente submuestreada. Son pocos los bancos de trabajo bien
entendidos y estandarizados que validen el rendimiento de un algoritmo; de
manera que cuestiones signicativas acerca del diseño experimental, la
abilidad de las redes predichas y la utilidad de varios enfoques a aplicaciones
particulares no han sido aún profundamente analizadas.
Las técnicas de aprendizaje se han enfocado principalmente en decodicar
los mecanismos de control transcripcional, el primer paso en la expresión génica.
Esto se debe a que la tecnología del chip de ADN permite a los investigadores
medir la concentración de todos los ARN transcritos en una célula, haciendo
abundante esta información. Dicha información puede consistir de una serie
temporal de M puntos de datos de expresión de N genes, o bien puede tratarse

52
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

de mediciones en un estado de homeostasis o estado estacionario tomadas en


M condiciones diferentes. Algunos algoritmos pueden trabajar con ambos tipos
de datos, mientras que otros han sido diseñados especícamente para operar con
sólo uno de ellos.
Una vez elegido un modelo de red, el paso siguiente es identicar las
interacciones existentes entre los genes, tarea que puede realizarse a partir de
conocimiento previo, datos de expresión o una combinación de ambos. Este
proceso es generalmente conocido como aprendizaje estructural, ya que el
resultado del mismo es un modelo de red que representa a la red biológica
subyacente. Luego, en un proceso diferente, los parámetros del modelo tienen
que ajustarse a los datos experimentales; incluso los modelos más sencillos son
sistemas complejos que involucran muchos parámetros, y ajustarlos no es una
tarea trivial. Este proceso de obtención de valores para dichos parámetros es
conocido como aprendizaje paramétrico. Debido a la cantidad de información
existente, ambos procesos suelen realizarse por medios computacionales.
Mientras que el aprendizaje paramétrico es una parte importante del proceso,
la primera etapa el aprendizaje estructural es una tarea mucho más
compleja, y es el objetivo de este trabajo.
En la gura 4.1 pueden observarse los diferentes pasos que suelen llevarse a
cabo en el aprendizaje de sistemas de control transcripcional. Básicamente, el
experimentador perturba las células con varios tratamientos y obtiene
diferentes respuestas. Luego, para cada perturbación, el experimentador mide
la expresión de muchas o todas las transcripciones de ARN. Finalmente,
algoritmos de aprendizaje obtienen las interacciones y calculan los parámetros
del modelo de red que mejor describa al sistema.

Figura 4.1. Estrategia general para el aprendizaje de sistemas de


control transcripcional (adaptada de [GF05])

El aprendizaje de la estructura de la red es, como es de suponer, un paso


crítico. La forma más inmediata de llevarlo a cabo sería enumerando todos
los posibles grafos, dado un número de nodos. Desafortunadamente, el número
de grafos resultantes para n nodos crece exponencialmente; por ejemplo, para 6
nodos, hay 3.781.503 grafos posibles; se entiende entonces que vericar todas las
combinaciones de interacción entre genes, es decir, todos los grafos posibles, y
elegir aquel con mayor puntaje es un problema NP-complejo. Por ello, se adoptan

53
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

diferentes algoritmos de aprendizaje, como, por ejemplo, aquellos basados en el


modelo de redes bayesianas.

4.2. Características del aprendizaje estructural


El aprendizaje estructural puede entenderse como una forma de minería de
datos, donde una red generada por un algoritmo de aprendizaje a partir de un
conjunto de datos experimentales es considerada como un modelo asociado a
dicho conjunto de datos. En este sentido, el aprendizaje estructural presenta
diferentes características asociadas con el ambiente, el proceso de aprendizaje y
su evaluación, las cuales se detallan a continuación.

4.2.1. Ambiente
El aprendizaje siempre ocurre en un ambiente a partir del cual un
algoritmo puede aprender. Este ambiente puede establecer ciertas condiciones
o propiedades que pueden afectar la manera en que funciona un algoritmo.

Aprendizaje supervisado y no supervisado


En algunos casos, el algoritmo recibe información proveniente de conjuntos
de datos o de humanos expertos acerca de lo apropiado que resulta ser su
rendimiento, mientras que en otros esto no ocurre. Este último suele ser el
caso en los algoritmos de aprendizaje estructural de redes de regulación.

Aprendizaje en línea y fuera de línea


Otra característica que establece el ambiente es la manera en la cual las
instancias de datos son presentadas al algoritmo de aprendizaje. El
aprendizaje en línea ocurre cuando los datos son presentados uno a la
vez, siendo ésta la situación más común en el aprendizaje de redes. Por el
contrario, el aprendizaje fuera de línea ocurre cuando los datos son todos
entregados al mismo tiempo. Asimismo, existen casos intermedios donde
la información es presentada en partes.

Regularidad del ambiente


El aprendizaje puede verse dicultado por el ambiente, debido a la
complejidad del conocimiento a aprender, al número de características
irrelevantes del sistema, a la presencia de ruido en los datos o a cambios
evolutivos del ambiente.

4.2.2. Proceso de aprendizaje


El proceso de aprendizaje puede entenderse como una búsqueda a través
del espacio de búsqueda o de conocimiento, donde cada estado propio de dicho
espacio representa una estructura de conocimiento. Para ejecutar una búsqueda,
es necesario un conjunto de operadores que transformen esos estados en otros,
una función de medida que sopese la calidad de los estados con respecto al

54
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

conjunto de datos y, nalmente, un algoritmo o procedimiento que aplique los


operadores y efectivamente lleve a cabo la búsqueda.
Adicionalmente, un sistema de aprendizaje requiere alguna estrategia de
búsqueda, la cual debe denir 4 cuestiones básicas:

Dónde comenzar la búsqueda

Cómo organizar la búsqueda

Cómo evaluar estados alternativos

Cúando terminar la búsqueda

4.2.2.1. Aprendizaje incremental y no incremental

Cuando se caracterizó al ambiente, se realizó una distinción entre aprendizaje


en línea y aprendizaje fuera de línea. Una diferenciación similar puede hacerse
para algoritmos de aprendizaje que puedan manejar todas las instancias de
datos de una vez, de manera no incremental, o bien una instancia a la vez
de manera incremental [Rou04]. La mayoría del trabajo realizado en la tarea
de aprendizaje de estructuras de red se ha enfocado en los primeros, también
llamados algoritmos de procesamiento por lotes o batch. Estos algoritmos asumen
que los datos con los que cuentan constituyen toda la información que siempre
estará disponible, por lo que el aprendizaje es realizado de una sola vez y sin
la posibilidad de revisar las estructuras en el caso de existir nueva información.
Tanto el presente capítulo como el siguiente estarán abocados a este tipo de
algoritmos.

4.2.3. Evaluación del aprendizaje


La metodología de evaluación del aprendizaje utilizada en gran parte de la
literatura adhiere al siguiente protocolo:

1. Se escoge un conjunto de redes conocidas.

2. Para cada una de dichas redes, se generan diferentes conjuntos de datos


que varían en tamaño.

3. Para cada uno de los conjuntos de datos, se ejecuta cada algoritmo por
evaluar.

4. Luego, se realiza una evaluación de cada algoritmo y cada ejecución,


valiéndose de las siguientes métricas:

Función de puntaje: es la medida utilizada por el algoritmo para


evaluar la cercanía de la red construida y los datos, y como tal, es la
que primero evalúa los resultados del algoritmo.

55
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Distancia estructural de Hamming (SHD): es el promedio de los


arcos añadidos, omitidos e invertidos en dirección, entre la estructura
generada por el algoritmo y la estructura original a partir de la cual
se generaron los datos. Aquí el pseudocódigo del algoritmo:
Algoritmo 1: Algoritmo SHD
entrada: El grafo original G,
El grafo aprendido H .
salida : La distancia estructural de Hamming entre ambos
grafos
shd ← 0;
para cada arco E diferente entre G y H hacer
si E no está en H y está en G entonces
shd ← shd + 1;
si E está en H y no está en G entonces
shd ← shd + 1;
si E está en H y en diferente dirección en G entonces
shd ← shd + 1;
Retornar shd;

Verdaderos positivos (VP) y negativos (VN): representan el


número de casos para los cuales una prueba sobre una condición
durante un proceso de evaluación ha sido satisfecha o ha fallado,
respectivamente, cuando efectivamente es así.
Falsos positivos (FP) y negativos (FN): representan el número
de casos para los cuales una prueba sobre una condición durante un
proceso de evaluación ha sido satisfecha o ha fallado, respectivamente,
cuando en realidad no es así.
Sensibilidad o tasa de valor positivo: mide la proporción entre los
casos positivos correctamente identicados como tales por una prueba
durante un proceso de evaluación y aquellos casos que efectivamente
cumplen con la condición. Su fórmula es:
VP
Sensibilidad = (4.1)
V P + FN

Precisión o valor predictivo positivo: mide la proporción entre


los casos positivos correctamente identicados como tales por una
prueba durante un proceso de evaluación y todos los casos positivos.
Su fórmula es:
VP
P recisión = (4.2)
V P + FP

56
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

4.3. Características comparativas entre


algoritmos
El trabajo de Wessels et al. [WSR01] sugiere ciertas características como
punto de comparación entre los algoritmos, las cuales son frecuentemente
mencionadas en la literatura. Ellas son:

Poder de inferencia: habilidad que posee un algoritmo de predecir


cambios en los niveles de expresión y comportamientos de la red que se
encuentren fuera de los datos de entrenamiento utilizados para resolver
el modelo.

Robustez: las mediciones de expresión de los genes es particularmente


ruidosa por lo que es importante conocer hasta qué punto el algoritmo
puede extraer adecuadamente las interacciones de regulación en presencia
de ruido.

Consistencia: un algoritmo se dice consistente si puede inferir uno y sólo


un conjunto de parámetros a partir de los datos de expresión.

Costo computacional: se trata de una medida de la cantidad de recursos


computacionales que el algoritmo necesita para su funcionamiento.

Cuando es posible, se utilizan datos generados computacionalmente para


investigar o evaluar algunas de estas propiedades de forma experimental.

Es posible agrupar a los algoritmos de ingeniería inversa en dos grandes


clases: aquellos basados en la interacción física entre los genes de la red y aquellos
basados en la interacción por inuencia.

4.4. Algoritmos basados en interacción física


Estos algoritmos buscan interacciones físicas reales entre los factores de
transcripción y sus genes objetivo (promotores). Una ventaja de esta
estrategia es que permite reducir la dimensionalidad del problema de
aprendizaje restringiendo los reguladores posibles a factores de transcripción.
También permite la utilización de información de secuencias génicas en
combinación con datos de expresión de ARN, de manera de mejorar la
sensibilidad y especicidad de la interacciones predichas. La limitación
principal de este enfoque es que no puede describir los mecanismos de control
regulatorio si no es a través de los factores de transcripción mencionados.

57
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

4.5. Algoritmos basados en interacción por


inuencia
La interacción entre dos genes en una red de regulación génica no implica
necesariamente una interacción física entre ellos, sino que también puede
referirse a una regulación indirecta mediante proteínas, metabolitos y otras
moléculas que no han sido medidas directamente. El enfoque basado en la
interacción por inuencia trata de relacionar la expresión de un gen con la
expresión de otros genes en la célula, buscando relaciones posiblemente
causales entre las concentraciones de los productos de expresión. De esta
manera, cuando cambios en las concentraciones de ciertos productos de
expresión permiten explicar cambios en la concentración de otro, entonces
aquellos son tomados como entradas y este último como salida (ver gura
4.2).

Figura 4.2. Diagrama de inuencias entre concentraciones de


productos de expresión (adaptada de [GF05])

Generalmente, el signicado de una interacción por inuencia no suele estar


bien denido y depende del formalismo matemático utilizado para modelar la
red. Sin embargo, las redes de inuencia son de utilidad práctica para:

Identicar módulos funcionales : permiten identicar subconjuntos de


genes que se regulan entre ellos por medio de múltiples interacciones,
posiblemente indirectas, y que tienen pocas interacciones de regulación
con otros genes fuera del subconjunto;

Predecir el comportamiento del sistema ante perturbaciones : pueden


utilizarse para predecir la respuesta de una red a una perturbación
externa e identicar los genes que directamente son alcanzados por la
perturbación; e

Identicar interacciones físicas reales : permiten integrar la red génica


con información adicional proveniente de datos de secuencia y otros
datos experimentales.

58
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Una ventaja de esta estrategia es que puede capturar implícitamente


mecanismos de regulación a nivel de proteínas y metabolitos que no son
medidos físicamente, de manera que no se encuentra restringido a describir
solamente interacciones entre los factores de transcripción y el ADN. Por ello,
los modelos de inuencias suelen ser apropiados cuando se trata de predecir la
respuesta global de la célula a un estímulo. La limitación principal de este
enfoque es que puede resultar dicultosa la interpretación de los modelos en
términos de la estructura física de la célula, siendo compleja su integración o
extensión mediante nuevas investigaciones. Por todo esto, el presente trabajo
se enfocará en describir algunos de los algoritmos basados en este enfoque, y
en particular ciertos algoritmos bayesianos.

4.5.1. Algoritmos de agrupamiento


La estrategia de agrupamiento o clustering se basa en la idea de clasicar
genes con perles de expresión similares en grupos o clusters. Para medir
similitud, los algoritmos usualmente utilizan alguna métrica de distancias
mientras que el número de clusters puede establecerse de manera automática o
por el usuario, dependiendo del algoritmo utilizado [Ama+06] [Eis+98]. La
lógica detrás de estos algoritmos es que genes que se expresan conjuntamente,
es decir, que están en el mismo cluster, tienen una buena probabilidad de
encontrarse funcionalmente relacionados. Esto no implica, sin embargo, la
existencia de una interacción directa entre dichos genes, ya que genes
separados por uno o más intermediarios pueden expresarse de manera
conjunta.
El enfoque de agrupamiento más conocido es el agrupamiento jerárquico,
propuesto por Eisen et al. [Eis+98], donde las relaciones entre los genes se
representan por un árbol cuyas longitudes de rama reejan el grado de
similitud entre genes, evaluado por una función de similitud como el
coeciente de Pearson.

4.5.2. Algoritmos estocásticos


Se trata de aquellos algoritmos cuyo comportamiento es no determinístico, es
decir, en donde el estado del proceso está dado tanto por acciones predecibles del
mismo como por elementos aleatorios. Estos algoritmos trabajan con métodos
probabilísticos para resolver problemas.

4.5.2.1. Computación evolutiva

La computación evolutiva es una rama de la inteligencia articial inspirada


en los mecanismos de evolución biológica propuestos por Darwin, Medel y
Lamark [DJ06]. Representa una clase de métodos de optimización estocástica
que utiliza operadores como la mutación y la recombinación para generar
buenas soluciones a un problema dado, la cual funciona relativamente bien en
problemas de optimización complejos.

59
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Un sistema necesita presentar determinadas características para ser


considerado como un sistema evolutivo. Existe cierto consenso general respecto
de cuáles son dichas propiedades:

Una o más poblaciones de individuos compitiendo por recursos limitados,


La noción de poblaciones que cambian dinámicamente debido al
nacimiento y muerte de individuos,
Un concepto de aptitud, el cual reeje la habilidad de un individuo de
sobrevivir y reproducirse, y
Un concepto de herencia variacional: los hijos se parecen estrechamente a
sus padres, pero no son idénticos.

Esta caracterización lleva naturalmente a considerar a un sistema evolutivo


como un proceso que, dadas ciertas condiciones iniciales, sigue una trayectoria
en el tiempo a través de un complejo espacio de estados evolutivos.
En líneas generales, un modelo evolutivo funciona de la siguiente manera:
inicialmente, se elige una población inicial, y se determina la calidad de cada
individuo. Luego, en cada iteración, se seleccionan uno o más padres de entre
la población. El o los padres producen hijos; por cada individuo nuevo, existe
cierta probabilidad de que mute, es decir, de que cambie su código genético.
Adicionalmente, algunos individuos son removidos de la población de acuerdo a
un criterio de selección. Se denomina generación a cada iteración.
Los operadores que denen el proceso de producción de hijos y el proceso
de mutación son el operador de recombinación o cruce y de mutación,
respectivamente. La mutación es necesaria para explorar nuevos estados a la
vez que ayuda al algoritmo a evitar máximos locales. En tanto, la
recombinación aumenta la calidad promedio de la población.

La computación evolutiva engloba diferentes estrategias de optimización


meta-heurísticas que se utilizan en la resolución de problemas. Entre ellas, se
destacan:

Algoritmos evolutivos
Programación evolutiva
Estrategias evolutivas
Algoritmos genéticos
Programación genética
Sistemas inmunes articiales
Vida articial
Auto-organización

60
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Optimización por enjambre de partículas

Optimización por colonia de hormigas

Inteligencia de enjambre

En estos modelos algunos de ellos tradicionalmente determinísticos y


otros estocásticos, el espacio de búsqueda de un problema es representado
como una colección de individuos. Como se mencionó anteriormente, el
objetivo es encontrar aquel individuo con el mejor material genético, cuya
calidad es medida con una función de puntaje.
A continuación, y a modo de ejemplo de cómo lucen estos algoritmos, se
muestra el pseudocódigo de un algoritmo genético bayesiano abstracto, basado
en aquel presentado en el trabajo de Larrañaga et al. [LP96].

Algoritmo 2: Algoritmo genético bayesiano abstracto


entrada: Un conjunto de n nodos, con o sin un orden sobre los nodos,
Una base de datos D conteniendo m casos,
Una función de puntaje f (),
Un criterio de parada criterioparada .
salida : El mejor individuo encontrado
Generar una población inicial al azar;
Calcular la función de puntaje f (i, D) de cada individuo i;
mientras no es alcanzado hacer
criterioparada
para i ← 1 a tamaño(población)/2 hacer
Seleccionar dos individuos (padres) para cruzar;
Cruzar con cierta probabilidad los dos individuos, para obtener
dos descendientes;
Mutar los dos descendientes con cierta probabilidad;
Calcular la función de puntaje f () de ambos descendientes
mutados;
Agregar los dos descendientes a la población;
Reducir la población extendida;
Retornar el mejor individuo encontrado;

En el caso de los algoritmos genéticos que trabajan con redes bayesianas,


en donde los individuos representan grafos dirigidos acíclicos, puede ocurrir
que algunos de los descendientes no cumplan con las condiciones que aquellos
plantean. Cuando esto ocurre, se procede a su reparación. Finalmente, los
descendientes son agregados a la población para luego ésta ser reducida, lo que
se conoce como reemplazo.

61
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

4.5.2.2. Algoritmos bayesianos

Como se mencionó en la sección 3.6.1, Redes bayesianas, la expresión de los


genes Xi es descrita en el modelo bayesiano mediante variables aleatorias que
siguen una distribución de probabilidad condicional. En dichas funciones, sólo
los productos de expresión considerados como padres aparecen como
reguladores del resto de los genes de la red. En general, existen dos partes
esenciales en el aprendizaje de una red bayesiana: aprendizaje estructural y
ajuste de parámetros [DJ02][Fil05][GF05].

Aprendizaje estructural
Dado un conjunto de datos de expresión, la red que mejor se corresponda
con esos datos puede inferirse utilizando algoritmos de aprendizaje para redes
bayesianas. Estos algoritmos permiten encontrar el grafo acíclico dirigido G que
mejor describa o se ajuste a los datos de expresión D, los cuales se asumen
tomados en un estado estacionario del sistema. Usualmente, el algoritmo de
aprendizaje estructural del modelo presupone la forma de las distribuciones
de probabilidad condicional, las cuales son obtenidas en el siguiente paso. En
el próximo capítulo se estudiarán en detalle algunas estrategias bayesianas de
aprendizaje estructural.

Ajuste de parámetros
Dado un grafo y datos experimentales, se busca denir las distribuciones de
probabilidad condicional que relacionen el estado de los reguladores con el
estado del resto de los elementos en la red. Esta tarea puede realizarse
mediante dos métodos bien estudiados: los algoritmos de Estimación de
Máxima Probabilidad, cuando todos los nodos son conocidos, o los algoritmos
de Esperanza-Maximización, cuando algunos de ellos están ocultos.
Como ejemplo, considérese la red de la gura 4.3. Si se discretizan los
niveles de transcripción a variables binarias, el algoritmo debe aprender un
parámetro por cada una de las 2k combinaciones de los estados de los k padres
de cada nodo. En el caso de la distribución condicional del producto de
transcripción 3, P (X3 |X1 , X2 ), se necesitan determinar cuatro parámetros.
Entonces, a n de especicar completamente la función de distribución de un
producto de expresión, deberían observarse experimentalmente al menos una
vez cada uno de los 2k estados. Debido a que éste es un número de
experimentos impracticable, el conjunto de datos de entrenamiento para estos
modelos es usualmente incompleto. Afortunadamente, la estructura de red
bayesiana permite a un algoritmo especicar las distribuciones de probabilidad
condicional de manera parcial, teniendo en cuenta sólo los estados observados.
Cada modelo candidato obtiene un puntaje; el de mayor puntaje es
considerado el que mejor se ajusta a los datos. El puntaje puede denirse
utilizando la regla de Bayes

P (D/G)P (G)
P (G/D) = (4.3)
P (D)

62
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Figura 4.3. Parámetros de un modelo bayesiano. Similar al modelo


booleano, se requieren 4 parámetros para relacionar los elementos
1, 2 y 3; en este caso, estos parámetros especican distribuciones
de probabilidad en lugar de relaciones determinísticas (adaptada de
[GF05])

donde P (G) promedia la probabilidad sobre todos los modelos posibles G y


puede contener cierto contenido a priori de la estructura de la red o bien una
constante a priori no informativa, y P (D/G) es una función seleccionada por
el algoritmo utilizado que evalúa la probabilidad del modelo G sobre todas las
posibles asignaciones paramétricas. Suele aplicarse la función logaritmo a la
ecuación anterior para lograr que sus miembros sean aditivamente
independientes:

P (D/G)P (G)
logP (G/D) = log = logP (D/G) + logP (G) + C (4.4)
P (D)

siendo C una constante independiente del modelo.


Con el objeto de encontrar el modelo y los parámetros con el mejor puntaje
de manera eciente, es necesario elegir una función de puntaje que pueda ser
particionada en las contribuciones de puntaje individuales presentadas en la
ecuación 4.4 y para la cual existan garantías que los modelos con los mayores
puntajes sean aquellos con mayores probabilidades de capturar la red real, dados
los datos.

Usualmente, la tarea de aprendizaje en redes bayesianas es indeterminada


y se encuentran varias redes con alto puntaje. Con el objeto de lidiar con este
problema, suelen seleccionarse las interacciones de regulación más probables
mediante técnicas como la promediación de modelos y la carga inicial o
bootstrapping para luego obtener estimaciones de conanza sobre ellas.
Alternativamente, un conjunto de datos incompleto puede ser aumentado con

63
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

información previa que ayude a seleccionar la estructura de modelo más


probable. Esto es posible gracias a la estructura probabilística de una red
bayesiana, la cual permite incorporar inmediatamente dicha información a
través de la aplicación de la regla de Bayes.
Además de la función de puntaje, es necesario tomar otras decisiones para
lograr el aprendizaje de una red a partir de los datos de expresión. Éstas incluyen
la discretización de los datos en niveles y elecciones de las funciones a priori.
Las redes bayesianas pueden ser entrenadas con datos discretos un gen se
expresa, o no se expresa y con datos continuos niveles de expresión. Por
tanto, el modelo probabilístico seguirá, por ejemplo, una distribución
multinomial o una distribución normal. Las redes bayesianas con nodos
continuos son, por lo general, difíciles de inferir a partir de los datos
experimentales debido a que tienen una complejidad computacional añadida.
Sin embargo, esto último también resulta ventajoso ya que no es necesario
discretizar previamente dichos datos.

4.5.3. Algoritmos de asociación


Los algoritmos de asociación asignan interacciones a pares de elementos que
exhiben una alta similitud estadística en sus respuestas a un conjunto de datos
de entrenamiento [GF05]. Para medir similitud, suele utilizarse el coeciente de
correlación de Pearson, el cual asume una dependencia lineal entre variables, o
el coeciente de información mutua. Para cada par de genes, se calcula alguno
de estos coecientes y se establece si existe dependencia estadística entre ellos
a partir de un umbral contra el cual se compara dicho valor.
Esta clase de algoritmos necesita un conjunto de datos de entrenamiento
perteneciente a las concentraciones de los productos de expresión medidas en
diversas condiciones experimentales, para comenzar agregando conexiones
entre todos los pares de productos que excedan un umbral de similitud. Si bien
idealmente se pretende describir relaciones padre-hijo que existan en la red de
genes subyacente, es posible que el algoritmo asocie productos que estén
regulados por un producto padre común, o por otros ubicados más arriba en
la red. Con el objeto de lidiar con este problema, suele llevarse a cabo un
proceso de poda encargado de remover conexiones que puedan explicarse
mejor a partir de un camino más directo en el grafo, permaneciendo entonces
aquellas conexiones que son más probables de ser interacciones causales.
Asimismo, estos enfoques requieren que cada experimento sea
estadísticamente independiente de otros. Por ello, estos modelos pueden lidiar
con datos de expresión tomados en estados estacionarios del sistema o bien con
series temporales de datos en tanto el tiempo de muestreo sea lo
sucientemente extenso como para asumir que cada punto de datos es
independiente de los puntos anteriores.
Así como ocurre con las redes bayesianas, una arista representa sólo una
dependencia estadística entre los genes, de manera que se requiere un voto de
conanza para interpretarla como una interacción causal directa entre ellos.

64
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Debido a que estos algoritmos sólo miden similitud, no es posible asignar


dirección a las conexiones entre los productos de expresión.
Como parte de esta clase de algoritmos, puede mencionarse el creado por
De la fuente et al. en [Fue+04], el cual utiliza el coeciente de Pearson y
correlación parcial en el proceso de poda. Otro algoritmo conocido es el
llamado ARACNE  analizado en trabajos como el de Margolin et al.
[Mar+06] y Bansal et al. [Ban+07], el cual usa información mutua para
asociar productos de expresión. De igual manera, lo hace el algoritmo
REVEAL, o REVerse Engineering ALgorithm, presentado en [LFS98].

4.5.4. Algoritmos basados en ecuaciones diferenciales


ordinarias
Los algoritmos de aprendizaje basados en ecuaciones diferenciales ordinarias
relacionan cambios en las concentraciones de productos de expresión, entre ellos
y con perturbaciones externas. Este es un enfoque determinístico que no está
basado en la estimación de probabilidades condicionales, a diferencia de las redes
bayesianas y de los modelos basados en la teoría de la información.
Como se presentó anteriormente, un conjunto de ecuaciones diferenciales,
una por cada gen, describe la regulación de cada uno de ellos como una
función paramétrica del resto de los genes presentes en la red, conocidas éstas
como funciones de inuencia. Inferir una red utilizando este enfoque implica,
entonces, elegir una forma funcional para dichas funciones y estimar los
parámetros desconocidos utilizando alguna técnica de optimización.
Los investigadores han estudiado varias funciones, incluyendo funciones
lineales [CHC99][D'h+99][Gar+03] y sigmoidales [WWS99]. Las funciones
lineales han probado ser las más versátiles en el análisis de datos
experimentales, en parte, debido a su poder simplicador que permite reducir
drásticamente el número de parámetros necesarios para describir la función de
inuencia y evitar problemas de sobreajuste. Puede observarse un ejemplo en
la gura 4.4. De esta manera, la cantidad de datos requerida para resolver un
modelo lineal es mucho menor que la requerida por modelos no lineales más
complejos. Esta ganancia en eciencia experimental se obtiene a costa de
establecer fuertes restricciones acerca de la naturaleza de las interacciones de
regulación.
Estos modelos arrojan como resultado grafos dirigidos y pueden ser aplicados
tanto a perles de expresión tomados en estados estacionarios del sistema como
a series temporales de datos.
Se han propuesto en la literatura varios algoritmos basados en ecuaciones
diferenciales ordinarias. En varios trabajos de Bansal et al.[BDGB06][Ban+07]
se analizan algunos de estos algoritmos. Entre ellos, pueden mencionarse
Network Identication by multiple Regression o NIR (presentado en el trabajo
de Gardner et al.[Gar+03]); y Microarray Network Identication o MNI
(utilizado por Di Bernardo et al. en [Ber+05]), los cuales utilizan datos
tomados en estados estacionarios del sistema. Otro algoritmo frecuentemente
utilizado es el Time-Series Network Identication o TSNI, el cual opera con

65
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Figura 4.4. Parámetros de un modelo de ecuaciones diferenciales.


Para una relación lineal entre los elementos 1, 2 y 3, el modelo requiere
2 parámetros. Algunos modelos, como el del ejemplo, contemplan una
perturbación externa pi al nivel de expresión del elemento i (adaptada
de [GF05])

series temporales de datos. Todos ellos modelan la función de actualización de


manera lineal. Otros modelos dentro de este grupo son redes neuronales
articiales recurrentes [MSR91] y sigma-pi [RHM86], modelos jerárquicos y
modelos de acción de masa generalizada [FK98][Sav98].

4.6. Rendimiento de algoritmos


En la actualidad, no existe un criterio generalmente aceptado que sirva
para evaluar el rendimiento de los algoritmos. En parte, esto se debe a los
diferentes objetivos que persiguen, y la limitada disponibilidad de conjuntos de
datos estandarizados (experimentales o computacionales). Por ello, su utilidad
práctica no es del todo conocida. Se hace imperativo entonces que los
algoritmos sean probados con datos estandarizados utilizando criterios de
rendimiento de referencia.
No son pocos los trabajos en los que se utilizan datos de expresión génica
generados computacionalmente o in silico  para realizar evaluaciones de
rendimiento (ver [BDGB06][Ban+07][MSY03][NRF04][Pac09]). El
conocimiento incompleto de las redes reales, la falta de conjuntos de datos de
expresión génica reales y de control de los niveles de ruido hacen necesaria la
simulación de datos. Esto se debe a que dichas simulaciones permiten vericar
el rendimiento de los algoritmos sobre una base perfectamente conocida: redes
simuladas en un modelo de computadora.

66
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

4.7. Requerimientos de los datos


En esta sección se examinarán algunas de las características e inconvenientes
asociados a la obtención de redes a partir del procesamiento de datos a gran
escala [DLS99][Har01].

4.7.1. La maldición de la dimensión (Efecto Hughes)


La maldición de la dimensión se reere al hecho de que, cuantas más
variables (dimensiones) se necesiten en un modelo, más difícil se torna la tarea
de modelado, debido a que el espacio de búsqueda aumenta exponencialmente
con el número de parámetros haciendo que los datos disponibles se vuelvan
dispersos. Esta dispersión es problemática para cualquier método que requiera
signicación estadística. Por ello, con el n de obtener un resultado
estadísticamente sólido y able, la cantidad de datos necesaria para mantener
el resultado a menudo debe también crecer exponencialmente con la
dimensionalidad.

4.7.2. Restricciones al modelo


Reducir el rango de modelos posibles colocando restricciones adicionales o
utilizando información a priori puede simplicar la búsqueda del mejor modelo
de manera considerable. Por ejemplo, agregar una restricción acerca del número
de genes que puede regular a otro gen permite disminuir drásticamente el número
de interacciones de regulación a tener en cuenta.

4.7.3. Número y variedad de los puntos de datos


Todas las técnicas de inferencia de redes de regulación tienen en común que
están hambrientas de datos. Como se mencionó en la introducción de este
capítulo, estos datos pueden ser series temporales, o bien puede tratarse de
mediciones en un estado estacionario tomadas en condiciones diferentes. Si
bien medir la expresión de los genes en series temporales arroja una gran
cantidad de información, dichos puntos de datos tienden a estar vinculados
con un único proceso dinámico en la célula. Por otro lado, un conjunto de
mediciones realizadas bajo diferentes condiciones ambientales puede contener
más información que una serie de puntos del mismo fenómeno.
Ambos tipos de datos son necesarios para revelar la interacciones de
regulación entre genes. De hecho, para poder inferir correctamente la
regulación de un único gen, es necesario observar su expresión bajo muchas
combinaciones diferentes de niveles de expresión de las entradas que lo
regulan. Esto implica una gran variedad de condiciones ambientales y
perturbaciones diferentes.
En cuanto al número de puntos de datos, una red booleana de n nodos, sin
restricciones adicionales y potencialmente conectada en su totalidad, requeriría
2n pares de entradas-salidas, lo cual es inconcebible para un número realista de

67
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

genes. Con la restricción de que los genes no pueden tener más de k entradas,
dicho número se hace proporcional a log(k). Para otros modelos, en general se
necesitan al menos tantos puntos como genes existan en la red.

4.7.4. Discretización de los datos


Dentro de las células, las reacciones bioquímicas son eventos discretos en los
cuales moléculas y enzimas se unen para su oxidación, reducción, etc. Dada la
tecnología de medición actual, los datos se presentan en abundancia como para
ser representados como valores de concentración continuos. Sin embargo, razonar
en base a valores continuos puede ser problemático dado el número inherente de
grados de libertad que poseen las distribuciones continuas arbitrarias.
Debido a que la cantidad de información disponible es comparativamente
limitada, se hace necesario reducir la dimensionalidad del modelo. Por diversas
razones, suele preferirse alcanzar esto discretizando las variables en un número
menor de niveles. Los valores discretizados constituyen entonces una
aproximación de los valores continuos reportados, los cuales son a su vez una
aproximación de los procesos verdaderamente discretos que ocurren en el
interior de las células.
Uno de los métodos más sencillos y conocidos es la discretización en cuantiles
o por frecuencia, en el cual las observaciones de una variable se ordenan para
ubicarlas en diferentes niveles de discretización con la premisa de, al nal del
proceso, contar con el mismo número de observaciones en cada uno. Esto se
lleva a cabo teniendo en cuenta el número de índice de cada valor (por ejemplo,
las muestras 1, 2 y 3 se ubican al primer nivel; 4, 5 y 6 en el segundo, etc).
Otro método sencillo es la discretización por intervalos. En este método, las
observaciones ordenadas se dividen en niveles de discretización que no se basan
en los índices sino en sus valores. De esta manera, la discretización en cuantiles
depende solamente del orden de los valores observados, mientras que el segundo
método también considera el espacio relativo entre dichos valores.
Cuando un conjunto de datos sufre un proceso de discretización, cierta
información se pierde. En este contexto, se busca modelar las dependencias
condicionales e incondicionales entre las variables, por lo cual es importante
retener tanta información como sea posible de manera que las relaciones
existentes entre ellas se vean reejadas en los datos. Para cada caso, existe un
número de niveles de discretización óptimo que permite alcanzar dicho
objetivo. Si bien existen algoritmos que miden la cantidad de información que
se pierde a diferentes niveles, en este trabajo dicho número será un número jo.

4.8. Aprendizaje estructural bayesiano en redes


de regulación génica
Muchas veces, una red bayesiana es especicada por un experto, para luego
ser utilizada en procesos de inferencia. En otras aplicaciones, la tarea de denir
la red es demasiado compleja para los seres humanos. En este caso, se hace

68
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

necesario que la estructura de la red y los parámetros de las distribuciones


locales sea aprendida a partir de los datos.
Un algoritmo de búsqueda requiere de un espacio de búsqueda el cual
contiene las soluciones candidatas y un conjunto de operaciones que
transformen una solución candidata en otra. La mayoría de los métodos
buscan a través del espacio de estructuras de redes bayesianas, probablemente
el espacio de búsqueda más sencillo. Sin embargo, en ciertos casos es posible
realizar la búsqueda a través del espacio de órdenes de nodos [FK03], en el
espacio de clases de estructuras de red equivalentes, o alternando entre el
espacio de redes bayesianas y el de esqueletos de grafos [SAT00]. No está del
todo claro si estos enfoques presentan mayores benecios que el primero, si
bien resulta particularmente sencillo denir operadores de búsqueda en el
espacio de estructuras.

Como se mencionó anteriormente, el problema de encontrar una estructura


de red es NP-complejo, debido al gran número de formas en las cuales pueden
vincularse sus nodos. Con el objeto de mitigar este problema, suelen adoptarse
estrategias de aprendizaje aproximado. En redes bayesianas, estos algoritmos
de aprendizaje estructural pueden agruparse en dos categorías: aquellos
basados en restricciones y aquellos basados en puntaje
[Bun96][DSA11][Hec96][HTJ12][Nea03]. El presente trabajo está centrado en
estos últimos.

4.8.1. Algoritmos estructurales bayesianos basados en


restricciones
Los algoritmos basados en restricciones aprenden la estructura de red al
analizar las relaciones probabilísticas dadas por la propiedad de Markov de las
redes bayesianas mediante pruebas de independencia condicional para luego
construir un grafo que reeje los grados de separación entre los nodos.
Usualmente, los modelos resultantes son interpretados como modelos causales,
si bien son aprendidos a partir de datos experimentales.
Un ejemplo de ese tipo de algoritmos es el clasicador Bayesiano ingenuo o
Naive Bayes classier, el cual es un clasicador probabilístico causal que asume
la existencia de un único nodo padre mientras que los otros nodos en la red
constituyen sus hijos. Si bien éste no es siempre el caso en las redes reales,
presenta ciertas ventajas como el corto tiempo de construcción. También se
destacan los algoritmos PC [SGS01] y NPC [Ste01].
Generalmente, este tipo de algoritmos requiere de una gran cantidad de datos
para permitir obtener estimaciones ables a partir de pruebas de independencia
condicional entre variables con dependencia débil, y cuando hay un gran número
de variables involucradas. Debido a esto, los algoritmos basados en puntaje que
se presentan en la siguiente sección se han convertido en el enfoque utilizado en
la mayoría de los trabajos relacionados con el aprendizaje estructural en redes
bayesianas.

69
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

4.8.2. Algoritmos estructurales bayesianos basados en


puntaje
Los algoritmos basados en puntaje atraviesan el espacio de grafos dirigidos
acíclicos utilizando un criterio de buena forma. Este criterio puede describirse
mediante una función de puntaje que mide la calidad de una estructura de red
a partir de los datos. Algunos representantes de este enfoque son los algoritmos
K2 [CH92], B [Bou95], FG [FG97] y HCMC [CK04].
Debido a que dicho espacio crece más que exponencialmente con el número de
variables, los métodos basados en puntaje utilizan heurísticas para explorar sólo
la parte del espacio de grafos dirigidos acíciclos que es probable que contenga
una estructura de red bayesiana que sea óptima, dados los datos. La heurística
más utilizada es la de ascenso de colinas o Hill climbing [HTJ12], la cual utiliza
operadores transversales para obtener la mejor red.
Como se mencionó anteriormente, si bien algunos algoritmos atraviesan el
espacio de todos los posibles ordenamientos de nodos [TK12] o bien el espacio
de clases de equivalencia [Chi02][MC00], la mayoría de los métodos de
búsqueda utilizados en redes bayesianas introducen sucesivos cambios en las
aristas de una red inicial, y luego evalúan el mérito de dicho cambio. Las
posibles modicaciones son fáciles de identicar:

Si existe una arista conectando dos variables, el sentido de la misma puede


revertirse o bien la arista puede ser removida.

Si no existe una arista en dos variables, entonces la misma puede agregarse


en cualquier dirección.

Todos los cambios pueden realizarse mientras la red resultante no contenga


ciclos dirigidos.

4.8.2.1. Criterios de selección

Un criterio de selección de modelo sirve para medir el grado con el que un


modelo de red se ajusta a los datos y, por lo tanto, para seleccionar alguno de
entre las estructuras candidatas. En redes bayesianas suelen utilizarse criterios
globales de selección como la probabilidad posterior relativa o bien criterios
de selección local [Hec96], los cuales implican la elección de distribuciones de
probabilidad a priori y el cálculo de probabilidades marginales. Las métricas
más utilizadas son:

Dirichlet bayesiano o Bayesian Dirichlet (BD) : propuesto por Heckerman,


Greiger y Chickering, asume que se trata de una muestreo multinomial con
distribución Dirichlet y con independencia y modularidad paramétricas.

K2 : se trata de un caso particular de la métrica BD, planteado por Cooper


y Herskovits.

70
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Equivalente Dirichlet Bayesiano o Bayesian Dirichlet equivalent (BDe) :


desarrollado por Heckerman y basado en la métrica BD, resuelve el
problema de especicación de hiperparámetros al considerar suposiciones
adicionales.

Equivalente Dirichlet Bayesiano con prioridad uniforme o Bayesian


Dirichlet equivalent uniform (BDeu) : propuesto por Buntine, es un caso
particular de BDe, en el que se utiliza una constante matemática para
crear una distribución ja o uniforme.

Verosimilitud logarítmica o Log-likelihood (LL): es otra de las métricas


usadas que previene el fenómeno de sobreajuste de datos.

Longitud de descripción mínima o Minimum Description Length (MDL) :


este puntaje constituye un enfoque más sencillo al problema del ajuste de
datos.

Criterio de Información Bayesiano o Bayesian Information Criterion


(BIC)
Criterio de Información Akaike o Akaike Information Criterion (AIC)
Máxima verosimilitud normalizada o Normalized Maximum Likelihood
(NML) : es un puntaje propuesto por Roos, Silander, Konthanen y
Myllymäki basado en el principio MDL.

Pruebas de información mutua o Mutual Information Tests (MIT)


También son conocidos aquellos puntajes basados en la teoría de la
información.

4.8.2.2. Ordenamiento

Un concepto importante en el aprendizaje bayesiano basado en puntaje es


el ordenamiento de las variables. Frecuentemente se lo utiliza para restringir el
espacio de búsqueda con una simple regla: dado un cierto orden, una variable
X sólo puede considerar a otra variable Y como su padre si y solo si Y precede
a X.
Como se ha mencionado, el ordenamiento de las variables permite reducir el
espacio de búsqueda y ayuda a evitar costosos chequeos de aciclicidad.

4.8.3. Algoritmo K2
El algoritmo K2, desarrollado por Cooper y Herskovits [CH92], es un
algoritmo goloso que obtiene la mejor estructura a través de un proceso
iterativo entre todos los posibles grafos dirigidos acíclicos de n variables. Para
compensar esto, el algoritmo tiene que iterar sobre muchas estructuras de
manera de asegurarse que se ha encontrado el mejor puntaje.

71
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

4.8.3.1. Supuestos

El algoritmo presenta los siguientes supuestos:

Las variables son discretas.

No existen casos con valores desconocidos.

Los datos se encuentran independiente e idénticamente distribuidos.

4.8.3.2. Descripción

El algoritmo tiene como entrada un conjunto de nodos, un orden sobre


ellos y una base de datos de casos. Para poder encontrar el conjunto de padres
de un nodo, asume primeramente que cada nodo no tiene padres, para luego
agregar incrementalmente a dicho conjunto aquellos predecesores que
aumenten la probabilidad de la estructura resultante. Cuando la adición de un
padre no permite incrementar la probabilidad de la estructura existente, el
algoritmo deja de agregar padres al nodo corriente.
La función de puntaje utilizada por el algoritmo K2 (sobre el nodo i) está
basada en la función de Dirichlet bayesiano:
|φi | ri
Y (ri − 1)! Y
f (i, πi ) = αijk ! (4.5)
j=1
(Nij + ri − 1)!
k=1

donde:

πi es el conjunto de padres del nodo i


φi es la lista de todas las posibles instanciaciones de los padres del nodo i.
Esto es, si {p1 , ..., ps } son los padres del nodo i, entonces φi es el producto
cartesiano de todos los posibles valores de p1 hasta ps

|φi | es el número de elementos en φi


ri es el número de estados posibles del nodo i
αijk es el número de casos en el conjunto de datos D en los cuales el nodo i
tiene asignado su k -ésimo valor, y los padres del nodo i tienen asignados
su j -ésima instanciación en φi

Nij es el número de casos en el conjunto de datos D en los cuales los padres


del nodo i en πi tienen asignados su j -ésima instanciación en φi

Finalmente, el puntaje nal de una red se obtiene multiplicando los puntajes


individuales.

72
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

4.8.3.3. Pseudocódigo

A continuación se muestra el pseudocódigo del algoritmo K2, obtenido y


adaptado del trabajo de Cooper y Herskovits [CH92].

Algoritmo 3: Algoritmo K2
entrada: Un conjunto de n nodos {X1 , ..., Xn } y un orden sobre los
nodos ≺,
Una base de datos D conteniendo m casos,
Una función de puntaje f (),
Un límite superior k sobre el número de padres de un nodo.
salida : Para cada nodo, un listado de sus padres
para i ← 1 a n hacer
padresi ← ∅;
puntaje_actual ← f (Xi , padresi );
continuar_buscando ← verdadero;
mientras (continuar_buscando == verdadero y |πi | ≤ k) hacer
z ← nodo en {predecesores(Xi , ≺) − padresi } que maximiza
f (Xi , padresi ∪ {z}, D);
puntaje_nuevo ← f (Xi , padresi ∪ {z}, D);
si puntaje_nuevo > puntaje_actual entonces
puntaje_actual ← puntaje_nuevo;
padresi ← padresi ∪ {z};
sino
continuar_buscando ← f also;
declarar padresi como los padres del nodo Xi

4.8.3.4. Análisis

En cada iteración del lazo mientras, la determinación del valor de z requiere


como mucho n − 1 operaciones de f (), ya que cada nodo tiene como mucho n − 1
predecesores. Cooper y Herskovitz demostraron que la complejidad de f () es
O(mkr), donde m es el número de casos, k el número máximo de padres que un
nodo puede tener y r el máximo número de valores que puede tomar una variable.
Entonces, calcular z requiere del orden de O(nmkr) operaciones. Debido a que
pueden ocurrir como mucho k iteraciones del lazo mientras y n del lazo para,
entonces la complejidad del algoritmo es O(n2 mk 2 r).
Su complejidad es comparativamente menor a la de otros algoritmos ya que
utiliza un orden óptimo de las variables para restringir el espacio de los grafos
dirigidos acíclicos que atraviesa. Si bien este ordenamiento óptimo podría
obtenerse a partir de conocimiento de dominio, como por ejemplo un
ordenamiento temporal de las variables, no está disponible por lo general, lo
cual lo hace impracticable en la mayoría de las situaciones. Sin embargo,

73
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

existen algoritmos que permiten, dado un orden inicial, obtener un


ordenamiento que mejor se ajuste a los datos.

4.8.4. Búsqueda basada en ordenamiento


La búsqueda basada en ordenamiento, u Ordering based search (OS), aborda
el problema del aprendizaje de la estructura bayesiana óptima de una manera
diferente al algoritmo K2. En lugar de atravesar el espacio de búsqueda de grafos
dirigidos acíclicos, atraviesa el espacio de ordenamiento de nodos. Tal y como
se menciona en [TK12], este espacio es mucho más pequeño que el de los grafos
dirigidos acíclicos a la vez que los pasos de búsqueda son más globales y evita
chequeos de aciclicidad costosos. En general, el algoritmo ejecuta una búsqueda
golosa por ascenso de colinas, con reinicios aleatorios ocasionales que permiten
abordar el problema del máximo local.

4.8.4.1. Descripción

Debido a que se trata de una búsqueda por puntaje, el algoritmo utiliza


una función de puntaje que permite determinar la mejor estructura que sea
consistente con un ordenamiento dado. Para llevar a cabo esta tarea, tal y como
es propuesto en [TK12], el método se basa simplemente en seleccionar el mejor
conjunto de padres para cada nodo, dado un cierto ordenamiento.
Para esto, primeramente precalcula los conjuntos de mejores padres para
cada variable y evalúa la ganancia de intercambiar dos variables adyacentes en
el ordenamiento para luego iterar mientras una ganancia mejor sea posible. El
algoritmo aplica entonces el intercambio que otorga la mayor ganancia en el
orden, actualiza el conjunto de padres de las variables intercambiadas y evalúa
dos posibilidades de intercambio nuevas en cada iteración.

4.8.4.2. Pseudocódigo

A continuación se muestra el pseudocódigo del algoritmo OS, obtenido y


adaptado del trabajo de Pacekajus [Pac09].

74
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Algoritmo 4: Algoritmo OS
entrada: Un conjunto de n nodos {X1 , ..., Xn } y un orden sobre los
nodos ≺,
Una base de datos D conteniendo m casos,
Una función de puntaje f (),
Un límite superior k sobre el número de padres de un nodo.
salida : Un mejor orden de nodos y, para cada nodo, un listado de sus
padres
para i ← 1 a n hacer
padresi ← mejores_padres(Xi , predecesores(Xi , ≺), D, f, k);
si i < n entonces
gananciai,i+1 ← ganancia(Xi , padresi , Xi+1 , padresi+1 , ≺, D, k);

continuar_buscando ← verdadero;
mientras (continuar_buscando == verdadero) hacer
(i, j) ← par donde la ganancia en gananciai,j es máxima;
si gananciai,j > 0 entonces
intercambiar Xi y Xj en ≺;
padresi ← mejores_padres(Xi , predecesores(Xi , ≺), D, f, k);
padresj ← mejores_padres(Xj , predecesores(Xj , ≺), D, f, k);
si i > 1 entonces
gananciai−1,i ← ganancia(Xi−1 , padresi−1 , Xi , padresi ), ≺
, D, k);
gananciai,j ← −gananciaj,i ;
si j < n − 1 entonces
padresj+1 ← mejores_padres(Xj+1 , predecesores(Xj+1 , ≺
), D, f, k);
gananciaj,j+1 ← ganancia(Xj , padresj , Xj+1 , padresj+1 , ≺
, D, k);
sino
continuar_buscando ← f also;

declarar ≺ como un mejor orden para los nodos y a padresi como los
padres del nodo Xi

75
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA

Este algoritmo se basa en otros dos, los cuales se esbozan seguidamente.


Algoritmo 5: Algoritmo mejores_padres
entrada: Un nodo Xi ,
Un conjunto C de candidatos padre de Xi ,
Una base de datos D conteniendo m casos,
Una función de puntaje f (),
Un límite superior k sobre el número de padres de un nodo.
salida : El mejor conjunto de padres para Xi dados los candidatos C
P ← conjunto de los superconjuntos de C que no superen los k elementos
(nodos);
padres ← conjunto de nodos en P que maximiza f (Xi , P, D);
declarar padres como los mejores padres de Xi

Algoritmo 6: Algoritmo ganancia


entrada: Un nodo Xi y un nodo Xj adjacente en el orden sobre los
nodos ≺,
Los actuales padres padresi y padresj de los nodos Xi y Xj ,
Una base de datos D conteniendo m casos,
Una función de puntaje f (),
Un límite superior k sobre el número de padres de un nodo.
salida : La ganancia de intercambiar Xi y Xj en el orden ≺
padres0i ← mejores_padres(Xi , predecesores(Xi , ≺) ∪ Xj , D, f, k);
padres0j ← mejores_padres(Xj , predecesores(Xj , ≺) \ Xi , D, f, k);
gananciai ← f (Xi , padres0i , D) − f (Xi , padresi , D);
gananciaj ← f (Xj , padres0j , D) − f (Xj , padresj , D);
ganancia ← gananciai + gananciaj ;
declarar ganancia como la ganancia en puntaje de intercambiar Xi y Xj
en el orden ≺

4.8.4.3. Análisis

El método mejores_padres es aquel que selecciona el mejor conjunto de


padres posible para cada nodo dado un ordenamiento. Para un máximo número
de padres k , el máximo
Pk número de conjuntos de padres a evaluar para el nodo
Xi está dado por l=0 il . Siendo nk = O(nk ), la complejidad de este método
 

es también O(nk ).
De esta manera, la complejidad del algoritmo OS es O(nk+1 ) en la
inicialización y O(nk ) por cada iteración.

76
Capítulo 5

Experimentación
Dados los algoritmos presentados en el capítulo anterior, y teniendo en
cuenta los desafíos tanto en tiempo como en recursos que presenta el problema
del aprendizaje estructural de redes, se desea analizar empíricamente dichos
algoritmos y sus parámetros mediante la experimentación. Especícamente, se
desea determinar:

Si el algoritmo K2 es capaz de arrojar mejores resultados cuando se le


provee un orden obtenido por el algoritmo OS,
Cuán bueno es ese orden en función de los resultados con respecto a un
orden óptimo y un orden aleatorio, y
Qué rol juegan los parámetros de cada uno de estos algoritmos en el
resultado nal.

En particular, se utilizarán redes de genes para esta tarea, en vista de sus


características inherentes, su complejidad y su relevancia.

5.1. Herramientas
5.1.1. GeneNetWeaver
GeneNetWeaver (GNW) [SMR10][Mar+09][SMF11] es una herramienta de
código abierto que permite generar redes de regulación génica biológicamente
posibles in silico y datos de expresión simulados, los cuales pueden utilizarse
como bancos de prueba de métodos de inferencia. Estas estructuras se generan
a partir de extraer módulos de redes de interacción biológica conocidas. Luego,
las mismas son dotadas de una dinámica usando un modelo cinético de
transcripción y traducción, en donde la regulación transcripcional se modela
usando un enfoque termodinámico lo cual permite tanto interacciones
independientes como sinérgicas. Finalmente, estos modelos son usados para
producir datos de expresión génica sintéticos mediante simulaciones, las cuales

77
CAPÍTULO 5. EXPERIMENTACIÓN

pueden llevarse a cabo tanto determinística como estocásticamente, de manera


de modelar el ruido interno propio de la dinámica de las redes. También puede
agregarse ruido experimental usando un modelo de ruido observado en los
microarrays. La gura 5.1 muestra una captura de pantalla de GNW.

Figura 5.1. Captura de pantalla de la aplicación GeneNetWeaver

5.1.2. Entorno y lenguaje de programación R


R [R C13] es un conjunto integrado de programas para manipulación de
datos, cálculo y grácos. Entre otras características, dispone de:

almacenamiento y manipulación efectiva de datos,

operadores para cálculo sobre variables indexadas (arreglos), en particular


matrices,

una colección de herramientas para análisis de datos amplia, coherente e


integrada,

posibilidades grácas para análisis de datos, que funcionan directamente


sobre pantalla o impresora, y

un lenguaje de programación bien desarrollado, simple y efectivo, que


incluye condicionales, ciclos, funciones recursivas y posibilidad de entradas
y salidas.

Se trata de un entorno completamente diseñado y coherente, en lugar de tan


sólo una agregación incremental de herramientas muy especícas e inexibles,
como ocurre frecuentemente con otros programas de análisis de datos.

78
CAPÍTULO 5. EXPERIMENTACIÓN

RStudio
RStudio [RSt15] es un entorno de desarrollo integrado, o IDE en inglés,
libre y de código abierto para R, escrito en C++ y que hace uso del entorno
multiplataforma orientado a objetos Qt [Qt] para su interfaz gráca. Este IDE,
el cual incluye una consola, editor de sintaxis que apoya la ejecución de código y
herramientas para el trazado, la depuración y la gestión del espacio de trabajo,
es el utilizado en el presente trabajo. En la gura 5.2 se observa una captura de
pantalla de este entorno.

Figura 5.2. Captura de pantalla del entorno de desarrollo RStudio

5.1.3. Amazon Web Services


Amazon Web Services (AWS) [Aws] es una plataforma de servicios de
computación en la nube de la empresa Amazon.com, que ofrece potencia de
cómputo, almacenamiento de bases de datos, entrega de contenido y otras
funcionalidades. Una parte central de esta plataforma es Amazon Elastic
Compute Cloud (EC2). EC2 permite a los usuarios alquilar computadores
virtuales en los cuales poder ejecutar sus propias aplicaciones. En el presente
trabajo, se utilizaron instancias por demanda, lo cual permitió aumentar o
disminuir la capacidad de cómputo dependiendo de las necesidades de la
aplicación. Se muestra una captura de pantalla de la consola de EC2 en la
gura 5.3.

5.1.4. Orange
Orange [Ora] es una aplicación de código abierto que cuenta con un juego
de herramientas para visualizar información, realizar minería de datos y
análisis predictivo desarrollado en la Facultad de Informática de la
Universidad de Ljubljana (Eslovenia). Consta de una serie de componentes

79
CAPÍTULO 5. EXPERIMENTACIÓN

Figura 5.3. Captura de pantalla de la consola de EC2

desarrollados en C++ que implementan algoritmos de minería de datos, así


como operaciones de pre-procesamiento y representación gráca de datos. En
este trabajo, Orange ha sido utilizado tanto para obtener ciertos grácos como
para llevar adelante análisis estadísticos sobre los datos. Se muestra una
captura de pantalla de la aplicación en la gura 5.4.

Figura 5.4. Captura de pantalla de Orange

5.2. Metodología
Con el objeto de alcanzar los objetivos perseguidos en el presente trabajo, se
ha seguido una serie de pasos para evaluar el comportamiento de los algoritmos
considerados (ver gura 5.5), a saber:

80
CAPÍTULO 5. EXPERIMENTACIÓN

1. Proponer una red bayesiana (su estructura al menos) y simularla,


obteniendo una base de casos D, las cuales deben reejar las relaciones
de independencia condicional entre las variables.

2. Utilizando cada uno de los enfoques, se trata de obtener una estructura


de red bayesiana B , la cual maximice la probabilidad P (D|B).

3. Evaluar la aptitud de las soluciones encontradas.

Figura 5.5. Proceso de evaluación de aprendizaje estructural a partir


de una base de casos (adaptada de [LP96])

5.2.1. Generación de datos


Los conjuntos de prueba se han generado a partir de subredes de genes
tomadas de 3 redes génicas reales y conocidas:

Drerio-1, 30 nodos y 33 aristas (ver gura 5.6), obtenida de la red


original de Danio Rerio (pez zebra) de 239 nodos y 269 aristas, tal y
como aparece en el trabajo de Chatr-Aryamontri [CA+15]. Siendo que la
cantidad de nodos de esta subred es relativamente menor al resto, la red
Drerio-1 se creó con la característica adicional de incluir como mínimo 10
reguladores, es decir, 10 nodos que tienen al menos una arista saliente en
la red original, de manera de asegurarse la presencia de dichos nodos.

Ecoli-1, de 40 nodos y 84 aristas (ver gura 5.7), obtenida de la red


original del bacilo Escherichia coli de 1565 nodos y 3758 aristas, teniendo
en cuenta el trabajo de Gamma-Castro [GC+08].

Levadura-1, 52 nodos y 95 aristas (ver gura 5.8), obtenida de la


red original de Levadura de 4441 nodos y 12873 aristas, de acuerdo con
Balaji [Bal+06].

81
CAPÍTULO 5. EXPERIMENTACIÓN

Figura 5.6. Red Drerio-1

Figura 5.7. Red Ecoli-1

82
CAPÍTULO 5. EXPERIMENTACIÓN

Figura 5.8. Red Levadura-1

Los datos se han obtenido dotando a cada red de un modelo dinámico


utilizando GeneNetWeaver. Para el presente trabajo, se ha elegido el modelo
de ecuaciones diferenciales estocásticas debido a la naturaleza no
determinística y a la presencia de ruido propios de estas mediciones,
ecuaciones que son resueltas por la herramienta mediante métodos numéricos.
Para cada red, se generaron datos en series temporales, previa remoción de
cualquier interacción autoregulada. Todas las corridas han considerado como
condición inicial una medición del estado de la red sin perturbar. Luego, en t=0
y durante la primera mitad de la simulación, se aplicó una perturbación sobre
los genes de la red. La serie temporal obtenida muestra cómo la red responde a
dicha perturbación y cómo se relaja luego de removerla. Cabe destacar que la
cantidad de puntos o entradas en el tiempo no presenta ningún efecto sobre la
precisión del método numérico empleado para obtener los valores de expresión
de cada gen.
Como se mencionó, el modelo de ecuaciones diferenciales estocásticas
permitió agregar ruido inherente a los chips de ADN a cada nivel de expresión

83
CAPÍTULO 5. EXPERIMENTACIÓN

obtenido en cada conjunto [TSK02], valores que luego fueron normalizados.


La tabla 5.1 muestra los diferentes conjuntos de datos utilizados durante la
experimentación.

Drerio-1 Ecoli-1 Levadura-1

Entradas Tablas Entradas Tablas Entradas Tablas


2000 20 2000 10 2000 10
4000 20 4000 10 4000 10
8000 20 8000 10 8000 10
16000 20 16000 10 16000 10
32000 20

Cuadro 5.1. Conjuntos de datos utilizados en la experimentación

5.3. Diseño de la solución


5.3.1. Generalidades
La solución se ha desarrollado completamente en R. Los diferentes algoritmos
y funcionalidades se han implementado en múltiples subrutinas a lo largo de
varios archivos .R, o scripts, que se llaman unas a otras, existiendo un script
principal que actúa como punto de partida.
Asimismo, se han creado algunas clases para albergar ecientemente cierta
información que es necesaria a lo largo de la ejecución del script, como por
ejemplo una tabla de datos discretizados que es utilizada por varias subrutinas.
También existen algunas clases envoltorio, o wrappers en inglés, que permiten
representar estructuras y encapsular funcionalidades utilizadas frecuentemente;
por ejemplo, la estructura de datos lista y la posibilidad de agregar elementos a
ella. En este sentido, R cuenta con 3 sistemas orientados a objetos, además de
los tipos de datos base: S3, S4 y las llamadas clases de referencia [Roo]. Se ha
utilizado el paquete R6 [R6] el cual permite la creación de clases similares a las
clases de referencia nativas de R, pero más livianas y ecientes.
En cuanto a las implementaciones de los algoritmos K2 y OS, las mismas se
han llevado a cabo prescidiendo de cualquier técnica de optimización adicional
como podrían ser reinicios aleatorios o cargas iniciales. Asimismo, y a n de
tener un mayor control sobre el rendimiento de OS, se ha decidido empíricamente
establecer un valor de 50 para el número máximo de superconjuntos a evaluar
por el método mejores_padres. La implementación en su totalidad se encuentra
en el apéndice A, Código fuente.

84
CAPÍTULO 5. EXPERIMENTACIÓN

5.3.2. Arquitectura
Operando sobre el principio de dividir y conquistar, se ha decidido paralelizar
la ejecución de las tareas a través un clúster conformado por múltiples procesos,
los cuales hacen uso de las distintas unidades de proceso, o cores en inglés,
disponibles. Dichos procesos suelen compartir la misma memoria; esto supuso,
por un lado, un escrutinio minucioso de la memoria con el objetivo de ecientizar
su uso; y, por otro, la realización de varias pruebas y análisis a n de estimar la
cantidad de memoria que un proceso podría nalmente utilizar en función de la
red considerada y los diferentes conjuntos de datos de prueba.
De esta manera, cada proceso se hace responsable de gestionar una tabla y
todos sus conjuntos de datos de prueba por vez. Esto implica que cada uno de los
procesos lee inicialmente una tabla de datos desde disco, la cual discretiza para
luego pasar a procesar los datos utilizando los distintos algoritmos y parámetros.
Una vez que se han ejecutado todos los pasos, la tabla es eliminada de memoria
y el proceso procede con la siguiente asignación.

5.3.3. Optimizaciones
Con el objeto de mejorar el rendimiento, y siguiendo algunas de las decisiones
de diseño mencionadas en el trabajo de Pa£ejakus [Pac09], se han introducido
ciertas optimizaciones, las cuales se mencionan seguidamente.

5.3.3.1. Conteo de ocurrencias

Los funciones de puntaje utilizadas se basan fundamentalmente en el número


de ocurrencias existente en una base de casos, dado un conjunto de nodos y sus
valores. Se trata de una funcionalidad central y de la cual se hace un uso intensivo
ya que ella determina toda valoración relativa a dichos nodos y valores, y cuán
bien se ajustan a los datos.
Con el objeto de soportar ecientemente esta búsqueda, los datos
discretizados son guardados en una adaptación de un árbol de decisión
alternativo, o AD-tree en inglés [AM98]. Este árbol guarda las frecuencias con
que ocurren las posibles combinaciones de nodos y sus valores. Dada, entonces,
una combinación de nodos y valores, se recorre el árbol desde su raíz hasta
obtener el número de ocurrencias buscado.
Por ejemplo, dados los nodos A, B, C y D, los valores 1, 2, 3 y 4, y una cierta
tabla de datos, un posible árbol de decisión alternativo sería el siguiente:
Si la combinación a buscar fuese (A = 1, B = 1, C = 2, D = 4), sería
posible decir que, de acuerdo al árbol, la misma sólo ocurre una vez mientras
que la combinación (A = 1, B = 2, C = 3, D = 1) ocurre 2 veces al igual que
(A = 3, B = 1, C = 2, D = 4). En tanto, la combinación (A = 1, B = 2, C =
∗, D = ∗), donde * implica cualquier valor válido, se presenta en 4 ocasiones en
la base de casos.
Ahora bien, si la combinación fuese (A = ∗, B = ∗, C = 3, D = 2), la
búsqueda no sería tan eciente ya que, comenzando desde la raíz, habría que

85
CAPÍTULO 5. EXPERIMENTACIÓN

raíz

A = 1c=6 A = 2c=2 A = 3c=2

B = 1c=2 B = 2c=4 B = 1c=2 B = 1c=2

C = 2c=1 C = 4c=1 C = 1c=1 C = 3c=3 C = 2c=1 C = 3c=1 C = 2c=2

D = 4c=1 D = 3c=1 D = 1c=1 D = 1c=2 D = 2c=1 D = 1c=1 D = 2c=1 D = 4c=2

Figura 5.9. Ejemplo de árbol de decisión alternativo

sumar las contribuciones de cada subárbol donde se presente dicha combinación


para obtener el número total de ocurrencias. En este caso, para la combinación
(A = ∗, B = ∗, C = 3, D = 2), el número total sería 2 (una proveniente del
subárbol (A = 1, B = 2) y la otra del subárbol (A = 2, B = 1)).
De esta manera, se advierte que la construcción de árboles adicionales al
presentado permitiría ecientizar el resto de las búsquedas. Entonces, y teniendo
en cuenta que las combinaciones (A = ∗, B = ∗, C = 3, D = 2) y (A = ∗, B =
∗, D = 2, C = 3) son equivalentes, es conveniente contar con un árbol para cada
subconjunto de nodos posible. Siguiendo con el ejemplo anterior, se construirían
el árbol presentado anteriormente para el (sub)conjunto {A, B, C, D} y 3 árboles
adicionales para los subconjuntos {B, C, D}, {C, D} y {D}, respectivamente:
Estos 4 árboles cubren todo el espectro de combinaciones de nodos y
valores posible y permiten ecientizar las búsquedas de ocurrencias. Así, si la
combinación contiene únicamente los nodos B y D (sin importar el orden en
que aparezcan en la combinación), se utiliza el segundo árbol mientras que si
contiene todos se utiliza el árbol presentado en primer lugar.

5.3.3.2. Funciones de puntaje

Las funciones de puntaje utilizadas para evaluar la aptitud de una red


dados los datos contienen productorias y factoriales. Estas operaciones son
costosas en términos de tiempo y los resultados, por lo general,
extremadamente pequeños. Por tanto, se ha decidido aplicar una función
monótona estrictamente creciente como lo es la función logaritmo,
transformando así las productorias en sumatorias y permitiendo trabajar con
números que son más simples de procesar.

Cada coeciente utilizado en las funciones de puntaje se corresponde con el


número de casos en la base de datos en los cuales ocurre una combinación
de nodos y valores dados. Cualquiera sea la combinación, la suma total de
estos valores debe ser necesariamente igual al número total de casos en dicha

86
CAPÍTULO 5. EXPERIMENTACIÓN

raíz

B = 1c=6 B = 2c=4

C = 2c=4 C = 3c=1 C = 4c=1 C = 1c=1 C = 3c=3

D = 1c=1 D = 4c=3 D = 2c=1 D = 3c=1 D = 1c=1 D = 1c=2 D = 2c=1

raíz

C = 1c=1 C = 2c=4 C = 3c=4 C = 4c=1

D = 1c=1 D = 1c=1 D = 4c=3 D = 1c=2 D = 2c=2 D = 3c=1

raíz

D = 1c=4 D = 2c=2 D = 3c=1 D = 4c=3

Figura 5.10. Ejemplos de árboles de decisión alternativos adicionales


al árbol principal

base. Teniendo en cuenta esta propiedad, se ha implementado una pequeña


optimización por la cual, a medida que dichos coecientes se obtienen del árbol
de decisión alternativo, los mismos son sumados. Cuando alguna de estas sumas
parciales alcanza el número total de casos, entonces se considera que el valor del
resto de los coecientes a obtener es cero. De esta manera, se evitan búsquedas
innecesarias en el árbol.

Adicionalmente, se ha utilizado la técnica de memoización, o memoization


en inglés. Esta técnica de optimización se emplea principalmente para acelerar
programas de computadora guardando los resultados de llamadas a función
costosas y retornando el resultado almacenado cuando las mismas entradas
vuelven a ocurrir. En el trabajo, los resultados anteriores son borrados al
nalizar el procesamiento de cada una de las tablas.

5.3.3.3. Lista de soluciones tabú

Como se mencionó en 4.8.4, Búsqueda basada en ordenamiento, el


algoritmo basado en ordenamiento ejecuta una búsqueda por ascenso de
colinas. Con el objeto de evitar que dicho algoritmo revierta una permutación
ejecutada recientemente en la búsqueda, se ha implementado lo que se conoce
como una lista tabú. Esta es una lista que guarda las soluciones encontradas
por el algoritmo, a medida que la búsqueda progresa. Cuando se encuentra una

87
CAPÍTULO 5. EXPERIMENTACIÓN

solución de ordenamiento, el algoritmo verica si dicho orden ya se encuentra


en la lista. De existir, retorna aquél cuyas relaciones padre/hijo mejor se
ajustan a los datos utilizando la función de puntaje K2 (ver ecuación 4.5).

5.4. Ejecución
Una vez generados los conjuntos de datos para cada red, los mismos son
procesados por los diferentes algoritmos. Por un lado, el proceso de
discretización de datos demanda que se le proporcionen dos parámetros: un
método de discretización y un número de intervalos. Se utilizaron los métodos
de discretización por intervalos y por frecuencia, con un número de intervalos
igual a 2. Por otro lado, tanto el algoritmo OS como el K2 requieren como
parámetros un orden inicial de nodos y un número máximo de padres. Durante
los experimentos, se utilizaron un orden óptimo de los genes de acuerdo a la
red de la que formaban parte y órdenes generados al azar, mientras que 2, 3 y
4 fueron los valores elegidos como máximo número de padres. De esta manera,
los pasos de ejecución pueden resumirse como sigue:
1. Discretizar el conjunto de datos utilizando los siguientes parámetros:
Método de discretización: intervalo, frecuencia
Número de intervalos: 2
2. Construir el árbol de decisión alternativo.
3. Ejecutar el algoritmo K2 con los siguientes parámetros:
Orden inicial de nodos de K2: óptimo, al azar
Número máximo de padres de K2: 2, 3, 4
4. Ejecutar el algoritmo OS y a continuación el algoritmo K2 con los
siguientes parámetros:
Orden inicial de nodos de OS: óptimo, al azar
Número máximo de padres de OS: 2, 3, 4
Orden inicial de nodos de K2: la salida del algoritmo OS
Número máximo de padres de K2: 2, 3, 4

Asimismo, los algoritmos se ejecutaron sobre instancias de la plataforma de


servicios en la nube Amazon AWS, con las siguientes características:
Sistema operativo: Ubuntu 14.04.3 LTS
Procesador: Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.4 GHz
Número de procesadores virtuales: 16
Memoria: 64 GB

88
Capítulo 6

Resultados y conclusiones
Los algoritmos en estudio, presentados en el capítulo anterior, fueron
ejecutados sobre los conjuntos de datos mencionados en la sección 5.4,
Ejecución. Los resultados de los experimentos, las conclusiones a las que se ha
arribado y recomendaciones de trabajo futuro se describen a continuación.

6.1. Resultados
La tablas 6.1, 6.2 y 6.3 muestran un promedio del puntaje log BDeu y del
tiempo de corrida de cada combinación de algoritmos para cada conjunto de
datos para cada una de las redes.
Se han coloreado los puntajes log BDeu en cada la de manera de advertir
grácamente el mejor puntaje (en azul más oscuro) del peor puntaje (en azul
más claro). Como se esperaba, un orden óptimo de los nodos para OS seguido
del algoritmo K2 resulta ser la combinación de algoritmos más exitosa en la
mayor parte de los casos para las 3 redes. En tanto, en segundo lugar y
particularmente en las redes más grandes Ecoli-1 y Levadura-1, aparece la
combinación óptimo K2. Las diferencias entre los dos puntajes de ambos
aumentan  o al menos se mantienen en cada red a medida que crece el
número de entradas, lo cual indica que esta tendencia se consolida al contar
con más datos. En tanto, las combinaciones en donde interviene el azar al
azar K2 y al azar K2+OS tienen un perl variable y ambiguo,
presentando un muy buen comportamiento en algunos casos y no tanto en
otros.
Asimismo, es interesante estudiar las posibles correlaciones existentes entre
el puntaje log BDeu y los parámetros de los algoritmos: método de
discretización, combinación de algoritmos, máximo número de padres de OS y
máximo número de padres de K2. Esta tarea se ha llevado a cabo con la ayuda
de una funcionalidad de la herramienta Orange llamada Rank que determina
el grado de correlación entre variables a través de distintos métodos de
puntaje. Siendo que el parámetro máximo número de padres de OS es el

89
Red Drerio-1
Óptimo K2 Al azar K2 Óptimo OS+K2 Al azar OS+K2
Entradas Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s)
2000 -8756.65 17.79 -9190.24 13.16 -8751.90 817.84 -9186.82 970.48
4000 -18105.01 12.05 -18099.71 9.22 -18096.46 509.20 -18902.21 589.43
8000 -37102.05 21.17 -37084.43 17.08 -37067.45 923.71 -37042.65 1015.44
16000 -74978.12 25.76 -74991.16 22.82 -74930.49 1141.46 -74900.41 1361.84
32000 -146110.00 29.34 -146043.25 21.31 -146017.36 1238.83 -146074.04 1396.09

Cuadro 6.1. Resultados de los experimentos para la red Drerio-1

Red Ecoli-1
Óptimo K2 Al azar K2 Óptimo OS+K2 Al azar OS+K2
Entradas Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s)
2000 -11880.77 47.25 -11919.85 41.64 -11874.54 1751.48 -11913.03 1953.45

90
4000 -20907.97 134.81 -20968.78 94.90 -20899.33 7866.22 -20974.11 5617.08
8000 -38892.19 161.10 -38996.83 112.38 -38879.68 4683.36 -38978.10 4873.06
16000 -88194.68 158.48 -88461.44 130.80 -88181.91 7537.86 -88385.57 7514.99
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

Cuadro 6.2. Resultados de los experimentos para la red Ecoli-1

Red Levadura-1
Óptimo K2 Al azar K2 Óptimo OS+K2 Al azar OS+K2
Entradas Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s)
2000 -17467.31 251.59 -17445.92 205.81 -17457.48 7705.69 -17463.22 8607.38
4000 -33129.88 272.46 -33148.62 216.29 -33113.75 9855.14 -33150.06 10189.43
8000 -65576.42 515.40 -65607.15 328.62 -65555.78 15321.52 -65648.84 16041.35
16000 -105365.74 255.81 -105370.71 228.89 -105347.42 9286.34 -105342.77 11207.62

Cuadro 6.3. Resultados de los experimentos para la red Levadura-1


CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

único que sólo se encuentra presente en las combinaciones donde OS


interviene, cada conjunto de datos fue dividido en dos para su estudio: por un
lado, aquellas combinaciones que incluyen a OS y, por otro, aquellas que no lo
incluyen. A modo de referencia, se incluyen las tablas 6.4, 6.5 y 6.6, las cuales
muestran los puntajes obtenidos para la red Drerio-1 y el conjunto de datos de
2000 entradas, aquellos para la red Ecoli-1 con el conjunto de 8000 entradas y
aquellos para Levadura-1 con el conjunto de 16000 entradas, respectivamente.

(a) Combinaciones de algoritmos que incluyen OS

(b) Combinaciones de algoritmos que no incluyen OS


Cuadro 6.4. Puntajes de correlación entre log BDeu y los parámetros
de los algoritmos para el conjunto de datos de 2000 entradas de la red
Drerio-1

(a) Correlación de parámetros en combinaciones de algoritmos que incluyen OS

(b) Correlación de parámetros en combinaciones de algoritmos que no incluyen OS


Cuadro 6.5. Puntajes de correlación entre log BDeu y los parámetros
de los algoritmos para el conjunto de datos de 8000 entradas de la red
Ecoli-1

91
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

(a) Correlación de parámetros en combinaciones de algoritmos que incluyen OS

(b) Correlación de parámetros en combinaciones de algoritmos que no incluyen OS


Cuadro 6.6. Puntajes de correlación entre log BDeu y los parámetros
de los algoritmos para el conjunto de datos de 16000 entradas de la red
Levadura-1

92
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

De estos puntajes, puede concluirse que el método de discretización utilizado


es el que presenta una mayor correlación con el puntaje log BDeu con respecto
al resto de los parámetros.

Veamos ahora los grácos mosaico de las guras 6.1, 6.2 y 6.3, los cuales
tienen en cuenta todos los conjuntos de datos de cada una de las redes y aportan
información acerca de los distintos métodos de discretización utilizados. Los
grácos se han construido discretizando los valores de log BDeu en 3 intervalos
del mismo ancho: bajo, medio y alto.

Figura 6.1. Gráco mosaico para la red Drerio-1. El área de las celdas
es proporcional al número de observaciones dentro de cada una de las
categorías. Los diferentes tonos de azul (residuos) en ciertas celdas
indican que existen sucientes datos para concluir que, de incorporarse
más información, esas celdas continuarán siendo más altas que las otras
en la misma la.

93
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

Figura 6.2. Gráco mosaico para la red Ecoli-1.

94
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

Figura 6.3. Gráco mosaico para la red Levadura-1. El área de las


celdas es proporcional al número de observaciones dentro de cada una
de las categorías. Los diferentes tonos de azul (residuos) en ciertas
celdas indican que existen sucientes datos para concluir que, de
incorporarse más información, esas celdas continuarán siendo más altas
que las otras en la misma la.

Los grácos mosaico muestran que el método de discretización por intervalos


proporciona mejores puntajes para buena parte de las combinaciones y conjuntos
de datos. Esto puede observarse en las tablas 6.7, 6.8 y 6.9.
En tanto, los otros parámetros combinación, máximo número de padres
OS y K2 tienen una menor inuencia en el puntaje nal.

95
Red Drerio-1
Óptimo K2 Al azar K2 Óptimo OS+K2 Al azar OS+K2
Entradas Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s)
2000 -7660.05 11.74 -8055.69 12.60 -7657.77 927.49 -8057.78 1131.27
4000 -16371.71 9.17 -16382.58 6.81 -16367.65 558.45 -16372.39 567.39
8000 -33946.65 15.80 -33955.44 13.38 -33929.64 902.00 -33924.44 984.18
16000 -69006.88 17.28 -69076.74 15.12 -69000.47 1233.86 -69037.01 1272.81
32000 -135639.28 22.00 -135533.85 15.60 -135338.32 1401.62 -135484.00 1461.26

Cuadro 6.7. Resultados de los experimentos para la red Drerio-1 utilizando solamente el método de discretización
por intervalos
Red Ecoli-1
Óptimo K2 Al azar K2 Óptimo OS+K2 Al azar OS+K2
Entradas Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s)
2000 -11670.72 51.07 -11700.31 39.83 -11666.29 1740.88 -11713.64 1847.81

96
4000 -21182.09 139.58 -21247.94 65.93 -21174.47 10581.75 -21258.91 3798.48
8000 -40308.10 107.78 -40426.08 98.05 -40307.15 4149.30 -40932.21 4336.04
16000 -73065.39 87.12 -73430.17 68.31 -73062.73 6164.72 -73347.91 5669.58

Cuadro 6.8. Resultados de los experimentos para la red Ecoli-1 utilizando solamente el método de discretización por
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

intervalos
Red Levadura-1
Óptimo K2 Al azar K2 Óptimo OS+K2 Al azar OS+K2
Entradas Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s) Puntaje log BDeu Tiempo (s)
2000 -15603.29 163.76 -15591.81 170.09 -15597.94 6710.77 -15619.80 7041.53
4000 -36789.33 380.47 -36803.60 244.42 -36775.34 13134.72 -36812.26 12538.67
8000 -73343.19 670.10 -73336.83 413.90 -73308.25 19246.25 -73374.33 19038.21
16000 -117259.10 322.75 -117336.96 281.98 -117259.62 10819.29 -117243.18 13182.25

Cuadro 6.9. Resultados de los experimentos para la red Levadura-1 utilizando solamente el método de discretización
por intervalos
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

Otra métrica importante es la sensibilidad. Dependiendo de la red, la


sensibilidad aumenta a medida que se cuenta con más datos, de manera tal
que aumenta la tasa de valor positivo de los algoritmos (ver guras 6.4, 6.5 y
6.6). Dentro de cada conjunto, se destaca la combinación al azar OS+K2, la
cual presenta, en buena parte de los casos, una sensibilidad mayor que el resto
de las combinaciones.

Figura 6.4. Sensibilidad en la red Drerio-1.

97
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

Figura 6.5. Sensibilidad en la red Ecoli-1.

Figura 6.6. Sensibilidad en la red Levadura-1.

98
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

6.2. Conclusiones
El presente trabajo compara el rendimiento de ciertas combinaciones de
algoritmos en donde intervienen el algoritmo de búsqueda OS y el algoritmo
K2, los cuales necesitan un orden de entrada para funcionar junto con otros
parámetros.
Para ello, se experimentó in silico con las siguientes combinaciones de
algoritmos:

óptimo K2

al azar K2

óptimo OS+K2

al azar OS+K2

Como se mencionó a lo largo del trabajo, el algoritmo K2, cuya complejidad


es comparativamente menor a la de otros algoritmos, sólo resulta útil en la
medida en que se le proporciona un orden óptimo. Inicialmente, se esperaba
que este algoritmo pudiera beneciarse de la salida de OS. Efectivamente, los
experimentos mostraron que las combinaciones en donde el orden de entrada
es un orden óptimo óptimo K2 y óptimo OS+K2 son las que ofrecen
los mejores puntajes. En este sentido, la combinación óptimo OS+K2 mejora
aún más los buenos resultados obtenidos utilizando óptimo K2. Sin embargo,
el tiempo de corrida de OS es mucho mayor y crece exponencialmente a medida
que aumenta la cantidad de nodos en la red, por lo cual cabe preguntarse hasta
qué punto tiene sentido utilizar OS. De acuerdo a los resultados, la diferencia
de puntaje log BDeu entre ambos se acrecienta a medida que aumentan las
entradas para cada red, lo cual permitiría concluir que la presencia de OS tiene
un impacto en la calidad de la red aprendida cada vez más positivo a medida
que se cuenta con un mayor número de datos.
Claramente, el principal inconveniente que presentan ambas combinaciones
es que interviene un orden óptimo y, por lo general, no se cuenta con un orden
de estas características. En este sentido, es útil recurrir a las combinaciones
donde el azar forma parte. Los resultados muestran que la combinación al
azar OS+K2 supera a al azar K2 en términos de puntaje log BDeu.
Asimismo, esta combinación es la que presenta una sensibilidad más alta en
buena parte de los casos. Una explicación de esto podría encontrarse en el
hecho de haber utilizado múltiples órdenes al azar durante los experimentos,
las cuales provocarían respuestas más variadas con el consiguiente aumento de
la sensibilidad cuando son consideradas como un todo.

Ahora bien, los resultados pueden mejorarse trabajando con los parámetros
del proceso. Ciertamente los métodos utilizados tanto en la generación de
datos como en la discretización de los mismos tienen un impacto importante
en el resultado nal. En este trabajo, los datos fueron producidos utilizando

99
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

series temporales de datos, las cuales permiten investigar las dinámicas de


activación o inhibición de los genes en respuesta a una perturbación especíca.
Sin embargo, y sobre la base de los resultados obtenidos, estos datos no
parecen ser lo sucientemente útiles para inferir una red con una exactitud
aceptable. La realización de otros experimentos, como por ejemplo perturbar
redes en estado estacionario o bien perturbar un gen, múltiples genes a la vez o
conforme a algún otro protocolo, podría producir una respuesta más rica en
términos de información.
Asimismo, y de acuerdo con el análisis de correlación de datos llevado a cabo
entre el puntaje log BDeu y los parámetros en estudio, el mayor impacto en el
resultado nal lo tiene el método de discretización empleado; en este caso, la
discretización por intervalos parece ofrecer mejores resultados. Probablemente
este fenómeno se deba a cómo están distribuidos los datos, los cuales por lo
general no están distribuidos lineal o equitativamente, mientras que este método
enfatiza la cantidad de un valor de atributo dado relativo al resto de los valores.
Si bien no ha sido objeto de estudio en el presente trabajo, es muy probable que
el número de intervalos también ejerza cierta inuencia sobre los resultados.

Los resultados esbozados en el presente trabajo resultan ciertamente


alentadores. Sin embargo, es claro que las variables a tener en cuenta son
muchas así como lo es la cantidad de enfoques que existe para abordar la tarea
del aprendizaje estructural de redes génicas. Por lo tanto, es claramente
necesario un estudio sistemático sobre esta problemática para determinar la
mejor solución posible. Probablemente, no exista una solución que se ajuste
bien a todos los casos, sino más bien soluciones especícas para problemas
puntuales. En el enfoque bayesiano, en particular, la demanda de recursos
computacionales que permitiría llevar a cabo una tarea semejante es lo
sucientemente alta como para enfatizar la necesidad de elaborar un diseño
inteligente que los utilice ecientemente.

6.3. Trabajo Futuro


Si bien el presente trabajo ha abordado el problema del aprendizaje
estructural bayesiano teniendo en cuenta un número relativamente
considerable de escenarios y variables intervinientes, se hace imperioso
continuar el trabajo de manera de obtener resultados más precisos y
categóricos. Algunas de las cuestiones a tener en cuenta en un trabajo futuro
se mencionan a continuación:

Diseñar un conjunto más completo de experimentos que permita obtener


una respuesta más relevante en términos del comportamiento de la red
perturbando, por ejemplo:

• una gen a la vez


• múltiples genes simultáneamente

100
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES

• redes en estado estacionario


• con algún otro protocolo
Incorporar otros algoritmos a la búsqueda.

Diseñar y utilizar en los experimentos órdenes de nodos que se encuentren a


cierta distancia de algún orden óptimo, a n de evaluar cómo se comportan
los algoritmos a medida que se acercan a la solución ideal.

Implementar estrategias adicionales para intentar superar el problema del


máximo local, como lo son las estrategias de reinicio o esquemas más
complejos basados en iteraciones.

Distribuir las tareas de manera de aprovechar mejor los recursos


computacionales disponibles, teniendo en cuenta que el tiempo de
corrida y los recursos necesarios para el procesamiento de los distintos
conjuntos de datos dependen de varios factores, como son el algoritmo
utilizado y la cantidad de datos a procesar.

101
Apéndice A

Código fuente

Listing A.1. main.R


1 list . of . packages <- c(" parallel " , " lsr ")
2 new . packages <- list . of . packages [!( list . of . packages %in % installed .
packages () [," Package " ]) ]
3 if ( length ( new . packages ) ) install . packages ( new . packages , repos = "
http :// cran . us .r - project . org ")
4
5 library ( " parallel " )
6 library ( " lsr " )
7 setwd ( paste0 ( path . expand ("~ ") , " / .. / Dropbox / Public / Tesis /
Experiments "))
8
9 source (" algorithms . R")
10
11 statExists <- function ( working . directory , number . sets , number .
instances , table . number , network , discretization . method , number
. intervals , order . name , os . max . number . parents , k2 . max . number .
parents ) {
12 file <- getAbsolutePath ( working . directory , paste ( network $ get _
network _ name () , "_ " , number . sets , "_" , number . instances , " _
learned _ networks _ stats " , sep = " ") , " csv ")
13
14 if (! file . exists ( file ) ) {
15 return ( FALSE )
16 }
17
18 current . stats <- read . table ( file , sep = " ," , header = TRUE )
19 exists <- apply ( current . stats , 1, function ( current . stat ) {
20
21 ( current . stat [2] == paste0 ( network $ get _ network _ name () , "_" ,
number . sets , "_" , number . instances , "_ data _ data _ table _ " ,
table . number )) && ( current . stat [4] == discretization . method
) && ( current . stat [5] == number . intervals ) && ( current . stat
[6] == order . name ) & & ( current . stat [8] == os . max . number .
parents ) && ( current . stat [10] == k2 . max . number . parents )
22 })
23

102
APÉNDICE A. CÓDIGO FUENTE

24 return ( sum ( exists ) == 1)


25 }
26
27
28 inferNetwork <- function ( grid , statExists , getNetworkData ,
29 network , working . directory , data . file ,
table . number , number . sets , number .
instances , optimal . order ) {
30 discretization . method <- as . character ( grid [[ " discretization .
methods " ]])
31 number . intervals <- as . integer ( levels ( grid [[ " numbers . intervals "
]]) [ grid [[ " numbers . intervals " ]]])
32 order . name <- as . character ( grid [[ " order . name " ]])
33 os . max . number . parents <- as . integer ( levels ( grid [[ " os . max . numbers .
parents " ]]) [ grid [[ " os . max . numbers . parents " ]]])
34 k2 . max . number . parents <- as . integer ( levels ( grid [[ " k2 . max . numbers .
parents " ]]) [ grid [[ " k2 . max . numbers . parents " ]]])
35
36 if ( statExists ( working . directory , number . sets , number . instances ,
table . number , network , discretization . method , number .
intervals , order . name , os . max . number . parents , k2 . max . number .
parents ) ) {
37 message ( " Already done ")
38 return (0) ;
39 }
40
41 discretized . data . table . name <- paste0 ( network $ get _ network _ name () ,
"_" , number . sets , "_" , number . instances , "_ data _ data _ table _
" , table . number , " _ discretized _ table _" , discretization . method
, " _" , number . intervals )
42
43 if ( is . null ( get0 ( discretized . data . table . name , envir = . GlobalEnv )
)) {
44 rm ( list = ls ( pattern = paste0 ( network $ get _ network _ name () , "_" ,
number . sets , "_" , number . instances , "_ data _ data _ table _ " ,
table . number , " _ discretized _ table _") , envir = . GlobalEnv ) ,
envir = . GlobalEnv )
45 gc ()
46
47 network . data <- getNetworkData ( network , working . directory , data
. file , table . number , number . instances )
48 data . table <- network . data $ get _ data _ table ()
49 assign ( discretized . data . table . name , discretizeDataTableIn ( data .
table , discretization . method , number . intervals ) , envir = .
GlobalEnv )
50
51 rm ( network . data )
52 rm ( data . table )
53 gc ()
54 }
55
56 if ( order . name == " óptimo OS + K2 " || order . name == " al azar OS + K2 "
) {
57
58 if ( is . null ( k2 . nodes . order <- get0 ( paste0 ( discretized . data .
table . name , "_" , order . name , " _" , os . max . number . parents ) ,
envir = . GlobalEnv )) ) {

103
APÉNDICE A. CÓDIGO FUENTE

59 browser ()
60 if ( order . name == " óptimo OS + K2 ") {
61 os . initial . nodes . order <- NodesOrder $ new ( an . order . name = "
óptimo OS " , an . order = optimal . order )
62 } else if ( order . name == " al azar OS + K2 " ) {
63 os . initial . nodes . order <- NodesOrder $ new ( an . order . name = "
al azar OS " , an . order = getRandomOrderNotInList ( get0 (
discretized . data . table . name , envir = . GlobalEnv )$ get _
attribute _ names () , optimal . order )$ unList () )
64 } else {
65 stop (" Error ")
66 }
67
68 k2 . nodes . order <- osIn ( discretized . data . table . name , os .
initial . nodes . order , os . max . number . parents )
69
70 assign ( paste0 ( discretized . data . table . name , "_" , order . name , "
_" , os . max . number . parents ) , k2 . nodes . order , envir = .
GlobalEnv )
71 }
72 } else {
73
74 if ( order . name == " óptimo K2 ") {
75 k2 . nodes . order <- NodesOrder $ new ( an . order . name = " óptimo K2 " ,
an . order = optimal . order )
76 } else {
77 k2 . nodes . order <- NodesOrder $ new ( an . order . name = " al azar K2 "
, an . order = getRandomOrderNotInList ( get0 ( discretized .
data . table . name , envir = . GlobalEnv )$ get _ attribute _ names
() , optimal . order )$ unList () )
78 }
79 }
80
81 learned . network <- k2In ( network , discretized . data . table . name , k2 .
nodes . order , k2 . max . number . parents )
82
83 exportLearnedNetworkIn ( learned . network , working . directory , number
. sets , number . instances , network $ get _ network _ name () , " gml ")
84
85 rm ( learned . network )
86 rm ( k2 . nodes . order )
87 if ( exists (" os . initial . nodes . order ")) {
88 rm ( os . initial . nodes . order )
89 }
90 rm ( discretization . method )
91 rm ( number . intervals )
92 rm ( order . name )
93 rm ( os . max . number . parents )
94 rm ( k2 . max . number . parents )
95 }
96
97
98 data . tables . function <- function ( table . number , grid , getNetworkData
, inferNetwork , statExists ,
99 network , working . directory , data .
file , number . sets , number .
instances , optimal . order ) {

104
APÉNDICE A. CÓDIGO FUENTE

100 lapply ( grid , inferNetwork , statExists , getNetworkData ,


101 network , working . directory , data . file , table . number ,
number . sets , number . instances , optimal . order )
102
103 forget ( K2Score )
104 gc ()
105 }
106
107 args <- commandArgs ( TRUE )
108
109 network . name = args [1]
110 working . directory = paste0 ( path . expand ( "~") , "/ .. / Dropbox / Public /
Tesis / Experiments /" , network . name )
111 number . instances = as . integer ( args [2])
112 number . sets = as . integer ( args [3])
113 data . file = paste0 ( network . name , "_" , number . sets , "_ " , number .
instances , " _ data ")
114 discretization . methods = c(" intervalo " , " frecuencia ")
115 numbers . intervals = c (2)
116 optimal . order = as . vector ( strsplit ( args [4] , " ,") [[1]])
117 os . max . numbers . parents = c (2 ,3 ,4)
118 k2 . max . numbers . parents = c (2)
119
120 network = importNetwork ( working . directory , network . name )
121
122 grid1 <- expand . grid ( discretization . methods , numbers . intervals , c("
óptimo OS + K2 " , " al azar K2 + OS ") , os . max . numbers . parents , k2 . max
. numbers . parents , stringsAsFactors = FALSE )
123 grid2 <- expand . grid ( discretization . methods , numbers . intervals , c("
óptimo K2 " , " al azar K2 ") , c (0) , k2 . max . numbers . parents ,
stringsAsFactors = FALSE )
124 grid <- rbind ( grid1 , grid2 )
125 colnames ( grid ) <- c( " discretization . methods " , " numbers . intervals " ,
" order . name " , " os . max . numbers . parents " , " k2 . max . numbers . parents
" )
126 grid <- unname ( tFrame ( grid [ order ( grid [, 1] , grid [, 2] , grid [, 3] ,
grid [, 4] , grid [, 5]) ,]) )
127 colnames ( grid ) <- c (1: ncol ( grid ))
128
129 no _ cores <- as . integer ( args [5])
130
131 cl <- makeCluster ( no _ cores , outfile = " debug . log ")
132
133 clusterEvalQ (cl , source ( " algorithms .R"))
134
135 parLapplyLB (cl , c( as . integer ( args [6]) : as . integer ( args [7]) ) , data .
tables . function , grid , getNetworkData , inferNetwork , statExists
,
136 network , working . directory , data . file , number . sets ,
number . instances , optimal . order )
137
138 stopCluster ( cl )

Listing A.2. domain.R


1 list . of . packages <- c(" R6 " , " data . tree ")
2 new . packages <- list . of . packages [!( list . of . packages %in % installed .
packages () [," Package " ]) ]

105
APÉNDICE A. CÓDIGO FUENTE

3 if ( length ( new . packages ) ) install . packages ( new . packages )


4
5 library ( " R6 ")
6 library ( " data . tree ")
7
8 Network <- R6Class (
9 " Network " ,
10 public = list (
11 initialize = function (a. network . name = NULL ,
12 an . adjacency . matrix = NULL ,
13 some . nodes . parents = NULL ) {
14 private $ network . name <- a. network . name
15 private $ nodes . parents <- some . nodes . parents
16 private $ adjacency . matrix <- an . adjacency . matrix
17
18 if (! is . null ( private $ nodes . parents ) &&
19 is . null ( private $ adjacency . matrix )) {
20 private $ nodes . names <- names ( private $ nodes . parents $ unList ()
)
21 private $ number . nodes = length ( private $ nodes . names )
22 private $ adjacency . matrix <- matrix (0 , ncol = private $ number
. nodes , nrow = private $ number . nodes , byrow = TRUE ,
dimnames <- list ( private $ nodes . names , private $ nodes .
names ))
23
24 sapply ( private $ nodes . names , function ( current . node ) {
25 parents . current . node <- private $ nodes . parents $ get ( current
. node )
26 if ( parents . current . node $ length () > 0) {
27 for ( parent . current . node in parents . current . node $ unList
() ) {
28 if ( length ( parent . current . node ) > 0) {
29 private $ adjacency . matrix [ parent . current . node ,
current . node ] <- 1
30 }
31 }
32 }
33 })
34 } else {
35 private $ nodes . names <- List $ new ( rownames ( private $ adjacency .
matrix ))
36 private $ number . nodes = private $ nodes . names $ length ()
37 }
38 },
39 get _ network _ name = function () {
40 return ( private $ network . name )
41 },
42 get _ adjacency _ matrix = function () {
43 return ( private $ adjacency . matrix )
44 },
45 get _ nodes _ parents = function () {
46 return ( private $ nodes . parents )
47 },
48 get _ nodes _ names = function () {
49 return ( private $ nodes . names )
50 },
51 get _ number _ nodes = function () {

106
APÉNDICE A. CÓDIGO FUENTE

52 return ( private $ number . nodes )


53 }
54 ),
55 private = list (
56 network . name = NULL ,
57 adjacency . matrix = NULL ,
58 nodes . parents = NULL ,
59 nodes . names = NULL ,
60 number . nodes = NULL
61 )
62 )
63
64
65 NetworkData <- R6Class (
66 " NetworkData " ,
67 public = list (
68 initialize = function (a. header , a. data . table ) {
69 private $ header = a. header
70 private $ data . table = a . data . table
71 },
72 get _ header = function () {
73 return ( private $ header )
74 },
75 get _ data _ table = function () {
76 return ( private $ data . table )
77 }
78 ),
79 private = list (
80 header = NULL ,
81 data . table = NULL
82 )
83 )
84
85
86 NetworkDataTable <- R6Class (
87 " NetworkDataTable " ,
88 public = list (
89 initialize = function (a. data . table = NULL ,
90 a. network = NULL ,
91 a. data . file ,
92 a. number . instances = NULL ,
93 bulk . id = NULL ) {
94 if (! is . null (a. network ) && ! is . null (a . number . instances )) {
95 private $ table . name <- paste0 (a. data . file , " _ data _ table _" ,
bulk . id )
96 }
97
98 private $ network <- a. network
99 if (! is . null ( private $ network )) {
100 private $ attribute . names <- private $ network $ get _ nodes _ names
()
101 node . names . unlisted <- private $ attribute . names $ unList ()
102
103 seq . attributes <- seq _ along ( node . names . unlisted )
104 attributes <- sapply ( seq . attributes , function ( seq .
attributes . index ) {
105 Attribute $ new ( node . names . unlisted [[ seq . attributes . index

107
APÉNDICE A. CÓDIGO FUENTE

]] , seq . attributes . index )


106 })
107 names ( attributes ) <- node . names . unlisted
108
109 private $ attributes <- List $ new ( attributes )
110 private $ number . attributes <- private $ attributes $ length ()
111 }
112
113 private $ data . table <- a. data . table
114 private $ number . instances <- a. number . instances
115 },
116 get _ data _ table = function () {
117 return ( private $ data . table )
118 },
119 get _ table _ name = function () {
120 return ( private $ table . name )
121 },
122 get _ network = function () {
123 return ( private $ network )
124 },
125 get _ attributes = function () {
126 return ( private $ attributes )
127 },
128 get _ attribute _ names = function () {
129 return ( private $ attribute . names )
130 },
131 get _ number _ attributes = function () {
132 return ( private $ number . attributes )
133 },
134 get _ number _ instances = function () {
135 return ( private $ number . instances )
136 }
137 ),
138 private = list (
139 table . name = NULL ,
140 data . table = NULL ,
141 attributes = NULL ,
142 attribute . names = NULL ,
143 number . attributes = NULL ,
144 network = NULL ,
145 number . instances = NULL
146 )
147 )
148
149
150 DiscretizationAlgorithmParams <- R6Class (
151 " discretizationAlgorithmParams " ,
152 public = list (
153 initialize = function (a. discretization . method = NULL ,
154 a. number . intervals = NULL ) {
155 private $ discretization . method <- a. discretization . method
156 private $ number . intervals <- a. number . intervals
157 },
158 get _ discretization _ method = function () {
159 return ( private $ discretization . method )
160 },
161 get _ number _ intervals = function () {

108
APÉNDICE A. CÓDIGO FUENTE

162 return ( private $ number . intervals )


163 }
164 ),
165 private = list (
166 discretization . method = NULL ,
167 number . intervals = NULL
168 )
169 )
170
171
172 DiscretizationAlgorithmRun <- R6Class (
173 " DiscretizationAlgorithmRun " ,
174 public = list (
175 initialize = function (a. data . table = NULL ,
176 some . params = NULL ,
177 a. processing . time = NULL ) {
178 private $ data . table <- a . data . table
179 private $ params <- some . params
180 private $ processing . time <- a . processing . time
181 },
182 get _ data _ table = function () {
183 return ( private $ data . table )
184 },
185 get _ params = function () {
186 return ( private $ params )
187 },
188 get _ processing _ time = function () {
189 return ( private $ processing . time )
190 }
191 ),
192 private = list (
193 data . table = NULL ,
194 params = NULL ,
195 processing . time = NULL
196 )
197 )
198
199
200 DiscretizedNetworkDataTable <- R6Class (
201 " DiscretizedNetworkDataTable " ,
202 public = list (
203 initialize = function (a. data . table = NULL ,
204 a. discretized . data . table = NULL ,
205 a. discretization . algorithm . run = NULL ) {
206 private $ discretization . algorithm . run <- a. discretization .
algorithm . run
207
208 if (! is . null (a. data . table )) {
209 private $ attributes <- a. data . table $ get _ attributes ()
210 private $ attribute . names <- a . data . table $ get _ attribute _ names
()
211 private $ number . attributes <- a. data . table $ get _ number _
attributes ()
212 private $ number . instances <- a. data . table $ get _ number _
instances ()
213 private $ table . name <- a. data . table $ get _ table _ name ()
214 }

109
APÉNDICE A. CÓDIGO FUENTE

215
216 private $ timestamp <- format ( now () , " %Y _ %m_ %d_ %H_ %M_ %S" )
217
218 private $ discretized . table . name = NULL
219 if (! is . null (a. data . table )) {
220 private $ discretized . table . name <- paste0 (a. data . table $ get _
table _ name () , " _ discretized _ table _" , a. discretization .
algorithm . run $ get _ params () $ get _ discretization _ method () ,
"_" , a. discretization . algorithm . run $ get _ params () $ get _
number _ intervals () )
221 }
222
223 private $ number . levels <- nlevels ( a. discretized . data . table )
224 private $ levels <- levels (a. discretized . data . table )
225
226 attributes <- private $ attributes $ unList ()
227 seq . attributes <- seq _ along ( attributes )
228
229 private $ build _ ad _ tree (a. discretized . data . table )
230 },
231 get _ ad _ tree = function () {
232 return ( private $ ad . tree )
233 },
234 get _ discretized _ table _ name = function () {
235 return ( private $ discretized . table . name )
236 },
237 get _ discretization _ algorithm _ run = function () {
238 return ( private $ discretization . algorithm . run )
239 },
240 get _ table _ name = function () {
241 return ( private $ table . name )
242 },
243 get _ attributes = function () {
244 return ( private $ attributes )
245 },
246 get _ attribute _ names = function () {
247 return ( private $ attribute . names )
248 },
249 get _ number _ levels = function () {
250 return ( private $ number . levels )
251 },
252 get _ levels = function () {
253 return ( private $ levels )
254 },
255 get _ rows = function ( rownames ) {
256 return ( private $ discretized . data . table [ rownames , ])
257 },
258 get _ number _ instances = function () {
259 return ( private $ number . instances )
260 },
261 get _ number _ attributes = function () {
262 return ( private $ number . attributes )
263 },
264 get _ data _ instances = function () {
265 return ( private $ data . instances )
266 },
267 get _ data _ instance _ count = function ( possible . level . combination )

110
APÉNDICE A. CÓDIGO FUENTE

{
268 total = 0
269
270 if ( total < private $ number . instances ) {
271 possible . level . combination <- sort ( possible . level .
combination )
272
273 base . node <- private $ ad . tree $ get _ first _ child _ node _ by _ name (a
. parent . node = private $ ad . tree $ get _ root _ node () , child .
node . name = possible . level . combination [1])
274
275 if ( length ( possible . level . combination ) > 1) {
276 if (! is . null ( base . node ) && ! is . null ( base . node [[1]]) ) {
277 value = private $ get _ count ( base . node , possible . level .
combination , 2, private $ attributes $ unList () )
278 total < <- total + value
279 } else {
280 value = 0
281 }
282 } else {
283 if (! is . null ( base . node ) && ! is . null ( base . node [[1]]) ) {
284 value = base . node [[1]] $ cou
285 } else {
286 value = 0
287 }
288 }
289 } else {
290 value = 0
291 }
292
293 return ( value )
294 }
295 ),
296 private = list (
297 discretized . table . name = NULL ,
298 table . name = NULL ,
299 timestamp = NULL ,
300 levels = NULL ,
301 number . levels = NULL ,
302 discretization . algorithm . run = NULL ,
303 attributes = NULL ,
304 attribute . names = NULL ,
305 number . attributes = NULL ,
306 data . instances = NULL ,
307 number . instances = NULL ,
308 ad . tree = NULL ,
309
310 build _ ad _ tree = function (a . discretized . data . table ) {
311 private $ ad . tree <- Tree $ new ()
312 root . node <- private $ ad . tree $ get _ root _ node ()
313
314 seq . attributes <- seq _ len ( length . out = private $ attributes $
length () )
315
316 apply (a. discretized . data . table , 2, function ( data . instance ) {
317 lapply ( seq . attributes , function ( seq . attributes . index ) {
318 private $ update _ node _ subtree ( parent . current . node = root .

111
APÉNDICE A. CÓDIGO FUENTE

node ,
319 data . instance ,
320 private $ number . attributes ,
321 seq . attributes . index , FALSE ,
322 private $ attributes $ unList () )
323 })
324 })
325 },
326
327 update _ node _ subtree = function ( parent . current . node ,
328 data . instance . attribute . value .
pairs
329 , child . nodes . in . tree . length
330 , index , parent . added ,
331 attributes ) {
332
333 data . instance . attribute . value . pair <- data . instance . attribute
. value . pairs [[ index ]]
334
335 attribute <- attributes [[ index ]]
336 attribute . name <- attribute $ get _ attribute _ name ()
337
338 a. child . name <- paste0 ( attribute . name , " -" , data . instance .
attribute . value . pair )
339
340 if ( parent . added ) {
341 a. child . node . name = attribute . name
342 a. child . node . value = data . instance . attribute . value . pair
343 a. child . attribute . position = attribute $ get _ attribute _
position ()
344
345 node <- private $ ad . tree $ add _ child _ node ( a. parent . node =
parent . current . node , child . name = a. child . name , child .
node . name = a. child . node . name , child . node . value = a.
child . node . value , child . attribute . position = a . child .
attribute . position )
346 } else {
347 node <- parent . current . node $ children [[ a. child . name ]]
348
349 if ( is . null ( node ) ) {
350 a. child . node . name = attribute . name
351 a. child . node . value = data . instance . attribute . value . pair
352 a. child . attribute . position = attribute $ get _ attribute _
position ()
353
354 node <- private $ ad . tree $ add _ child _ node ( a. parent . node =
parent . current . node , child . name = a. child . name , child
. node . name = a. child . node . name , child . node . value = a.
child . node . value , child . attribute . position = a. child .
attribute . position )
355 parent . added <- TRUE
356 } else {
357 node $ cou <- node $ cou + 1
358 parent . added <- FALSE
359 }
360 }
361

112
APÉNDICE A. CÓDIGO FUENTE

362 if ( child . nodes . in . tree . length > index ) {


363 private $ update _ node _ subtree ( node ,
364 data . instance . attribute . value .
pairs
365 , child . nodes . in . tree . length
366 , index + 1, parent . added ,
367 attributes )
368 }
369 },
370 get _ count = function ( parent . nodes , possible . level . combination ,
index , node . names ) {
371
372 target . node <- possible . level . combination [[ index ]]
373
374 target . node . name <- strsplit ( target . node , " -") [[1]][[1]]
375
376 target . attribute . position <- node . names [[ target . node . name ]] $
get _ attribute _ position ()
377
378 child . nodes <- lapply ( parent . nodes , function ( parent . node ) {
379
380 level = target . attribute . position - node . names [[ parent . node
$ node . name ]] $ get _ attribute _ position () + 1
381
382 private $ ad . tree $ traverse ( node = parent . node , level = level ,
nodes = nodes . at . level )
383
384 filtered . nodes <- Filter ( x = nodes . at . level $ unList () ,
function (e ) e$ name == target . node )
385
386 nodes . at . level $ clear ()
387
388 filtered . nodes
389 })
390
391 child . nodes <- unlist ( child . nodes )
392
393 if ( length ( child . nodes ) > 0 && length ( child . nodes [[1]]) > 0)
{
394 if ( index == length ( possible . level . combination )) {
395 return ( Reduce ( '+ ', mapply ( function ( node ) node $ cou , child
. nodes )) )
396 } else {
397 return ( private $ get _ count ( child . nodes , possible . level .
combination , ( index + 1) , node . names ))
398 }
399 }
400
401 return (0)
402 }
403 )
404 )
405
406
407 OrderingAlgorithmParams <- R6Class (" OrderingAlgorithmParams ")
408
409

113
APÉNDICE A. CÓDIGO FUENTE

410 OsAlgorithmParams <- R6Class (


411 " OsAlgorithmParams " ,
412 inherit = OrderingAlgorithmParams ,
413 public = list (
414 initialize = function (a. max . number . parents = NULL ) {
415 private $ max . number . parents <- a. max . number . parents
416 },
417 get _ max _ number _ parents = function () {
418 return ( private $ max . number . parents )
419 }
420 ),
421 private = list ( max . number . parents = NULL )
422 )
423
424
425 OrderingAlgorithmRun <- R6Class (
426 " OrderingAlgorithmRun " ,
427 public = list (
428 initialize = function (a. discretized . data . table = NULL ,
429 some . params = NULL ,
430 a. processing . time = NULL ) {
431 private $ discretized . data . table <- a. discretized . data . table
432 private $ params <- some . params
433 private $ processing . time <- a . processing . time
434 },
435 get _ processing _ time = function () {
436 return ( private $ processing . time )
437 },
438 get _ params = function () {
439 return ( private $ params )
440 }
441 ),
442 private = list (
443 discretized . data . table = NULL ,
444 params = NULL ,
445 processing . time = 0.0
446 )
447 )
448
449
450 OsAlgorithmRun <- R6Class (
451 " OsAlgorithmRun " ,
452 inherit = OrderingAlgorithmRun ,
453 public = list (
454 initialize = function (a. discretized . data . table = NULL ,
455 an . initial . nodes . order = NULL ,
456 some . params = NULL ,
457 a. processing . time = NULL ) {
458 super $ initialize (
459 a. discretized . data . table <- a. discretized . data . table ,
460 some . params <- some . params ,
461 a. processing . time <- a. processing . time
462 )
463 private $ initial . order <- an . initial . nodes . order
464 },
465 get _ initial _ order = function () {
466 return ( private $ initial . order )

114
APÉNDICE A. CÓDIGO FUENTE

467 }
468 ),
469 private = list (
470 initial . order = NULL
471 )
472 )
473
474
475 NodesOrder <- R6Class (
476 " NodesOrder " ,
477 public = list (
478 initialize = function ( an . order . name = NULL ,
479 an . order = NULL ,
480 an . ordering . algorithm . run = NULL ) {
481 private $ order . name <- an . order . name
482 private $ order <- an . order
483 private $ ordering . algorithm . run <- an . ordering . algorithm . run
484 },
485 get _ order = function () {
486 return ( private $ order )
487 },
488 get _ ordering _ algorithm _ run = function () {
489 return ( private $ ordering . algorithm . run )
490 },
491 get _ order _ name = function () {
492 return ( private $ order . name )
493 }
494 ),
495 private = list (
496 order . name = NULL ,
497 order = NULL ,
498 ordering . algorithm . run = NULL
499 )
500 )
501
502
503 K2AlgorithmParams <- R6Class (
504 " K2AlgorithmParams " ,
505 public = list (
506 initialize = function (a. max . number . parents = NULL ) {
507 private $ max . number . parents <- a. max . number . parents
508 },
509 get _ max _ number _ parents = function () {
510 return ( private $ max . number . parents )
511 }
512 ),
513 private = list (
514 max . number . parents = NULL
515 )
516 )
517
518
519 K2AlgorithmRun <- R6Class (
520 " K2AlgorithmRun " ,
521 public = list (
522 initialize = function (a. discretized . data . table = NULL ,
523 a. nodes . order = NULL ,

115
APÉNDICE A. CÓDIGO FUENTE

524 some . params = NULL ,


525 a. processing . time = NULL ) {
526 private $ discretized . data . table <- a. discretized . data . table
527 private $ nodes . order <- a. nodes . order
528 private $ params <- some . params
529 private $ processing . time <- a . processing . time
530 },
531 get _ discretized _ data _ table = function () {
532 return ( private $ discretized . data . table )
533 },
534 get _ nodes _ order = function () {
535 return ( private $ nodes . order )
536 },
537 get _ params = function () {
538 return ( private $ params )
539 },
540 get _ processing _ time = function () {
541 return ( private $ processing . time )
542 }
543 ),
544 private = list (
545 discretized . data . table = NULL ,
546 nodes . order = NULL ,
547 params = NULL ,
548 processing . time = NULL
549 )
550 )
551
552
553 LearnedNetwork <- R6Class (
554 " LearnedNetwork " ,
555 inherit = Network ,
556 public = list (
557 initialize = function ( original . network , some . nodes . parents =
NULL ,
558 a. k2 . algorithm . run = NULL ) {
559 a. network . name = NULL
560 if (! is . null (a. k2 . algorithm . run )) {
561 a. network . name <- paste0 (a. k2 . algorithm . run $ get _ discretized
_ data _ table () $ get _ table _ name () , "_ learned _ network _" ,
format ( now () , " %Y_ %m_ %d_ %H_ %M _ %S"))
562 }
563
564 super $ initialize (a. network . name = a. network . name , some . nodes .
parents = some . nodes . parents )
565 private $ k2 . algorithm . run <- a. k2 . algorithm . run
566
567 learned . network <- Network $ new (a. network . name = a. network .
name , some . nodes . parents = private $ nodes . parents )
568
569 private $ stats <- getLearnedNetworkStatistics ( original . network
, learned . network , private $ k2 . algorithm . run $ get _
discretized _ data _ table () )
570 },
571 get _ stats = function () {
572 return ( private $ stats )
573 },

116
APÉNDICE A. CÓDIGO FUENTE

574 get _ k2 _ algorithm _ run = function () {


575 return ( private $ k2 . algorithm . run )
576 }
577 ),
578 private = list (
579 k2 . algorithm . run = NULL ,
580 stats = NULL
581 )
582 )
583
584
585 NetworkStats <- R6Class (
586 " NetworkStats " ,
587 public = list (
588 initialize = function ( true . positives = NULL ,
589 false . positives = NULL ,
590 false . negatives = NULL ,
591 accuracy = NULL ,
592 sensitivity = NULL ,
593 bdeu . score = NULL ,
594 k2 . score = NULL ,
595 shifted . hamming . distance = NULL ) {
596 private $ true . positives <- true . positives
597 private $ false . positives <- false . positives
598 private $ false . negatives <- false . negatives
599 private $ accuracy <- accuracy
600 private $ sensitivity <- sensitivity
601 private $ bdeu . score <- bdeu . score
602 private $ k2 . score <- k2 . score
603 private $ shifted . hamming . distance <- shifted . hamming . distance
604 },
605 get _ true _ positives = function () {
606 return ( private $ true . positives )
607 },
608 get _ false _ positives = function () {
609 return ( private $ false . positives )
610 },
611 get _ false _ negatives = function () {
612 return ( private $ false . negatives )
613 },
614 get _ accuracy = function () {
615 return ( private $ accuracy )
616 },
617 get _ sensitivity = function () {
618 return ( private $ sensitivity )
619 },
620 get _ bdeu _ score = function () {
621 return ( private $ bdeu . score )
622 },
623 get _ k2 _ score = function () {
624 return ( private $ k2 . score )
625 },
626 get _ shifted _ hamming _ distance = function () {
627 return ( private $ shifted . hamming . distance )
628 }
629 ),
630 private = list (

117
APÉNDICE A. CÓDIGO FUENTE

631 true . positives = NULL ,


632 false . positives = NULL ,
633 false . negatives = NULL ,
634 accuracy = NULL ,
635 sensitivity = NULL ,
636 bdeu . score = NULL ,
637 k2 . score = NULL ,
638 shifted . hamming . distance = NULL
639 )
640 )
641
642
643 Tree <- R6Class (
644 " Tree " ,
645 public = list (
646 initialize = function () {
647 private $ root . node <- Node $ new (" tree . root ")
648 },
649 get _ root _ node = function () {
650 return ( private $ root . node )
651 },
652 add _ child _ node = function ( a. parent . node , child . name , child . node
. name , child . node . value , child . attribute . position ) {
653 child . node <- a. parent . node $ AddChild ( child . name , cou = 1,
node . name = child . node . name , node . value = child . node .
value , node . attribute . position = child . attribute . position
)
654
655 return ( child . node )
656 },
657 get _ first _ child _ node _ by _ name = function (a. parent . node , child .
node . name ) {
658 return (a. parent . node $ children [ child . node . name ])
659 },
660 traverse = function ( node , level , nodes ) {
661
662 children <- node $ children
663
664 if ( level == 2) {
665 for ( child in children ) {
666 nodes $ add ( child )
667 }
668 } else {
669 for ( child in children ) {
670 self $ traverse ( child , level = level - 1, nodes )
671 }
672 }
673 }
674 ),
675 private = list (
676 root . node = NULL
677 )
678 )
679
680
681 List <- R6Class (
682 inherit = Vector ,

118
APÉNDICE A. CÓDIGO FUENTE

683 " List " ,


684 public = list (
685 initialize = function ( some . elements = NULL , a . name = NULL ) {
686 return ( super $ initialize (a. mode = " list " , some . elements , a .
name ))
687 }
688 )
689 )
690
691
692 Vector <- R6Class (
693 " Vector " ,
694 public = list (
695 initialize = function (a. mode , some . elements = NULL , a. name =
NULL ) {
696 private $ mode <- a . mode
697 private $ vector <- vector ( mode = private $ mode )
698 private $ size = 0
699 private $ counter = 0
700 private $ name = a. name
701
702 if (! is . null ( some . elements )) {
703
704 if ( is . list ( some . elements ) || is . vector ( some . elements )) {
705 some . elements <- as . list ( some . elements )
706
707 if ( is . null ( names <- names ( some . elements )) ) {
708 sapply ( some . elements , function ( some . element ) {
709 if ( is . list ( some . element ) & & length ( some . element ) >
0) {
710 self $ add ( some . element [[1]])
711 } else {
712 self $ add ( some . element )
713 }
714 })
715 } else {
716 sapply ( names , function ( name ) {
717 some . element <- some . elements [[ name ]]
718 if ( is . list ( some . element ) & & length ( some . element ) >
0) {
719 self $ add ( some . element [[1]] , name )
720 } else {
721 self $ add ( some . element , name )
722 }
723 })
724 }
725 } else {
726 self $ add ( some . elements )
727 }
728 }
729 },
730 add = function ( an . element = NULL , name = NULL ) {
731 if ( private $ size == 0) {
732 private $ size <- 1
733 length ( private $ vector ) <- 1
734 }
735

119
APÉNDICE A. CÓDIGO FUENTE

736 if ( private $ counter == private $ size ) {


737 length ( private $ vector ) <- private $ size <- private $ size * 2
738 }
739
740 private $ counter <- private $ counter + 1
741 private $ vector [[ private $ counter ]] <- an . element
742
743 if (! is . null ( name )) {
744 names ( private $ vector )[ private $ counter ] <- name
745 }
746 },
747 addAll = function ( some . elements ) {
748 lapply ( some . elements , function ( some . element ) {
749 self $ add ( some . element )
750 })
751 },
752 get = function ( element . reference = NULL ) {
753 if ( is . null ( element . reference )) {
754 if ( private $ counter > 0) {
755 return ( private $ vector [1: private $ counter ])
756 } else {
757 return ( private $ vector )
758 }
759 } else {
760
761 if ( length ( element . reference ) == 1) {
762 if (" List " %in % class ( private $ vector [[ element . reference
]]) ) {
763 return ( private $ vector [[ element . reference ]])
764 } else {
765 return ( List $ new ( private $ vector [ element . reference ]) )
766 }
767 } else {
768 return ( List $ new ( private $ vector [ element . reference ]) )
769 }
770 }
771 },
772 set = function ( element . reference , value = NULL ) {
773 private $ vector [[ element . reference ]] <- value
774 },
775 toString = function () {
776 if ( private $ counter > 0) {
777 return ( toString ( private $ vector [1: private $ counter ]) )
778 }
779
780 return (" NULL ")
781 },
782 sapply = function (...) {
783 if ( private $ counter > 0) {
784 return ( List $ new ( sapply ( private $ vector [1: private $ counter ] ,
...) ))
785 }
786
787 return ( NULL )
788 },
789 lapply = function (... , names = NULL ) {
790 if ( private $ counter > 0) {

120
APÉNDICE A. CÓDIGO FUENTE

791 result <- lapply ( private $ vector [1: private $ counter ] , ...)
792
793 if (! is . null ( names )) {
794 names ( result ) <- names
795 }
796
797 return ( List $ new ( result ) )
798 }
799
800
801 return ( NULL )
802 },
803 get _ pos = function ( an . element ) {
804 return ( which ( private $ vector == an . element ))
805 },
806 length = function () {
807 return ( private $ counter )
808 },
809 unList = function () {
810 if ( private $ counter == 0) {
811 return ( list () )
812 } else {
813 if ( length ( names ( private $ vector )) > 0) {
814 return ( private $ vector [1: private $ counter ])
815 } else {
816 return ( unlist ( private $ vector [1: private $ counter ]) )
817 }
818 }
819 },
820 which . max = function () {
821 return ( which . max ( private $ vector [1: private $ counter ]) )
822 },
823 swap = function ( element . reference1 , element . reference2 ) {
824 element1 <- self $ get ( element . reference1 )
825 element2 <- self $ get ( element . reference2 )
826
827 temp <- private $ vector [ element . reference1 ]
828 private $ vector [ element . reference1 ] <- private $ vector [ element .
reference2 ]
829 private $ vector [ element . reference2 ] <- temp
830 },
831 get _ name = function () {
832 return ( private $ name )
833 },
834 set _ name = function (a . name ) {
835 private $ name <- a . name
836 },
837 clear = function () {
838 private $ vector <- vector ( mode = private $ mode )
839 private $ size = 0
840 private $ counter = 0
841 }
842 ),
843 private = list (
844 vector = NULL ,
845 size = NULL ,
846 counter = NULL ,

121
APÉNDICE A. CÓDIGO FUENTE

847 name = NULL ,


848 mode = NULL
849 )
850 )
851
852
853 ArgMaxResponse <- R6Class (
854 " ArgMaxResponse " ,
855 public = list (
856 initialize = function (a. value . list = NULL , a. value . max = NULL )
{
857 private $ value . list <- a. value . list
858 private $ value . max <- a. value . max
859 },
860 get _ value _ list = function () {
861 return ( private $ value . list )
862 },
863 get _ value _ max = function () {
864 return ( private $ value . max )
865 }
866 ),
867 private = list (
868 value . list = NULL ,
869 value . max = NULL
870 )
871 )
872
873
874 TabuListEntry <- R6Class (
875 " TabuListEntry " ,
876 public = list (
877 initialize = function (a. nodes . order = NULL , a . gain = NULL , some
. nodes . parents = NULL ) {
878 private $ nodes . order <- a. nodes . order
879 private $ gain <- a . gain
880
881 if (! is . null ( some . nodes . parents )) {
882 private $ nodes . parents <- List $ new ( sapply ( some . nodes . parents
$ unList () , function (x) {x$ unList () }) , " tabu . list . entry "
)
883 }
884 },
885 get _ nodes _ order = function () {
886 return ( private $ nodes . order )
887 },
888 get _ nodes _ parents = function () {
889 return ( private $ nodes . parents )
890 }
891 ),
892 private = list (
893 nodes . order = NULL ,
894 gain = NULL ,
895 nodes . parents = NULL
896 )
897 )
898
899

122
APÉNDICE A. CÓDIGO FUENTE

900 TabuList <- R6Class (


901 " TabuList " ,
902 inherit = List ,
903 public = list (
904 initialize = function (a. tabu . list . entry = NULL ) {
905 super $ initialize (a. name = " tabu . list ")
906 self $ add (a. tabu . list . entry )
907 },
908 add = function ( a. tabu . list . entry = NULL , name = NULL ) {
909 super $ add ( an . element = a. tabu . list . entry , name );
910 },
911 get _ entry _ by _ nodes _ order = function ( nodes . order ) {
912 nodes . order . unlisted <- nodes . order $ unList ()
913 nodes . order . unlisted . length <- nodes . order $ length ()
914
915 contained <- sapply ( private $ vector [1: private $ counter ] ,
function ( list . entry ) {
916 sum ( nodes . order . unlisted == list . entry $ get _ nodes _ order () $
unList () ) == nodes . order . unlisted . length
917 })
918
919 if ( sum ( contained ) > 0) {
920 return ( private $ vector [ contained == TRUE ][[1]])
921 } else {
922 return ( NULL )
923 }
924 }
925 ),
926 private = list (
927 nodes . orders = NULL
928 )
929 )
930
931
932 Attribute <- R6Class (
933 " Attribute " ,
934 public = list (
935 initialize = function ( an . attribute . name , an . attribute . position )
{
936 private $ attribute . name <- an . attribute . name
937 private $ attribute . position <- an . attribute . position
938 },
939 get _ attribute _ name = function () {
940 return ( private $ attribute . name )
941 },
942 get _ attribute _ position = function () {
943 return ( private $ attribute . position )
944 }
945 ),
946 private = list (
947 attribute . name = NULL ,
948 attribute . position = NULL
949 )
950 )

Listing A.3. algorithms.R


1 list . of . packages <- c( " HapEstXXR " , " arules " , " data . tree ")

123
APÉNDICE A. CÓDIGO FUENTE

2 new . packages <- list . of . packages [!( list . of . packages %in % installed .
packages () [," Package " ]) ]
3 if ( length ( new . packages ) ) install . packages ( new . packages , repos = "
http :// cran . us .r - project . org ")
4
5 library ( " HapEstXXR ")
6 library ( " arules ")
7 library ( " data . tree ")
8
9 source (" domain .R")
10 source (" common .R")
11 source (" stats . R")
12
13 discretizeDataTableIn <- function ( data . table , discretization . method
, number . intervals ) {
14 message ( sprintf (" Discretizing data table : %s \ nDiscretization
method : %s \ nNumber of intervals : %d " , data . table $ get _
table _ name () , discretization . method , number . intervals ))
15
16 params <- DiscretizationAlgorithmParams $ new (a . discretization .
method = discretization . method , a . number . intervals = number .
intervals )
17
18 time <- system . time ( discretized . data <- discretizeDataTable ( data .
table , discretization . method , number . intervals ))
19
20 run <- DiscretizationAlgorithmRun $ new (a. data . table = data . table ,
some . params = params , a. processing . time = time [[ " elapsed " ]])
21
22 discretized . data . table <- DiscretizedNetworkDataTable $ new (a. data .
table = data . table , a. discretized . data . table = discretized .
data , a. discretization . algorithm . run = run )
23
24 message ( " Done \n")
25
26 rm ( run )
27 rm ( time )
28 rm ( params )
29 rm ( data . table )
30 rm ( discretization . method )
31 rm ( number . intervals )
32 gc ()
33 return ( discretized . data . table )
34 }
35
36
37 discretizeDataTable <- function ( data . table , discretization . method ,
number . intervals ) {
38
39 data <- data . table $ get _ data _ table ()
40
41 if ( discretization . method == " intervalo ") {
42 discretization . method <- " interval "
43 } else {
44 discretization . method <- " frequency "
45 }
46

124
APÉNDICE A. CÓDIGO FUENTE

47 discretized . data <-


48 arules :: discretize ( data , discretization . method , categories =
number . intervals )
49
50 dim ( discretized . data ) <- dim ( data )
51
52 colnames ( discretized . data ) <- colnames ( data )
53 rownames ( discretized . data ) <- rownames ( data )
54
55 rm ( data )
56 rm ( data . table )
57 gc ()
58
59 return ( discretized . data )
60 }
61
62
63
64 k2In <- function ( original . network , discretized . data . table . name , k2 .
nodes . order , k2 . max . number . parents ) {
65 message ( sprintf (" Executing K2 for data table : %s \ nNode order
: %s \ nMax number of parents : %d" ,
discretized . data . table . name , paste ( k2 . nodes . order $ get _ order ()
, collapse = " , ") , k2 . max . number . parents ))
66
67 params <- K2AlgorithmParams $ new (a. max . number . parents = k2 . max .
number . parents )
68
69 time <- system . time ( nodes . parents <- k2 ( discretized . data . table .
name , k2 . nodes . order $ get _ order () , k2 . max . number . parents ))
70
71 run <- K2AlgorithmRun $ new ( a. discretized . data . table = get0 (
discretized . data . table . name , envir = . GlobalEnv ) , a. nodes .
order = k2 . nodes . order , some . params = params , a. processing .
time = time [[ " elapsed " ]])
72
73 message ( " Done \n")
74
75 learned . network <- LearnedNetwork $ new ( original . network , some .
nodes . parents = List $ new ( nodes . parents ) , a. k2 . algorithm . run =
run )
76
77 rm ( time )
78 rm ( run )
79 rm ( params )
80 rm ( k2 . nodes . order )
81 gc ()
82 learned . network
83 }
84
85
86 # data rows are the variables
87 # data cols are the time values
88 k2 <- function ( discretized . data . table . name , nodes . order , max . number
. parents ) {
89
90 nodes . parents <- sapply ( nodes . order , function ( current . node ) {

125
APÉNDICE A. CÓDIGO FUENTE

91 current . node . pos <- which ( nodes . order == current . node )


92
93 if ( current . node . pos == 1) {
94 return ( list () )
95 }
96
97 parents . current . node <- List $ new ()
98 predecessors . current . node <- nodes . order [c (1:( current . node . pos
- 1) )]
99
100 parents . current . node . score <- K2Score ( parents . current . node $
unList () , discretized . data . table . name , current . node )
101 continue <- TRUE
102 while ( continue & ( parents . current . node $ length () < max . number .
parents ) ) {
103
104 potential . parents . current . node <- List $ new ( lapply (
predecessors . current . node , function ( predecessor . current .
node ) {
105 parents . current . node . cloned <- parents . current . node $ clone ()
106 parents . current . node . cloned $ add ( predecessor . current . node )
107 parents . current . node . cloned $ unList ()
108 }) )
109
110 argmax . response <- argmax ( K2Score , potential . parents . current .
node , discretized . data . table . name , current . node )
111
112 potential . parents . max <- argmax . response $ get _ value _ list ()
113 potential . parents . max . score <- argmax . response $ get _ value _ max
() $ unList ()
114
115 if ( potential . parents . max $ length () > 0 & ( parents . current .
node . score < potential . parents . max . score )) {
116 parents . current . node . score <- potential . parents . max . score
117 parents . current . node <- List $ new ( potential . parents . max $ get
() [[1]])
118 predecessors . current . node <- setdiff ( predecessors . current .
node , potential . parents . max $ unList () )
119 continue <- !( length ( predecessors . current . node ) == 0)
120 } else {
121 continue <- FALSE
122 }
123 }
124
125 return ( parents . current . node $ unList () )
126
127 }, simplify = FALSE , USE . NAMES = TRUE )
128
129 rm ( nodes . order )
130 gc ()
131
132 return ( nodes . parents )
133 }
134
135
136 get _ power _ sets <- function ( elements , max . elements , max . power . sets )
{

126
APÉNDICE A. CÓDIGO FUENTE

137 power . sets <- List $ new ()


138
139 for ( i in c (1: min ( length ( elements ) , max . elements ))) {
140 e <- combn ( elements , i )
141 power . sets $ addAll ( unname ( split (e , rep (1: ncol (e) , each = nrow (e )
))) )
142 }
143
144 power . sets . length <- power . sets $ length ()
145
146 if ( power . sets . length > max . power . sets ) {
147 ps <- power . sets $ get ()
148 power . sets $ clear ()
149 power . sets . capped <- sample (1: length ( ps ) , max . power . sets ,
replace = F )
150 power . sets $ addAll ( ps [ power . sets . capped ])
151 }
152
153 return ( power . sets )
154 }
155
156
157 best <- function ( current . node , predecessors . current . node ,
discretized . data . table . name , max . number . parents ) {
158
159 if ( predecessors . current . node $ length () > 0) {
160 predecessors . power . sets <- get _ power _ sets ( predecessors . current .
node $ unList () , max . number . parents , 50)
161
162 if ( predecessors . power . sets $ length () > 0) {
163 argmax . response <- argmax ( K2Score , predecessors . power . sets ,
discretized . data . table . name , current . node )
164
165 best . potential . parents <- argmax . response $ get _ value _ list ()
166
167 rm ( current . node )
168 rm ( predecessors . current . node )
169 gc ()
170 return ( best . potential . parents )
171 }
172 }
173
174 rm ( current . node )
175 rm ( predecessors . current . node )
176 gc ()
177 return ( List $ new () )
178 }
179
180
181 gain <- function ( nodes . order , current . node , parents . current . node ,
next . current . node , parents . next . current . node , discretized . data .
table . name , max . number . parents ) {
182
183 position . current . node <- nodes . order $ get _ pos ( current . node )
184 if ( position . current . node > 1) {
185 predecessors . current . node <- nodes . order $ get ( c (1:( position .
current . node - 1) ))

127
APÉNDICE A. CÓDIGO FUENTE

186 } else {
187 predecessors . current . node <- List $ new ()
188 }
189
190 predecessors . current . node . plus . next <- predecessors . current . node $
clone ()
191 predecessors . current . node . plus . next $ add ( next . current . node )
192
193 predecessors . next . current . node . minus . current <- predecessors .
current . node
194
195 best . parents . current . node <- best ( current . node , predecessors .
current . node . plus . next , discretized . data . table . name , max .
number . parents )
196
197 best . parents . next . current . node <- best ( next . current . node ,
predecessors . next . current . node . minus . current , discretized .
data . table . name , max . number . parents )
198
199 gain . current . node <- K2Score ( best . parents . current . node $ unList () ,
discretized . data . table . name , current . node ) - K2Score ( parents .
current . node $ unList () , discretized . data . table . name , current .
node )
200
201 gain . next . current . node <- K2Score ( best . parents . next . current . node $
unList () , discretized . data . table . name , next . current . node ) -
K2Score ( parents . next . current . node $ unList () , discretized . data .
table . name , next . current . node )
202
203 result <- gain . current . node + gain . next . current . node
204
205 rm ( nodes . order )
206 rm ( current . node )
207 rm ( parents . current . node )
208 rm ( next . current . node )
209 rm ( parents . next . current . node )
210 rm ( position . current . node )
211 rm ( predecessors . current . node )
212 rm ( predecessors . current . node . plus . next )
213 rm ( predecessors . next . current . node . minus . current )
214 rm ( best . parents . current . node )
215 rm ( best . parents . next . current . node )
216 rm ( gain . current . node )
217 rm ( gain . next . current . node )
218 gc ()
219 return ( result )
220 }
221
222
223 osIn <- function ( discretized . data . table . name , initial . nodes . order ,
os . max . number . parents ) {
224 message ( sprintf (" Executing OS for data table : %s \ nInitial node
order : %s \ nMax number of parents : %d" ,
discretized . data . table . name , paste ( initial . nodes . order $ get _
order () , collapse = " , ") , os . max . number . parents ))
225
226 params <- OsAlgorithmParams $ new (a. max . number . parents = os . max .

128
APÉNDICE A. CÓDIGO FUENTE

number . parents )
227
228 time <- system . time ( os . nodes . order <- os ( discretized . data . table .
name , initial . nodes . order , os . max . number . parents ) )
229
230 run <- OsAlgorithmRun $ new ( a. discretized . data . table = get0 (
discretized . data . table . name , envir = . GlobalEnv ) , an . initial .
nodes . order = initial . nodes . order , some . params = params , a.
processing . time = time [[ " elapsed " ]])
231
232 message ( sprintf (" OS node order : %s" , paste ( os . nodes
. order $ toString () , collapse = " , ")))
233
234 message ( " Done \n")
235
236 nodes . order <- NodesOrder $ new ( an . order . name = initial . nodes . order
$ get _ order _ name () , an . order = os . nodes . order $ unList () , an .
ordering . algorithm . run = run )
237
238 rm ( initial . nodes . order )
239 gc ()
240 return ( nodes . order )
241 }
242
243
244 os <- function ( discretized . data . table . name , nodes . order , max . number
. parents ) {
245 nodes . order <- List $ new ( nodes . order $ get _ order () )
246 nodes . order . length <- nodes . order $ length ()
247
248 nodes . parents <- nodes . order $ lapply ( function ( current . node ) {
249 position . current . node <- nodes . order $ get _ pos ( current . node )
250
251 if ( position . current . node > 1) {
252 predecessors . current . node <- nodes . order $ get (c (1: position .
current . node -1) )
253 parents . current . node <- best ( current . node , predecessors .
current . node , discretized . data . table . name , max . number .
parents )
254 } else {
255 parents . current . node <- List $ new ()
256 }
257
258 return ( parents . current . node )
259 }, names = unlist ( nodes . order $ unList () ) )
260
261 gains <- nodes . order $ lapply ( function ( current . node ) {
262 position . current . node <- nodes . order $ get _ pos ( current . node )
263
264 if ( position . current . node < nodes . order . length ) {
265 next . current . node <- nodes . order $ get ( position . current . node +
1) $ unList ()
266
267 gain ( nodes . order , current . node , nodes . parents $ get ( position .
current . node ) , next . current . node ,
268 nodes . parents $ get ( position . current . node + 1) ,
discretized . data . table . name , max . number . parents )

129
APÉNDICE A. CÓDIGO FUENTE

269 } else {
270 return ( - Inf )
271 }
272 })
273
274 tabu . list <- TabuList $ new ( TabuListEntry $ new ( a. gain = -1 , a. nodes .
order = nodes . order $ clone () , some . nodes . parents = nodes . parents
))
275
276 proceed <- TRUE
277 while ( proceed ) {
278 gains . max . position <- gains $ which . max ()
279
280 gains . max <- gains $ get ( gains . max . position )
281 if ( gains . max $ unList () > 0) {
282 nodes . order $ swap ( gains . max . position , gains . max . position + 1)
283
284 current . node <- nodes . order $ get ( gains . max . position )$ unList ()
285
286 if ( gains . max . position > 1) {
287 predecessors . current . node <- nodes . order $ get ( c (1: gains . max .
position - 1) )
288 } else {
289 predecessors . current . node <- List $ new ()
290 }
291
292 nodes . parents $ set ( current . node , best ( current . node ,
predecessors . current . node , discretized . data . table . name ,
max . number . parents ))
293
294 if ( gains . max . position > 1) {
295 previous . current . node <- nodes . order $ get ( gains . max . position
- 1) $ unList ()
296 gains $ set ( gains . max . position - 1, gain ( nodes . order ,
previous . current . node , nodes . parents $ get ( previous .
current . node ) ,
297 current . node , nodes .
parents $ get (
current . node ) ,
discretized . data
. table . name , max
. number . parents )
)
298
299 }
300
301
302 next . current . node <- nodes . order $ get ( gains . max . position + 1) $
unList ()
303 predecessors . next . current . node <- nodes . order $ get ( c (1: gains .
max . position ))
304
305 nodes . parents $ set ( next . current . node , best ( next . current . node ,
predecessors . next . current . node , discretized . data . table .
name , max . number . parents ))
306
307 gains $ set ( gains . max . position , - gains $ get ( gains . max . position )$

130
APÉNDICE A. CÓDIGO FUENTE

unList () )
308
309 if ( gains . max . position < ( nodes . order . length - 1) ) {
310 predecessors . next . next . current . node <- nodes . order $ get (c
(1:( gains . max . position + 1) ) )
311
312 next . next . current . node <- nodes . order $ get ( gains . max .
position + 2) $ unList ()
313
314 nodes . parents $ set ( next . next . current . node , best ( next . next .
current . node , predecessors . next . next . current . node ,
discretized . data . table . name , max . number . parents ))
315 gains $ set ( gains . max . position + 1, gain ( nodes . order , next .
current . node , nodes . parents $ get ( next . current . node ) ,
316 next . next . current .
node , nodes .
parents $ get ( next
. next . current .
node ) ,
discretized . data
. table . name , max
. number . parents )
)
317 }
318
319 if (! is . null ( tabu . list . entry <- tabu . list $ get _ entry _ by _ nodes _
order ( nodes . order ))) {
320 argmax . response <- argmax ( networkScore , List $ new ( list ( tabu .
list . entry $ get _ nodes _ parents () ,
321 List $ new ( sapply (
nodes . parents $
unList () ,
function (x ) {x$
unList () }) ))) ,
discretized .
data . table . name
, K2Score )
322
323 rm ( nodes . parents )
324 rm ( gains )
325 gc ()
326
327 if (! is . null ( argmax . response $ get _ value _ list () $ get _ name () ))
{
328 return ( tabu . list . entry $ get _ nodes _ order () )
329 } else {
330 return ( nodes . order )
331 }
332
333 } else {
334 tabu . list $ add ( TabuListEntry $ new (a. gain = gains . max , a . nodes .
order = nodes . order $ clone () , some . nodes . parents = nodes .
parents ))
335 }
336
337 } else {
338 proceed <- FALSE

131
APÉNDICE A. CÓDIGO FUENTE

339 }
340 }
341
342 rm ( gains )
343 rm ( gains . max )
344 rm ( gains . max . position )
345 if ( exists ( " next . current . node ")) {
346 rm ( next . current . node )
347 }
348
349 if ( exists (" next . next . current . node ")) {
350 rm ( next . next . current . node )
351 }
352
353 rm ( nodes . parents )
354 if ( exists (" predecessors . current . node ") ) {
355 rm ( predecessors . current . node )
356 }
357 if ( exists (" predecessors . next . current . node ")) {
358 rm ( predecessors . next . current . node )
359 }
360
361 if ( exists (" predecessors . next . next . current . node ")) {
362 rm ( predecessors . next . next . current . node )
363 }
364 if ( exists (" previous . current . node ")) {
365 rm ( previous . current . node )
366 }
367 if ( exists (" tabu . list ") ) {
368 rm ( tabu . list )
369 }
370 if ( exists (" tabu . list . entry " )) {
371 rm ( tabu . list . entry )
372 }
373 gc ()
374
375 return ( nodes . order )
376 }

Listing A.4. stats.R


1 source (" common .R")
2
3 getLearnedNetworkStatistics <- function ( original . network , learned .
network , discretized . data . table ) {
4 original . matrix <- original . network $ get _ adjacency _ matrix ()
5 learned . matrix <- learned . network $ get _ adjacency _ matrix ()
6
7 original . matrix . true . positive <- original . matrix
8 learned . matrix . true . positive <- learned . matrix
9
10 original . matrix . true . positive [ original . matrix . true . positive == 0]
<- 2
11 learned . matrix . true . positive [ learned . matrix . true . positive == 0]
<- -2
12
13 matrix . true . positive <- original . matrix . true . positive - learned .
matrix . true . positive

132
APÉNDICE A. CÓDIGO FUENTE

14 true . positives <- length ( matrix . true . positive [ matrix . true .


positive == 0])
15
16 matrix . false . positive <- learned . matrix - original . matrix
17 false . positives <- length ( matrix . false . positive [ matrix . false .
positive == 1])
18
19 matrix . false . negative <- original . matrix - learned . matrix
20 false . negatives <- length ( matrix . false . negative [ matrix . false .
negative == 1])
21
22 accuracy <- 0
23 if (( true . positives + false . positives ) > 0) {
24 accuracy <- true . positives /( true . positives + false . positives )
25 }
26
27 sensitivity <- 0
28 if (( true . positives + false . negatives ) > 0) {
29 sensitivity <- true . positives / ( true . positives + false . negatives
)
30 }
31
32 bdeu . score <- networkScore ( learned . network $ get _ nodes _ parents () ,
discretized . data . table $ get _ discretized _ table _ name () ,
BdeuScore )
33
34 k2 . score <- networkScore ( learned . network $ get _ nodes _ parents () ,
discretized . data . table $ get _ discretized _ table _ name () , K2Score )
35
36 shd <- shd ( original . matrix , learned . matrix )
37
38 result <- NetworkStats $ new ( true . positives = true . positives , false
. positives = false . positives , false . negatives = false .
negatives , accuracy = accuracy , sensitivity = sensitivity ,
bdeu . score = bdeu . score , k2 . score = k2 . score , shifted . hamming
. distance = shd )
39 return ( result )
40 }
41
42
43 shd <- function ( original . matrix , learned . matrix ) {
44 shd . matrix <- original . matrix - learned . matrix
45
46 shd <- length ( shd . matrix [ shd . matrix != 0])
47
48 original . matrix . shd <- original . matrix
49 learned . matrix . shd <- learned . matrix
50
51 original . matrix . shd [ original . matrix . shd == 0] <- 2
52 learned . matrix . shd [ learned . matrix . shd == 0] <- -2
53
54 matrix . incorrectly . directed . shd <- original . matrix . shd - t(
learned . matrix . shd )
55
56 shd <- shd + length ( matrix . incorrectly . directed . shd [ matrix .
incorrectly . directed . shd == 0])
57

133
APÉNDICE A. CÓDIGO FUENTE

58 return ( shd )
59 }

Listing A.5. common.R


1 list . of . packages <- c(" igraph " , " plyr " , " memoise " , " lubridate ")
2 new . packages <- list . of . packages [!( list . of . packages %in % installed .
packages () [," Package " ]) ]
3 if ( length ( new . packages ) ) install . packages ( new . packages , repos = "
http :// cran . us .r - project . org ")
4
5 library ( " igraph ")
6 library ( " plyr ")
7 library ( " memoise ")
8 library ( " lubridate ")
9
10 source (" domain .R")
11
12 assign (" nodes . at . level " , List $ new () , envir = . GlobalEnv )
13
14 # alfa cols are levels of current node
15 # alfa rows are combinations of current node parents
16 alfa <- function ( discretized . data . table . name , current . node , parents
. current . node ) {
17 discretized . data . table <- get ( discretized . data . table . name , envir
= . GlobalEnv )
18
19 number . levels <- discretized . data . table $ get _ number _ levels ()
20 levels <- discretized . data . table $ get _ levels ()
21 number . parents . current . node <- length ( parents . current . node )
22 number . parents . possible . combinations <- number . levels ^ number .
parents . current . node
23 number . instances <- discretized . data . table $ get _ number _ instances ()
24
25 if ( is . na ( number . parents . possible . combinations ) || number . parents
. possible . combinations > 256) {
26 stop ()
27 }
28
29 alfa . matrix <- matrix (0 , nrow = number . parents . possible .
combinations , ncol = number . levels )
30
31 if ( number . parents . current . node == 0) {
32
33 alfa . matrix <- sapply (c (1: number . levels ) , function ( number . level
) {
34
35 possible . level . combination <- c( paste (c( current . node ) , number
. level , sep = " -" ))
36
37 discretized . data . table $ get _ data _ instance _ count ( possible . level
. combination )
38
39 })
40
41 dim ( alfa . matrix ) <- c (1 , number . levels )
42
43 } else {

134
APÉNDICE A. CÓDIGO FUENTE

44
45 parents . possible . level . combinations . matrix <- combn ( rep (c (1:
number . levels ) , number . parents . current . node ) , number .
parents . current . node )
46
47 if ( number . parents . current . node > 0) {
48 parents . possible . level . combinations . matrix <- matrix ( parents .
possible . level . combinations . matrix [, ! duplicated (t(
parents . possible . level . combinations . matrix ))], nrow =
number . parents . current . node )
49 }
50
51 possible . level . combination . matrices <- lapply (c (1: number . levels
) , function ( current . node . level ) apply ( parents . possible .
level . combinations . matrix , 2, function ( parents . possible .
level . combinations . matrix . col ) c ( current . node . level ,
parents . possible . level . combinations . matrix . col )))
52
53 nodes <- c( current . node , parents . current . node )
54 total = 0
55 alfa . matrix <- sapply (c (1: number . levels ) , function ( number . level
) {
56 apply ( possible . level . combination . matrices [[ number . level ]] ,
2, function ( possible . level . combination ) {
57 if ( total < number . instances ) {
58 possible . level . combination <- paste ( nodes , possible . level
. combination , sep = " -")
59
60 value = discretized . data . table $ get _ data _ instance _ count (
possible . level . combination )
61
62 total < <- total + value
63 } else {
64 value = 0
65 }
66
67 return ( value )
68 })
69 })
70 alfa . matrix
71 }
72
73 return ( alfa . matrix )
74 }
75
76
77 networkScore <- function ( nodes . parents , discretized . data . table .
name , func ) {
78 nodes . parents <- nodes . parents $ unList ()
79 seq . nodes . parents . names <- names ( nodes . parents )
80
81 score <- Reduce ( '+ ', mapply ( function ( seq . nodes . parents . name ) {
82 return ( func ( discretized . data . table . name = discretized . data .
table . name , current . node = seq . nodes . parents . name , parents .
current . node = nodes . parents [[ seq . nodes . parents . name ]]) )
83 }, seq . nodes . parents . names ))
84

135
APÉNDICE A. CÓDIGO FUENTE

85 rm ( nodes . parents )
86 rm ( seq . nodes . parents . names )
87 # gc ()
88
89 return ( score )
90 }
91
92
93 K2Score <- memoise ( function ( parents . current . node , discretized . data .
table . name , current . node ) {
94 discretized . data . table <- get0 ( discretized . data . table . name , envir
= . GlobalEnv )
95
96 alfas <- alfa ( discretized . data . table . name , current . node , parents .
current . node )
97
98 number . levels <- discretized . data . table $ get _ number _ levels ()
99
100 result <- sum (( lfactorial ( number . levels - 1) - lfactorial ( apply (
alfas , 1, sum ) + number . levels - 1) ) + apply ( alfas , 1,
function (x) sum ( lfactorial (x))) )
101
102 rm ( discretized . data . table )
103 rm ( alfas )
104
105 return ( result )
106 })
107
108
109 BdeuScore <- function ( discretized . data . table . name , current . node ,
parents . current . node ) {
110 discretized . data . table <- get0 ( discretized . data . table . name , envir
= . GlobalEnv )
111
112 alfas <- alfa ( discretized . data . table . name , current . node , parents .
current . node )
113
114 number . levels <- discretized . data . table $ get _ number _ levels ()
115 number . parents . current . node <- length ( parents . current . node )
116 number . parents . possible . combinations <- number . levels ^ number .
parents . current . node
117
118 aijk = 10 /( number . levels * number . parents . possible . combinations )
119 aij = aijk * number . levels
120
121 result <- sum ( lgamma ( aij ) - lgamma ( aij + apply ( alfas , 1, sum ) )) +
sum ( lgamma ( aijk + alfas ) - lgamma ( aijk ))
122
123 rm ( alfas )
124 rm ( aij )
125 rm ( discretized . data . table )
126
127 return ( result )
128 }
129
130
131 argmax <- function ( func , domain . values , ...) {

136
APÉNDICE A. CÓDIGO FUENTE

132 value . images <- domain . values $ lapply ( func , ...)


133
134 max . position <- value . images $ which . max ()
135
136 result <- ArgMaxResponse $ new ( domain . values $ get ( max . position ) ,
value . images $ get ( max . position ))
137
138 rm ( value . images )
139 rm ( max . position )
140
141 return ( result )
142 }
143
144
145 adjacencyMatrixToParents <- function ( adjacency . matrix ) {
146 nodes . parents <- sapply ( colnames ( adjacency . matrix ) , function (
current . node ) {
147
148 cols <- row . names ( adjacency . matrix )[ which ( adjacency . matrix [,
current . node ] == 1, arr . ind = TRUE )]
149
150 if ( length ( cols ) == 0) {
151 cols <- list ()
152 }
153
154 return ( cols )
155
156 }, simplify = FALSE )
157
158 return ( nodes . parents )
159 }
160
161
162 getAbsolutePath <- function ( working . directory , filename , extension )
{
163 return ( paste ( working . directory , '\\ ', filename , "." , extension ,
sep ="" ))
164 }
165
166
167 importNetwork <- function ( working . directory , network . name ) {
168 return ( Network $ new (a. network . name = network . name , an . adjacency .
matrix = importNetworkAdjacencyMatrix ( working . directory =
working . directory , filename = network . name , extension = " adj "
)))
169 }
170
171
172 importNetworkAdjacencyMatrix <- function ( working . directory ,
filename , extension ) {
173 adjacency . matrix <-
174 as . matrix ( read . table (
175 getAbsolutePath ( working . directory , filename , extension ) ,
176 header = TRUE ,
177 sep = "\t" ,
178 row . names = 1,
179 as . is = TRUE

137
APÉNDICE A. CÓDIGO FUENTE

180 ))
181
182 adjacency . matrix <- adjacency . matrix [ , - ncol ( adjacency . matrix )] #
Drop last column
183 adjacency . matrix <- adjacency . matrix [ sort ( rownames ( adjacency .
matrix )) , sort ( colnames ( adjacency . matrix )) ]
184 adjacency . matrix [ adjacency . matrix == -1] <- 0 # Replace -1 with 0
185
186 return ( adjacency . matrix )
187 }
188
189
190 exportLearnedNetworkIn <- function ( network , working . directory ,
number . sets , number . instances , original . network . name , extension
) {
191 file <- getAbsolutePath ( working . directory , paste ( original . network
. name , "_" , number . sets , "_ " , number . instances , "_ learned _
networks _ stats " , sep = " ") , " csv ")
192
193 message ( sprintf (" Exporting matrix and stats for learned network %
s" , network $ get _ network _ name () ))
194 browser ()
195 stats <- list ( timestamp = now () ,
196 data . table = network $ get _ k2 _ algorithm _ run () $ get _ discretized _
data _ table () $ get _ table _ name () ,
197 network . file . path = paste ( network $ get _ network _ name () , "." ,
extension , sep = "") ,
198 discretization . method = network $ get _ k2 _ algorithm _ run () $ get _
discretized _ data _ table () $ get _ discretization _ algorithm _
run () $ get _ params () $ get _ discretization _ method () ,
199 discretization . number . intervals = network $ get _ k2 _ algorithm _
run () $ get _ discretized _ data _ table () $ get _ discretization _
algorithm _ run () $ get _ params () $ get _ number _ intervals () ,
200 order . name = network $ get _ k2 _ algorithm _ run () $ get _ nodes _ order
() $ get _ order _ name () ,
201 os . initial . order = getInitialOrder ( network ) ,
202 os . max . number . parents = getMaxNumberParents ( network ) ,
203 k2 . node . order = paste ( network $ get _ k2 _ algorithm _ run () $ get _
nodes _ order () $ get _ order () , collapse = " - ") ,
204 k2 . max . number . parents = network $ get _ k2 _ algorithm _ run () $ get _
params () $ get _ max _ number _ parents () ,
205 true . positives = network $ get _ stats () $ get _ true _ positives () ,
206 false . positives = network $ get _ stats () $ get _ false _ positives () ,
207 false . negatives = network $ get _ stats () $ get _ false _ negatives () ,
208 accuracy = round ( network $ get _ stats () $ get _ accuracy () , digits
= 3) ,
209 sensitivity = round ( network $ get _ stats () $ get _ sensitivity () ,
digits = 3) ,
210 k2 . score = round ( network $ get _ stats () $ get _ k2 _ score () , digits
= 3) ,
211 bdeu . score = round ( network $ get _ stats () $ get _ bdeu _ score () ,
digits = 3) ,
212 shd = network $ get _ stats () $ get _ shifted _ hamming _ distance () ,
213 processing . time = ( getorderingProcessingTime ( network ) +
network $ get _ k2 _ algorithm _ run () $ get _ processing _ time () ))
214
215 if (! file . exists ( file )) {

138
APÉNDICE A. CÓDIGO FUENTE

216 write . table ( stats , file , sep = " ," , col . names = c(" timestamp " ,
" data . table " , " network . file . path " , " método de
discretización " , " número de intervalos " , " combinación " , " os
. initial . order " , " número máx de padres OS " , " k2 . node . order "
, " número máx de padres K2 " , " true . positives " , " false .
positives " , " false . negatives " , " accuracy " , " sensitivity " ,
" k2 . score " , " puntaje log Bdeu " , " shd " , " processing . time ") ,
row . names = FALSE , append = file . exists ( file ) , quote =
FALSE )
217 } else {
218 write . table ( stats , file , sep = " ," , col . names = FALSE , row .
names = FALSE , append = file . exists ( file ) , quote = FALSE )
219 }
220
221 message ( " Done \n")
222 }
223
224
225 getInitialOrder <- function ( network ) {
226 if ( length ( grep (" OS " , network $ get _ k2 _ algorithm _ run () $ get _ nodes _
order () $ get _ order _ name () )) > 0) {
227 return ( paste ( network $ get _ k2 _ algorithm _ run () $ get _ nodes _ order () $
get _ ordering _ algorithm _ run () $ get _ initial _ order () $ get _ order
() , collapse = " - "))
228 } else {
229 return (" NA ")
230 }
231 }
232
233
234 getMaxNumberParents <- function ( network ) {
235 if ( length ( grep (" OS " , network $ get _ k2 _ algorithm _ run () $ get _ nodes _
order () $ get _ order _ name () )) > 0) {
236 return ( network $ get _ k2 _ algorithm _ run () $ get _ nodes _ order () $ get _
ordering _ algorithm _ run () $ get _ params () $ get _ max _ number _
parents () )
237 } else {
238 return (0)
239 }
240 }
241
242
243 getorderingProcessingTime <- function ( network ) {
244 if ( length ( grep (" OS " , network $ get _ k2 _ algorithm _ run () $ get _ nodes _
order () $ get _ order _ name () )) > 0) {
245 return ( network $ get _ k2 _ algorithm _ run () $ get _ nodes _ order () $ get _
ordering _ algorithm _ run () $ get _ processing _ time () )
246 } else {
247 return (0)
248 }
249 }
250
251
252 exportNetworkAsGraph <- function ( network , destination . directory ,
network . name ) {
253 network . graph <- graph _ from _ adjacency _ matrix ( network $ get _
adjacency _ matrix () , mode = " directed ")

139
APÉNDICE A. CÓDIGO FUENTE

254 exportNetworkGraph ( network . graph , working . directory = destination


. directory , filename = network . name , extension = " gml ")
255 }
256
257
258 exportNetworkFromAdjacencyMatrix <- function ( adjacency . matrix ,
working . directory , filename , extension ) {
259 network . graph <- graph _ from _ adjacency _ matrix ( adjacency . matrix ,
mode = " directed " )
260 exportNetworkGraph ( network . graph , working . directory , filename ,
extension )
261 }
262
263
264 exportNetworkGraph <- function ( network . graph , working . directory ,
filename , extension ) {
265 V( network . graph )$ label <- V( network . graph )$ name
266 V( network . graph )$ id <- V( network . graph ) $ label
267 write . graph ( graph = network . graph , getAbsolutePath ( working .
directory , filename , extension ) , extension )
268 }
269
270
271 getNetworkData <- function ( network , working . directory , data . file ,
table . number , number . instances ) {
272 message ( sprintf (" Getting network data for table %d from %s ... " ,
table . number , ( path <- getAbsolutePath ( working . directory ,
data . file , " tsv ")) ))
273
274 header <- read . table ( path , nrows = 1 , header = TRUE )
275 header <- header [2: length ( header )]
276
277 data . table <- read . table ( path , skip = 1 + ( table . number -1) *(
number . instances +1) , nrows = number . instances )
278 data . table <- data . table [, 2: ncol ( data . table )]
279
280 colnames ( data . table ) <- colnames ( header )
281 data . table <- t( data . table [, sort ( colnames ( data . table )) ])
282 data <- NetworkData $ new ( header , NetworkDataTable $ new (a . data . table
= data . table , a. network = network , a. data . file = data . file ,
a. number . instances = number . instances , bulk . id = table . number
))
283
284 message (" Network data obtained and processed ")
285
286 rm ( data . table )
287 rm ( header )
288
289 return ( data )
290 }
291
292
293 getRandomOrderNotInList <- function ( node . order , node . orders ) {
294 node . order . unlisted <- node . order $ unList ()
295
296 random = sample ( node . order . unlisted )
297

140
APÉNDICE A. CÓDIGO FUENTE

298 while ( sum ( node . orders %in % list ( random )) >= 1) {


299 random = sample ( node . order . unlisted )
300 }
301
302 rm ( node . order . unlisted )
303 return ( List $ new ( random ))
304 }

141
APÉNDICE A. CÓDIGO FUENTE

142
Glosario
ácido desoxirribonucleico
Ácido nucleico que contiene instrucciones genéticas usadas en el desarrollo
y funcionamiento de todos los organismos vivos conocidos y algunos virus,
y es responsable de su transmisión hereditaria.

ácido ribonucleico
Ácido nucleico procedente del proceso de transcripción del ADN,
intermediario de la biosíntesis de proteínas.

ADN
Ácido DesoxirriboNucleico.

aminoácido
Moléculas orgánicas con un grupo amino ( NH2 ) y un grupo carboxilo
( COOH) que constituyen los monómeros de las proteínas.

ARN
Ácido RiboNucleico.

ARN polimerasa
Enzima soluble conocida de mayor tamaño capaz de formar los nucleótidos
necesarios para sintetizar ARN a partir de una secuencia de ADN que sirve
como patrón o molde.

célula eucariota
Célula que contiene un núcleo celular delimitado dentro de una doble capa
lipídica llamada envoltura nuclear, la cual es porosa y contiene su material
hereditario.

célula procariota
Célula sin núcleo celular denido, cuyo material genético se encuentra
disperso en el citoplasma, reunido en una zona denominada nucleoide.

143
GLOSARIO

ciclo celular
Conjunto ordenado de sucesos que conducen al crecimiento de una célula
y su división en dos células hijas.
codón
Triplete de nucleótidos que codica un aminoácido.
cromosoma
Pequeños cuerpos en forma de bastoncillos en que se organiza el conjunto
de ADN y proteínas en el núcleo de las células eucariotas.

eliminación de explicaciones
También conocido como explaining away, es un patrón común de
razonamiento en el cual la conrmación de un evento observado o creído
reduce la necesidad de invocar causas alternativas. También puede
suceder lo contrario, donde la conrmación de una causa aumenta la
creencia en otra.
enzima
Molécula de naturaleza proteica y estructural que permite que reacciones
químicas de muy baja velocidad pero energéticamente posibles, sean
cinéticamente favorables, es decir, transcurran a mayor velocidad.
eucariota
Dominio biológico que incluye los organismos formados por células con
núcleo verdadero, abarcando desde organismos unicelulares hasta
verdaderos pluricelulares en los cuales las diferentes células se
especializan en diferentes tareas.
expresión génica
Proceso biológico por el cual cierta información existente en un gen es
utilizada en la síntesis o creación de productos biológicamente funcionales.

factor de transcripción
Proteína que participa en la regulación del proceso de transcripción del
ADN.
logenético
Perteneciente o relativo a la parte de la biología que se ocupa de las
relaciones de parentezco entre los distintos grupos de seres vivos.

gen
Diminuta partícula orgánica, capaz de reproducirse y que es responsable
de la transmisión de características hereditarias. Se encuentran presentes
en los cromosomas. La denición de gen ha cambiado a lo largo de la
historia, tal y como se describe en [Ger+07].

144
GLOSARIO

genoma
Conjunto de genes contenidos en los cromosomas; en los eucariotas,
comprende el ADN contenido en el núcleo, organizado en cromosomas y
en ciertos orgánulos celulares, mientras que en los procariotas comprende
el ADN de su nucleoide.

independencia condicional
Dos eventos R y B son condicionalmente independientes dado un tercer
evento Y si la ocurrencia o la no ocurrencia de R y la ocurrencia o la
no ocurrencia de B son eventos independientes en sus distribuciones de
probabilidad condicional dado Y .

metabolismo
Conjunto de reacciones bioquímicas y procesos físico-químicos que ocurren
en una célula y en el organismo.

metabolito
Cualquier molécula utilizada o producida durante el metabolismo.

monómero
Molécula de pequeña masa molecular que unida a otros monómeros, a
veces cientos o miles, por medio de enlaces químicos forman
macromoléculas llamadas polímeros.

morfogénesis
Proceso biológico que lleva a que un organismo desarrolle su forma. Es
uno de los dos aspectos fundamentales del desarrollo biológico junto con
el control del crecimiento celular y la diferenciación celular.

nucleótido
Moléculas orgánicas que constituyen los monómeros de los ácidos nucleicos
ADN y ARN.

polímero
Macromolécula formadas por la unión de moléculas más pequeñas
llamadas monómeros.

procariota
Dominio biológico que incluye los microorganismos constituidos por células
procariotas, es decir, células que presentan un ADN libre en el citoplasma.

progenie
Casta, generación o familia de la cual se origina o desciende una persona.

145
GLOSARIO

promotor
Región de ADN que controla la iniciación de la transcripción de una
determinada porción del ADN a ARN.

proteína
Molécula formada por cadenas lineales de aminoácidos.

RB
Red bayesiana.

RG
Red de genes.

ribosoma
Complejo macromolecular de proteínas y ARN encargado de sintetizar
proteínas a partir de la información genética que les llega del ADN
transcripto en forma de ARN y que se encuentra en el diferentes lugares
de la célula, como el citoplasma.

RRG
Red de regulación génica.

ruta metabólica
En bioquímica, sucesión de reacciones químicas que conducen de un
elemento químico inicial a uno o varios productos nales, a través de una
serie de metabolitos intermediarios.

síntesis
En biología, conjunto de procesos, también conocido como biosíntesis o
anabolismo, que tienen como resultado la generación de componentes
celulares a partir de otros de baja masa molecular. Se destaca la
biosíntesis de proteínas o proteica, proceso mediante el cual se forman las
proteínas.

sitio de enlace
Región de una proteína, ADN o ARN en la que otra molécula o ion
especícos forma un enlace químico.

146
Referencias

Artículos cientícos
[AJB00] Réka Albert, Hawoong Jeong y Albert-László Barabási. Error and
attack tolerance of complex networks. En: Nature 406.6794 (2000),
págs. 378-382.
[Alo07] Uri Alon. Network motifs: theory and experimental approaches.
En: Nature reviews. Genetics 8 (2007), págs. 450-461. issn: 1471-
0056. doi: 10.1038/nrg2102.
[AM98] Brigham Anderson y Andrew Moore. ADtrees for Fast Counting
and for Fast Learning of Association Rules. En: Proceedings of the
Fourth International Conference on Knowledge Discovery and Data
Mining. KDD'98. New York, NY: AAAI Press, 1998, págs. 134-138.
url: http://dl.acm.org/citation.cfm?id=3000292.3000314.
[Ama+06] R. Amato y col. A multi-step approach to time series analysis and
gene expression clustering. En: Bioinformatics (Oxford, England)
22 (2006), págs. 589-596. issn: 1367-4803. doi: 10.1093/bioinfo
rmatics/btk026.
[Bal+06] Sandhiya Balaji y col. Comprehensive Analysis of Combinatorial
Regulation using the Transcriptional Regulatory Network of Yeast.
En: Journal of Molecular Biology 360.1 (2006), págs. 213-227. issn:
00222836. doi: 10.1016/j.jmb.2006.04.029.
[Ban+07] Mukesh Bansal y col. How to infer gene networks from expression
proles. En: Molecular Systems Biology 3 (2007), pág. 78. issn:
17444292. doi: 10.1038/msb4100120. url: http://dx.doi.org/
10.1038/msb4100120.
[BDGB06] Mukesh Bansal, Giusy Della Gatta y Diego di Bernardo. Inference
of gene regulatory networks and compound mode of action from
time course gene expression proles. En: Bioinformatics 22 (2006),
págs. 815-822. issn: 13674803. doi: 10 . 1093 / bioinformatics /
btl003.

147
REFERENCIAS

[Ber+05] Diego di Bernardo y col. Chemogenomic proling on a genome-


wide scale using reverse-engineered gene networks. En: Nature
Biotechnology 23 (2005), págs. 377-83. issn: 1087-0156. doi:
10 . 1038 / nbt1075. url:
http://www.ncbi.nlm.nih.gov/pubmed/15765094.
[Bra03] Dennis Bray. Molecular Networks: The Top-Down View. En:
Science 301.5641 (2003), págs. 1864-1865. doi:
10 . 1126 / science . 1089118. url: http :
//www.sciencemag.org/content/301/5641/1864.abstract.
[Bun96] Wray Buntine. A guide to the literature on learning probabilistic
networks from data. En: IEEE Transactions on Knowledge and
Data Engineering 8 (1996). issn: 1041-4347. doi: 10 . 1109 / 69 .
494161.
[CA+15] Andrew Chatr-Aryamontri y col. The BioGRID interaction
database: 2015 update. En: Nucleic Acids Research 43.D1 (2015),
págs. D470-D478. issn: 13624962. doi: 10.1093/nar/gku1204.
[CH92] Gregory F. Cooper y Edward Herskovits. A Bayesian method for
the induction of probabilistic networks from data. En: Machine
Learning 9.4 (1992), págs. 309-347. issn: 08856125. doi: 10.1007/
BF00994110. url: http://link.springer.com/10.1007/BF0099
4110.
[CHC99] Ting Chen, Hongyu L. He y George M. Church. Modeling gene
expression with dierential equations. En: Pacic Symposium on
Biocomputing (1999), págs. 29-40. issn: 2335-6936.
[Che+96] Mark Chee y col. Accessing Genetic Information with
High-Density DNA Arrays. En: Science 274.5287 (1996),
págs. 610-614. doi: 10.1126/science.274.5287.610. url: http:
//www.sciencemag.org/content/274/5287/610.abstract.
[Chi02] David M. Chickering. Learning equivalence classes of
Bayesian-network structures. En: The Journal of Machine
Learning Research 2 (2002), págs. 445-498. issn: 1532-4435. doi:
10 . 1162 / 153244302760200696. url: http : / / www . jmlr . org /
papers/volume2/chickering02a/chickering02a.pdf.
[CK04] Robert Castelo y Tomá² Ko£ka. On Inclusion-Driven Learning of
Bayesian Networks. En: Journal of Machine Learning Research 5
(2004), págs. 527-574. issn: 15324435. doi: 10.1162/15324430477
3936045. url: http://search.epnet.com/login.aspx?direct=
true\&db=aph\&an=13054479.
[D'h+99] Patrik D'haeseleer y col. Linear modeling of mRNA expression
levels during CNS development and injury. En: Pacic symposium
on Biocomputing 52 (1999), págs. 41-52. url: http://psb.stan
ford . edu / psb11 / conference - materials / proceedings1996 -
2010/psb99/Dhaeseleer.pdf.

148
REFERENCIAS

[Das+00] George von Dassow y col. The segment polarity network is a robust
developmental module. En: Nature 406 (2000), págs. 188-192. issn:
0028-0836. doi: 10.1038/35018085.
[DJ02] Hidde De Jong. Modeling and simulation of genetic regulatory
systems: a literature review. En: Journal of computational biology :
a journal of computational molecular cell biology 9.1 (ene. de 2002),
págs. 67-103. issn: 1066-5277. doi: 10.1089/10665270252833208.
url: http://www.ncbi.nlm.nih.gov/pubmed/11911796.
[DLS99] Patrik D'haeseleer, Shoudan Liang y Roland Somogyi. Tutorial:
Gene Expression Data Analysis and Modeling. En: Gene
Expression 94035 (1999), págs. 1-35. url:
http://ws1.izbi.uni-leipzig.de/pdf/dhaes-99-tutorial-
GE-clust.pdf.
[DSA11] Rónán Daly, Qiang Shen y Stuart Aitken. Learning Bayesian
networks: approaches and issues. En: The Knowledge Engineering
Review 26.02 (2011), págs. 99-157. issn: 02698889. doi:
10 . 1017 / S0269888910000251. url:
http://dx.doi.org/10.1017/S0269888910000251.
[Eis+98] Michael B. Eisen y col. Cluster analysis and display of genome-
wide expression patterns. En: vol. 95. 1998, págs. 14863-14868.
isbn: 0027-8424 (Print) 0027-8424 (Linking). doi: 10.1073/pnas.
95.25.14863.
[FG97] Nir Friedman y Moises Goldszmidt. Sequential update of Bayesian
network structure. En: Thirteenth Conference on Uncertainty in
Articial Intelligence (1997). url: http://arxiv.org/ftp/arxiv
/papers/1302/1302.1538.pdf.
[FK03] Nir Friedman y Daphne Koller. Being Bayesian About Network
Structure. A Bayesian Approach to Structure Discovery in
Bayesian Networks. English. En: Machine Learning 50.1-2
(2003), págs. 95-125. issn: 0885-6125. doi:
10 . 1023 / A : 1020249912095. url:
http://ai.stanford.edu/~koller/Papers/Friedman+Koller:
MLJ03.pdf.
[FK98] Chikara Furusawa y Kunihiko Kaneko. Emergence of multicellular
organisms with dynamic dierentiation and spatial pattern. En:
Articial life 4 (1998), págs. 79-93. issn: 1064-5462. doi: 10.1162/
106454698568459.
[Fri+00] Nir Friedman y col. Using Bayesian networks to analyze
expression data. En: Journal of computational biology: a journal
of computational molecular cell biology 7.3-4 (2000), págs. 601-20.
issn: 10665277. doi: 10 . 1089 / 106652700750050961. url:
http://www.ncbi.nlm.nih.gov/pubmed/11108481.

149
REFERENCIAS

[Fue+04] Alberto de la Fuente y col. Discovery of meaningful associations


in genomic data using partial correlation coecients. En:
Bioinformatics 20 (2004), págs. 3565-3574. issn: 1367-4803. doi:
10 . 1093 / bioinformatics / bth445. url:
http://bioinformatics.oxfordjournals.org/content/20/18/
3565.full.pdf.
[Gar+03] Timothy S. Gardner y col. Inferring genetic networks and
identifying compound mode of action via expression proling.
En: Science (New York, N.Y.) 301 (2003), págs. 102-105. issn:
0036-8075. doi: 10.1126/science.1081900.
[GC+08] Socorro Gama-Castro y col. RegulonDB (version 6.0): Gene
regulation model of Escherichia coli K-12 beyond transcription,
active (experimental) annotated promoters and Textpresso
navigation. En: Nucleic Acids Research 36.SUPPL. 1 (2008).
issn: 03051048. doi: 10.1093/nar/gkm994.
[Ger+07] Mark B. Gerstein y col. What is a gene, post-ENCODE? History
and updated denition. En: Genome research 17.6 (2007),
págs. 669-681. issn: 10889051. doi: 10.1101/gr.6339607. url:
http://dx.doi.org/10.1101/gr.6339607.
[GF05] Timothy S. Gardner y Jeremiah J. Faith. Reverse-engineering
transcription control networks. En: Physics of life reviews 2.1
(mar. de 2005), págs. 65-88. issn: 15710645. doi:
10 . 1016 / j . plrev . 2005 . 01 . 001. url:
http://www.ncbi.nlm.nih.gov/pubmed/20416858.
[GP98] Peter J. E. Goss y Jean Peccoud. Quantitative modeling of
stochastic systems in molecular biology by using stochastic Petri
nets. En: vol. 95. 12. 1998, págs. 6750-6755. url:
http://www.pnas.org/content/95/12/6750.abstract.
[Gue+02] Nabil Guelzim y col. Topological and causal structure of the yeast
transcriptional regulatory network. En: Nature genetics 31 (2002),
págs. 60-63. doi: 10.1038/ng873.
[Har+99] Leland H. Hartwell y col. From molecular to modular cell biology.
En: Nature 402.6761 Suppl (1999), págs. C47-52.
[Hec96] David Heckerman. A Tutorial on Learning With Bayesian
Networks. En: Innovations in Bayesian Networks 1995 (1996),
págs. 33-82. issn: 1860949X. doi: 10.1007/978-3-540-85066-3.
url:
http://www.springerlink.com/index/62mv333389016034.pdf.
[HTJ12] Alireza S. Hesar, Hamid Tabatabaee y Mehrdad Jalali. Structure
Learning of Bayesian Networks Using Heuristic Methods. En:
2012 International Conference on Information and Knowledge
Management (ICIKM 2012) 45 (2012). url:
http://www.ipcsit.com/vol45/047-ICIKM2012-M20002.pdf.

150
REFERENCIAS

[Jeo+00] H. Jeong y col. The large-scale organization of metabolic


networks. En: Nature 407 (2000), págs. 651-654. issn: 0028-0836.
doi: 10.1038/35036627. arXiv: 0010278 [cond-mat].
[Kau69] Stuart A. Kauman. Homeostasis and dierentiation in random
genetic control networks. En: Nature 224 (1969), págs. 177-178.
issn: 0028-0836. url: http://view.ncbi.nlm.nih.gov/pubmed/
5343519.
[LFS98] Shoudan Liang, Stephanie Fuhrman y Roland Somogyi. Reveal,
a general reverse engineering algorithm for inference of genetic
network architectures. En: Pacic Symposium on Biocomputing
(1998), págs. 18-29. issn: 1793-5091.
[Loc+96] David J. Lockhart y col. Expression monitoring by hybridization
to high-density oligonucleotide arrays. En: Nature biotechnology 14
(1996), págs. 1675-1680. issn: 1087-0156. doi: 10.1038/nbt1296-
1675.
[LP96] Pedro Larrañaga y Mike Poza. Structure learning of Bayesian
networks by genetic algorithms: A performance analysis of control
parameters. En: IEEE Transactions on Pattern Analysis and
Machine Intelligence 18.9 (1996), págs. 912-926. url: http :
//ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=537345.
[MA97] Harley H. McAdams y Adam Arkin. Stochastic mechanisms in
gene expression. En: vol. 94. 3. 1997. url: http://www.pnas.
org/content/94/3/814.abstract.
[Mar+06] Adam A. Margolin y col. ARACNE: an algorithm for the
reconstruction of gene regulatory networks in a mammalian
cellular context. En: BMC bioinformatics 7 Suppl 1 (2006), S7.
issn: 14712105. doi: 10 . 1186 / 1471 - 2105 - 7 - S1 - S7. arXiv:
0410037 [q-bio].
[Mar+09] Daniel Marbach y col. Generating Realistic In Silico Gene
Networks for Performance Assessment of Reverse Engineering
Methods. En: Journal of Computational Biology 16.2 (2009),
págs. 229-239. doi: 10.1089/cmb.2008.09TT.
[Mat+06] Hiroshi Matsuno y col. A new regulatory interaction suggested by
simulations for circadian genetic control mechanism in mammals.
En: Journal of bioinformatics and computational biology 4 (2006),
págs. 139-153. issn: 0219-7200. doi: 10.1142/S021972000600176X.
[MC00] Paul Munteanu y Denis Cau. Ecient Score-Based Learning of
Equivalence Classes of Bayesian Networks. En: vol. 1910. 2000,
págs. 96-105. url: http : / / www . springerlink . com / openurl .
asp?genre=article\&id=YPUDG2P2K0BK03U2.

151
REFERENCIAS

[Mew+02] H. W. Mewes y col. MIPS: a database for genomes and protein


sequences. En: Nucleic Acids Research 30.1 (2002), págs. 31-34.
doi: 10 . 1093 / nar / 30 . 1 . 31. eprint: http : / / nar . oxfordjou
rnals . org / content / 30 / 1 / 31 . full . pdf + html. url: http :
//nar.oxfordjournals.org/content/30/1/31.abstract.
[Mil+02] R. Milo y col. Network motifs: simple building blocks of complex
networks. En: Science (New York, N.Y.) 298 (2002), págs. 824-827.
issn: 00368075. doi: 10 . 1126 / science . 298 . 5594 . 824. arXiv:
0908.1143v1.
[MM99] Kevin Murphy y Saira Mian. Modelling gene expression data using
dynamic Bayesian networks. En: Life Sciences (1999). doi: 10.1.
1 . 87 . 4205. url: http : / / www - devel . cs . ubc . ca / ~murphyk /
Papers/ismb99.pdf.
[Mor+11] Camilo Mora y col. How Many Species Are There on Earth and
in the Ocean? En: PLoS Biol 9.8 (ago. de 2011), e1001127. doi:
10.1371/journal.pbio.1001127. url: http://dx.doi.org/10.
1371%2Fjournal.pbio.1001127.
[MSR91] Eric Mjolsness, David H. Sharp y John Reinitz. A connectionist
model of development. En: Journal of theoretical biology 152
(1991), págs. 429-453. issn: 0022-5193.
[MSY03] Pedro Mendes, Wei Sha y Keying Ye. Articial gene networks for
objective comparison of analysis algorithms. En: Bioinformatics.
Vol. 19. 2003. isbn: 1367-4811 (Electronic)\r1367-4803 (Linking).
doi: 10.1093/bioinformatics/btg1069.
[Mur89] Tadao Murata. Petri nets: Properties, analysis and applications.
En: vol. 77. 1989, págs. 541-580. doi: 10.1109/5.24143.
[NRF04] Iftach Nachman, Aviv Regev y Nir Friedman. Inferring
quantitative models of regulatory networks from expression data.
En: Bioinformatics. Vol. 20. 2004. isbn: 1367-4811 (Linking). doi:
10.1093/bioinformatics/bth941.
[OR02] George Orphanides y Danny Reinberg. A Unied Theory of Gene
Expression. En: Cell 108.4 (2002), págs. 439 -451. issn: 0092-8674.
doi: http://dx.doi.org/10.1016/S0092- 8674(02)00655- 4.
url: http://www.sciencedirect.com/science/article/pii/
S0092867402006554.
[Per+03] B.E. Perrin y col. Gene networks inference using dynamic
Bayesian networks. En: Bioinformatics 19.Suppl 2 (oct. de 2003),
págs. ii138-ii148. issn: 1367-4803. doi:
10 . 1093 / bioinformatics / btg1071. url:
http : / / bioinformatics . oxfordjournals . org / cgi / doi / 10 .
1093/bioinformatics/btg1071.

152
REFERENCIAS

[SAT00] Harald Steck, Siemens Ag y Corporate Technology. On the Use of


Skeletons when Learning in Bayesian Networks. En: Proceedings
of the 16th Conference on Uncertainty in AI. 2000, págs. 558-565.
[Sav98] M. A. Savageau. Rules for the evolution of gene circuitry. En:
Pacic Symposium on Biocomputing (1998), págs. 54-65. issn:
2335-6936.
[Sch+95] Mark Schena y col. Quantitative Monitoring of Gene Expression
Patterns with a Complementary DNA Microarray. En: Science
270.5235 (1995), págs. 467-470. doi: 10.1126/science.270.5235.
467. eprint: http://www.sciencemag.org/content/270/5235/
467 . full . pdf. url: http : / / www . sciencemag . org / content /
270/5235/467.abstract.
[SMF11] Thomas Schater, Daniel Marbach y Dario Floreano.
GeneNetWeaver: In silico benchmark generation and
performance proling of network inference methods. En:
Bioinformatics 27.16 (2011), págs. 2263-2270. doi:
10.1093/bioinformatics/btr373.
[TK12] Marc Teyssier y Daphne Koller. Ordering-Based Search: A
Simple and Eective Algorithm for Learning Bayesian Networks.
En: 2012, págs. 584-590. arXiv: 1207 . 1429v1. url:
http://ai.stanford.edu/~koller/Papers/Teyssier+Koller:
UAI05.pdf.
[TSK02] Yuhai Tu, Gustavo Stolovitzky y U Klein. Quantitative noise
analysis for gene expression microarray experiments. En:
Proceedings of the National Academy of Sciences of the United
States of America 99.22 (2002), págs. 14031-6. issn: 0027-8424.
doi: 10 . 1073 / pnas . 222164199. url:
http://www.pnas.org/content/99/22/14031.full.
[Vil+02] José M. G. Vilar y col. Mechanisms of noise-resistance in genetic
oscillators. En: vol. 99. 2002, págs. 5988-5992. isbn: 0027-8424
(Print)\n0027-8424 (Linking). doi: 10 . 1073 / pnas . 092133899.
arXiv: 0208044 [physics].
[WSR01] L. F. Wessels, Eugene P. van Someren y Marcel J. Reinders. A
comparison of genetic network models. En: Pacic Symposium on
Biocomputing 6 (2001), págs. 508-19. issn: 2335-6936. url: http:
//www.ncbi.nlm.nih.gov/pubmed/11262968.
[WWS99] D C Weaver, Christopher T. Workman y G D Stormo. Modeling
regulatory networks with weight matrices. En: Pacic Symposium
on Biocomputing (1999), págs. 112-123. issn: 2335-6936.

153
REFERENCIAS

Libros
[Alb+08] Bruce Alberts y col. Molecular Biology of the Cell. 5th. Garland
Science, 2008. isbn: 0815341059.
[DJ06] Kenneth A. De Jong. Evolutionary Computation: A Unied
Approach. MIT press, 2006, pág. 250. isbn: 0262041944. url:
http://mitpress.mit.edu/0262041944.
[Nea03] Richard E. Neapolitan. Learning Bayesian Networks. Vol. 6. 2003,
pág. 674. isbn: 0130125342. url: http://www.cs.technion.ac.
il/~dang/books/Learning%20Bayesian%20Networks(Neapolita
n,%20Richard).pdf.
[SGS01] Peter Spirtes, Clark Glymour y Rcihard Scheines. Causation,
Prediction, and Search, Second Edition (Adaptive Computation
and Machine Learning). 2nd. The MIT Press, 2001. isbn:
0262194406.
[VG01] Nagarajan Vaidehi y William A. Goddard. Computational
modeling of genetic and biochemical networks. En: MIT Press,
2001. Cap. Atomic-Level Simulation and Modeling of
Biomacromolecules, págs. 161-188.
[Wat99] Duncan J. Watts.Small worlds: the dynamics of networks between
order and randomness. Princeton University Press, 1999. url: ht
tp://research.microsoft.com/apps/pubs/default.aspx?id=
164512.

Memorias de investigación y tesis de posgrado


[Bou95] R.R. Bouckaert. Bayesian Belief Networks: from Construction to
Inference. Tesis doct. Utrecht, Netherlands: University of Utrecht,
1995.
[Gea04] Nicholas Geard. Modelling gene regulatory networks: systems
biology to complex systems. 2004, págs. 1-48. url:
http://eprints.soton.ac.uk/267777/1/modelling-GRNs.pdf.
[Har01] Alexander J. Hartemink. Principled Computational Methods for
the Validation and Discovery of Genetic Regulatory Networks.
Tesis doct. 2001, págs. 1-206.
[MG] Daniel Mateos García. Sistemas Regulatorios de la Expresión
Génica. Memoria de investigación. Universidad de Sevilla. url:
https://www.lsi.us.es/docs/doctorado/memorias/Memoria-
Invest-DMateosGarcia.pdf.

154
REFERENCIAS

[Mur02] Kevin P. Murphy. Dynamic Bayesian networks: representation,


inference and learning. Tesis doct. 2002, págs. 1-281. url: http:
//ibug.doc.ic.ac.uk/media/uploads/documents/courses/
DBN-PhDthesis-LongTutorail-Murphy.pdf.
[Pac09] Saulius Pacekajus. Ordering Estimation for Bayesian Network
Structure Learning. Tesis de mtría. 2009, págs. 1-43. url:
http : / / projekter . aau . dk / projekter / files / 61074622 /
1233327979.pdf.
[Rou04] Josep Roure. Incremental methods for Bayesian network structure
learning. Tesis doct. Software department, Technical University
of Catalonia, 2004. url: http : / / www . researchgate . net / pr
ofile / Josep _ Roure / publication / 220308912 _ Incremental _
methods_for_Bayesian_network_structure_learning/links/
00b4952244e782d8ac000000.pdf.
[Ste01] Harald Steck. Constraint-Based Structural Learning in Bayesian
Networks using Finite Data Sets. Tesis doct. Munich, Germany:
Department of Informatics, Technical University Munich, mayo de
2001. url: http://www.researchgate.net/publication/3642
1244_Constraint-Based_Structural_Learning_in_Bayesian_
Networks_using_Finite_Data_Sets.

Sitios en Internet
[Arr] ArrayExpress - functional genomics data. url: http://www.ebi.
ac.uk/arrayexpress/ (visitado 09-09-2014).
[Aws] Amazon Web Services (AWS) - Cloud Computing Services. url:
https://aws.amazon.com/ (visitado 12-05-2017).
[Cog] Clusters of Orthologous Groups (COGs). url: http : / / clovr .
org/docs/clusters- of- orthologous- groups- cogs/ (visitado
10-09-2014).
[Gena] GenBank. url: http : / / www . ncbi . nlm . nih . gov / genbank/
(visitado 08-09-2014).
[Genb] Gene Expression Omnibus: NCBI gene expression and
hybridization array data repository. url:
http : / / www . ncbi . nlm . nih . gov / pubmed / 11752295 (visitado
09-09-2014).
[Genc] Gene Ontology (GO). url: http://www.yeastgenome.org/help/
function-help/gene-ontology-go (visitado 10-09-2014).
[Jas] The Jaspar database. url: http://jaspar.binf.ku.dk/ (visitado
09-09-2014).
[Keg] KEGG: Kyoto Encyclopedia of Genes and Genomes. url: http:
//www.genome.jp/kegg/ (visitado 10-09-2014).

155
REFERENCIAS

[Ora] Orange - Data Mining Fruitful & Fun. url: https : / / orange .
biolab.si/ (visitado 14-05-2017).
[Pat] Pathguide: the pathway resource list. url: http://www.pathguide
.org/ (visitado 09-09-2014).
[Qt] Qt | Cross-platform software development for embedded & desktop.
url: https://www.qt.io/ (visitado 15-05-2017).
[R6] R6: Classes with Reference Semantics. url: https://cran.r-pro
ject.org/web/packages/R6/index.html (visitado 22-04-2017).
[Roo] Advanced R: OO eld guide. url: http://adv-r.had.co.nz/OO-
essentials.html (visitado 22-04-2017).
[Smd] Stanford Microarray Database. url: http://smd.princeton.edu/
(visitado 10-12-2014).
[Tra] Transcription Factor Binding Sites (Transfac) database. url: http
://www.biobase-international.com/product/transcription-
factor-binding-sites (visitado 09-09-2014).

Manuales
[SMR10] Thomas Schater, Daniel Marbach y Gilles Roulet.
GeneNetWeaver: In silico benchmark generation and performance
proling of network inference methods. 2010. url:
http://gnw.sourceforge.net/.
[R C13] R Core Team. R: A Language and Environment for Statistical
Computing. R Foundation for Statistical Computing. Vienna,
Austria, 2013. url: http://www.R-project.org/.
[RSt15] RStudio Team. RStudio: Integrated Development Environment for
R. RStudio, Inc. Boston, MA, 2015. url: http://www.rstudio.
com/.

156

You might also like