• Nenhum resultado encontrado

M´etodos alternativos para gera¸c˜ao da popula¸c˜ao inicial

5.2 Alinhadores iterativos estoc´asticos

5.2.8 M´etodos alternativos para gera¸c˜ao da popula¸c˜ao inicial

Ao final dos testes descritos na Se¸c˜ao 5.2.6, tinha-se um alinhador m´ultiplo capaz de obter 80,81 para pontua¸c˜ao SP e 56,80 para pontua¸c˜ao TC. Essas pontua¸c˜oes referem-se a m´edia para todas as entradas do conjunto RV12. Nesta se¸c˜ao s˜ao descritas e avaliadas altera¸c˜oes no procedimento de gera¸c˜ao da popula¸c˜ao inicial, denominado Algoritmo 1 e detalhado na Se¸c˜ao 5.2.1.

Como um primeiro teste, adicionou-se uma terceira abordagem para gera¸c˜ao de in- div´ıduos. Gera-se mais um indiv´ıduo utilizando o m´etodo ABOT, que ´e descrito a seguir. Este faz uso de janela deslizante, grafo orientado e ordena¸c˜ao topol´ogica para construir alinhamentos de pares. Para produzir o alinhamento m´ultiplo utiliza uma varia¸c˜ao do alinhamento estrela. Denominou-se essa varia¸c˜ao, em rela¸c˜ao ao m´etodo original para gera¸c˜ao da popula¸c˜ao inicial, de Algoritmo 2.

Um outro teste consistiu em adicionar ao Algoritmo 2 outros novos m´etodos para a gera¸c˜ao de indiv´ıduos. Os m´etodos AB1, AB2, AB3, AB4 e AB5, que s˜ao baseados em blocos, assim como ABOT, foram utilizados. Juntamente a estes, aplicou-se um refinador. Foram adicionados mais 20 indiv´ıduos. Cada alinhador baseado em blocos gerou quatro alinhamentos, o original e mais trˆes atrav´es de refinamentos. O refinador possui um parˆametro X que indica a porcentagem m´ınima de concordˆancia de res´ıduos para que uma coluna seja mantida. Caso contr´ario, ela ´e refeita. Utilizou-se X = 40, X = 50 e X = 60. Chamou-se esse novo procedimento para gera¸c˜ao da popula¸c˜ao inicial de Algoritmo 3. Esses novos m´etodos e o refinador s˜ao descritos a seguir.

S˜ao tamb´em apresentados a seguir os resultados obtidos com a utiliza¸c˜ao do Algoritmo 2 e do Algoritmo 3 para gera¸c˜ao da popula¸c˜ao inicial.

Primeira abordagem (ABOT)

Para cada par de sequˆencias, busca-se, utilizando uma janela deslizante de tamanho fixo k, blocos cont´ınuos (sem gaps) e idˆenticos. Cria-se um grafo onde cada n´o representa um bloco β encontrado. Denota-se por βi e βj as posi¸c˜oes iniciais do bloco e por βi + k e

βj + k as posi¸c˜oes finais. Arestas (orientadas) conectam blocos consistentes. Por blocos

5.2. Alinhadores iterativos estoc´asticos 107 C1, β2) =                      β1 i + k < βi2∧ βj1+ k < βj2 ∨ (β1 i < βi2∧ βi1+ k ≥ βi2)∧ (β1 j < βj2∧ βj1+ k ≥ βj2)∧ (β2 i − βi1 = βj2− βj1)

A primeira condi¸c˜ao ´e satisfeita quando um bloco antecede o outro sem qualquer sobreposi¸c˜ao. A segunda condi¸c˜ao trata do caso de sobreposi¸c˜ao, garantindo que esta seja coerente nas duas sequˆencias, ou seja, β2

i − βi1 = βj2 − βj1 ≥ 1. Na Figura 5.3 n˜ao

apresentados dois exemplos de blocos consistentes, subfiguras (a) e (b), e dois exemplos de blocos n˜ao consistentes, (c) e (d). Em cada uma deles h´a um bloco delimitado por um retˆangulo com linha cont´ınua e um outro com linha tracejada. Por exemplo, em (a) h´a um bloco composto pelos res´ıduos KTT que inicia no terceiro res´ıduo da primeira sequˆencia e no primeiro da segunda. H´a outro bloco composto pelos res´ıduos ADK que inicia no s´etimo res´ıduo da primeira sequˆencia e no quarto res´ıduo da segunda.

