DNA de vírus: alinhamento e distância

Conhecimentos básicos para lidar com sequências de DNA, RNA e proteínas utilizando ferramentas de R
Data de Publicação

23 de outubro de 2026

Dica

Nota: Este material foi escrito para práticas em R usando o RStudio.

Conceitos fundamentais

Polímeros biológicos como sequências

DNA, RNA e proteínas são polímeros formados por monômeros ordenados:

  • DNA e RNA: cadeias de nucleotídeos

  • Proteínas: cadeias de aminoácidos

A ordem dos monômeros codifica informação biológica e determina função e estrutura: a sequência de DNA codifica RNAs e proteínas; a sequência de aminoácidos determina estrutura tridimensional das proteínas e sua atividade; a sequência de nucleotídeos de um RNA, codificador ou não de proteínas, pode determinar regiões de auto pareamentos, que resultam em estruturas secundárias e terciárias com capacidade catalítica, semelhantemente às proteínas.

O formato fasta

O fasta armazena sequências (de DNA, RNA ou proteínas).

Como os nucleotídeos e aminoácidos são moléculas definidas e fácilmente representadas por letras, a International Union of Pure and Applied Chemistry IUPAC padronizou o código de uma letra, que toda a área da Bioinformática de sequências utiliza em suas análises de genética, genômica, transcriptômica, proteômica e outras áras afins.

O arquivo fasta é muito simples, composto por múltiplas linhas que podem ser apenas de 2 tipos:

  • Cabeçalho: linha iniciada por > com um identificador único da sequência e, opcionalmente, metadados.
  • Sequência: linhas subsequentes com as letras do alfabeto correspondente (aminoácidos ou nucleotídeos).

Exemplo (fasta de DNA):

>seq1 organismo=Homo_sapiens gene=MT-ND1
ATGCCCTCGGCTTCTGGTAATACACCGCGGACATCGGCGTAAAGAGTGGTTAGGAAGTCTTTCAAACTACGGTTACGGAC
ATCGGCGTAAAGAGTGGTTAGGAAGTCTTTCAAACTATACGAATACGGACATCGGCGTAAAGAGTGGTTAGGAAGTCTTT
CAAACTACGGACATCGGCGTAAAGAGTGGTTAGGAAGTCTTTCAAACTAGGCCCAAGTTGATGAACATCGGCGTAAAAAG
TGGTTAGGAACAGAGCTAGATACTAAA

Repositórios de sequências

Muitos Bancos de Dados são dedicados para o armazenamento de sequências de DNA, RNA e proteínas. O principal destes é o NCBI nucleotide. Este banco guarda virtualmente todas sequências biológicas já registradas pela ciência, com livre acesso e possibilidade de download. Todo cientista que realiza algum estudo genético deve depositar os dados genéticos lá, para contribuir para o conhecimento coletivo.

Prática

Baixar o script desta prática (.R)

Vamos conhecer um arquivo fasta? Siga as instruções a seguir no seu Rstudio. Copie, cole e execute os comandos abaixo

Preparativos

Carregando pacotes

Todos pacotes públicos criados para o R são de livre acesso. Qualquer usuário poide baixar e instalar com poucos comandos. Existem vários repositórios de pacotes (packages) e na bioinforática utilizamos práticamente dois:

  • CRAN (pacotes “gerais” do R)
    Repositório amplo e genérico (estatística, web, gráficos, etc.). Publicação via install.packages(). Ciclo de versões independente entre pacotes; revisão é mais básica e não força integração entre eles.
  • Bioconductor (instalado/gerenciado via BiocManager)
    Ecossistema focado em bioinformática/ômicas (RNA-seq, ChIP-seq, variantes, anotação, análise de dados de sequenciamento, …). Apresenta larga padronização em formatos de resultados. Possui annotation/data packages (ex.: genomas, bancos de genes) e serviços como AnnotationHub/ExperimentHub. Tem releases semestrais sincronizadas com a versão do R e checagem de compatibilidade entre pacotes, visando reprodutibilidade.

CRAN - Instalando pacotes

