Vous êtes sur la page 1sur 16

Algoritmos en Bioinformtica

Hctor Condori Alagn


II

Este trabajo est publicado bajo la licencia Creative Commons Attribution


Non-Commercial No Derivatives.
BY: $ =

\
ndice general

Prlogo V

1. Formatos para datos biolgicos 1


1.1. Secuencias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.1. Formato FASTA . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.1.2. Formato FASTQ . . . . . . . . . . . . . . . . . . . . . . . . . 2

2. Alineamiento de secuencias 5
2.1. Distancia entre cadenas . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2. La distancia de Hamming . . . . . . . . . . . . . . . . . . . . . . . 5
2.3. Distancia de edicin . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.4. El algoritmo de Smith-Waterman . . . . . . . . . . . . . . . . . . . 9
2.5. Affine gap penalty . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

III
IV NDICE GENERAL
Prlogo

Esta gua ha sido elaborada para la asignatura de Algoritmos y Biologa Compu-


tacional en la Maestra en Ciencias Mencin Informtica en la UNSAAC.
Usaremos problemas prcticos, como el problema del ensamblaje de genomas
como temas unificadores. El objetivo es estudiar los algoritmos que nos permiten
resolver estos problemas.
En esta gua usaremos los lenguajes Python y C++. Python es un lenguaje muy
conveniente para desarrollar y especificar algoritmos. Lo usaremos para estos fines.
C++ es uno de los lenguajes ms convenientes para desarrollar aplicaciones de
alto rendimiento. Tiene un buen equilibrio entre abstraccin y eficiencia. Es por
eso que, al estudiar un algoritmo, primero desarrollaremos una implementacin en
Python, y luego veremos cmo optimizar esta implementacin en C++.
A lo largo de esta gua, usaremos GNU/Linux. Este es es sistema operativo ms
usado en el mundo acadmico. Casi todo el software bioinformtico se desarrolla y
puede ejecutarse sin problemas en este sistema operativo.

V
VI PRLOGO
CAPTULO 1
Formatos para datos biolgicos

Existen muchos tipos de archivos para almacenar datos biolgicos. Gran parte
de archivos con los que se trabaja en bioinformtica son archivos de texto.
Por ejemplo, podemos estar interesados en almacenar

secuencias de nucletidos y aminocidos

estructuras moleculares

redes metablicas, de sealizacin

etc.

A continuacin, veremos los formatos ms utilizados para almacenar datos


biolgicos.

1.1. Secuencias
Una secuencia de nucletidos o la estructura primaria de una protena son
ejemplos de secuencias biolgicas. Si nos olvidamos de la estructura molecular
de dichas entidades, podemos representarlas simplemente como una sucesin de
caracteres o, lo que es lo mismo, cadenas. En esta seccin veremos algunos formatos
frecuentemente empleados para almacenar secuencias biolgicas.

1.1.1. Formato FASTA


Originalmente, FASTA era una utilidad empleada para alinear secuencias de DNA
y de protenas. El formato que empleaba para almacenar secuencias actualmente
es conocido tambin como FASTA. Muchos programas que trabajan con secuencias
consumen archivos en este formato, por lo que es importante conocerlo.
Aqu tenemos un ejemplo de archivo FASTA:

>sequence_1
TGACTGATCGTATCGTATGAGTGTACGTGTGTATAGGAGGCGTAGCGATA
GATCGATCGATCGAGTCTTATACTCGAGTCTATCGTATGCTGACTATCGT
TGATCGATCGATCGTATCTGATGCTAGTGCGATCTGATCTAGCATCACAT
TAGCAGCTA

1
2 CAPTULO 1. FORMATOS PARA DATOS BIOLGICOS

Como se ve en este ejemplo, en realidad se trata de un formato bastante sencillo.