Ap´os esse passo s˜ao criados dois n´os especiais representando o in´ıcio e o fim das sequˆencias. S˜ao tamb´em criadas arestas conectando o n´o que representa o in´ıcio a todos os outros n´os, assim como s˜ao criadas arestas conectando todos os n´os ao n´o representando o final das sequˆencias. Procura-se ent˜ao o caminho m´aximo nesse grafo. Tal procedimento pode ser feito em tempo polinomial, utilizando-se ordena¸c˜ao topol´ogica, pelo fato do grafo ser orientado e ac´ıclico. Esse caminho representa o maior conjunto consistente de blocos conservados para o par de sequˆencias. Para alinhar as regi˜oes entre os blocos utiliza-se o algoritmo de alinhamento global de Needleman e Wunsch[174].

Um algoritmo progressivo constr´oi o alinhamento m´ultiplo. Este utiliza uma ´arvore gerada por UPGMA [228] a partir de distˆancias inversamente proporcionais ao n´umero de blocos conservados entre os pares de sequˆencia. Em seguida, utiliza-se uma varia¸c˜ao do alinhamento estrela [219]. Para unir uma sub-´arvore A com uma sub-´arvore B ´e utilizado o par de sequˆencias de menor distˆancia. Observe que o par deve ser composto por uma sequˆencia de A e outra de B. Este algoritmo usa os alinhamentos de pares j´a constru´ıdos para o c´alculo das distˆancias e para a efetiva composi¸c˜ao do alinhamento m´ultiplo em sua etapa final.

Para esse m´etodo, denominado ABOT, usou-se tamanho k = 5 para a janela deslizante. Segunda abordagem (ABx)

Inicia procurando todas as substrings, de um tamanho pr´e-definido k, que ocorrem nas sequˆencias de entrada. Toma-se a substring que ocorre no maior n´umero de sequˆencias

3 1 7 4 T T Y A D K T T A D K K T T A D K T T A K T T (a) Consistentes T T Y A D K T T A D K K T T A D K T T A K T T 2 5 3 6 (b) Consistentes T T Y A D K T T A D K K T T A D K T T A K T T 4 9 1 7 (c) N˜ao consistentes T T Y A D K T T A D K K T T A D K T T A K T T 2 5 3 10 (d) N˜ao consistentes

Figura 5.3: Exemplos de blocos consistentes e de blocos n˜ao consistentes para as sequˆencias ADKTTYADKTT e KTTADKTTAKTT.

como referˆencia para a constru¸c˜ao do bloco, que ´e gerado a partir da primeira ocorrˆencia da substring em cada sequˆencia. Faz-se chamadas recursivas para alinhar o restante das sequˆencias, tanto do lado esquerdo como do lado direito.

Note que ao longo da execu¸c˜ao desse algoritmo recursivo, sequˆencias ou regi˜oes de sequˆencias s˜ao “ignoradas” por n˜ao possu´ırem a substring. Essas sequˆencias ou regi˜oes s˜ao inseridas no alinhamento atrav´es de alinhamentos de perfis, que as adiciona em ordem arbitr´aria.

Utiliza-se para esse algoritmo, denominado AB1 e detalhado em Algoritmo 6, k = 6. Na implementa¸c˜ao deste, utiliza-se o alfabeto comprimido Dayhoff(6) [67]. Sendo assim, as sequˆencias s˜ao analisadas como uma sequˆencia de classes e n˜ao como uma sequˆencia de res´ıduos de amino´acidos.

Nas linhas 2 e 3 do c´odigo apresentado em Algoritmo 6 ´e implementada a condi¸c˜ao de parada. Isso ocorre quando resta menos de duas sequˆencias a alinhar. Na linha 5 ´e computada a substring que ocorre em um maior n´umero de sequˆencias. Na linha 7 ´e gerada uma lista com a primeira ocorrˆencia da substring em cada uma das sequˆencias.