# 00a - instalar pacotes CRAN----

#instale apenas caso você ainda não tenha o pacote ----
#    DICA: só é preciso instalar cada pacote uma única vez


# lista de pacotes CRAN que você quer garantir instalados
cran_pkgs <- c("pheatmap",
               "stringr",
               "BiocManager",
               "ggseqlogo",
               "tidyverse",
               "RColorBrewer")

# instala apenas os que não estão presentes
for (pkg in cran_pkgs) {
  if (!requireNamespace(pkg, quietly = TRUE)) {
    install.packages(pkg)
  }
}

Bioconductor - Instalando pacotes

# 00b - instalar pacotes Bioconductor----

#instale apenas caso você ainda não tenha o pacote ----
#    DICA: só é preciso instalar cada pacote uma única vez

# lista de pacotes Bioconductor
bio_pkgs <- c("Biostrings", "DECIPHER")

# instala apenas os que faltam
for (pkg in bio_pkgs) {
  if (!requireNamespace(pkg, quietly = TRUE)) {
    BiocManager::install(pkg, ask = FALSE, update = FALSE)
  }
}

Carregando pacotes

# 01 - carregando pacotes ----
{
library("tidyverse")
library("Biostrings")
library("stringr")
library("dplyr")
library("DECIPHER")
library("tibble")
library("RColorBrewer")
library("pheatmap")
library("ggseqlogo")
}

DICA: caso receba alguma mensagem de que o pacote não foi encontrado, você pode instalá-lo com:

install.packages("pacote")

DICA: Alguns pacotes de bioinformática são fornecidos pelo Bioconductor, e podem ser instalados com o gerenciador de pacotes BiocManager

install.packages("BiocManager")
BiocManager::install("pacote")

Definindo seu diretório de trabalho

Para cada projeto, sempre crie uma pasta onde você vai salvar todos arquivos e scripts, assim você mantém seu trabalho sempre organizado. No comando abaixo, coloque dentro das aspas o caminho para o seu diretório de trabalho.

DICA: Sempre utilize a tecla TAB para autocompletar os caminhos a partir do ~ ou / (ou ****, caso no windows). Para isso, coloque o cursor (|, a barra onde sua digitação aparece) entre as ” “.

# 02 - diretório de trabalho ----

# verifique onde stamos trabalhando e onde os arquivos estão sendo salvos
getwd()



#caso queira mudar de diretório, você pode usar 
#  setwd()
#utilize o tab para autocompletar com o cursor entre as aspas

Obter arquivos

Baixe o arquivo .fasta que utilizaremos.

# 03 - baixar arquivo fasta com sequencias ----

download.file(
  "https://raw.githubusercontent.com/heronoh/bioinfo/main/aulas/r/arquivos/seqs_biomed_DNA.fasta",
  destfile = "seqs_biomed_DNA.fasta",
  mode = "wb",            # seguro no Windows/macOS/Linux
  method = "libcurl"      # segue redirecionamentos HTTPS direitinho
)

carregar o .fasta como objeto no R

Agora você vai carregar para o Ambiente (Environment) do R o arquivo que você baixou, o salvando em um objeto. Vamos fazer isso com o pacote Biostrings. O pacote Biostrings é um dos pilares do ecossistema Bioconductor, amplamente usado em bioinformática, genômica e análise de sequências biológicas. Ele fornece estruturas de dados e funções eficientes para representar, manipular e analisar sequências de DNA, RNA e proteínas em R.

# 04 - ler arquivo fasta como objeto no R ----

fasta_seqs <- Biostrings::readDNAStringSet(filepath = "seqs_biomed_DNA.fasta")

