L'allineamento
Edit distance Le operazioni permesse sono: I: insert (inserimento, inserzione) D: delete (cancellazione, delezione, rimozione) R: replacement (substition, sostituzione) M: match (corrispondenza, accoppiamento, uguaglianza) v intner RIMDMDMMI wri t ers
Edit transcript Definizione Una stringa su un alfabeto {I,D,R,M} che descrive una trasformazione da una stringa ad un'altra e' detta edit transcript (trascrizione) delle due stringhe. Date due stringhe A e B, sia T la trascrizione da A a B. Se in T sostituiamo le I con D e contemporaneamente le D con le I otteniamo una trascrizione T' da B ad A.
Esempio di commutatività v intner RIMDMDMMI wri t ers RDMIMIMMD v intner
Edit distance Definizione La edit distance fra due stringhe e' definita come il minimo numero di operazione di edit (inserzioni, delezioni e sostituzioni) necessarie a trasformare una stringa nell'altra. NOTA BENE: i match non sono contati! La edit distance e' conosciuta anche come Levenshtein distance
Edit distance problem L'edit distance problem e' computare la edit distance fra due stringhe date, in modo che l'edit transcript sia ottimale Traduzione: trovare il trascritto che minimizza la distanza. Molto spesso si usa come sinonimo problema dell'allineamento
Il problema dell'allineamento Definizione Un allineamento (globale) di due stringhe S1 e S2 è ottenuto inserendo spazi (o linee) all'interno o agli estremi di S1 e S2, così da poter posizione le due stringhe una di sopra all'altra in modo che ogni carattere o spazio delle due stringhe è allineato con un'unico carattere o un'unico spazio nell'altra stringa qac-dbd qawx-b-
Edit trascript vs Allineamento Descrivano una relazione fra due stringhe Matematicamente sono equivalenti (possono essere convertiti da uno all'altro) Un edit trascript descrive come trasformare una stringa in un'altra mentre l'allineamento mostra solo le relazioni
Edit trascript vs Allineamento Si può passa da un edit trascript ad un allineamento e viceversa Due caratteri contrapposti che non coincidono in un'allineamento corrispondono ad una sostituzione Uno spazio contenuto nella prima stringa da allineare coincide con un inserimento per la prima stringa Uno spazio contenuto nella seconda stringa da allineare coincide con una delezione per la prima stringa
Calcolo della Edit Distance Definizione Date due stringhe S1 e S2, definiamo D(i,j) come l'edit distance delle stringe S1[1..i] e S2[1..j] Se S1 =n e S2 =m, D(n,m) è il minimo numero di operazioni di edit per trasformare S1 in S2.
Funzione D D è definita come segue: D(i,0) = i 0 i n D(0,j) = j 0 j m per i e j maggiori contemporanemanete di 0: D(i,j) = min { D(i-1,j) + 1, D(i,j-1) + 1, D(i-1,j-1) + t(i,j) } t(i,j) = 0 se S1[i] = S2[j] t(i,j) = 1 se S1[i] S2[j]
Soluzione ricorsiva 1 function D(i, j) 2 if (i = 0) return j; 3 if (j = 0) return i; 4 if (S1[i] = S2[j]) then t := 0; else t := 1; 5 return min( D(i-1, j) + 1, 6 D(i, j-1) + 1, 7 D(i-1, j-1) + t ); 8 EditDistance = D(n, m);
Correttezza della funzione D Lemma Il valore di D(i,j) può essere D(i,j-1)+1, D(i- 1,j)+1 oppure D(i-1,j-1)+t(i,j). Non ci sono altre possibilità Lemma D(i,j) min{d(i-1,j)+1, D(i,j-1)+1, D(i-1,j-1)+t(i,j)} Teorema Quando i e j sono strettamente positivi D(i,j) = min{d(i-1,j)+1, D(i,j-1)+1, D(i-1,j-1)+t(i,j)}
Complessità Un simile programma è altamente inefficiente e richiede un numero esponenziale sulle lunghezze di S1 e S2 di chiamate alla funzione D gli stessi valori di D(i,j) vengono calcolati più volte E' una strategia top-down
Osservazioni Esistono solo (n+1)(m+1) possibili combinazioni per i e j, quindi esistono al massimo (n+1)(m+1) possibili chiamate ricorsive Possiamo salvare questi valori in un matrice Invece di partire dall'allineamento totale possiamo cominciare con i casi basi ed estendere le lunghezze delle stringhe SOLUZIONE: programmazione dinamica
Programmazione dinamica Consiste nel risolvere un'istanza di un problema usando le informazioni precalcolate su istanze più piccole. Prese due sequenze S1 e S2, invece di determinare la soluzione per le due stringhe nella loro interezza, costruiremo la soluzione determinando le similarità fra i possibili prefissi delle due sequenze E' una strategia bottom-up
Programmazione dinamica Dobbiamo definire: relazione di ricorrenza computazione tabulare traceback La relazione di ricorrenza è D
Computazione tabulare Memorizziamo tutti i valori calcolati da D(i,j) in una tabella (matrice di (n+1) righe per (m+1) colonne) Calcoliamo D(i,j) per valori piccoli di i e j la prima righa (i=0) e la prima colonna (j=0) saranno riempiti con i casi base della ricorsione Procediamo incrementando i e j incrementiamo i e poi calcoliamo D per tutti i possibili j, partendo da zero
Esempio w r i t e r s 0 1 2 3 4 5 6 7 0 0 1 2 3 4 5 6 7 v 1 1 1 2 3 4 5 6 7 i 2 2 2 2 2 3 4 5 6 n 3 3 3 3 3 3 4 5 6 t 4 4 4 4 4 3 4 5 6 n 5 5 5 5 5 4 4 5 6 e 6 6 6 6 6 5 4 5 6 r 7 7 7 6 7 6 5 4 5
Algoritmo 1 function EditDistance(S1,S2) 2 n := S1 ; 3 m := S2 ; 4 for i := 0 to n do a[i,0] := i; 5 for j := 1 to m do a[0,j] := j; 6 for i := 1 to n do 7 for j := 1 to m do 8 if (S1[i] = S2[j]) then t := 0; else t := 1; 9 a[i,j] := min ( a[i-1,j]+1, a[i,j-1]+1, 10 a[i-1,j-1]+t ); 11 return a[n,m];
Tempo Teorema Utilizzando il metodo della programmazione dinamica possiamo completare una tabella per il calcolo dell'edit distance fra due stringhe di lunghezze n e m in tempo O(nm). Cioé l'edit distance D(n,m) fra due stringhe può essere calcolata in tempo O(nm). Osservazione: non è importante l'ordine con cui vengono calcolate le celle
Traceback Una volta calcolata la edit distance bisogna ricostruire gli edit trascript Bisogna cercare un cammino (minimo) che da (n,m) porti a (0,0) SOLUZIONE: utilizzare dei puntatori durante la costruzione della tabella
Puntatori Ogni volta che calcoliamo la cella (i,j) se D(i,j) = D(i,j-1)+1 allora inseriamo un puntatore da (i,j) a (i,j-1) se D(i,j) = D(i-1,j)+1 allora inseriamo un puntatore da (i,j) a (i-1,j) se D(i,j) = D(i-1,j-1)+t(i,j) allora inseriamo un puntatore da (i,j) a (i-1,j-1) le cella della prima riga e della prima colonna hanno un solo puntatore, le altre celle possono avere da uno a tre puntatori
Esempio w r i t e r s 0 1 2 3 4 5 6 7 0 v 1 i 2 n 3 t 4 n 5 e 6 r 7 0 1 2 3 4 5 6 7 1 1 2 3 4 5 6 7 2 2 2 2 3 4 5 6 3 3 3 3 3 4 5 6 4 4 4 4 3 4 5 6 5 5 5 5 4 4 5 6 6 6 6 6 5 4 5 6 7 7 6 7 6 5 4 5
Interpretazione L'edit transcript si ricostruisce (al contrario) seguendo uno (o tutti) i cammini che da (n,m) portano a (0,0) un puntatore orizzontale (da (i,j) a (i,j-1)) è un inserimento (I) del carattere S2[j] in S1 un puntatore verticale (da (i,j) a (i-1,j)) è la cancellazione (D) del carattere S1[i] da S1 un puntatore diagolale (da (i,j) a (i-1,j-1)) può corrispondere a un match (M) se S1[i]=S2[j] oppure a una sostituzione (R) se S1[i] S2[j]
Algoritmo 1 function EditTranscript(i,j) 2 if (i = 0) and (j=0) then return ''; 3 if ( in a[i,j]) then 4 if S1[i] = S2[j] then T:='M' else T='R'; 5 return EditTranscript(i-1,j-1). 'T'; 6 if ( in a[i,j]) then 7 return EditTranscript(i,j-1). 'I'; 8 if ( in a[i,j]) then 9 return EditTranscript(i-1,j). 'D'; 10 transcript = EditTranscript(n,m);
Interpretazione alternativa Dal punto di vista dell'allineamento di S1 con S2: un puntatore orizzontale è uno spazio inserito in S1 un puntatore verticale è uno spazio inserito in S2 un puntatore diagonale può essere un match o un mismatch
Allineamenti ottimi Esistono 3 allineamenti ottimi (3 percorsi minimi) che portano da (7,7) a (0,0): vintner- v-intner- -vintner- RRRMDMMI RIMDMDMMI IRMDMDMMI writ-ers wri-t-ers wri-t-ers
Tempo e correttezza del traceback Teorema Dopo che la matrice della programmazione dinamica è stata completata con i puntatori, un edit trascript ottimale può essere calcolato in tempo O(n+m) Teorema Tutti i cammini da (n,m) a (0,0) che seguono i puntatori durante la computazione di D(i,j) forniscono un edit transcript minimo rispetto al numero di operazioni di edit. Viceversa, ogni edit transcript ottimale è specificato da un cammino da (n,m) a (0,0)
Operation weights Generalizziamo i costi di una operazione di edit una inserzione o una delezione avrà costo d una sostituzione avrà costo r un match avrà costo e Definizione Si chiama problema della edit distance con operazioni pesate il problema di determinare un edit trascript che trasforma una stringa S1 in una stringa S2 con peso minimo delle operazioni
Operation weights D è ri-definita come segue: D(i,0) = i*d 0 i n D(0,j) = j*d 0 j m per i e j maggiori contemporanemanete di 0: D(i,j) = min { D(i-1,j) + d, D(i,j-1) + d, D(i-1,j-1) + t(i,j) } t(i,j) = e se S1[i] = S2[j] t(i,j) = r se S1[i] S2[j] con d=1, r=0, r=1 otteniamo la funzione standard per l'edit distance
Esempio d=4 r=2 e=1 writ-ers vintner- Un'altro schema molto usato è: d=-2 r=-1 e=+1 ma in questo casi si cerca di massimizzare (score massimo)
Nota Bene Poiché lo scopo della funzione è quello di minimizzare il peso totale e poiché una sostituzione può essere vista come una delezione seguita da un inserimento, per permettere le sostituzioni il loro peso deve essere minore della somma di una cancellazione più un inserimento r < 2 * d
Esempio d=1 e=0 r=3 dna d-na RMM 3 DIMM 2 rna -rna
Algoritmo 1 function OperationWeightEditDistance(S1,S2) 2 n := S1 ; 3 m := S2 ; 4 for i := 0 to n do a[i,0] := i*d; 5 for j := 1 to m do a[0,j] := j*d; 6 for i := 1 to n do 7 for j := 1 to m do 8 if (S1[i] = S2[j]) then t := e; else t := r; 9 a[i,j] := min ( a[i-1,j]+d, a[i,j-1]+d, 10 a[i-1,j-1]+t ); 11 return a[n,m];
Alphabet-weight Edit Distance Un'altra generalizzazione è permettere di avere pesi diversi per una sostituzione a seconda di quale carattere viene rimosso e quale carattere viene aggiunto Ad esempio vorremmo che la sostituzione di una A con una T pesi di più rispetto alla G Similmente, per inserimenti e cancellazioni, vogliamo che a seconda del carattere inserito o cancellato il costo cambi NB: il peso è locale, non influenzato dalla posizione sulle stringhe
Quali sono i pesi migliori? In letteratura esistono diverse versioni per il DNA viene usata la matrice +5/-4 per gli aminoacidi viene usata la BLOSUM62 (sono le matrici usate da Dotter e BLAST) Sono proposti e verificati in modo sperimentale (utilizzandoli)
Come diventa D? (+5/-4) D è ri-definita come segue: D(i,0) = -4*i 0 i n D(0,j) = -4*j 0 j m per i e j maggiori contemporanemanete di 0: D(i,j) = max { D(i-1,j) - 4, D(i,j-1) - 4, D(i-1,j-1) + t(i,j) } t(i,j) = 5 se S1[i] = S2[j] t(i,j) = -4 se S1[i] S2[j] NB: in questo caso si vuole massimizzare
BLOSUM62 A R N D C Q E G H I L K M F P S T W Y V B Z X * A 4-1 -2-2 0-1 -1 0-2 -1-1 -1-1 -2-1 1 0-3 -2 0-2 -1-1 -4 R -1 5 0-2 -3 1 0-2 0-3 -2 2-1 -3-2 -1-1 -3-2 -3-1 0-1 -4 N -2 0 6 1-3 0 0 0 1-3 -3 0-2 -3-2 1 0-4 -2-3 3 0-1 -4 D -2-2 1 6-3 0 2-1 -1-3 -4-1 -3-3 -1 0-1 -4-3 -3 4 1-1 -4 C 0-3 -3-3 9-3 -4-3 -3-1 -1-3 -1-2 -3-1 -1-2 -2-1 -3-3 -1-4 Q -1 1 0 0-3 5 2-2 0-3 -2 1 0-3 -1 0-1 -2-1 -2 0 3-1 -4 E -1 0 0 2-4 2 5-2 0-3 -3 1-2 -3-1 0-1 -3-2 -2 1 4-1 -4 G 0-2 0-1 -3-2 -2 6-2 -4-4 -2-3 -3-2 0-2 -2-3 -3-1 -2-1 -4 H -2 0 1-1 -3 0 0-2 8-3 -3-1 -2-1 -2-1 -2-2 2-3 0 0-1 -4 I -1-3 -3-3 -1-3 -3-4 -3 4 2-3 1 0-3 -2-1 -3-1 3-3 -3-1 -4 L -1-2 -3-4 -1-2 -3-4 -3 2 4-2 2 0-3 -2-1 -2-1 1-4 -3-1 -4 K -1 2 0-1 -3 1 1-2 -1-3 -2 5-1 -3-1 0-1 -3-2 -2 0 1-1 -4 M -1-1 -2-3 -1 0-2 -3-2 1 2-1 5 0-2 -1-1 -1-1 1-3 -1-1 -4 F -2-3 -3-3 -2-3 -3-3 -1 0 0-3 0 6-4 -2-2 1 3-1 -3-3 -1-4 P -1-2 -2-1 -3-1 -1-2 -2-3 -3-1 -2-4 7-1 -1-4 -3-2 -2-1 -1-4 S 1-1 1 0-1 0 0 0-1 -2-2 0-1 -2-1 4 1-3 -2-2 0 0-1 -4 T 0-1 0-1 -1-1 -1-2 -2-1 -1-1 -1-2 -1 1 5-2 -2 0-1 -1-1 -4 W -3-3 -4-4 -2-2 -3-2 -2-3 -2-3 -1 1-4 -3-2 11 2-3 -4-3 -1-4 Y -2-2 -2-3 -2-1 -2-3 2-1 -1-2 -1 3-3 -2-2 2 7-1 -3-2 -1-4 V 0-3 -3-3 -1-2 -2-3 -3 3 1-2 1-1 -2-2 0-3 -1 4-3 -2-1 -4 B -2-1 3 4-3 0 1-1 0-3 -4 0-3 -3-2 0-1 -4-3 -3 4 1-1 -4 Z -1 0 0 1-3 3 4-2 0-3 -3 1-1 -3-1 0-1 -3-2 -2 1 4-1 -4 X -1-1 -1-1 -1-1 -1-1 -1-1 -1-1 -1-1 -1-1 -1-1 -1-1 -1-1 -1-4 * -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4-4 -4 1 function t(i,j) C1 := S1[i]; C2 := S2[j]; COOR := [ 0, 20, 4, 3, 6,... ]; P1 := COOR[ord(C1)]; P2 := COOR[ord(C2)]; return BLOSUM32[P1, P2];
End-space free Un'altra variante assegna peso 0 agli spazi all'inizio e alla fine di un allineamento --cac-dbd ltcabbdb- solo spazi iniziali => la stringa e' suffisso dell'altra solo spazi finali => la stringa e' prefisso di un'altra spazi iniziali e finali => una stringa e' contenuta nell'altra
Gaps Definizione Un gap e' una sequenza massimale di spazi consecutivi di una singola stringa di un allineamento ccattcctaac--a-actccaactta cca-----cacccat-c------tta <gap> <gap>>