La primera lnea contiene un identificador para la secuencia. El carcter > nos
indica que el encabezado empieza a continuacin. El encabezado, por lo general,
contiene el identificador de la secuencia. Generalmente, es la primera palabra
que sigue a >, hasta llegar a un delimitador, como un espacio o el carcter |. El
encabezado contina hasta el final de la lnea.
Luego, empieza la secuencia, que puede estar contenida por una o varias lneas
de texto. Por lo general, y para mejorar la legibilidad, la secuencia se distribuye en
varias lneas de igual longitud.
Estrictamente hablando, un archivo FASTA contiene slo una secuencia. Pero
es comn encontrar archivos FASTA conteniendo varios registros. Estos son los
archivos Multi-FASTA. Pero dado que es prcticamente el caso ms frecuente, estos
archivos son conocidos simplemente como archivos FASTA.

1.1.2. Formato FASTQ


Es un formato utilizado con bastante frecuencia por los secuenciadores de DNA
para retornar las lecturas efectuadas. Un tpico archivo FASTQ contiene mltiples
registros con el siguiente aspecto:

@SRR001666.1 071112_SLXA-EAS1_s_7:5:1:817:345 length=36


GGGTGATGGCCGCTGCCGATGGCGTCAAATCCCACC
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIII9IG9IC

Como en el caso del formato FASTA, un registro del formato FASTQ empieza
con un encabezado contiendo, entre otras cosas, el identificador de la secuencia.
Despus del identificador, puede incluirse informacin adicional, hasta el final de
la lnea.
En la siguiente lnea viene la secuencia en s. Por lo general, la secuencia est
contenida en slo una lnea de texto, aunque la secuencia puede extenderse por
ms de una lnea. Luego de la secuencia, viene el carcter + en una lnea de texto.
Despus de este carcter, y en la misma lnea, opcionalmente se puede encontrar
informacin adicional hasta el final de la lnea.
Luego, la siguiente lnea contiene informacin sobre la calidad de las lecturas
posicin a posicin. Cada carcter de esta lnea se corresponde con una posicin de
la secuencia del registro en cuestin.

GGGTGATGGCCGCTGCCGATGGCGTCAAATCCCACC
IIIIIIIIIIIIIIIIIIIIIIIIIIIIII9IG9IC

Cada carcter codifica un puntuacin de calidad para cada base leda en la


posicin correspondiente.
Pero, qu significan exactamente?
Por ejemplo, tomemos el caso de la primera base leda en este ejemplo, que es
G. A esta base le corresponde el carcter I.
Como primer paso, veamos que nmero le corresponde al carcter I en la co-
dificacin ASCII. Le corresponde el nmero 73. Ahora, le restamos 33 y obtenemos
40. Esta es la puntuacin Phred que le corresponde a la lectura de la base G.
1.1. SECUENCIAS 3

La puntuacin de calidad Phred es una forma de cuantificar la calidad de las


lecturas por parte de un dispositivo secuenciador de DNA. Estos dispositivos no son
infalibles. Casi siempre cometen errores de lectura. Por ejemplo, en lugar de base A
en cierta posicin, el secuenciador podra errneamente reportar una G. Phred es
un esquema para cuantificar estos errores.
Por ejemplo, supongamos que el secuenciador (mediante tcnicas que no discuti-
remos ahora y que adems varan de secuenciador en secuenciador) ha determinado
que la probabilidad de un error de lectura en la base leda en la primera posicin,
en nuestro ejemplo, una guanina, es de 1/10000.
En primer lugar, la puntuacin Phred viene dada por la siguiente frmula:

Q = 10 log10 P
Entonces, podemos expresar la probabilidad de error en Phred como
1
Q = 10 log10 = 40
10000
que a su vez codificamos como carcter sumndole 33 y dando como resultado el
carcter I, que es lo que encontramos en el archivo FASTQ.
En general, mientras ms alta sea la puntuacin Phred, mayor es la calidad de
la lectura. O en otras palabras, menor la probabilidad de error.
Es bastante frecuente, despus de secuenciar DNA y obtener las lecturas del
dispositivo secuenciador, filtrar las lecturas por calidad, descartando aquellas de
muy baja calidad, es decir, una puntuacin Phred baja. Por ejemplo, podemos elegir
descartar todas las lecturas con puntuaciones Phred menores a un umbral de 30.
4 CAPTULO 1. FORMATOS PARA DATOS BIOLGICOS
CAPTULO 2
Alineamiento de secuencias