5.2. Alinhadores iterativos estoc´asticos 109

Algoritmo 6: Algoritmo AB1. Input: sequences

Output: msa

1 //Condi¸c˜ao de parada

2 if not canContinueAligment(sequences) then 3 return computeFinalAlignment(sequences) 4 // Computa a substring 5 substring ← computeMaxOccurSubstring(sequences) 6 //Computa o bloco 7 occurrences ← getFirstSubstringOccur(sequences) 8 if length(occurrences) > 1 then 9 block ← getBlock(sequences,occurrences)

10 //Separa as sequˆencias que pertencem e as que n˜ao pertencem ao bloco 11 alignedSeqs ← getAlignedSeqs(block)

12 otherSeqs ← getOtherSeqs(sequences,alignedSeqs) 13 //Realiza as chamadas recursivas

14 leftSeqs ← extractLeftSide(sequences, block) 15 leftAlign ← AB1(leftSeqs)

16 rightSeqs ← extractRightSide(sequences, block) 17 rightAlign ← AB1(rightSeqs)

18 //Combina os resultados da recurs˜ao com o bloco 19 partialAlignment ← leftAlign + block + rightAlign 20 else

21 partialAlignment ← null 22 otherSeqs ← sequences

23 //Adiciona as sequˆencias “ignoradas” ao alinhamento

24 return addSeqsByProfileAlignment(partialAlignment,otherSeqs)

Caso a substring ocorra em mais que uma sequˆencia, ´e executado o bloco entre as linhas 9 e 19. Nesse caso, inicia-se computando o bloco na linha 9 e gera-se uma lista com as sequˆencias que n˜ao foram adicionadas ao bloco nas linhas 11 e 12. Em seguida realiza-se a recurs˜ao `a esquerda nas linhas 14 e 15 e a recurs˜ao `a direita nas linhas 16 e 17. Esse bloco do c´odigo ´e conclu´ıdo com a combina¸c˜ao dos alinhamentos obtidos pelas recurs˜oes com o bloco computado. No caso em que n˜ao for poss´ıvel gerar um bloco com pelo menos duas sequˆencias, simplesmente define alinhamento parcial como nulo e indica que nenhuma das sequˆencias foi alinhada ainda. O algoritmo termina pela adi¸c˜ao das sequˆencias “ignoradas” ao alinhamento parcialmente gerado e ent˜ao retorna-se o alinhamento produzido.

Numa varia¸c˜ao de AB1, denominada AB2 e detalhada em Algoritmo 7, tenta-se agru- par as sequˆencias ou regi˜oes de sequˆencia “ignoradas” utilizando-se o algoritmo recursivo.

Podem ser criados tantos grupos quanto necess´ario. Os subalinhamentos oriundos dos grupos formados s˜ao agrupados por alinhamentos de perfis e as sequˆencias ou regi˜oes que ainda n˜ao estejam alinhadas ao final desse processo s˜ao adicionadas em ordem arbitr´aria atrav´es de alinhamento de perfis.

Observe que o c´odigo foi alterado apenas no bloco do c´odigo onde s˜ao realizadas as recurs˜oes. Foram inseridas as linhas 20 a 24 no final do bloco. Nelas faz-se uma chamada recursiva com as sequˆencias que foram inicialmente “ignoradas”. Dessa forma, recursivamente, gera quantos grupos forem poss´ıveis e finaliza inserindo as sequˆencias que ainda assim foram “ignoradas”. ´E nesse trecho tamb´em que ´e feita a combina¸c˜ao do grupo e o alinhamento gerado com as sequˆencias inicialmente “ignoradas”.

Numa varia¸c˜ao de AB2, denominada AB3, em vez de construir os blocos pela esco- lha arbitr´aria da primeira ocorrˆencia da substring nas sequˆencias, realiza-se uma busca pela melhor combina¸c˜ao de ocorrˆencias. Para isso ´e realizado um passo de expans˜ao. Para cada combina¸c˜ao das ocorrˆencias, expande-se lateralmente, tanto quanto poss´ıvel, o bloco. Tanto `a direita quanto `a esquerda, avan¸ca-se adicionando ao bloco a classe de maior ocorrˆencia naquela hipot´etica nova coluna do alinhamento. O procedimento ´e inter- rompido quando n˜ao h´a ao menos duas ocorrˆencias de uma mesma classe. Observe que o bloco pode ser formado por subsequˆencias de comprimentos distintos. A pontua¸c˜ao para a combina¸c˜ao das ocorrˆencias ´e dada pela soma dos comprimentos das subsequˆencias no bloco formado ao final da expans˜ao.