fasta_seqs
fasta_seqs
DNAStringSet object of length 10:
     width seq                                              names               
 [1]  2551 TCAGCACTTGTGGAGATGGGCCT...CTTGGAAAGGATTTTGCTATAA seq_01
 [2]  2513 TGCTCCTTGGGATGTTGATGATC...CTTGGAAAGGATTTTGCTATAA seq_02
 [3]  2568 AGAGTGAAGGAGAAATATCAGCA...CTTGGAAAGGATTTTGCTATAA seq_03
 [4]  2565 TTATAGCAAAATCCTTTCCAAGC...GATACTTCTCCTTCACTCTCAT seq_04
 [5]  2556 ATGAGAGTGAAGGAGAAATATCA...CTTGGAAAGGATTTTGCTATAA seq_05
 [6]  2535 CAGCACTTGTGGAGATGGGGGTG...CTTGGAAAGGATTTTGCTATAA seq_06
 [7]  2476 CTGTAGTGCTACAGAAAAATTGT...CTTGGAAAGGATTTTGCTATAA seq_07
 [8]  2556 TTATAGCAAAATCCTTTCCAAGC...GATATTTCTCCTTCACTCTCAT seq_08
 [9]  2556 ATGAGAGTGAAGGAGAAATATCA...CTTGGAAAGGATTTTGCTATAA seq_09
[10]  2556 ATGAGAGTGAAGGAGAAATATCA...CTTGGAAAGGATTTTGCTATAA seq_10

alinhamento de sequências

Vamos explorar esse objeto. As sequências parecem muito diferentes, mas na verdade só estão desorientadas. Como o DNA é dupla fita, você pode usar a informação em qualquer uma das fitas (sempre no sentido 5’ -> 3’) mas, para analisar vários DNAs juntos, é necessário colocar todos na mesma orientação.

O pacote DECIPHER oferece ferramentas para realizar a orientação, alinhamentos e visulização de sequências.

# 05 - alinhamentos ----

### a - orientar seqs ----
# orientar todas sequências na mesma direção (sobrescrevendo o objeto fasta_seqs)
#              (se alguma estiver no complemento reverso?)

fasta_seqs <- DECIPHER::OrientNucleotides(fasta_seqs)
========================================================================================================================================================================================================

Time difference of 0.09 secs
DECIPHER::BrowseSeqs(fasta_seqs)
### b - alinhar seqs ----

fasta_seqs_alg <- DECIPHER::AlignSeqs(myXStringSet = fasta_seqs, 
                                      refinements = 100,
                                      iterations = 100,
                                      verbose = TRUE)
fasta_seqs_alg
DNAStringSet object of length 10:
     width seq                                              names               
 [1]  2571 --------------------TCA...CTTGGAAAGGATTTTGCTATAA seq_01
 [2]  2571 -----------------------...CTTGGAAAGGATTTTGCTATAA seq_02
 [3]  2571 ---AGAGTGAAGGAGAAATATCA...CTTGGAAAGGATTTTGCTATAA seq_03
 [4]  2571 ATGAGAGTGAAGGAGAAGTATCA...CTTGGAAAGGATTTTGCTATAA seq_04
 [5]  2571 ATGAGAGTGAAGGAGAAATATCA...CTTGGAAAGGATTTTGCTATAA seq_05
 [6]  2571 ---------------------CA...CTTGGAAAGGATTTTGCTATAA seq_06
 [7]  2571 -----------------------...CTTGGAAAGGATTTTGCTATAA seq_07
 [8]  2571 ATGAGAGTGAAGGAGAAATATCA...CTTGGAAAGGATTTTGCTATAA seq_08
 [9]  2571 ATGAGAGTGAAGGAGAAATATCA...CTTGGAAAGGATTTTGCTATAA seq_09
[10]  2571 ATGAGAGTGAAGGAGAAATATCA...CTTGGAAAGGATTTTGCTATAA seq_10
### c - ver seqs ----

#veja seu alinhamento 
DECIPHER::BrowseSeqs(fasta_seqs_alg)
# onde começam e terminam as posições compartilhadas entre todos?

# 06 - Core alignment ----

# devemos utilizar apenas a parte comum a todos alinhamentos, jogar o resto fora!

#veja o objeto biostrings
fasta_subseqs_alg <-  Biostrings::subseq(fasta_seqs_alg,
                                         start = 1,   #substitua pela primeira posição compartilhada
                                         end = 2500)  #substitua pela ultima posição compartilhada


