Genómica con R
Introducción
En este tutorial, aprenderemos a configurar un entorno de trabajo en R para realizar análisis de bioinformática genómica. Cubriremos la instalación de las bibliotecas necesarias y cómo cargarlas en R. A lo largo del tutorial, utilizaremos el código proporcionado en el archivo main.R
.
Instalación y carga de bibliotecas
Comenzamos instalando y cargando las bibliotecas requeridas. Asegúrate de que R esté configurado para instalar paquetes si aún no tienes estas bibliotecas instaladas. Ejecuta el siguiente código en tu consola de R:
source("install.R", local = TRUE)
El archivo install.R
contiene un script para instalar las bibliotecas necesarias. A continuación, se muestra el contenido de install.R
:
# Package R dependencies
if (!is.element("devtools", rownames(installed.packages()))) {
install.packages("devtools")
install.packages("BiocManager")
}
library(devtools)
# Install missing packages
<- function(pkg) {
missingPackages if (!is.element(pkg, rownames(installed.packages()))) {
message(pkg, "-----> Package is not installed ")
::install(pkg)
BiocManager
}
}
<- c(
dependencies "dada2", "Rbowtie2", "Rsamtools", "ape", "rjson",
"dplyr", "foreach", "doParallel", "tidyr", "Biostrings",
"gmapR", "fastqcr", "ShortRead"
)
for (i in dependencies) {
missingPackages(i)
library(i, character.only = TRUE)
}
if (!is.element("GEOquery", rownames(installed.packages()))) {
::install_github('GEOquery', 'seandavi')
devtools
}
if (!is.element("radiator", rownames(installed.packages()))) {
::install_github("thierrygosselin/radiator")
devtools
}
library(radiator)
Funciones y archivos Fuente Utilizados
En esta sección, se colocaran las funciones y los archivos fuentes que utilizaremos durante el curso.
Descarga de SRA Toolkit
El siguiente código descarga SRA Toolkit dependiendo del sistema operativo (Windows o Linux) y configura las funciones necesarias para su uso.
# Código para descargar SRA Toolkit y configurar funciones específicas
# según el sistema operativo (Windows o Linux)
# ...
# Funciones para descargar y dividir archivos SRA
setClass("sratoolkit", slots = list(dest = "character", sraid = "character"))
setGeneric("downloadsra", function(obj) {
standardGeneric("downloadsra")
})
setGeneric("fastqdump", function(obj, output) {
standardGeneric("fastqdump")
})
Listado de archivos FASTQ
El archivo listfastq.R
contiene una función llamada list_fastq
que se utiliza para listar los archivos FASTQ en un directorio específico y organizarlos según un patrón.
<- function(ruta = getwd(), pattern = c("_1.fastq", "_2.fastq")){
list_fastq #Set working directory
setwd(ruta)
= paste0(ruta,"/data/rawdata")
fastqlist.files(fastq)
<- sort(list.files(fastq, pattern = pattern[1], full.names = T))
lecturasf <- sort(list.files(fastq, pattern = pattern[2], full.names = T))
lecturasr <- sapply(strsplit(basename(lecturasf),"_"), `[`,1)
nombres_muestras return(list(lf = lecturasf, lr = lecturasr, name = nombres_muestras))
}
Filtrado y recorte de lecturas
El archivo filterreads.R
contiene una función llamada filter_reads
que se utiliza para filtrar y recortar lecturas de archivos FASTQ.
#----filtrado y recorte de lecturas----
<- function(name, lf, lr, trunc = 150){
filter_reads
<- file.path(paste0(getwd(),"/data/processed_data"), "filtered_F",
filtF paste0(name, "_filt_1.fastq"))
<- file.path(paste0(getwd(),"/data/processed_data"), "filtered_R",
filtR paste0(name, "_filt_2.fastq"))
names(filtF) <- name
names(filtR) <- name
<- filterAndTrim(lf,filtF,lr,filtR,
out truncLen = c(trunc,trunc),
maxN = 0,
maxEE = c(2,2),
truncQ = 2,
rm.phix = T,
compress = F,
multithread = T)
<- round(out[2]/out[1]*100,2)
recovery <- paste0("Secuencias recuperadas : ",recovery, "%")
log cat(log)
return(log)
}
Generación de consenso
El archivo consensus.R
contiene una función llamada consensus_parallel
que se utiliza para generar secuencias de consenso a partir de datos de secuenciación. La función consensus_parallel
toma varios argumentos, incluyendo el rango de posiciones, profundidad, umbral de frecuencia y otros.
<- function(sup, inf=1, ex, depth=0, freq_threshold = 0.6,
consensus_parallel fastafile = NULL){
mltcore,
<-function(num, ex,depth,freq_threshold ){
nucl_string ## exist position
if(nrow(ex[which(ex$pos == num), ]) == 0){
<- "N"
return else{
}<- ex[which(ex$pos ==num), ]
tmp ## depth >= threshold
if(sum(tmp$count) >= depth){
<- tmp %>% dplyr::mutate(Percentage = count/sum(count))
tmp ### most frequency nucl >= threshold
if(max(tmp$Percentage) >= freq_threshold){
<- as.character(tmp[which(tmp$Percentage == max(tmp$Percentage)),3])
tmp <- tmp
return ### most frequency nucl < threshold
else{
}
## capture two more frequency nucl
<- as.character(tmp[which(tmp$Percentage >= freq_threshold/2),3])
abg <- rev(abg)
abg_rev ## make a string normal and rev
<- paste(abg, collapse = "")
abg <- paste(abg_rev, collapse = "")
abg_rev
## identify IUPAC code
= switch(
result
abg, "AG"= "R",
"CT"= "Y",
"GC"= "S",
"AT"= "W",
"GT"= "K",
"AC"= "M"
)
= switch(
result_rev
abg_rev, "AG"= "R",
"CT"= "Y",
"GC"= "S",
"AT"= "W",
"GT"= "K",
"AC"= "M"
)
## assign code to vector consensus
if(is.null(result_rev) && is.null(result)){
<- "N"
return else{
}<- c(result,result_rev)
r <- r
return
}
}
## depth <= threshold
else{
}<- "N"
return
}
}
}
# dna_vector <- c()
<- parallel::makeCluster(
my.cluster
mltcore, type = "PSOCK"
)
::registerDoParallel(cl = my.cluster)
doParallel::getDoParRegistered()
foreach::getDoParWorkers()
foreach
<- foreach(i = 1:sup, .combine = 'c',.packages='dplyr')%dopar%{
x nucl_string(num = i, ex = ex,depth = depth,
freq_threshold = freq_threshold )
}
#make string of vector consensus
<- paste(x, collapse = "")
dna_string ::stopCluster(cl = my.cluster)
parallel
if(!is.null(fastafile)){
<-file(fastafile)
fileConnwriteLines(c(paste0(">",as.character(res$seqnames[1]),
"_",format(inf,scientific=FALSE),
":",format(sup,scientific=FALSE)),
dna_string), fileConn)close(fileConn)
}return(x)
}