Essa varia¸c˜ao ´e detalhada em Algoritmo 8. Note que a linha 7 do c´odigo foi alterada para trocar a primeira ocorrˆencia da substring pela melhor. Foi tamb´em inserida a linha 10, onde realiza-se a expans˜ao lateral seguida de um ajuste pela inser¸c˜ao de gaps para eventualmente completar o bloco.

Em AB4, que ´e uma varia¸c˜ao de AB3, adiciona-se um passo de expans˜ao vertical. Este adicionar´a sequˆencias que seriam “ignoradas” na recurs˜ao desde que possua uma substring com apenas uma diferen¸ca em rela¸c˜ao a substring que ocorre em um maior n´umero de sequˆencias. O passo de expans˜ao lateral ´e realizado em seguida.

Essa varia¸c˜ao ´e detalhada em Algoritmo 9. Note que agora foi inserida, na linha 10, a expans˜ao vertical antes da expans˜ao lateral.

A varia¸c˜ao AB5, inspirada em AB4, ´e detalhada em Algoritmo 10. Adiciona-se um segundo passo de expans˜ao lateral. Este permitir´a uma classe distinta do consenso a cada k classes na sequˆencia. Esse passo, entretanto, n˜ao ´e capaz de expandir a largura do bloco. As altera¸c˜oes realizadas em rela¸c˜ao ao algoritmo anterior est˜ao nas linhas 11 e 12. Na linha 11 ´e feita a expans˜ao lateral e em seguida a nova expans˜ao lateral, que ´e mais flex´ıvel. Na pr´oxima linha ´e ent˜ao feito o ajuste que eventualmente insere gaps para completar o bloco.

5.2. Alinhadores iterativos estoc´asticos 111

Refinador

Tal m´etodo baseia-se em refazer colunas mal alinhadas. Para isso, busca-se por colunas com menos de X% de concordˆancia de classe de Dayhoff(6) no alinhamento. Colunas cont´ınuas mal alinhadas determinam blocos que s˜ao refeitos.

Para refazer o bloco ´e utilizado um alinhador progressivo. Este usa modelo das cate- gorias do PHYLIP para computar a matriz de distˆancias, UPGMA para gerar a ´arvore guia e par mais pr´oximo com alinhamento de perfis e fun¸c˜ao afim para penaliza¸c˜ao de

gaps para produzir o alinhamento m´ultiplo.

Na Tabela 5.13 s˜ao apresentados os resultados obtidos pelos alinhadores de blocos da segunda abordagem. S˜ao apresentados tamb´em os resultados ao aplicar o refinador descrito nesta se¸c˜ao com X = 40, X = 50 e X = 60. Os valores correspondem a m´edia da pontua¸c˜ao SP para todas as entradas do conjunto RV12 do BAliBASE 3.0.

Pode-se observar que o uso do refinador eleva a qualidade dos alinhamentos, assim como, `a medida que ele se torna mais restritivo, observa-se tamb´em um incremento na qualidade. Observa-se uma exce¸c˜ao a esse comportamento para AB1, que inclusive obteve os melhores resultados. Isso pode ter ocorrido por efetivamente realizar um menor per- centual de alinhamento por blocos e assim faz um maior uso do alinhamento progressivo, um algoritmo mais robusto.

Resultados

Na Tabela 5.14 s˜ao apresentados os resultados dos testes com os novos algoritmos para gera¸c˜ao da popula¸c˜ao inicial. Seria esperado que, pela inclus˜ao de novos indiv´ıduos e incremento na diversidade da popula¸c˜ao, a pontua¸c˜ao fosse elevada a medida que novas abordagens fossem adicionadas `a gera¸c˜ao da popula¸c˜ao inicial. Os resultados n˜ao expuse- ram isso, assim como n˜ao foi observada uma rela¸c˜ao direta entre as pontua¸c˜oes SP e TC. Observa-se a melhor pontua¸c˜ao SP com o Algoritmo 2 e a melhor pontua¸c˜ao TC com o Algoritmo 1. A varia¸c˜ao na pontua¸c˜ao, entretanto, ´e pouco significativa.