En captulos anteriores vimos cmo hacer bsquedas exactas de un patrn en


un texto dado. Si bien es posible resolver muchos problemas con este tipo de
algoritmos, tambin nos podemos encontrar con el caso de patrones que no encajan
de forma exacta dentro del texto.

2.1. Distancia entre cadenas


En la bioinformtica y en otros mbitos es muy comn comparar cadenas. Como
caso trivial, tenemos el caso de verificar si dos cadenas son iguales o no. Pero
supongamos que queremos comparar cadenas no necesariamente iguales. Adems,
estamos interesados en saber, en caso de que no sean iguales, qu tan similares
son.
Primero, entonces, debemos establecer un criterio para cuantificar la similitud
entre cadenas, que a partir de este momento denominaremos la distancia entre dos
cadenas dadas.

2.2. La distancia de Hamming


Como primera aproximacin, podemos usar la distancia de Hamming como un
criterio para cuantificar la distancia entre dos cadenas. La distancia de Hamming
slo puede aplicarse a cadenas de igual longitud. Bsicamente, slo cuenta las
posiciones en las que las cadenas difieren. Por ejemplo, si tenemos las cadenas

CTGCATCTA
CTGTATATA

la distancia de Hamming es 2, porque las cadenas difieren en dos posiciones.


Si bien es un buen inicio, el problema es que la distancia de Hamming no es el
mejor criterio para cuantificar la distancia entre cadenas, al menos no en el contexto
de la comparacin de secuencias biolgicas. Como primera desventaja, podemos
mencionar que slo sirve para comparar cadenas de igual longitud. Adems, no
puede identificar similitudes evidentes, como en el siguiente ejemplo.

CTGCATCTA
ACTGCATCT

5
6 CAPTULO 2. ALINEAMIENTO DE SECUENCIAS

En este ejemplo, vemos que si bien la distancia de Hamming entre estas cadenas
es 9, es decir, que los caracteres son distintos en cada posicin, es evidente que
ambas cadenas son bastante similares. Si introducimos un espacio al inicio de la
primera cadena, obtenemos lo siguiente:

CTGCATCTA
ACTGCATCT

con lo que queda claro que este no es precisamente el mejor criterio para comparar
cadenas biolgicas.

2.3. Distancia de edicin


Tambin conocida como distancia de Levenshtein, en honor al cientfico que
estudi este tipo de distancia. La distancia de edicin cuenta el mnimo nmero de
operaciones de edicin que debemos hacer sobre una de las cadenas para convertirla
en la otra cadena.
Las operaciones de edicin son: sustitucin, insercin y eliminacin. Son prc-
ticamente las operaciones que podemos hacer en un editor de texto, de ah el
nombre.
Por ejemplo, si queremos calcular la distancia de edicin entre las siguientes
cadenas:

CTGCATCTA
CTGCATCA

podemos simular el aplicar operaciones de edicin sobre la primera cadena para


convertirla en la otra. Por ejemplo, podemos eliminar el ltimo carcter

CTGCATCT
CTGCATCA

y luego sustituir el ltimo carcter, la T, por una A.

CTGCATCA
CTGCATCA

En la seccin anterior vimos un ejemplo de distancia de Hamming entre dos


cadenas. Estas eran:

CTGCATCTA
ACTGCATCT

