StringTie es un programa de código abierto utilizado para ensamblar y cuantificar transcritos a partir de datos de secuenciación de ARN (RNA-seq). Esta guía proporciona una descripción detallada de los parámetros utilizados en StringTie y cómo ajustarlos para personalizar el proceso de ensamblaje y cuantificación.
- -x: Especifica el nombre del archivo de salida (archivo GTF) que contendrá la información de los transcritos ensamblados.
- -i: Opcional. Proporciona un archivo de referencia de anotación de genes en formato GTF o GFF3 para guiar el proceso de ensamblaje y cuantificación.
- -u: Especifica el nombre del archivo de salida que contendrá la matriz de expresión de los genes y sus isoformas.
- -G: Utiliza la anotación proporcionada con el parámetro -i para guiar el proceso de ensamblaje y cuantificación.
Este modo combina y ensambla conjuntos de transcritos provenientes de múltiples archivos GTF/GFF en un conjunto no redundante de transcritos. Es esencial para el análisis diferencial de expresión génica.
- -G <guide_gff>: Especifica un archivo de anotación de referencia para incluir en la fusión.
- -o <out_gtf>: Establece el nombre del archivo de salida para los transcritos fusionados en formato GTF.
- -m <min_len>: Especifica la longitud mínima que debe tener un transcrito de entrada para ser incluido en la fusión (por defecto, 50 bases).
- -c <min_cov>: Establece la cobertura mínima que debe tener un transcrito de entrada para ser incluido en la fusión (por defecto, 0).
- -F <min_fpkm>: Define el FPKM mínimo que debe tener un transcrito de entrada para ser incluido en la fusión (por defecto, 0).
- -T <min_tpm>: Establece el TPM mínimo que debe tener un transcrito de entrada para ser incluido en la fusión (por defecto, 0).
- -f <min_iso>: Especifica la fracción mínima de isoformas que un transcrito debe representar para ser incluido en la fusión (por defecto, 0.01).
- -i: Conserva los transcritos fusionados que contengan intrones retenidos.
- -l : Prefijo de nombre para los transcritos de salida fusionados (por defecto, MSTRG).
A continuación, se presenta un ejemplo de cómo utilizar StringTie para ensamblar y cuantificar transcritos a partir de datos de RNA-seq:
stringtie <read_alignments.bam> -o output.gtf -p 10 -f 0.05 -m 200 --conservative -t -s 3.0 -l LNCRNA_Donde:
<read_alignments.bam>: Especifica el archivo BAM de alineamientos como entrada.-o output.gtf: Establece el nombre del archivo de salida donde se escribirán los transcritos ensamblados.-f 0.05: Establece la mínima abundancia de isoformas como fracción de la isoforma más abundante en un locus.-m 200: Define la longitud mínima permitida para los transcritos predichos.--conservative: Activa el modo conservador para ensamblar transcritos de manera más estricta.-t: Desactiva el recorte de los extremos de los transcritos.-s 3.0: Establece la mínima cobertura permitida para los transcritos de una sola exon.-l LNCRNA_: Personaliza el prefijo para el nombre de los transcritos de salida.
- -f 0.05: Permite la identificación de isoformas menos abundantes.
- -m 200: Permite la identificación de transcritos más cortos.
- -s 3.0: Ayuda a filtrar transcritos con una cobertura más baja.
- --conservative: Reduce la tasa de falsos positivos.
Para el modo de fusión de transcritos, se puede utilizar el siguiente comando:
stringtie --merge -o NAPL5_0.05.gtf -p 10 -m 200 -f 0.05 -T 0.5 -l LNCRNA_ SRR14404330.gtf SRR14404331.gtf SRR14404332.gtf SRR14404333.gtf SRR14404334.gtf SRR14404335.gtfEn este caso, se agrega el parámetro -T 0.5 para incluir los transcritos con baja expresión, mejorando los procesos posteriores de normalización.
Para mejorar la precisión y la integridad de la anotación de los transcritos ensamblados, se utilizó gffcompare. Este programa compara y anota los transcritos ensamblados contra un archivo de referencia de anotación de genes. A continuación, se describe el proceso y el comando utilizado:
El archivo de referencia utilizado fue el archivo GTF de Rattus norvegicus (genomic.gff). El objetivo de esta comparación es identificar y clasificar los transcritos ensamblados en función de su concordancia con los genes anotados en la referencia. Este paso es crucial para validar la calidad del ensamblaje y para identificar nuevas isoformas potenciales.
El siguiente comando se utilizó para llevar a cabo la anotación con gffcompare:
gffcompare -r genomic.gff -o rn7 merged_transcripts.gtfDonde:
- -r genomic.gff: Especifica el archivo de referencia de anotación de genes en formato GFF.
- -o rn7: Establece el prefijo para los archivos de salida generados por gffcompare.
- merged_transcripts.gtf: Especifica el archivo GTF resultante del proceso de fusión de transcritos.
El uso de gffcompare permitió:
- Validación de Transcritos: Confirmar la presencia de transcritos conocidos y la identificación de nuevas isoformas.
- Clasificación de Transcritos: Clasificar los transcritos ensamblados en categorías como "completamente coincidente", "parcialmente coincidente" y "nuevas isoformas".
- Mejora de la Anotación: Proporcionar una anotación más precisa y detallada de los transcritos ensamblados, lo cual es esencial para estudios posteriores de expresión génica y análisis funcional.
Este paso es fundamental para asegurar la calidad y la utilidad de los datos de RNA-seq en investigaciones genómicas y transcriptómicas.
Antes de utilizar RNAmining, se empleó un script personalizado para filtrar los transcritos anotados por gffcompare. Este script separa los transcritos y sus exones según el código de clasificación de transcrito.
El siguiente script en Python fue utilizado para filtrar los transcritos con los códigos de clasificación =, u, i, x:
######################################################################################
# #
# Script de Filtrado de Transcritos #
# #
# Este script filtra un archivo GTF anotado por gffcompare y separa los transcritos #
# y sus exones según el código de clasificación de transcrito. #
# #
# Autor: Allan Javier Peñaloza Otárola #
# Contacto: allan.penaloza@ug.uchile.cl #
# Fecha: 12/10/2024 #
# #
######################################################################################
import argparse
def procesar_archivo(archivo_entrada, archivo_salida, codigos):
codigos = ['class_code "' + codigo + '"' for codigo in codigos.split(',')]
with open(archivo_entrada, "r") as archivo_original:
with open(archivo_salida, "w") as nuevo_archivo:
anterior = None
for linea in archivo_original:
elemento = linea.strip().split("\t")
campo = elemento[8]
subcampos = campo.split("; ")
ID = subcampos[1].split(" ")[1].replace('"', '') # Extrae el ID correctamente
if elemento[2] == 'transcript' and any(codigo in linea for codigo in codigos):
nuevo_archivo.write(linea) # No añadimos un salto de línea
anterior = ID
elif elemento[2] == 'exon' and anterior == ID:
nuevo_archivo.write(linea) # No añadimos un salto de línea
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="""
Negro Envidioso (allan.penaloza@ug.uchile.cl)
Presenta:
Script para filtrar un GTF reconstruido por StringTie por códigos de clasificación de transcripciones
""", formatter_class=argparse.RawTextHelpFormatter)
parser.add_argument('-i', '--input', help='El archivo GTF de entrada', required=True)
parser.add_argument('-o', '--output', help='El archivo GTF de salida', required=True)
parser.add_argument('-f', '--filter', nargs='?', help='Códigos de clasificación de transcripciones para filtrar. Ejemplo: -f o,c,k,m, etc.', required=False, default="")
args = parser.parse_args()
procesar_archivo(args.input, args.output, args.filter)El script permitió filtrar los transcritos con los códigos de clasificación =, u, i, x. Los transcritos filtrados con los códigos u, i, x fueron posteriormente ingresados a RNAmining para evaluar su potencial no codificante.
Para el análisis posterior de los transcritos anotados y filtrados, se utilizó la herramienta web RNAmining. Esta herramienta proporciona una plataforma integrada para el análisis de datos de RNA-seq, facilitando la normalización, visualización y análisis diferencial de expresión génica.
RNAmining permite cargar los archivos GTF anotados y realizar una serie de análisis bioinformáticos avanzados. Entre las funcionalidades destacadas se incluyen:
- Normalización de Datos: Ajuste de los datos de expresión para eliminar sesgos técnicos y biológicos.
- Análisis Diferencial de Expresión: Identificación de genes diferencialmente expresados entre condiciones experimentales.
- Visualización de Datos: Generación de gráficos y tablas para la interpretación de los resultados.
El análisis se realizó a través de la interfaz web de RNAmining, disponible en RNAmining.
El uso de RNAmining permitió:
- Normalización Eficiente: Ajustar los datos de expresión para obtener resultados más precisos y comparables.
- Identificación de Genes Clave: Detectar genes con cambios significativos en su expresión entre diferentes condiciones.
- Visualización Clara: Facilitar la interpretación de los resultados mediante gráficos y tablas intuitivas.
Este análisis es crucial para comprender los mecanismos biológicos subyacentes y para avanzar en la investigación genómica y transcriptómica.
Después de obtener los lncRNAs de RNAmining, se utilizó el siguiente script en R para visualizar y analizar los datos:
library(openxlsx)
library(ggplot2)
library(scales)
library(viridisLite)
library(viridis)
setwd('D:/Documentos/doctorado/reconstruccion de transcritos/all_datasets/')
lncRNAs = read.xlsx("lncRNAs_gffcompare.xlsx")
# largo de los mono exonicos y multi exonicos
ggplot(lncRNAs, aes(x = exon, y = len, fill = exon)) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE) +
theme_classic(base_size = 14) +
theme(text = element_text(size = 20), # Ajustamos el tamaño del texto
legend.position = "none", # Eliminamos la leyenda
plot.title = element_text(hjust = 0.5)) + # Centramos el título
labs(title ="Tamaño de los lncRNAs", # Añadimos título
x ="Categorías", # Nombre del eje X
y ="Tamaño (nt)") # Nombre del eje Y
# Gffcompare clasificacion
ggplot(lncRNAs, aes(x = classification, y = len, fill = classification)) +
geom_boxplot() +
scale_fill_viridis(discrete = TRUE) +
theme_classic(base_size = 14) +
theme(text = element_text(size = 20), # Ajustamos el tamaño del texto
legend.position = "none", # Eliminamos la leyenda
plot.title = element_text(hjust = 0.5)) + # Centramos el título
labs(title ="Tamaño de los lncRNAs descubiertos", # Añadimos título
x ="Categorías", # Nombre del eje X
y ="Tamaño (nt)") # Nombre del eje Y
# gffcompare classes
library(dplyr)
summary_data <- lncRNAs %>%
group_by(classification) %>%
summarise(tx_name_count = n_distinct(qry_id))
ggplot(data = summary_data, aes(x = classification, y = tx_name_count, fill = classification)) +
geom_bar(stat = "identity",
position = position_dodge(width = 0.8),
width = 0.7) +
geom_text(aes(label = tx_name_count), vjust = 0.5, hjust = 0, color = "black",
position = position_dodge(0.9), size = 5) + # Ajustamos las etiquetas de texto
scale_fill_viridis(discrete = TRUE) +
labs(x = 'Tipos de transcritos no codificantes',
y = 'Número de transcritos',
fill = 'Tipos de Transcritos',
title = 'Distribución de Tipos de Transcritos No Codificantes Anotados') +
theme_classic(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
axis.title = element_text(size = 14, face = "bold"),
legend.title = element_text(size = 12, face = "bold"),
legend.text = element_text(size = 12),
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 14),
plot.caption = element_text(hjust = 0.5, size = 8, face = "italic")) +
scale_y_continuous(limits = c(0, 2000),
labels = number_format(accuracy = 1)) +
coord_flip() +
guides(fill = guide_legend(reverse = TRUE))
# Combinacion de datas Mono y Multi y las clases
summary_data = lncRNAs %>%
group_by(classification, exon) %>%
summarise(tx_name_count = n_distinct(qry_id), .groups = "drop")
summary_data$interaction = with(summary_data, paste(classification, exon, sep = " "))
ggplot(data = summary_data, aes(x = interaction, y = tx_name_count, fill = interaction)) +
geom_bar(stat = "identity",
position = position_dodge(width = 0.8),
width = 0.7) +
geom_text(aes(label = tx_name_count), vjust = 0.5, hjust = 0, color = "black",
position = position_dodge(0.9), size = 5) + # Ajustamos las etiquetas de texto
scale_fill_viridis(discrete = TRUE) +
labs(x = 'Tipos de transcritos no codificantes',
y = 'Número de transcritos',
fill = 'Tipos de Transcritos',
title = 'Distribución de Tipos de Transcritos No Codificantes Anotados') +
theme_classic(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
axis.title = element_text(size = 14, face = "bold"),
legend.title = element_text(size = 12, face = "bold"),
legend.text = element_text(size = 12),
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 14),
plot.caption = element_text(hjust = 0.5, size = 8, face = "italic")) +
scale_y_continuous(limits = c(0, 2000),
labels = number_format(accuracy = 1)) +
coord_flip() +
guides(fill = guide_legend(reverse = TRUE))
# grafico de barras
ggplot(data = summary_data, aes(x = exon, y = tx_name_count, fill = classification)) +
geom_bar(stat = "identity",
position = position_dodge(width = 0.8),
width = 0.7) +
geom_text(aes(label = tx_name_count), vjust = 0.5, hjust = 0, color = "black",
position = position_dodge(0.9), size = 5) + # Ajustamos las etiquetas de texto
scale_fill_viridis(discrete = TRUE) +
labs(x = 'Tipos de transcritos no codificantes',
y = 'Número de transcritos',
fill = 'Tipos de Transcritos',
title = 'Distribución de Tipos de Transcritos No Codificantes descubiertos') +
theme_classic(base_size = 14) +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
axis.title = element_text(size = 14, face = "bold"),
legend.title = element_text(size = 12, face = "bold"),
legend.text = element_text(size = 12),
plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
plot.subtitle = element_text(hjust = 0.5, size = 14),
plot.caption = element_text(hjust = 0.5, size = 8, face = "italic")) +
scale_y_continuous(limits = c(0, 2000),
labels = number_format(accuracy = 1)) +
coord_flip() +
guides(fill = guide_legend(reverse = TRUE))