Algoritmo 7: Algoritmo AB2. Input: sequences

Output: msa

1 //Condi¸c˜ao de parada

2 if not canContinueAligment(sequences) then 3 return computeFinalAlignment(sequences) 4 // Computa a substring 5 substring ← computeMaxOccurSubstring(sequences) 6 //Computa o bloco 7 occurrences ← getFirstSubstringOccur(sequences) 8 if length(occurrences) > 1 then 9 block ← getBlock(sequences,occurrences)

10 //Separa as sequˆencias que pertencem e as que n˜ao pertencem ao bloco 11 alignedSeqs ← getAlignedSeqs(block)

12 otherSeqs ← getOtherSeqs(sequences,alignedSeqs) 13 //Realiza as chamadas recursivas

14 leftSeqs ← extractLeftSide(sequences, block) 15 leftAlign ← AB2(leftSeqs)

16 rightSeqs ← extractRightSide(sequences, block) 17 rightAlign ← AB2(rightSeqs)

18 //Combina os resultados da recurs˜ao com o bloco 19 partialAlignment ← leftAlign + block + rightAlign 20 //Tenta formar outro grupo e o respectivo alinhamento 21 groupAlign ← AB2(otherSeqs) 22 alignedSeqs ← getAlignedSeqs(groupAlign) 23 otherSeqs ← getOtherSeqs(otherSeqs,alignedSeqs) 24 partialAlignment ← combineByProfileAlignment(partialAlignment,groupAlign) 25 else 26 partialAlignment ← null 27 otherSeqs ← sequences

28 //Adiciona as sequˆencias “ignoradas” ao alinhamento

5.2. Alinhadores iterativos estoc´asticos 113

Algoritmo 8: Algoritmo AB3. Input: sequences

Output: msa

1 //Condi¸c˜ao de parada

2 if not canContinueAligment(sequences) then 3 return computeFinalAlignment(sequences) 4 // Computa a substring 5 substring ← computeMaxOccurSubstring(sequences) 6 //Computa o bloco 7 occurrences ← getBestSubstringOccur(sequences) 8 if length(occurrences) > 1 then 9 block ← getBlock(sequences,occurrences) 10 block ← adjustAlignment(sideExpansion(block,sequences))

11 //Separa as sequˆencias que pertencem e as que n˜ao pertencem ao bloco 12 alignedSeqs ← getAlignedSeqs(block)

13 otherSeqs ← getOtherSeqs(sequences,alignedSeqs) 14 //Realiza as chamadas recursivas

15 leftSeqs ← extractLeftSide(sequences, block) 16 leftAlign ← AB3(leftSeqs)

17 rightSeqs ← extractRightSide(sequences, block) 18 rightAlign ← AB3(rightSeqs)

19 //Combina os resultados da recurs˜ao com o bloco 20 partialAlignment ← leftAlign + block + rightAlign 21 //Tenta formar outro grupo e o respectivo alinhamento 22 groupAlign ← AB3(otherSeqs) 23 alignedSeqs ← getAlignedSeqs(groupAlign) 24 otherSeqs ← getOtherSeqs(otherSeqs,alignedSeqs) 25 partialAlignment ← combineByProfileAlignment(partialAlignment,groupAlign) 26 else 27 partialAlignment ← null 28 otherSeqs ← sequences

29 //Adiciona as sequˆencias “ignoradas” ao alinhamento

Algoritmo 9: Algoritmo AB4. Input: sequences

Output: msa

1 //Condi¸c˜ao de parada

