Computation of Median Gene
Clusters
Marco Argiolas
Valentina Marioli
Introduzione al problema
Durante il corso dell'evoluzione, alcuni geni si sono persi
e altri si sono duplicati, provocando una divergenza tra
genomi che inizialmente avevano lo stesso ordine di geni
e lo stesso contenuto.
Introduzione al problema
Il confronto tra genoma, basato sull'ordine dei geni, è
l'approccio più comune, ma in alcuni casi può essere
utile identificare cluster di geni, ovvero insiemi di 2 o più
geni che occorrono in molti genomi.
Introduzione al problema
Il confronto tra genoma, basato sull'ordine dei geni, è
l'approccio più comune, ma in alcuni casi può essere
utile identificare cluster di geni, ovvero insiemi di 2 o più
geni che occorrono in molti genomi.
Introduzione al problema
Il confronto tra genoma, basato sull'ordine dei geni, è
l'approccio più comune, ma in alcuni casi può essere
utile identificare cluster di geni, ovvero insiemi di 2 o più
geni che occorrono in molti genomi.
Definizione di Gene Clusters
Un genoma S è una stringa di interi in cui ogni intero
rapprensenta un gene.
Geni che appartengono alla stessa famiglia vengono codificati
con lo stesso intero.
Definizione di Gene Clusters
Un genoma S è una stringa di interi in cui ogni intero
rapprensenta un gene.
Geni che appartengono alla stessa famiglia vengono codificati
con lo stesso intero.
1
2
3
4
5
6 7
8
Definizione di Gene Clusters
Un genoma S è una stringa di interi in cui ogni intero
rapprensenta un gene.
Geni che appartengono alla stessa famiglia vengono codificati
con lo stesso intero.
1
π1
8
π2
π3
π4
3
6
1
7
2
3
4
7
2
6
5
4
8
2
5
6 7
4
5
7
6
1
3
8
2
1
4
8
5
3
Gene cluster approssimato
In molte applicazioni la richiesta di avere le esatte
occorrenze del gene cluster in un genoma, risulta essere
troppo restrittiva.
Pertanto è preferibile estendere la definizione di gene
cluster permettendo piccole devianze.
Questo nuovo tipo di cluster viene chiamato gene cluster
approssimato.
Gene cluster approssimato
Rilassando il vincolo dell'uguaglianza, lo spazio di
ricerca di cluster di geni aumenta esponenzialmente
(dipende sia dal numero di confronti che dal numero
di deviazioni permesse).
Alcuni algoritmi risolutivi
Max-gap cluster
Permette un numero arbitrario di gaps nei clusters.
G1 = 1 * 2 3 4 * 5 6 * 7
G2 = 3 * 5 2 1 * 6 * * 7 4
*rappresenta i geni che possono non essere
condivisi tra i due genomi
Alcuni algoritmi risolutivi
Max-gap cluster
Non è in grado di trovare cluster approssimati.
La
complessità
di
questo
problema
cresce
esponenzialemente con il numero di sequenze e risulta
essere:
O(n2) per 2 sequenze, dove n è la lunghezza della sequenza
più lunga.
Alcuni algoritmi risolutivi
ILP
Cerchiamo locazioni perfette in un genoma
un'occorrenza approssimata in un'altra sequenza.
La complessità dell’algoritmo risulta essere:
O(n3 + |occ|) in tempo
O(n3) in spazio.
e
Alcuni algoritmi risolutivi
Quello che noi presenteremo è un algoritmo che risolve
questo problema in
O( n2 (1+ )2) in tempo
O(n2) in spazio,
dove  << n.
Introdurremo un nuovo concetto di cluster, chiamato
median gene cluster che permette di vincolare solo la
somma degli errori che possono essere presenti nelle
occorrenze approssimate di un gene cluster.
Definizioni di base:
intervallo comune
Gene cluster in cui sono permessi:
 ordine variabile dei geni
 occorrenze multiple dello stesso gene
