Professional Documents
Culture Documents
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 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
iii
ÍNDICE GENERAL
iv
ÍNDICE GENERAL
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
6. Resultados y conclusiones 89
6.1. Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
6.2. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
6.3. Trabajo Futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Glosario 143
Referencias 147
vi
Índice de guras
vii
ÍNDICE DE FIGURAS
viii
Índice de cuadros
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
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
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.
3
CAPÍTULO 1. INTRODUCCIÓN
4
Capítulo 2
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
6
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA
7
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA
2.1.3.1. Transcripción
2.1.3.2. Traducción
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.
9
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA
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]:
10
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA
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
• 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
13
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA
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 %)
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
16
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA
17
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA
18
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA
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.
20
CAPÍTULO 2. REDES DE REGULACIÓN GÉNICA
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]:
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.
23
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
24
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
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])
25
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
26
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
27
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
3.3.1.1. Supuestos
28
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
29
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
30
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
3.3.2.1. Supuestos
31
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
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
33
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
34
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
35
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
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)
36
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
37
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
3.4.1.1. Supuestos
38
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
39
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
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
40
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
41
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
42
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
43
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
44
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
Γ(α + β) α−1
p(Xi ) = Beta(Xi |α, β) = X (1 − Xi )β−1 (3.12)
Γ(α)Γ(β) i
45
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
46
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
47
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
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.
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.
dxi
= fi (xi ) + νi (t) (3.19)
dt
48
CAPÍTULO 3. MODELOS DE REDES DE REGULACIÓN GÉNICA
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:
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.
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
53
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
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.
54
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
3. Para cada uno de los conjuntos de datos, se ejecuta cada algoritmo por
evaluar.
55
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
56
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
57
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
58
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
59
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
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
Inteligencia de enjambre
61
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
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
P (D/G)P (G)
logP (G/D) = log = logP (D/G) + logP (G) + C (4.4)
P (D)
63
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
64
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
65
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
66
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
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.
68
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
69
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
70
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
4.8.2.2. Ordenamiento
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
4.8.3.2. Descripción
donde:
72
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
4.8.3.3. Pseudocódigo
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
73
CAPÍTULO 4. APRENDIZAJE ESTRUCTURAL EN REDES DE
REGULACIÓN GÉNICA
4.8.4.1. Descripción
4.8.4.2. Pseudocódigo
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
4.8.4.3. Análisis
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:
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
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.
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
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
81
CAPÍTULO 5. EXPERIMENTACIÓN
82
CAPÍTULO 5. EXPERIMENTACIÓN
83
CAPÍTULO 5. EXPERIMENTACIÓN
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.
85
CAPÍTULO 5. EXPERIMENTACIÓN
raíz
86
CAPÍTULO 5. EXPERIMENTACIÓN
raíz
B = 1c=6 B = 2c=4
raíz
raíz
87
CAPÍTULO 5. EXPERIMENTACIÓN
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
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
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
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
91
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES
92
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES
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
94
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES
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
97
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES
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
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
100
CAPÍTULO 6. RESULTADOS Y CONCLUSIONES
101
Apéndice A
Código fuente
102
APÉNDICE A. CÓDIGO FUENTE
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
105
APÉNDICE A. CÓDIGO FUENTE
106
APÉNDICE A. CÓDIGO FUENTE
107
APÉNDICE A. CÓDIGO FUENTE
108
APÉNDICE A. CÓDIGO FUENTE
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
113
APÉNDICE A. CÓDIGO FUENTE
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
116
APÉNDICE A. CÓDIGO FUENTE
117
APÉNDICE A. CÓDIGO FUENTE
118
APÉNDICE A. CÓDIGO FUENTE
119
APÉNDICE A. CÓDIGO FUENTE
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
122
APÉNDICE A. CÓDIGO FUENTE
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
125
APÉNDICE A. CÓDIGO FUENTE
126
APÉNDICE A. CÓDIGO FUENTE
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 }
132
APÉNDICE A. CÓDIGO FUENTE
133
APÉNDICE A. CÓDIGO FUENTE
58 return ( shd )
59 }
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
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
140
APÉNDICE A. CÓDIGO FUENTE
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
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
150
REFERENCIAS
151
REFERENCIAS
152
REFERENCIAS
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.
154
REFERENCIAS
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