Vimos que era evidente que se parecan bastante. De hecho, podemos considerar
la segunda cadena como el resultado de insertar una A al inicio y borrar el ltimo
carcter. En realidad, no importa el orden de las operaciones. Lo que importa es el
nmero mnimo de operaciones.
Ahora, cmo hallamos este nmero mnimo? El caso trivial es comparar una
cadena vaca, que denotamos con , y una cadena no vaca s. En este caso, la
distancia de edicin es la longitud de s, porque para convertir  en s, habr que
hacer tantas inserciones en  como caracteres tenga s.
2.3. DISTANCIA DE EDICIN 7

Supongamos que s1 = X y s2 = Y , es decir, que y son prefijos de s1 y s2 ,


respectivamente, slo dejando de lado sus ltimos caracteres, X y Y . Denotamos
con |s| la longitud de una cadena. Adems, la distancia entre caracteres d es
d(a, b) = 0 si a = b, y 1 en caso contrario.
Podemos plantear el siguiente algoritmo recursivo. Supongamos que comenza-
mos a analizar las cadenas desde sus ltimas posiciones. Entonces, podemos hacer
tres conjeturas.

que tenemos la distancia entre los prefijos y ,

que tenemos la distancia entre s1 y el prefijo ,

que tenemos la distancia entre s2 y el prefijo .

En el primer caso, an queda sumar el resultado de la comparacin entre el


ltimo par de caracteres X y Y .
En el segundo caso, asumimos una operacin de eliminacin al final de la
cadena s1 . Por lo tanto, le sumamos 1 por esta operacin.
En el tercer caso, asumimos una operacin de insercin al final de la cadena s1 .
Por lo tanto, le sumamos 1 por esta operacin.
Entonces, tenemos la siguiente funcin recursiva:


|s2 | si s1 = 

|s1 | si s2 = 



lev(s1 , s2 ) = lev(, ) + d(X, Y )





min lev(s1 , ) + 1

lev(, s2 ) + 1

Podemos implementar esta funcin en Python casi sin modificaciones.

def lev(s1, s2):


if len(s1) == 0:
return len(s2)
if len(s2) == 0:
return len(s1)
subs_score = lev(s1[:-1], s2[:-1])
+ (0 if s1[-1] == s2[-1] else 1)
ins_score = lev(s1[:-1], s2) + 1
del_score = lev(s1, s2[:-1]) + 1
return min(subs_score, ins_score, del_score)

La verdad, es una forma muy elegante de resolver este problema, aunque no


una muy eficiente que digamos.
El problema es que por cada llamada a esta funcin, se generan otras tres
llamadas recursivas, y as sucesivamente. El nmero de llamadas crece de forma
exponencial.
Este tipo de algoritmos puede implementarse fcilmente utilizando la tcnica
de programacin dinmica.
8 CAPTULO 2. ALINEAMIENTO DE SECUENCIAS

En lugar de lanzar llamadas recursivas partiendo de la instancia ms grande


del problema, vamos resolviendo problemas ms pequeos, con cuyas resoluciones
vamos construyendo la solucin al problema ms grande, que es el que queremos
resolver.
Podemos hacer esto con una tabla, la cual vamos llenando con los resultados de
resolver estos problemas ms pequeos.
Por ejemplo, volvamos al ejemplo de las cadenas ACTGCATCT y CTGCATCTA.
Primero, creamos la tabla que contendr las soluciones a los subproblemas
y al problema principal. Llenamos la primera fila y la primera columna con las
soluciones a los casos base, es decir, los resultados de comparar una cadena vaca
con otra no vaca.

 C T G C A T C T A
 0 1 2 3 4 5 6 7 8 9
A 1
C 2
T 3
G 4
C 5
A 6
T 7
C 8
T 9

Ahora, antes de seguir llenando la tabla, fijmonos en una celda arbitraria.


De acuerdo a la relacin de dependencia para hallar la distancia de edicin, po-
demos ver que una celda necesita otras tres celdas computadas previamente. Si
denominamos como Di,j a una celda arbitraria, entonces tenemos esta relacin de
dependencia:

Di1,j1 Di1,j

Di,j1 Di,j

