Las secuencias son fundamentales en la bioinformática. Nosotros trabajamos con secuenicas desde el inicio de la disciplina, algo más de 50 años. Las estruccturas biológicas como proteínas y nucleótidos están representados usualmente como cadena de caractres. Estas cadenas de caracteres están almacenadas y accesibles desde repositorios en linea. # Previo Nuestro proyecto de R tiene cuatro carpetas principales: 1. scr: donde están todos nuestros scripts de R. 2. data: donde están todos nuestros datos. 3. graphic: donde están todos los gráficos que se generan. 4. result: donde están todos los resultados de los análisis. # Importación de una secuencia desde una secuencia de una base de datos remota Primero necesitamos cargar los paquetes que vamos a utilizar:
library(seqinr)
## Warning: package 'seqinr' was built under R version 3.5.3
library(ape)
##
## Attaching package: 'ape'
## The following objects are masked from 'package:seqinr':
##
## as.alignment, consensus
Una vez instalado el paquete seqinr vamos a utilizar la función read.fasta() y en el parámetro de dirección vamos a poner la localizaición del archivo fasta que previamente descargamos de la vase de datos Uniprot (https://www.uniprot.org/) del Instituto Europeo Bioinformático (https://www.ebi.ac.uk/). Esta secuencia corresponde a la proteína spike de virus SARS-CoV-2 (https://www.uniprot.org/uniprot/P0DTC2), que en la base de NCBI corresponde a la siguiente proteína: https://www.ncbi.nlm.nih.gov/protein/YP_009724390.1). Creamos un objeto “ruta” para almacenar de forma mas sencilla la direccion de nuestro archivo.
ruta <- paste0(getwd(), .Platform$file.sep, "data", .Platform$file.sep, "spike.fasta")
La función getwd() nos devuelve la dirección actual del archivo de trabajo. La función paste0() crea una cadena de caractares pegando todos los parámetro sin ninguna separación. La función .Platform$file.sep() hace referencia al tipo de separador del sistema operativo que estemos utilizando. Esto es de gran ayuda si vamos a correr nuestro programa en diferentes sistemas operativos, ya que cada uno de ellos tiene diferentes separadores. Si nosotros usamos la función print() vemos que ruta hace referencia exacta a la ubicación de nuestro archivo.
print(ruta)
## [1] "C:/Users/acard/CloudStation/R-project/Clase_muestra_UTEC/data/spike.fasta"
Ahora que ya tenemos la ruta podemos crear el objeto con la función read.fasta() del paquete seqinr. Llamaremos al objeto “spike”
spike <- seqinr::read.fasta(file = paste0(getwd(),.Platform$file.sep, "data",.Platform$file.sep,"spike.txt"),
seqtype = "AA")
Ahora que ya tenemos la secuencia cargada, podemos imprimir la secuencia en pantalla con la función getSequence() del paquete seqinr:
seqinr::getSequence(spike)
## [[1]]
## [1] "M" "F" "V" "F" "L" "V" "L" "L" "P" "L" "V" "S" "S" "Q" "C" "V" "N" "L"
## [19] "T" "T" "R" "T" "Q" "L" "P" "P" "A" "Y" "T" "N" "S" "F" "T" "R" "G" "V"
## [37] "Y" "Y" "P" "D" "K" "V" "F" "R" "S" "S" "V" "L" "H" "S" "T" "Q" "D" "L"
## [55] "F" "L" "P" "F" "F" "S" "N" "V" "T" "W" "F" "H" "A" "I" "H" "V" "S" "G"
## [73] "T" "N" "G" "T" "K" "R" "F" "D" "N" "P" "V" "L" "P" "F" "N" "D" "G" "V"
## [91] "Y" "F" "A" "S" "T" "E" "K" "S" "N" "I" "I" "R" "G" "W" "I" "F" "G" "T"
## [109] "T" "L" "D" "S" "K" "T" "Q" "S" "L" "L" "I" "V" "N" "N" "A" "T" "N" "V"
## [127] "V" "I" "K" "V" "C" "E" "F" "Q" "F" "C" "N" "D" "P" "F" "L" "G" "V" "Y"
## [145] "Y" "H" "K" "N" "N" "K" "S" "W" "M" "E" "S" "E" "F" "R" "V" "Y" "S" "S"
## [163] "A" "N" "N" "C" "T" "F" "E" "Y" "V" "S" "Q" "P" "F" "L" "M" "D" "L" "E"
## [181] "G" "K" "Q" "G" "N" "F" "K" "N" "L" "R" "E" "F" "V" "F" "K" "N" "I" "D"
## [199] "G" "Y" "F" "K" "I" "Y" "S" "K" "H" "T" "P" "I" "N" "L" "V" "R" "D" "L"
## [217] "P" "Q" "G" "F" "S" "A" "L" "E" "P" "L" "V" "D" "L" "P" "I" "G" "I" "N"
## [235] "I" "T" "R" "F" "Q" "T" "L" "L" "A" "L" "H" "R" "S" "Y" "L" "T" "P" "G"
## [253] "D" "S" "S" "S" "G" "W" "T" "A" "G" "A" "A" "A" "Y" "Y" "V" "G" "Y" "L"
## [271] "Q" "P" "R" "T" "F" "L" "L" "K" "Y" "N" "E" "N" "G" "T" "I" "T" "D" "A"
## [289] "V" "D" "C" "A" "L" "D" "P" "L" "S" "E" "T" "K" "C" "T" "L" "K" "S" "F"
## [307] "T" "V" "E" "K" "G" "I" "Y" "Q" "T" "S" "N" "F" "R" "V" "Q" "P" "T" "E"
## [325] "S" "I" "V" "R" "F" "P" "N" "I" "T" "N" "L" "C" "P" "F" "G" "E" "V" "F"
## [343] "N" "A" "T" "R" "F" "A" "S" "V" "Y" "A" "W" "N" "R" "K" "R" "I" "S" "N"
## [361] "C" "V" "A" "D" "Y" "S" "V" "L" "Y" "N" "S" "A" "S" "F" "S" "T" "F" "K"
## [379] "C" "Y" "G" "V" "S" "P" "T" "K" "L" "N" "D" "L" "C" "F" "T" "N" "V" "Y"
## [397] "A" "D" "S" "F" "V" "I" "R" "G" "D" "E" "V" "R" "Q" "I" "A" "P" "G" "Q"
## [415] "T" "G" "K" "I" "A" "D" "Y" "N" "Y" "K" "L" "P" "D" "D" "F" "T" "G" "C"
## [433] "V" "I" "A" "W" "N" "S" "N" "N" "L" "D" "S" "K" "V" "G" "G" "N" "Y" "N"
## [451] "Y" "L" "Y" "R" "L" "F" "R" "K" "S" "N" "L" "K" "P" "F" "E" "R" "D" "I"
## [469] "S" "T" "E" "I" "Y" "Q" "A" "G" "S" "T" "P" "C" "N" "G" "V" "E" "G" "F"
## [487] "N" "C" "Y" "F" "P" "L" "Q" "S" "Y" "G" "F" "Q" "P" "T" "N" "G" "V" "G"
## [505] "Y" "Q" "P" "Y" "R" "V" "V" "V" "L" "S" "F" "E" "L" "L" "H" "A" "P" "A"
## [523] "T" "V" "C" "G" "P" "K" "K" "S" "T" "N" "L" "V" "K" "N" "K" "C" "V" "N"
## [541] "F" "N" "F" "N" "G" "L" "T" "G" "T" "G" "V" "L" "T" "E" "S" "N" "K" "K"
## [559] "F" "L" "P" "F" "Q" "Q" "F" "G" "R" "D" "I" "A" "D" "T" "T" "D" "A" "V"
## [577] "R" "D" "P" "Q" "T" "L" "E" "I" "L" "D" "I" "T" "P" "C" "S" "F" "G" "G"
## [595] "V" "S" "V" "I" "T" "P" "G" "T" "N" "T" "S" "N" "Q" "V" "A" "V" "L" "Y"
## [613] "Q" "D" "V" "N" "C" "T" "E" "V" "P" "V" "A" "I" "H" "A" "D" "Q" "L" "T"
## [631] "P" "T" "W" "R" "V" "Y" "S" "T" "G" "S" "N" "V" "F" "Q" "T" "R" "A" "G"
## [649] "C" "L" "I" "G" "A" "E" "H" "V" "N" "N" "S" "Y" "E" "C" "D" "I" "P" "I"
## [667] "G" "A" "G" "I" "C" "A" "S" "Y" "Q" "T" "Q" "T" "N" "S" "P" "R" "R" "A"
## [685] "R" "S" "V" "A" "S" "Q" "S" "I" "I" "A" "Y" "T" "M" "S" "L" "G" "A" "E"
## [703] "N" "S" "V" "A" "Y" "S" "N" "N" "S" "I" "A" "I" "P" "T" "N" "F" "T" "I"
## [721] "S" "V" "T" "T" "E" "I" "L" "P" "V" "S" "M" "T" "K" "T" "S" "V" "D" "C"
## [739] "T" "M" "Y" "I" "C" "G" "D" "S" "T" "E" "C" "S" "N" "L" "L" "L" "Q" "Y"
## [757] "G" "S" "F" "C" "T" "Q" "L" "N" "R" "A" "L" "T" "G" "I" "A" "V" "E" "Q"
## [775] "D" "K" "N" "T" "Q" "E" "V" "F" "A" "Q" "V" "K" "Q" "I" "Y" "K" "T" "P"
## [793] "P" "I" "K" "D" "F" "G" "G" "F" "N" "F" "S" "Q" "I" "L" "P" "D" "P" "S"
## [811] "K" "P" "S" "K" "R" "S" "F" "I" "E" "D" "L" "L" "F" "N" "K" "V" "T" "L"
## [829] "A" "D" "A" "G" "F" "I" "K" "Q" "Y" "G" "D" "C" "L" "G" "D" "I" "A" "A"
## [847] "R" "D" "L" "I" "C" "A" "Q" "K" "F" "N" "G" "L" "T" "V" "L" "P" "P" "L"
## [865] "L" "T" "D" "E" "M" "I" "A" "Q" "Y" "T" "S" "A" "L" "L" "A" "G" "T" "I"
## [883] "T" "S" "G" "W" "T" "F" "G" "A" "G" "A" "A" "L" "Q" "I" "P" "F" "A" "M"
## [901] "Q" "M" "A" "Y" "R" "F" "N" "G" "I" "G" "V" "T" "Q" "N" "V" "L" "Y" "E"
## [919] "N" "Q" "K" "L" "I" "A" "N" "Q" "F" "N" "S" "A" "I" "G" "K" "I" "Q" "D"
## [937] "S" "L" "S" "S" "T" "A" "S" "A" "L" "G" "K" "L" "Q" "D" "V" "V" "N" "Q"
## [955] "N" "A" "Q" "A" "L" "N" "T" "L" "V" "K" "Q" "L" "S" "S" "N" "F" "G" "A"
## [973] "I" "S" "S" "V" "L" "N" "D" "I" "L" "S" "R" "L" "D" "K" "V" "E" "A" "E"
## [991] "V" "Q" "I" "D" "R" "L" "I" "T" "G" "R" "L" "Q" "S" "L" "Q" "T" "Y" "V"
## [1009] "T" "Q" "Q" "L" "I" "R" "A" "A" "E" "I" "R" "A" "S" "A" "N" "L" "A" "A"
## [1027] "T" "K" "M" "S" "E" "C" "V" "L" "G" "Q" "S" "K" "R" "V" "D" "F" "C" "G"
## [1045] "K" "G" "Y" "H" "L" "M" "S" "F" "P" "Q" "S" "A" "P" "H" "G" "V" "V" "F"
## [1063] "L" "H" "V" "T" "Y" "V" "P" "A" "Q" "E" "K" "N" "F" "T" "T" "A" "P" "A"
## [1081] "I" "C" "H" "D" "G" "K" "A" "H" "F" "P" "R" "E" "G" "V" "F" "V" "S" "N"
## [1099] "G" "T" "H" "W" "F" "V" "T" "Q" "R" "N" "F" "Y" "E" "P" "Q" "I" "I" "T"
## [1117] "T" "D" "N" "T" "F" "V" "S" "G" "N" "C" "D" "V" "V" "I" "G" "I" "V" "N"
## [1135] "N" "T" "V" "Y" "D" "P" "L" "Q" "P" "E" "L" "D" "S" "F" "K" "E" "E" "L"
## [1153] "D" "K" "Y" "F" "K" "N" "H" "T" "S" "P" "D" "V" "D" "L" "G" "D" "I" "S"
## [1171] "G" "I" "N" "A" "S" "V" "V" "N" "I" "Q" "K" "E" "I" "D" "R" "L" "N" "E"
## [1189] "V" "A" "K" "N" "L" "N" "E" "S" "L" "I" "D" "L" "Q" "E" "L" "G" "K" "Y"
## [1207] "E" "Q" "Y" "I" "K" "W" "P" "W" "Y" "I" "W" "L" "G" "F" "I" "A" "G" "L"
## [1225] "I" "A" "I" "V" "M" "V" "T" "I" "M" "L" "C" "C" "M" "T" "S" "C" "C" "S"
## [1243] "C" "L" "K" "G" "C" "C" "S" "C" "G" "S" "C" "C" "K" "F" "D" "E" "D" "D"
## [1261] "S" "E" "P" "V" "L" "K" "G" "V" "K" "L" "H" "Y" "T"
Visualizar uno a uno de los aminoácidos de la secucencia es poco cómodo. Sería mas util si viéramos una tabla de contingencia con la frecuencia absoluta de cada amiácido. Para ello podemos usar la función nativa de R table() para generar facilmente una tabla de contingencia.
p1 <- table(seqinr::getSequence(spike))
print(p1)
##
## A C D E F G H I K L M N P Q R S T V W Y
## 79 40 62 48 77 82 17 76 61 108 14 88 58 62 42 99 97 97 12 54
Como vemos los aminoácidos están representados por una letra, una forma de codificación IUPAC universal. Pueden tomar la siguiente tabla como referencia.
Sin embargo, aún no es tan facil distinguir cuales son los aminoácidos mas frecuentes. Para ello podriamos hacer una gráfica de barras que permitiría identificar rapidamente los aminoácidos más frecuentes y menos frecuentes. Para ello usaremos la función nativa de R: barplot() sobre el objeto p1 que creamos previamente.
barplot(p1, las = 1, main = "Frecuencia absoluta de AA", ylab = "frecuencia absoluta", xlab = "aminoacido", col = colores1)
Tal vez sería mas conveniente verlos ordenados de mayor a menor por su frecuencia relativa. Para ello tendremos que dividir los valores previos entre el número total de aminoácidos de la secuencia. Para ello usaremos la función length().
long <- length(unlist(seqinr::getSequence(spike)))
long
## [1] 1273
Vemos que la longitud de la secuencia es de 1273 aminoácidos. Si dividmos el objeto p1 entre la longitud long, y lo ordenamos con la función sort(), podremos ver un gráfico mas util.
barplot(sort(p1/long, decreasing = T), las = 1, main = "Frecuencia absoluta de AA", ylab = "frecuencia absoluta", xlab = "aminoacido", col = colores1)
Vemos que los aminoácidos mas frecuentes son Lisina (un aminoácido hidrofóbico), Serina y Treonina (aminoácidos polares sin carga)
El paquete seqinr nos permite obtener con una sola función la estadística descriptiva de la proteína. Esta función es AAsata(), y nos brinda los valores de punto Isoelectrico, hidrofobicidad entre otros. Además nos da una gráfica de toda la secuencia.
secuencia <- seqinr::getSequence(spike)
seqinr::AAstat(unlist(secuencia))
## $Compo
##
## * A C D E F G H I K L M N P Q R S T V W
## 0 79 40 62 48 77 82 17 76 61 108 14 88 58 62 42 99 97 97 12
## Y
## 54
##
## $Prop
## $Prop$Tiny
## [1] 0.3118617
##
## $Prop$Small
## [1] 0.5514533
##
## $Prop$Aliphatic
## [1] 0.2207384
##
## $Prop$Aromatic
## [1] 0.1256874
##
## $Prop$Non.polar
## [1] 0.5475255
##
## $Prop$Polar
## [1] 0.4524745
##
## $Prop$Charged
## [1] 0.1806756
##
## $Prop$Basic
## [1] 0.09426551
##
## $Prop$Acidic
## [1] 0.08641005
##
##
## $Pi
## [1] 6.236478
A continuanción les muestro una referencia rápida de los terminos usados en esta función.