DECIPHER::BrowseSeqs(fasta_subseqs_alg)

Matriz de distâncias

# 07 - Distâncias ----

### a - calcular a matriz distâncias ----

fasta_seqs_dist <- DECIPHER::DistanceMatrix(myXStringSet = fasta_subseqs_alg,
                                            includeTerminalGaps = FALSE,
                                            correction = "JC69",   # Jukes-Cantor (nas versões antigas do DECIPHER: "Jukes-Cantor")
                                            processors = 20)
================================================================================

Time difference of 0 secs
# esta é a matriz de distâncias genéticas entre essas sequências
round(fasta_seqs_dist, 3)
       seq_01 seq_02 seq_03 seq_04 seq_05 seq_06 seq_07 seq_08 seq_09 seq_10
seq_01  0.000  0.000  0.001  0.016  0.014  0.015  0.015  0.015  0.015  0.015
seq_02  0.000  0.000  0.000  0.015  0.014  0.014  0.015  0.015  0.015  0.015
seq_03  0.001  0.000  0.000  0.015  0.013  0.014  0.015  0.015  0.015  0.015
seq_04  0.016  0.015  0.015  0.000  0.024  0.024  0.024  0.025  0.025  0.025
seq_05  0.014  0.014  0.013  0.024  0.000  0.000  0.001  0.001  0.001  0.001
seq_06  0.015  0.014  0.014  0.024  0.000  0.000  0.000  0.001  0.001  0.001
seq_07  0.015  0.015  0.015  0.024  0.001  0.000  0.000  0.000  0.000  0.000
seq_08  0.015  0.015  0.015  0.025  0.001  0.001  0.000  0.000  0.001  0.001
seq_09  0.015  0.015  0.015  0.025  0.001  0.001  0.000  0.001  0.000  0.000
seq_10  0.015  0.015  0.015  0.025  0.001  0.001  0.000  0.001  0.000  0.000
attr(,"correction")
[1] "Jukes-Cantor"

Para ver a matriz como uma planilha, use:

View(fasta_seqs_dist)

Visualizando a matriz de distâncias

# 08 - gráfico de distância ----

# vamos ver como fica a matriz

pheatmap::pheatmap(fasta_seqs_dist,
                   fontsize = 10,
                   color = RColorBrewer::brewer.pal(n = 9,name = "Greens"))

Logo de sequências

# 09 - Gráfico de proporção ----

## plotar proporção de bases para uma subsequência (ggseq logo)

### a - selecionar apenas uma pequena região parcialmente conservada

fasta_sub_char <- Biostrings::subseq(fasta_subseqs_alg,886,926) %>% as.character()

seqs_logo_plot <- ggplot2::ggplot() +
  ggseqlogo::geom_logo(data = fasta_sub_char,
                       method = "probability") +
  ggplot2::annotate(geom = "rect",
                    xmin = 12.5,xmax = 33.5,
                    ymin = -0.1,ymax = 1.1,
                    fill = "#3cff00", alpha = 0.25)

seqs_logo_plot

Para salvar o gráfico como imagem na sua pasta de trabalho:

ggplot2::ggsave(filename = "seqs_logo.png",
                device = "png",
                width = 30, height = 10,
                units = "cm")
# Referências ----
# https://www.bioconductor.org/help/course-materials/2016/BioC2016/ConcurrentWorkshops2/Wright/BigBioSeqData.pdf
# https://www.bioconductor.org/packages/release/bioc/vignettes/DECIPHER/inst/doc/DECIPHERing.pdf
# http://www2.decipher.codes/RLessons/RLesson14.html
# https://besjournals.onlinelibrary.wiley.com/doi/full/10.1111/2041-210X.12687
# http://www2.decipher.codes/OligoDesign.html
# http://www2.decipher.codes/Bioinformatics/BigBioSeqData/BigBioSeqData2.html
# https://cran.r-project.org/web/packages/ggdendro/vignettes/ggdendro.html

E por hoje ficamos por aqui!


Voltar para a página inicial