Por ejemplo, computemos la celda D1,1 (D0,0 es la primera celda, y su valor


es 0). En este caso, Di1,j1 = D0,0 = 0, Di1,j = D0,1 = 1, Di,j1 = D1,0 = 1 y
d(A, C) = 1. Entonces, el resultado de la celda es min(D0,0 + d(A, C), D0,1 , D1,0 ) =
min(1, 1, 1) = 1.
De este mismo modo, computamos el resto de celdas, iterando vertical u hori-
zontalmente por la tabla. De este modo, completamos la tabla y obtenemos:
2.4. EL ALGORITMO DE SMITH-WATERMAN 9

 C T G C A T C T A
 0 1 2 3 4 5 6 7 8 9
A 1 1 2 3 4 4 5 6 7 8
C 2 1 2 3 3 4 5 5 6 7
T 3 2 1 2 3 4 4 5 5 6
G 4 3 2 1 2 3 4 5 6 6
C 5 4 3 2 1 2 3 4 5 6
A 6 5 4 3 2 1 2 3 4 5
T 7 6 5 4 3 2 1 2 3 4
C 8 7 6 5 4 3 2 1 2 3
T 9 8 7 6 5 4 3 2 1 2

De esta tabla, nos interesa la ltima celda. El valor de esta celda es 2, que es la
distancia de edicin entre estas cadenas.

2.4. El algoritmo de Smith-Waterman


El algoritmo de Smith-Waterman es empleado para buscar similitudes locales
entre secuencias. A diferencia de los algoritmos que vimos en secciones anteriores,
el algoritmo de Smith-Waterman no intenta alinear el total de las secuencias.
Podemos definir este algoritmo de la siguiente forma:

H(i, 0) = 0, 0 i m
H(0, j) = 0, 0 j n



0

H(i 1, j 1) + s(ai , bj ) Sustitucin

H(i, j) = max , 1 i m, 1 j n

maxk1 {H(i k, j) + W } Eliminacin
maxl1 {H(i, j l) + W } Insercin

Por costumbre, se designa con la letra H a la tabla. s es la matriz de sustituciones.


W es la penalidad por los huecos en el alineamiento.
Al finalizar de llenar la tabla (o mientras se llena la tabla), debemos buscar
la celda con la mayor puntuacin. Esta es puntuacin del alineamiento. Para
reconstruir el alineamiento, debemos retroceder a partir de esta celda, buscando
en cada iteracin la celda de donde vino el valor que contiene la celda en cuestin,
y moverse a esa celda. El proceso se repite hasta encontrar una celda con valor 0.

2.5. Affine gap penalty


En la seccin anterior, la penalidad por huecos es igual para cada uno de los
huecos, sin importar si estn juntos o no. Existen otros criterios para puntuar. Por
ejemplo, podemos puntuar los huecos adyacentes de la siguiente manera.

p = gap_open + l gap_extend
10 CAPTULO 2. ALINEAMIENTO DE SECUENCIAS

donde gap_open es el costo de abrir el hueco y gap_extend es el costo de


extenderlo, es decir, el costo por cada hueco individual.
Entonces, en base a este criterio, podemos definir el algoritmo de Smith-
Waterman de esta forma:

H(i, 0) = 0 0im
H(0, j) = 0 0jn

0
H(i 1, j 1) + s(ai , bj )

H(i, j) = max 1 i m, 1 j n

Ei,j
Fi,j


0  j=0
E(i, j) = Hi,j1 Q
max j>0
Ei,j1 R

0  i=0
F (i, j) = Hi1,j Q
max i>0
Ei1,j R
Como de costumbre, H es la tabla de puntuaciones. E y F son las penalidades
acumuladas para los huecos. Q es la penalidad para la apertura del hueco y R es la
penalidad por extenderlo.
De igual forma, se debe buscar la celda con la mayor puntuacin y saltar de
celda en celda hasta encontrar un 0.

Vous aimerez peut-être aussi