sono noti come: intervalli comuni.
Definizioni di base:
intervallo comune
Un intervallo comune di S1,...,Sk si ha quando
sottostringhe (S1[i1,j1], ..., Sk[ik,jk]) di due o più stringhe
hanno lo stesso insieme di caratteri.
π1
π2
π3
π4
1
2
3
4
5
6
7
8
8
7
6
4
5
2
1
3
3
1
2
5
8
7
6
4
6
7
4
2
1
3
8
5
Definizioni di base:
intervallo comune
Un intervallo comune di S1,...,Sk si ha quando
sottostringhe (S1[i1,j1], ..., Sk[ik,jk]) di due o più stringhe
hanno lo stesso insieme di caratteri.
π1
π2
π3
π4
1
2
3
4
5
6
7
8
8
7
6
4
5
2
1
3
3
1
2
5
8
7
6
4
6
7
4
2
1
3
8
5
Definizioni di base:
intervallo comune
Un intervallo comune di S1,...,Sk si ha quando
sottostringhe (S1[i1,j1], ..., Sk[ik,jk]) di due o più stringhe
hanno lo stesso insieme di caratteri.
π1
π2
π3
π4
1
2
3
4
5
6
7
8
8
7
6
4
5
2
1
3
3
1
2
5
8
7
6
4
6
7
4
2
1
3
8
5
Definizioni di base:
character set
Data:
Una stringa S su un alfabeto finito Σ
Notatione: S[i] = il i-esmio carattere di S
S[i,j] = sottostringa di S che inizia da i e
finisce in j
Definizione:
Esempio:
Un character set CS(S[i,j]) := {S[k] | i ≤ k ≤ j}
è l'insieme di tutti i caratteri che occorrono
in S[i,j].
S: 3 1 2 3 1 5 2 6
1
2
3
4
5
6
7
8
CS(S[2,5]) := {1,2,3}
Definizioni di base: cs-location
Dato:
Un sottoinsieme C  Σ
Definizione: (i, j) è una CS-location di C in S, sse
CS(S[i,j]) = C
Esempio:
S: 3 1 2 3 1 5 2 6
1
2
3
4
5
6
7
8
la coppia (3,5) è una CS-location di un insieme
C={1,2,3}, perchè CS(S[3,5]) = {1,2,3}.
Definizioni di base: massimale
Un sottoinsieme C  Σ e una stringa S
Dato:
Definizione:
S[i,j] è
massimale-sinistro = S[i-1]  CS(S[i,j])
massimale-destro = S[j+1]  CS(S[i,j])
massimale
= massimale-destro e
massimale-sinistro
Esempio:
S: 3 1 2 3 1 5 2 6
1
2
3
4
5
6
7
8
S[3,5] non è massimale sinistro:
S[2]=1 CS(S[3,5]),
ma è massimale destro:
S[6]=5  CS(S[3,5]).
Definizioni di base:
distanza simmetrica
Dati:
Due insiemi di caratteri C,C'  Σ
Definizione: la distanza simmetrica tra insiemi è data da
D(C,C')=|C\C'|+|C'\C|
Esempio:
S1 : 3 1 2 3 1 5 2 6
S2 : 2 1 4 4 1 2 5 7
C1={1,2,3,5,6} , C2={1,2,4,5,7}
|C1\C2|= |{3,6}|=2
|C2\C1|= |{4,7}|=2
D(C1,C2) = 2+2= 4
Definizioni di base: d-location
Un insieme di caratteri C Σ e una stringa S
Dati:
Definizione: una d-location è una sottostringa S[i,j] tale che
D(C,CS(S[i,j])) ≤ d
Esempio:
S: 3 1 2 3 1 5 2 6
1
2
3
4
5
6
7
8
C={1,2,3} e d= 3
CS(S[4,8])={1,2,3,5,6}
D(C,CS(S[4,8])) = 2 ≤ d
quindi S[4,8] è una 3-locazione
Definizioni di base:
la mediana in statistica
In statistica la mediana indica il numero che occupa la posizione
centrale in un insieme di numeri, ovvero la metà dei numeri ha
un valore superiore rispetto alla mediana, mentre l'altra metà ha
un valore inferiore.
Per definire la mediana di un insieme di caratteri, sfrutteremo
una sua importante proprietà:
la mediana rende minima la somma dei valori assoluti degli
scarti.
Definizioni di base:
mediana di un insieme
Dati:
degli insiemi di caratteri C, C1,....Ck Σ
Definizione:
C è una mediana dei k set di caratteri C1,....Ck
se e solo se
per ogni C' 
Definizioni di base:
mediana di un insieme
La mediana di un insieme non è necessariamente unica,
infatti, se k è pari, un carattere che occorre nella mediana
può occorrere in esattamente k insiemi di caratteri.
Pertanto se andiamo a rimuovere quel carattere della
mediana, la distanza totale dagli insiemi C1,..,Ck rimane
inalterata e i caratteri rimanenti formeranno una mediana
alternativa.
Esempio:
C: {1,2,3,4}
C1 : {1,2,6}
C2 : {2,4,5,7,8}
C3 : {1,3,8,9}
C4 : {3,4,10,11}
D(C,C1) = 3
D(C,C2) = 5
D(C,C3) = 4
D(C,C4) = 4
Definizioni di base:
mediana di un insieme
La mediana di un insieme non è necessariamente unica,
infatti, se k è pari, un carattere che occorre nella mediana
può occorrere in esattamente k insiemi di caratteri.
Pertanto se andiamo a rimuovere quel carattere della
mediana, la distanza totale dagli insiemi C1,..,Ck rimane
inalterata e i caratteri rimanenti formeranno una mediana
alternativa.
Esempio:
C: {1,2,3,4}
C1 : {1,2,6}
C2 : {2,4,5,7,8}
C3 : {1,3,8,9}
C4 : {3,4,10,11}
D(C,C1) = 3
D(C,C2) = 5
D(C,C3) = 4
D(C,C4) = 4
Definizioni di base:
mediana di un insieme
La mediana di un insieme non è necessariamente unica,
infatti, se k è pari, un carattere che occorre nella mediana
può occorrere in esattamente k insiemi di caratteri.
Pertanto se andiamo a rimuovere quel carattere della
mediana, la distanza totale dagli insiemi C1,..,Ck rimane
inalterata e i caratteri rimanenti formeranno una mediana
alternativa.
Esempio:
C1 : {1,2,6}
C2 : {2,5,7,8}
C: {1,2,3}
C3 : {1,3,8,9}
E’ ancora una mediana.
C4 : {3,10,11}
D(C,C1) = 3 – 1 = 2
D(C,C2) = 5 + 1 = 6
D(C,C3) = 4 – 1 = 3
D(C,C4) = _4 + 1 = 5
_
16
16
Definizioni del problema
Date k sequenze S1,...,Sk, una dimensione minima di
cluster s e una soglia , vogliamo calcolare tutti gli insiemi
C  Σ con |C| ≥ s per i quali esistono S1[i1,j1], ..., Sk[ik,jk] e
C è una mediana di CS(S1[i1,j1]), ..., CS(Sk[ik,jk]) con
Un tale insieme C viene chiamato median gene cluster di
S1,...,Sk.
Lemma: Premesse
Siano date le sequenze S1….Sk , aventi come sottostringhe
S1[i1,j1],…,Sk[ik,jk], tali che per una data soglia di tolleranza
δ ≥ 0 esista un Character Set C appartenente all’alfabeto ∑,
e la sommatoria
D(C, CS (S[il,jl]) ≤ δ
Lemma: Conclusioni
Con queste premesse possiamo dire che esiste almeno una
sottostringa Sm[im,jm], dove 1 ≤ m ≤ k, con C' = CS (Sm[im,jm]
e che esiste la sommatoria
D(C', CS (Sl[il,jl]) ≤ 2
δ
Lemma: Dimostrazione
Tra le sottostringhe S1[i1,j1],…,Sk[ik,jk], prendiamo la sottostringa
Sm[im,jm], dove 1 ≤ m ≤ k, tale che D(C, CS (Sm[im,jm])) ≤
Dalla disuguaglianza triangolare possiamo dire che:
.
Lemma: Considerazioni
 Il character set che abbiamo indicato con C' viene utilizzato
per filtrare lo spazio di ricerca di un potenziale Median
Gene Cluster e quindi viene chiamato Cluster Filter;
 Il Lemma ci fornisce l’approccio per definire i passi
dell’algoritmo Median Gene Cluster.
Median Gene Cluster: Approccio
1.
Calcolare l’insieme dei Cluster Filters C' per le sequenze
S1….Sk;
2.
Calcolare, per ogni C', k-tuple in forma S1[i1,j1],…,Sk[ik,jk],
dove almeno uno degli elementi sia una locazione di C' e
soddisfi le condizioni del Lemma;
3.
Calcolare per ogni k-tupla la mediana del corrispondente
Character Set (CS). Una mediana che soddisfa il Lemma è
detta Median Gene Cluster
Calcolo dei Cluster Filter (Passo 1)
 In k sequenze di lunghezza n possiamo avere O(kn2)
sottostringhe.
 Un algoritmo naif può determinare tutti i cluster filter in
O(k2n4) confrontando le differenze tra le coppie di tutte le
sottostringhe.
 Presentiamo ora due approcci diversi basati sull’algoritmo
Connecting Intervals per diminuire la complessità.
Algoritmo Connecting Intervals (CI)
 L’algoritmo Connecting Intervals trova gli intervalli
comuni tra sequenze S1….Sk, di lunghezza n, appartenenti
all’alfabeto ∑
 Ha un passo di preprocessing dove crea un’array POS e una
tabella NUM.
 Vediamo un’esempio di esecuzione dell’algoritmo con:
k = 2
∑ = {1,2,3,4,5,6}
 S1= (2,4,5)
 S2= (1,3,5,2,4,5,2,4,3,6,2,5)
Preprocessing: Array POS
L’array POS è lungo |∑| e serve per elencare, per ogni
carattere c appartenente a ∑, tutte le posizioni in cui
occorrono in
S2= (1,3,5,2,4,5,2,4,3,6,2,5)
POS[1] = 1
POS[3] = 2, 9
POS[5] = 3, 6, 12
POS[2] = 4, 7, 11
POS[4] = 5, 8
POS[6] = 10
Preprocessing: Array POS
L’array POS è lungo |∑| e serve per elencare, per ogni
carattere c appartenente a ∑, tutte le posizioni in cui
occorrono in
S2= (1,3,5,2,4,5,2,4,3,6,2,5)
POS[1] = 1
POS[3] = 2, 9
POS[5] = 3, 6, 12
POS[2] = 4, 7, 11
POS[4] = 5, 8
POS[6] = 10
Preprocessing: Array POS
L’array POS è lungo |∑| e serve per elencare, per ogni
carattere c appartenente a ∑, tutte le posizioni in cui
occorrono in
S2= (1,3,5,2,4,5,2,4,3,6,2,5)
POS[1] = 1
POS[3] = 2, 9
POS[5] = 3, 6, 12
POS[2] = 4, 7, 11
POS[4] = 5, 8
POS[6] = 10
Preprocessing: Tabella NUM
La tabella NUM è grande |S2| x |S2| e ogni sua entry
contiene il numero di caratteri diversi che occorrono in
ogni sottosequenza S2[i,j]
S2[2,5] = (3,5,2,4)
S2[2,7] = (3,5,2,4,5,2)
NUM[2,5] = 4
NUM[2,7] = 4
Preprocessing: Tabella NUM
La tabella NUM è grande |S2| x |S2| e ogni sua entry
contiene il numero di caratteri diversi che occorrono in
ogni sottosequenza S2[i,j]
S2[2,5] = (3,5,2,4)
S2[2,7] = (3,5,2,4,5,2)
NUM[2,5] = 4
NUM[2,7] = 4
Preprocessing: Tabella NUM
La tabella NUM è grande |S2| x |S2| e ogni sua entry
contiene il numero di caratteri diversi che occorrono in
ogni sottosequenza S2[i,j]
S2[2,5] = (3,5,2,4)
S2[2,7] = (3,5,2,4,5,2)
NUM[2,5] = 4
NUM[2,7] = 4
Algoritmo CI: Esecuzione
Considera tutte le sottostringhe massimali di S1;
2. Marca, utilizzando l’array POS, le posizioni che
contengono i simboli di S1[i,j] nella sequenza S2 in
maniera iterativa;
3. Trova gli intervalli comuni confrontando i simboli della
sottostringa S1[i,j] con quelli marcati in S2.
1.
Algoritmo CI: Esempio
Supponiamo che i = 1 e j = 3:
S1[1,3]= (2,4,5)
S2= (1,3,5,2,4,5,2,4,3,6,2,5)
Algoritmo CI: Esempio
Supponiamo che i = 1 e j = 3:
S1[1,3]= (2,4,5)
S2= (1,3,5,2,4,5,2,4,3,6,2,5)
Algoritmo CI: Considerazioni
 Ad ogni passo dell’algoritmo, il CS degli intervalli marcati
in S2 è un sottoinsieme del CS di ogni S1[i,j]. Questo può
essere verificato tenendo traccia del numero dei caratteri
diversi in un array OCC e confrontandoli con la tabella
NUM, usando il valore per la entry corrispondente.
 L’algoritmo considera solo gli intervalli estesi durante
l’ultima iterazione.
Algoritmo CI: Esempio
S1 = (2,4,5)
|OCC| = 3
S2= (1,3,5,2,4,5,2,4,3,6,2,5)
NUM[3,8] = 3
NUM[11,12] = 2
Algoritmo CI: Esempio
S1 = (2,4,5)
|OCC| = 3
S2= (1,3,5,2,4,5,2,4,3,6,2,5)
NUM[3,8] = 3
NUM[11,12] = 2
Algoritmo CI: Esempio
S1 = (2,4,5)
|OCC| = 3
S2= (1,3,5,2,4,5,2,4,3,6,2,5)
NUM[3,8] = 3
NUM[11,12] = 2
Algoritmo CI: Considerazioni
 Ogni carattere è al più |S1| volte l’ultimo carattere della
sottostringa di S1 e ogni posizione in S2 può essere marcata
al più |S1| volte. Questo perché per ogni ciclo ho una i fissa
e la j che incrementa di una posizione.
 Ad ogni ciclo viene esteso un intervallo, vengono fusi due
intervalli oppure vengono creati nuovi intervalli.
 Ci sono al più |S1| x |S2| estensioni di intervalli e lo stesso
numero di confronti di character set.
Algoritmo CI: Complessità
La complessità dell’algoritmo risulta essere:
 O(n2) in tempo (confronti tra sottostringhe)
 O(n2) in spazio (costruzione array POS e tabella NUM)
Algoritmo CI: Problema
L’algoritmo Connecting Intervals considera solo le
sottosequenze che hanno esattamente gli stessi geni.
Quindi non può essere usato per trovare sequenze che
differiscano di qualche simbolo.
Algoritmo Connecting Intervals
with Errors (CIE)
 Questo algoritmo ci consente di trovare Cluster Filters che
differiscano al massimo di un valore δ arbitrario.
 Per semplicità confrontiamo 2 sequenze (k=2).
 Quindi per il Lemma abbiamo che
Algoritmo CIE: Pseudocodice
Algoritmo CIE: Pseudocodice
Algoritmo CIE: Pseudocodice
Algoritmo CIE: Pseudocodice
Algoritmo CIE: Pseudocodice
Algoritmo CIE: Pseudocodice
Algoritmo CIE: Pseudocodice
Algoritmo CIE: Pseudocodice
Differenza con CI
La differenza sostanziale con l’algoritmo CI è il calcolo e
l’utilizzo di l e r
Differenza con CI
La differenza sostanziale con l’algoritmo CI è il calcolo e
l’utilizzo di l e r
Calcolo di l e r
 Indichiamo con p come una posizione marcata in S2
 lx(p) = max({l | S2[l, p] contenente x differenti simboli non
marcati} U {0})
 ry(p) = min({r | S2[p, r] contenente x differenti simboli non
marcati} U {|S2| + 1})
 x, y ≥ 1
Uso di l e r
 Per costruzione, gli intervalli S2[lx+1, ry-1] contengono al più
x+y-2 simboli non presenti in S1[i,j] e sono massimali
 per ogni i e j, con i ≤ j, l’uso di l e r serve per determinare il
numero di simboli diversi all’interno dell’intervallo
corrente (dist).
Uso di l e r
 La variabile dist viene confrontata con quella minDist e
quella più piccola viene confrontata con il valore di soglia δ
 Se minDist è inferiore a δ allora la coppia i, j viene inserita
nel resultSet che contiene i Cluster Filter
Algoritmo CIE: Esempio
S1 = (1,3,4,2)
S1 [2,4]= (3,4,2)
δ=1
S2= (1, 3, 5, 2, 4, 5, 2, 4, 3, 6, 2, 5)
Algoritmo CIE: Esempio
S1 = (1,3,4,2)
S1 [2,4]= (3,4,2)
δ=1
S2= (1, 3, 5, 2, 4, 5, 2, 4, 3, 6, 2, 5)
\
1 2 3 4 5 6 7 8 9 10 11 12
p=7
Algoritmo CIE: Esempio
S1 = (1,3,4,2)
S1 [2,4]= (3,4,2)
δ=1
S2= (1, 3, 5, 2, 4, 5, 2, 4, 3, 6, 2, 5)
1 2 3 4 5 6 7 8 9 10 11 12
p=7
l1(7) = 6
Algoritmo CIE: Esempio
S1 = (1,3,4,2)
S1 [2,4]= (3,4,2)
δ=1
S2= (1, 3, 5, 2, 4, 5, 2, 4, 3, 6, 2, 5)
1 2 3 4 5 6 7 8 9 10 11 12
p=7
l1(7) = 6
l2(7) = 1
Algoritmo CIE: Esempio
S1 = (1,3,4,2)
S1 [2,4]= (3,4,2)
δ=1
S2= (1, 3, 5, 2, 4, 5, 2, 4, 3, 6, 2, 5)
1 2 3 4 5 6 7 8 9 10 11 12
p=7
l1(7) = 6
r1(7) = 10
l2(7) = 1
Algoritmo CIE: Esempio
S1 = (1,3,4,2)
S1 [2,4]= (3,4,2)
δ=1
S2= (1, 3, 5, 2, 4, 5, 2, 4, 3, 6, 2, 5)
1 2 3 4 5 6 7 8 9 10 11 12
p=7
l1(7) = 6
r1(7) = 10
l2(7) = 1
r2(7) = 12
Algoritmo CIE: Esempio
Quindi devo considerare le sottostringhe
S2 [2,9]= (3,5,2,4,5,2,4,3)
2. S2 [2,11]= (3,5,2,4,5,2,4,3,6,2)
3. S2 [7,9]= (2,4,3)
4. S2 [7,11]= (2,4,3,6,2)
1.
Algoritmo CIE: Esempio
Quindi devo considerare le sottostringhe
S2 [2,9]= (3,5,2,4,5,2,4,3)
2. S2 [2,11]= (3,5,2,4,5,2,4,3,6,2)
3. S2 [7,9]= (2,4,3)
4. S2 [7,11]= (2,4,3,6,2)
1.
Algoritmo CIE: Esempio
Quindi devo considerare le sottostringhe
S2 [2,9]= (3,5,2,4,5,2,4,3)
2. S2 [2,11]= (3,5,2,4,5,2,4,3,6,2)
3. S2 [7,9]= (2,4,3)
4. S2 [7,11]= (2,4,3,6,2)
1.
Algoritmo CIE: Esempio
Quindi devo considerare le sottostringhe
S2 [2,9]= (3,5,2,4,5,2,4,3)
2. S2 [2,11]= (3,5,2,4,5,2,4,3,6,2)
3. S2 [7,9]= (2,4,3)
4. S2 [7,11]= (2,4,3,6,2)
1.
Algoritmo CIE: Esempio
Quindi devo considerare le sottostringhe
S2 [2,9]= (3,5,2,4,5,2,4,3)
2. S2 [2,11]= (3,5,2,4,5,2,4,3,6,2)
3. S2 [7,9]= (2,4,3)
4. S2 [7,11]= (2,4,3,6,2)
1.
Le sottostringhe 1,3,4 vengono inserite in ResultSet
La sottostringa 2 non viene inserita
Algoritmo CIE: Complessità
 O(n2) in tempo (operazione di marcatura)
 O(n) in tempo (calcolo di l e r)
 O((δ+1) 2) (verificare della distanza di ogni coppia)
 O(n2) in spazio (costruzione array POS e tabella NUM)
L’algoritmo CIE costa in totale O(n2(n+δ2)) in tempo e
O(n2) in spazio
Algoritmo CIE: Variazione
Possiamo limitare il numero delle ripetizioni di un simbolo
in S2 con il valore b. In questo modo:
 il numero di passi per la determinazione di l e r viene
limitato da O(min{bδ})
 la complessità diventa O(n2(1+ min{bδ} + δ2)).
Questa variazione risulta particolarmente importante in
certe sequenze genetiche che hanno un valore b molto
basso.
Preprocessing: Rank
Posso ridurre a O(n2(1+2)) il tempo avendo a
disposizione uno spazio di O(n).
L'osservazione chiave è che per ogni posizione p nella
sequenza S2 i valori di lx e rx sono gli stessi per tutti gli
intervalli S1[i,j] con un bordo sinistro comune.
Preprocessing: Rank
I valori lx e rx sono memorizzati in due tabelle L e R di
dimensioni  x |S2| ciascuna.
Il valori di questi array deve essere aggiornato ogni volta
che il bordo sinistro i in S1 è mosso a destra e questo accade
O(n) volte.
Preprocessing: rinomino con Rank
Passi per l’inizializzazione e l’aggiornamento delle tabelle L
e R:
1)Per poter creare le tabelle L e R è necessario rinominare i
caratteri delle sequenze S1 e S2 con il rango della prima
occorrenza nella concatenazione della stringa S1[i,|S1|]S2,
inizialmente per i=1 e poi per ogni incremento di i.
Preprocessing: rinomino con Rank
Calcoliamo RANK: ∑→{1, ...., |∑|}.
Esempio :
S1
i
S2
S1[i,|S1|]S2 : 2 4 2 3 4 1 4 5 4 3 6 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
RANK[1] = ?4
RANK[2] = 1
1
2
3
RANK[3] = 3
4
RANK[4] = 2
5
6
RANK[5] = 5
RANK[6] = 6
Preprocessing: rinomino con Rank
Esempio: Rinominiamo i caratteri di S2 con il loro rango.
RANK[1] = 4
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
RANK[2] = 1
RANK[3] = 3
RANK[4] = 2
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
RANK[5] = 5
RANK[6] = 6
Preprocessing: creo L e R
2) Inizializziamo le tabelle L e R nel seguente modo:
Per ogni posizione p in S2 andiamo alla sua sinistra (e poi
alla sua destra) e cerchiamo i primi +1 caratteri che hanno
un rank maggiore del Rank(S2(p)).
Memorizziamo come l1, ......, l+1 ( e r1, ......, r+1)le posizioni
in cui un nuovo carattere diverso viene individuato.
Preprocessing: creo L e R
Esempio:
Inizializziamo la tabella L.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
l1 : 0
Preprocessing: creo L e R
Esempio:
Inizializziamo la tabella L.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
l1 : 0 1
Preprocessing: creo L e R
Esempio:
Inizializziamo la tabella L.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
l1 : 0 1 0
Preprocessing: creo L e R
Esempio:
Inizializziamo la tabella L.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
l1 : 0 1 0
Preprocessing: creo L e R
Esempio:
Inizializziamo la tabella L.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
l1 : 0 1 0 3
Preprocessing: creo L e R
Esempio:
Inizializziamo la tabella L.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
l1 : 0 1 0 3 3 0 6 6 6 0 10 10
l2 : 0 0 0 2 2 0 5 2 1 0 9 0
l3 : 0 0 0 1 1 0 2 1 0 0 8 0
Tabella L
Preprocessing: creo L e R
Esempio:
Inizializziamo la tabella R.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
r1 :
r2 :
r3 :
3
Preprocessing: Creo L e R
Esempio:
Inizializziamo la tabella R.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
r1 :
r2 :
r3 :
3 3
Preprocessing: creo L e R
Esempio:
Inizializziamo la tabella R.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
r1 :
r2 :
r3 :
3 3 10
Preprocessing: creo L e R
Esempio:
Inizializziamo la tabella R.
S2 : 1 3 5 2 4 5 2 4 3 6 2 5
1
2
3
4
5
6
7
8
9 10 11 12
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
r1 :
3 3 10 5 6 10 8 8 10 13 12 13
r2 : 10 10 13
6 9 13 9 10 12 13 13 13
r3 : 13 13 13
9 10 13 10 12 13 13 13 13
Tabella R
Preprocessing: aggiorno il Rank
3)Aggiornamento del rank
Quando il bordo sinistro di una sottostringa di S1 viene
shiftato da i a i+1, il rank di tutti i caratteri che occorrono tra
i e la successiva occorrenza del carattere S1[i] decresce di uno,
mentre il rank di cold=S1[i] aumenta del numero di caratteri
differenti tra le due occorrenze.
Esempio:
i
S1: 2 4 2 3 4 1 4 5 4 3 6
1
2
3
4
5
6
7
8
9 10 11
RANK[2] = 1 + 1 = 2
RANK[4] = 2 - 1 = 1
Preprocessing: aggiorno il Rank
3)Aggiornamento del rank
Aggiorno le entry delle tabelle L e R con il nuovo valore
di cold .
Esempio:
S'2 : 4 3 5 1 2 5 1 2 3 6 1 5
RANK[2] = 1 + 1 = 2
RANK[4] = 2 - 1 = 1
S''2 : 4 3 5 2 1 5 2 1 3 6 2 5
Preprocessing: aggiorno il Rank
3)Aggiornamento del rank
Per le posizioni in S2 con caratteri differenti da cold le entry
delle tabelle L e R cambiano solo se il rank del carattere è più
piccolo del nuovo valore di cold .
Esempio:
1
2
3
4
5
6
7
8
9 10 11 12
S''2 : 4 3 5 2 1 5 2 1 3 6 2 5
l1 : 0 1 0 3 3 0 6 6 6 0 10 10
l2 : 0 0 0 2 2 0 5 2 1 0 9 0
l3 : 0 0 0 1 1 0 2 1 0 0 8 0
Preprocessing: aggiorno il Rank
3)Aggiornamento del rank
Per le posizioni in S2 con caratteri differenti da cold le entry
delle tabelle L e R cambiano solo se il rank del carattere è più
piccolo del nuovo valore di cold .
Esempio:
1
2
3
4
5
6
7
8
9 10 11 12
S''2 : 4 3 5 2 1 5 2 1 3 6 2 5
l1 : 0 1 0 3 4 0 6 6 6 0 10 10
l2 : 0 0 0 2 2 0 5 2 1 0 9 0
l3 : 0 0 0 1 1 0 2 1 0 0 8 0
Preprocessing: aggiorno il Rank
3)Aggiornamento del rank
Per le posizioni in S2 con caratteri differenti da cold le entry
delle tabelle L e R cambiano solo se il rank del carattere è più
piccolo del nuovo valore di cold .
Esempio:
1
2
3
4
5
6
7
8
9 10 11 12
S''2 : 4 3 5 2 1 5 2 1 3 6 2 5
l1 : 0 1 0 3 4 0 6 7 6 0 10 10
l2 : 0 0 0 2 3 0 5 6 1 0 9 0
l3 : 0 0 0 1 2 0 2 2 0 0 8 0
Preprocessing: Complessità
L’inizializzazione richiede O(n2) in tempo e
l’aggiornamento O(n) in tempo ad ogni incremento di i.
Con tali modifiche, l’algoritmo CIE costa:
O(n2 +n2(1+  2)) = O(n2(1+  2)) in tempo
O(n +n2) = O(n2) in spazio.
Estensione a genomi multipli
D
Dovremo considerare tutti i possibili cluster filter C’,
di ogni possibile sottostringa di S1, …, Sk.
Un intervallo Sl[i,j] sara’ un cluter filter se la somma
delle distanze minime dalle altre k-1 sequenze non
eccede
Tra ogni coppia dovra’ ancora essere rispettata la
distanza δ, altrimenti nella somma totale non
sarebbe rispettata la disuguaglianza triangolare del
lemma 1.
Estensione a genomi multipli
1) Per ogni carattere Sl[j] dobbiamo esaminare tutte le
tutte le sue occorrenze nelle altre k-1 sequenze.
S1 : 1 2 1 3 1 4 1 5
S2 : 1 2 4 1 2 1 3
S3 : 1 3 3 1 2 1 2
S4 : 1 4 1 1
1
2
3
4
5
6
7
8
Genomi multipli: esempio
Esempio:
Esaminiamo tutte le tutte le occorrenze del
carattere S1[2] nelle altre 3 sequenze.
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
S2 : 1 2 4 1 2 1 3
S3 : 1 3 3 1 2 1 2
S4 : 1 4 1 1
1
2
3
4
5
6
7
8
Genomi multipli: esempio
Esempio:
Esaminiamo tutte le tutte le occorrenze del
carattere S1[2] nelle altre 3 sequenze.
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
S2 : 1 2 4 1 2 1 3
S3 : 1 3 3 1 2 1 2
S4 : 1 4 1 1
1
2
3
4
5
6
7
8
Genomi multipli: esempio
2) Per ogni occorrenza del carattere Sl[j] dobbiamo
calcolarci lx e rx nelle altre k-1 sequenze, per poter poi
calcolare D(CS(Sl[i,j]), CS(Sj[lx+1,ry-1]))
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
S2 : 1 2 4 1 2 1 3
S3 : 1 3 3 1 2 1 2
S4 : 1 4 1 1
1
2
3
4
5
6
7
8
Genomi multipli: esempio
2) Per ogni occorrenza del carattere Sl[j] dobbiamo
calcolarci lx e rx nelle altre k-1 sequenze, per poter poi
calcolare D(CS(Sl[i,j]), CS(Sj[lx+1,ry-1]))
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
S2 : 1 2 4 1 2 1 3
S3 : 1 3 3 1 2 1 2
S4 : 1 4 1 1
1
2
3
4
5
6
7
8
Genomi multipli: esempio
2) Per ogni occorrenza del carattere Sl[j] dobbiamo
calcolarci lx e rx nelle altre k-1 sequenze, per poter poi
calcolare D(CS(Sl[i,j]), CS(Sj[lx+1,ry-1]))
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
S2 : 1 2 4 1 2 1 3
S3 : 1 3 3 1 2 1 2
S4 : 1 4 1 1
1
2
3
4
5
6
7
8
Genomi multipli: esempio
2) Per ogni occorrenza del carattere Sl[j] dobbiamo
calcolarci lx e rx nelle altre k-1 sequenze, per poter poi
calcolare D(CS(Sl[i,j]), CS(Sj[lx+1,ry-1]))
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
S2 : 1 2 4 1 2 1 3
S3 : 1 3 3 1 2 1 2
S4 : 1 4 1 1
1
2
3
4
5
6
7
8
Genomi multipli: esempio
3) Calcoliamo il valore di mindist in maniera separata
per ogni sequenza S1, ..., Sk.
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
mindist1
S2 : 1 2 4 1 2 1 3
mindist2
S3 : 1 3 3 1 2 1 2
mindist3
S4 : 1 4 1 1
mindist4
1
2
3
4
5
6
7
8
Genomi multipli: esempio
3) Calcoliamo il valore di mindist in maniera separata
per ogni sequenza S1, ..., Sk.
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
mindist1
S2 : 1 2 4 1 2 1 3
mindist 2 = [1,2]
S3 : 1 3 3 1 2 1 2
mindist3
S4 : 1 4 1 1
mindist4
1
2
3
4
5
6
7
8
Genomi multipli: esempio
3) Calcoliamo il valore di mindist in maniera separata
per ogni sequenza S1, ..., Sk.
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
mindist1
S2 : 1 2 4 1 2 1 3
mindist 2 = [1,2]
S3 : 1 3 3 1 2 1 2
mindist3 = [4,7]
S4 : 1 4 1 1
mindist4= [3,4]
1
2
3
4
5
6
7
8
Genomi multipli: esempio
4) Se
mindisti ≤ d
allora ho trovato un cluster filter.
j
S1 [2]
S1 : 1 2 1 3 1 4 1 5
mindist1
S2 : 1 2 4 1 2 1 3
mindist 2 = [1,2]
S3 : 1 3 3 1 2 1 2
mindist3 = [4,7]
S4 : 1 4 1 1
mindist4= [3,4]
1
2
3
4
5
6
7
8
Genomi multipli: Complessità
O(k2) in tempo, per ognuno
precedentemente presentati;
O(kn2) in spazio.
degli
algoritmi
Collezione di locazioni (Passo 2)
Ora che abbiamo calcolato tutti i possibili cluster
filter, li useremo per farci guidare nella ricerca dei
nostri Median Gene Cluster.
Per ogni cluster filter C', calcoleremo le sue massime
δ-locazioni di ogni sequenza S1, ..., Sk in modo da
formare k-tuple (S1[i1,j1], ..., Sk[ik,jk]), tali che gli
insiemi di caratteri di ogni coppia soddisfi:
Collezione di locazioni (Passo 2)
Esempio:
Calcoliamo le massime 3-locazioni di ogni sequenza S1,...,Sk
per il cluster filter C'={1,2} tali che soddisfino il lemma.
Ricordiamo che una δ-locazione di un insieme di caratteri
C in una stringa S è una sottosequenza S[i,j] tale che:
D(C, CS(S[i,j])) ≤ δ.
S1 : 1 2 1 3 1 4 1 5
S2 : 1 2 4 1 2 1 3
S3 : 1 3 3 1 2 1 2
S4 : 1 4 1 1
1
2
3
4
5
6
7
8
Collezione di locazioni (Passo 2)
Esempio:
Verifichiamo se il lemma è soddisfatto per d=10:
D(C', CS(S1[1,2])) + D(C', CS(S2[1,6])) + D(C', CS(S3[4,7])) +
D(C', CS(S4[1,4])) = 3 + 2 +1 +2 = 8 ≤ d
E’ soddisfatto. Abbiamo dunque individuato le k-tuple che
useremo nel prossimo passo.
S1 : 1 2 1 3 1 4 1 5
S1[1,2]
S2 : 1 2 4 1 2 1 3
S2[1,6]
S3 : 1 3 3 1 2 1 2
S3[4,7]
S4 : 1 4 1 1
S4[1,4]
1
2
3
4
5
6
7
8
C'={1,2}
Collezione di locazioni (Passo 2)
Il numero delle δ-locazioni massimali è O(kn2),
mentre il numero di k-tuple può essere esponenziale
in k.
Tuttavia per sequenze di geni, dove |∑| è Θ(n)
l'esperienza mostra che questo approccio è flessibile
per valori ragionevoli di δ.
Calcolo dei Median Gene
Clusters tra k-tuple (Passo 3)
Per individuare una mediana:
1. Esaminare le k-tuple ricavate dal Passo 2;
2. Contare le occorrenze di ogni gene in ognuna di esse;
3. Se un gene occorre in totale k/2 volte diventa un
elemento di una mediana
Verifica di una mediana
Ogni mediana ricavata deve soddisfare le condizioni del
Lemma.
In questo caso viene classificata come mediana del gene
cluster.
Possono esserci varie mediane da testare
Numero delle mediane
Una mediana esiste solo se il numero di geni in comune è
inferiore o uguale a
, per il fatto che che ogni gene
aggiunge k / 2 alla somma delle distanze.
In questo caso, esistono 2 possibili mediane.
Esempio
S1 = (1 2 1 3 1 4 1 5)
S2 = (1 2 4 1 2 1 3)
S3 = (1 3 3 1 2 1 2)
S4 = (1 4 1 1)
δ =3
C = {1, 2}
cluster filter
Esempio
S1 = (1 2 1 3 1 4 1 5)
S2 = (1 2 4 1 2 1 3)
S3 = (1 3 3 1 2 1 2)
S4 = (1 4 1 1)
δ =3
C = {1, 2}
cluster filter
Esempio
S1 = (1 2 1 3 1 4 1 5)
S2 = (1 2 4 1 2 1 3)
S3 = (1 3 3 1 2 1 2)
S4 = (1 4 1 1)
δ =3
C = {1, 2}
cluster filter
Esempio
S1 = (1 2 1 3 1 4 1 5)
S2 = (1 2 4 1 2 1 3)
S3 = (1 3 3 1 2 1 2)
S4 = (1 4 1 1)
δ =3
C = {1, 2}
cluster filter
Esempio
S1 = (1 2 1 3 1 4 1 5)
S2 = (1 2 4 1 2 1 3)
S3 = (1 3 3 1 2 1 2)
S4 = (1 4 1 1)
δ =3
C = {1, 2}
cluster filter
Quindi le mediane risultanti sono {1,2} e {1,2,4}
Verifica Lemma
Le mediane sono {1, 2} e {1, 2, 4} per le quali il Lemma è
verificato
Possibili duplicati
In base alle varie k-tuple potrebbero esserci dei duplicati
tra i median gene clusters.
L’algoritmo, in questo caso, elimina i duplicati.
Costo Totale
 L’algoritmo MGC costa:
 O(n2 +n2(1+  2)) = O(n2(1+ )2) in tempo
 O(n +n2) = O(n2) in spazio.
Confronto con Max-Gap
Clusters
Vantaggi di MGC su modello max-gap clusters:
1. Non ci sono problemi in caso di bassa densità dei
cluster;
2. Non è necessario specificare un determinato gap;
3. MGC è in grado di trovare cluster approssimati
(importante per particolare confronti di genomi).
Confronto con ILP
Vantaggi di MGC su modello ILP per la ricerca di gene
cluster approssimati:
1. Più efficiente per il calcolo dei cluster, anche se i cluster
risultanti sono simili;
2. Vantaggio superiore nell’applicazione a genomi multipli.
Risultati degli Esperimenti
Entrambi gli approcci presentati sono applicabili a più
genomi, ma non sono stati indicati risultati sperimentali in
nessuna pubblicazione sul confronto di più di due genomi.
Risultati degli Esperimenti
Per dimostrare l'applicabilità dell’MGC sui genomi
multipli, abbiamo cercato di approssimare i gene cluster in
tre genomi di batteri: Bacillus subtilis, Buchnera aphidicola
ed Escherichia coli, con diverse combinazioni di size s e
soglia δ
Risultati degli Esperimenti
Per trovare gene clusters è necessario fissare s e
incrementare δ. Fissando s = 13 e δ = 10, troviamo 5 cluster
distinti tra cui il seguente
Conclusioni
 In
questa presentazione abbiamo introdotto il
concetto di Median Gene Cluster (MGC) per
l’individuazione di gene cluster approssimati in un
insieme di k genomi.
 Abbiamo ottenuto un’individuazione più veloce dei
gene cluster grazie a un metodo di filtraggio per
limitare lo spazio di ricerca di potenziali cluster.
Conclusioni
I risultati degli esperimenti hanno mostrato che
l’individuazione di genomi multipli è fattibile, ma in effetti
le combinazioni di k-tuple, risultanti dal passo 2, non si
presentano con una scelta di dati reali e con parametri
scelti in maniera ragionevole (s, δ).
Conclusioni
Una più ampia analisi dell’algoritmo comunque è ancora in
corso, in particolare sull’influenza del numero di sequenze
S1….Sk da analizzare e dal valore della soglia.
Conclusioni
Il metodo risulta essere più veloce quanto più δ è piccolo.
Per applicazioni pratiche si potrebbe incrementare
iterativamente δ per s fissata fino a che i cluster individuati
non siano potenzialmente significativi.
Possibili sviluppi futuri
Possibili estensione dell’algoritmo:
1. Estenderlo per individuare i median gene cluster che
occorrono solamente in un sottoinsieme di genomi di
input;
2. Effettuare un’analisi statistica dei cluster individuati per
classificarli in base alla loro rilevanza.