¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Puntuación, huecos y alineamiento local

Después de esta lección: Puedo cambiar la puntuación de un alineamiento y decir cuándo conviene el alineamiento local.

Lección de 75 min3 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Cómo cambia la puntuación el alineamiento?

La puntuación de un alineamiento depende de tres números que elige quien analiza: lo que vale una coincidencia, una discrepancia y un hueco. Cambiar esos números cambia qué alineamiento sale como el mejor.

Además hay dos formas de alinear: global, de un extremo a otro, y local, que busca solo el mejor trozo en común.

Al final de esta lección

Nota

Puedo cambiar la puntuación de un alineamiento y decir cuándo conviene el alineamiento local.

Palabras clave

PalabraQué significaEjemplo
Penalización de huecolos puntos que resta cada hueco-2
Alineamiento globalalinea las dos secuencias enteras
Alineamiento localbusca solo el mejor trozo en común
Trozo comúnuna parte parecida en las dos secuencias
Umbralla puntuación mínima para decir que se parecen

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

La penalización de hueco cambia el mejor alineamiento

Si un hueco cuesta poco, el alineamiento usa huecos con facilidad. Si cuesta mucho, los evita y acepta discrepancias.

No hay un valor correcto para siempre. Se elige según lo que se busca, y se dice cuál se usó para que otra persona repita el resultado.

Ejemplo resuelto: GATC contra G-TC con tres huecos

Penalización de huecoCoincidenciasHuecoPuntuación total
-13 x (+1) = 3-12
-23 x (+1) = 3-21
-43 x (+1) = 3-4-1

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Puntúa el mismo alineamiento con tres huecos

Comando
docker exec jupyter python3 -c "a='GATC'; b='G-TC'; print([sum(g if '-' in (x, y) else (1 if x == y else -1) for x, y in zip(a, b)) for g in (-1, -2, -4)])"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El alineamiento local busca solo el mejor trozo

A veces solo una parte de dos secuencias se parece, y el resto no. El alineamiento global paga las discrepancias de los extremos y la puntuación baja.

El alineamiento local ignora los extremos. La tabla nunca baja de 0. La primera fila y la primera columna valen 0. La respuesta es la celda más alta de toda la tabla.

Puntúa dos secuencias columna a columna

Comando
docker exec jupyter python3 -c "a='TTGACGTT'; b='CCGACGCC'; 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.

Mira el trozo del medio

Comando
docker exec jupyter python3 -c "a='TTGACGTT'; b='CCGACGCC'; print(a[2:6], b[2:6], a[2:6] == b[2:6])"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Calcula la puntuación global y la local

Código: python
def best_score(a, b, match, mismatch, gap, local):
    # En el local la tabla nunca baja de 0 y se guarda la celda más alta
    table = []
    for i in range(len(a) + 1):
        table.append([0] * (len(b) + 1))
    if not local:
        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
    best = 0
    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
            value = max(diagonal, table[i - 1][j] + gap, table[i][j - 1] + gap)
            if local and value < 0:
                value = 0
            table[i][j] = value
            if value > best:
                best = value
    if local:
        return best
    return table[len(a)][len(b)]

print(best_score("TTGACGTT", "CCGACGCC", 1, -1, -2, True))
print(best_score("TTGACGTT", "CCGACGCC", 1, -1, -2, False))

Ejemplo resuelto: TTGACGTT contra CCGACGCC

TipoQué cuentaPuntuación
GlobalLas dos secuencias enteras, con las discrepancias de los extremos0
LocalSolo el trozo GACG, que coincide en las dos4

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Un error muy común

Advertencia

Mucha gente cree que la puntuación local está siempre en la esquina de abajo a la derecha, como la global. No: el mejor trozo puede estar en cualquier parte. Hay que buscar la celda más alta de toda la tabla, y esa celda nunca es negativa.

Se elige global o local según la pregunta

Usa el alineamiento global cuando las dos secuencias tienen un tamaño parecido y quieres compararlas enteras.

Usa el local cuando una secuencia es larga y buscas en ella un trozo parecido a otra más corta. Después se compara la puntuación con un umbral para decidir si el parecido importa.

Para ir más lejos: tres umbrales

Con tu función local, prueba la pareja GGGATTTCCC y AAATTTAAA. Su puntuación local es 4, el trozo ATTT. ¿Con qué umbral dirías que se parecen? Prueba 3, 4 y 5 y escribe qué decides en cada caso.

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.