¿Cómo se comparan dos secuencias?
El alineamiento por parejas coloca dos secuencias una sobre otra para ver cuánto se parecen. Una puntuación convierte ese parecido en un número, y así se pueden comparar muchas parejas con justicia.
Dos secuencias casi iguales pueden diferir en una base de más o de menos. El alineamiento deja un hueco justo ahí y el resto vuelve a coincidir.
Al final de esta lección
Nota
Puedo calcular la puntuación de un alineamiento global con coincidencias, discrepancias y huecos.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Alineamiento | dos secuencias colocadas una sobre otra, columna a columna | |
| Coincidencia | una columna con la misma base arriba y abajo | |
| Discrepancia | una columna con dos bases distintas | |
| Hueco | una columna con un guion: falta una base | G-TC |
| Puntuación | la suma de lo que vale cada columna |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cada columna del alineamiento suma o resta
Se escriben las dos secuencias una encima de otra y se puntúa cada columna. En este módulo una coincidencia vale +1, una discrepancia vale -1 y un hueco vale -2.
La puntuación del alineamiento es la suma de todas las columnas. Cuanto más alta, más se parecen las secuencias.
Ejemplo resuelto: puntuar GATC contra G-TC
| Columna | Arriba | Abajo | Qué es | Puntos |
|---|---|---|---|---|
| 1 | G | G | Coincidencia | +1 |
| 2 | A | - | Hueco | -2 |
| 3 | T | T | Coincidencia | +1 |
| 4 | C | C | Coincidencia | +1 |
| Total | 1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Puntúa el alineamiento con un programa
docker exec jupyter python3 -c "a='GATC'; b='G-TC'; print(sum(-2 if '-' in (x, y) else (1 if x == y else -1) for x, y in zip(a, b)))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuenta coincidencias, discrepancias y huecos
docker exec jupyter python3 -c "a='GATC'; b='G-TC'; print(sum(1 for x, y in zip(a, b) if x == y), sum(1 for x, y in zip(a, b) if x != y and '-' not in (x, y)), (a + b).count('-'))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Hay muchos alineamientos y se busca el mejor
Para dos secuencias hay muchísimas formas de colocar huecos. Probarlas todas tarda demasiado. El alineamiento global busca la que da la puntuación más alta.
Comparar letra a letra sin huecos suele fallar: una base de más desplaza todo lo que viene después, y parece que no se parecen.
Compara GATC con GTC sin ningún hueco
docker exec jupyter python3 -c "a='GATC'; b='GTC'; print(sum(1 if x == y else -1 for x, y in zip(a, b)))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una tabla guarda las mejores puntuaciones
Se hace una tabla. Cada celda es la mejor puntuación de un trozo del principio de la primera secuencia contra un trozo del principio de la segunda.
Una celda toma el mayor de tres valores. Uno es la celda en diagonal más una coincidencia o discrepancia. Otro es la de arriba más un hueco, y el tercero la de la izquierda más un hueco. La primera fila y la primera columna son huecos: 0, -2, -4, y así.
Ejemplo resuelto: la tabla de GATC contra GTC
| Inicio | G | T | C | |
|---|---|---|---|---|
| Inicio | 0 | -2 | -4 | -6 |
| G | -2 | 1 | -1 | -3 |
| A | -4 | -1 | 0 | -2 |
| T | -6 | -3 | 0 | -1 |
| C | -8 | -5 | -2 | 1 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Rellena la tabla con dos bucles
# Rellena la tabla: la mejor puntuación para cada pareja de prefijos.
a = "GATC"
b = "GTC"
match = 1
mismatch = -1
gap = -2
table = []
for i in range(len(a) + 1):
table.append([0] * (len(b) + 1))
for i in range(1, len(a) + 1):
table[i][0] = i * gap
for j in range(1, len(b) + 1):
table[0][j] = j * gap
for i in range(1, len(a) + 1):
for j in range(1, len(b) + 1):
if a[i - 1] == b[j - 1]:
diagonal = table[i - 1][j - 1] + match
else:
diagonal = table[i - 1][j - 1] + mismatch
up = table[i - 1][j] + gap
left = table[i][j - 1] + gap
table[i][j] = max(diagonal, up, left)
for row in table:
print(row)
# La celda de abajo a la derecha es la mejor puntuación. Cambia b a "GAC".
Un error muy común
Advertencia
Mucha gente cree que basta con comparar las secuencias letra a letra desde la izquierda. Si una secuencia tiene una base de más, todas las columnas siguientes quedan desplazadas. Un hueco las recoloca. Por eso se prueban huecos y se elige la mejor puntuación.
Para ir más lejos: otra tabla
Rellena a mano la tabla de AGT contra AT con +1, -1 y -2. Después comprueba la esquina final con tu función. ¿Qué pasa si las dos secuencias se intercambian? Prueba con GATC y GTC en los dos órdenes.