2 if not canContinueAligment(sequences) then 3 return computeFinalAlignment(sequences) 4 // Computa a substring 5 substring ← computeMaxOccurSubstring(sequences) 6 //Computa o bloco 7 occurrences ← getBestSubstringOccur(sequences) 8 if length(occurrences) > 1 then 9 block ← getBlock(sequences,occurrences) 10 block ← verticalExpansion(block,sequences) 11 block ← adjustAlignment(sideExpansion(block,sequences))

12 //Separa as sequˆencias que pertencem e as que n˜ao pertencem ao bloco 13 alignedSeqs ← getAlignedSeqs(block)

14 otherSeqs ← getOtherSeqs(sequences,alignedSeqs) 15 //Realiza as chamadas recursivas

16 leftSeqs ← extractLeftSide(sequences, block) 17 leftAlign ← AB4(leftSeqs)

18 rightSeqs ← extractRightSide(sequences, block) 19 rightAlign ← AB4(rightSeqs)

20 //Combina os resultados da recurs˜ao com o bloco 21 partialAlignment ← leftAlign + block + rightAlign 22 //Tenta formar outro grupo e o respectivo alinhamento 23 groupAlign ← AB4(otherSeqs) 24 alignedSeqs ← getAlignedSeqs(groupAlign) 25 otherSeqs ← getOtherSeqs(otherSeqs,alignedSeqs) 26 partialAlignment ← combineByProfileAlignment(partialAlignment,groupAlign) 27 else 28 partialAlignment ← null 29 otherSeqs ← sequences

30 //Adiciona as sequˆencias “ignoradas” ao alinhamento

5.2. Alinhadores iterativos estoc´asticos 115

Algoritmo 10: Algoritmo AB5. Input: sequences

Output: msa

1 //Condi¸c˜ao de parada

2 if not canContinueAligment(sequences) then 3 return computeFinalAlignment(sequences) 4 // Computa a substring 5 substring ← computeMaxOccurSubstring(sequences) 6 //Computa o bloco 7 occurrences ← getBestSubstringOccur(sequences) 8 if length(occurrences) > 1 then 9 block ← getBlock(sequences,occurrences) 10 block ← verticalExpansion(block,sequences) 11 block ← flexibleSideExpansion(sideExpansion(block,sequences)) 12 block ← adjustAlignment(block)

13 //Separa as sequˆencias que pertencem e as que n˜ao pertencem ao bloco 14 alignedSeqs ← getAlignedSeqs(block)

15 otherSeqs ← getOtherSeqs(sequences,alignedSeqs) 16 //Realiza as chamadas recursivas

17 leftSeqs ← extractLeftSide(sequences, block) 18 leftAlign ← AB5(leftSeqs)

19 rightSeqs ← extractRightSide(sequences, block) 20 rightAlign ← AB5(rightSeqs)

21 //Combina os resultados da recurs˜ao com o bloco 22 partialAlignment ← leftAlign + block + rightAlign 23 //Tenta formar outro grupo e o respectivo alinhamento 24 groupAlign ← AB5(otherSeqs) 25 alignedSeqs ← getAlignedSeqs(groupAlign) 26 otherSeqs ← getOtherSeqs(otherSeqs,alignedSeqs) 27 partialAlignment ← combineByProfileAlignment(partialAlignment,groupAlign) 28 else 29 partialAlignment ← null 30 otherSeqs ← sequences

31 //Adiciona as sequˆencias “ignoradas” ao alinhamento

Tabela 5.13: Resultados obtidos pelos alinhadores de blocos da segunda abordagem e do refinador usando X = 40, X = 50 e X = 60.

Alinhador Sem refinamento X = 40 X = 50 X = 60

AB1 50,82 50,73 50,64 50,75

AB2 42,28 42,35 42,68 43,92

AB3 39,70 39,73 40,03 41,63

AB4 36,39 37,08 37,70 39,89

AB5 36,65 37,31 37,94 40,16

Tabela 5.14: Resultados obtidos pelo ALGAe quando variou-se o procedimento para gera¸c˜ao da popula¸c˜ao inicial. Os valores correspondem a m´edia para o conjunto RV12.

Popula¸c˜ao Inicial SP TC

Algoritmo 1 80,81 56,80

Algoritmo 2 81,36 55,20

5.2. Alinhadores iterativos estoc´asticos 117

Documentos relacionados