Curso Bioinformática con R 2025

Author

Dr. Juan Fidel Osuna-Ramos

Conceptos Básicos de Visualización en Bioinformática

Visualización Genómica

  • Representación gráfica de genes, regiones regulatorias, y elementos genómicos en un cromosoma o genoma completo.

  • Usos Principales:

    • Identificar variantes genéticas.

    • Explorar relaciones estructurales entre genes.

  • Ejemplo: Mapas genómicos de genes asociados a una enfermedad.

Conceptos Básico

  • Mapas Genómicos: Representan genes y regiones reguladoras.

  • Compatibilidad: Los datos deben estar estructurados como objetos GRanges.

Visualización de Tracks Genómicos

  • Definición: Superposición de diferentes capas de datos (tracks) que representan información complementaria, como:

    • Genes.

    • Variantes genéticas (SNPs, INDELs).

    • Datos de expresión génica.

  • Usos Principales:

    • Comparar diferentes tipos de datos en una región genómica.

Visualización de Redes Biológicas

  • Definición: Representación de interacciones entre genes, proteínas, o metabolitos.

  • Usos Principales:

    • Explorar vías metabólicas y de señalización.

    • Analizar relaciones funcionales y estructurales entre proteínas.

Paquete ggbio

Introducción a ggbio

  • ggbio: Extensión de ggplot2 diseñada para datos genómicos.

  • Características:

    • Visualización de genes y regiones genómicas.

    • Compatibilidad con objetos de Bioconductor como GRanges.

Funciones Principales de ggbio:

  1. autoplot: Genera gráficos genómicos simples.

  2. Tracks: Combina múltiples capas de datos en una sola visualización.

  3. plotGrandLinear: Representa valores continuos (p. ej., expresión génica) a lo largo del genoma.

Práctica 1: Visualización de una Región Genómica

Instalación de paquetes:

if (!requireNamespace("BiocManager", quietly = TRUE)) {
  install.packages("BiocManager")
}
BiocManager::install(c("ggbio", "GenomicRanges", "rtracklayer"))
Bioconductor version 3.20 (BiocManager 1.30.25), R 4.4.2 (2024-10-31 ucrt)
Warning: package(s) not installed when version(s) same as or greater than current; use
  `force = TRUE` to re-install: 'ggbio' 'GenomicRanges' 'rtracklayer'
Installation paths not writeable, unable to update packages
  path: C:/Program Files/R/R-4.4.2/library
  packages:
    class, cluster, foreign, KernSmooth, MASS, nnet, rpart, spatial, survival
Old packages: 'bit64', 'Rcpp', 'rlang', 'SparseArray', 'xfun'
library(ggbio)
Cargando paquete requerido: BiocGenerics

Adjuntando el paquete: 'BiocGenerics'
The following objects are masked from 'package:stats':

    IQR, mad, sd, var, xtabs
The following objects are masked from 'package:base':

    anyDuplicated, aperm, append, as.data.frame, basename, cbind,
    colnames, dirname, do.call, duplicated, eval, evalq, Filter, Find,
    get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply,
    match, mget, order, paste, pmax, pmax.int, pmin, pmin.int,
    Position, rank, rbind, Reduce, rownames, sapply, saveRDS, setdiff,
    table, tapply, union, unique, unsplit, which.max, which.min
Cargando paquete requerido: ggplot2
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
Need specific help about ggbio? try mailing 
 the maintainer or visit https://lawremi.github.io/ggbio/

Adjuntando el paquete: 'ggbio'
The following objects are masked from 'package:ggplot2':

    geom_bar, geom_rect, geom_segment, ggsave, stat_bin, stat_identity,
    xlim
library(GenomicRanges)
Cargando paquete requerido: stats4
Cargando paquete requerido: S4Vectors

Adjuntando el paquete: 'S4Vectors'
The following object is masked from 'package:utils':

    findMatches
The following objects are masked from 'package:base':

    expand.grid, I, unname
Cargando paquete requerido: IRanges

Adjuntando el paquete: 'IRanges'
The following object is masked from 'package:grDevices':

    windows
Cargando paquete requerido: GenomeInfoDb
library(rtracklayer)

Mapas Genómicos Simples

Visualización de Genes Simulados

  • GRanges: Define genes con posiciones iniciales y finales.

  • autoplot: Genera un gráfico genómico con colores personalizados por cada gen.

Funciones

  1. GRanges:

    • Crea un objeto para almacenar datos genómicos.

    • Contiene:

      • seqnames: Cromosoma donde se encuentran los genes.

      • ranges: Rangos definidos por start y end que especifican la posición de los genes en el cromosoma.

      • strand: Orientación de las secuencias (+ o -).

      • gene: Etiqueta para cada gen.

  2. autoplot:

    • Genera un gráfico automáticamente para el objeto GRanges.

    • Usa aes(color = gene) para colorear cada gen de forma diferente.

  3. ggtitle:

    • Agrega un título al gráfico.
# Crear datos genómicos
genes <- GRanges(
  seqnames = "chr1",
  ranges = IRanges(
    start = c(500, 2000, 4000),
    end = c(1000, 2500, 4500)
  ),
  strand = c("+", "-", "+"),
  gene = c("Gene1", "Gene2", "Gene3")
)

# Visualizar los genes
autoplot(genes, aes(color = gene)) +
  ggtitle("Mapa Genómico: Genes Simulados")

El gráfico ilustra cómo los datos genómicos pueden representarse de manera visual usando ggbio. La visualización facilita:

  • Identificar la localización de genes en un cromosoma.

  • Interpretar la orientación de los genes (+ o -).

  • Comparar rápidamente las posiciones y tamaños relativos de diferentes genes.

Este enfoque es útil para analizar regiones genómicas y sus elementos en estudios bioinformáticos.

Visualización de Genes en el Cromosoma 1

Vamos a utilizar un ejemplo basado en genes reales en el cromosoma 1 del genoma humano. Para este caso, representaremos tres genes conocidos, con sus posiciones genómicas obtenidas de la base de datos de Ensembl o UCSC Genome Browser.

Genes Seleccionados

  1. BRCA1: Gen relacionado con la susceptibilidad al cáncer de mama.

  2. TP53: Gen que codifica la proteína p53, importante en la regulación del ciclo celular.

  3. APOE: Gen involucrado en el metabolismo de lípidos.

Posiciones en el Cromosoma 1

Los rangos genómicos y las hebras para cada gen se han tomado de bases de datos genómicas públicas.

Explicación del Código

  1. Datos de los Genes:

    • Se define un objeto GRanges con las posiciones genómicas (inicio y fin) en pares de bases (bp) y se convierten a megabases (Mb).
  2. Representación del Cromosoma:

    • Usamos geom_segment para dibujar una línea horizontal (gris) que representa el cromosoma.
  3. Barras de los Genes:

    • Se agregan barras coloreadas que representan las posiciones de los genes sobre el cromosoma.
  4. Conexión al Cromosoma:

    • Líneas punteadas conectan cada barra de gen con el cromosoma para mejorar la claridad visual.
  5. Etiquetas de los Genes:

    • Se colocan etiquetas encima de cada barra para mostrar el nombre de los genes.
  6. Estilo del Gráfico:

    • Se usa theme_minimal con ajustes personalizados para quitar las líneas de cuadrícula y las etiquetas del eje Y.
#BiocManager::install(c("ggbio", "GenomicRanges"))

library(ggbio)
library(GenomicRanges)
library(ggplot2)

# Crear datos genómicos reales
genes_real <- GRanges(
  seqnames = "chr1",  # Cromosoma
  ranges = IRanges(
    start = c(43045629, 43125483, 45409028),  # Posiciones de inicio en bp
    end = c(43125482, 43164164, 45412649)    # Posiciones de fin en bp
  ),
  strand = c("+", "-", "+"),                 # Hebras de los genes
  gene = c("BRCA1", "TP53", "APOE")          # Nombres de los genes
)

# Convertir posiciones a megabases (Mb)
genes_real$start_mb <- start(genes_real) / 1e6  # Dividir por 1,000,000
genes_real$end_mb <- end(genes_real) / 1e6     # Dividir por 1,000,000

# Añadir coordenada auxiliar para las etiquetas
genes_real$y <- c(1, 2, 3)  # Coordenada Y para cada gen

# Crear el gráfico del cromosoma y los genes
p <- ggplot() +
  # Dibujar una línea horizontal que represente el cromosoma
  geom_segment(aes(x = 42, xend = 46, y = 2, yend = 2), color = "gray50", size = 1.5) +
  # Agregar barras para los genes
  geom_segment(data = as.data.frame(genes_real),
               aes(x = start_mb, xend = end_mb, y = y, yend = y, color = gene),
               size = 4) +
  # Conectar los genes con el cromosoma mediante líneas verticales
  geom_segment(data = as.data.frame(genes_real),
               aes(x = (start_mb + end_mb) / 2, xend = (start_mb + end_mb) / 2, y = y, yend = 2),
               color = "black", linetype = "dotted") +
  # Agregar etiquetas para los nombres de los genes
  geom_text(data = as.data.frame(genes_real),
            aes(x = (start_mb + end_mb) / 2, y = y + 0.2, label = gene), size = 5, hjust = 0.5) +
  # Títulos y etiquetas
  ggtitle("Mapa Genómico: Genes en el Cromosoma 1 (BRCA1, TP53, APOE)") +
  xlab("Posición Genómica (Mb)") +
  ylab("") +
  # Personalización del tema
  theme_minimal(base_size = 14) +
  theme(
    panel.grid = element_blank(),
    axis.text.y = element_blank(),
    axis.ticks.y = element_blank()
  ) +
  # Colores personalizados para los genes
  scale_color_manual(values = c("BRCA1" = "#1f77b4", "TP53" = "#ff7f0e", "APOE" = "#2ca02c"))

# Mostrar el gráfico
print(p)

  • library(ggbio):

    • Proporciona herramientas para visualizar datos genómicos de manera estructurada.

    • Especialmente útil para trabajar con objetos GRanges.

  • library(GenomicRanges):

    • Maneja datos genómicos, como regiones genómicas (cromosomas, posiciones, hebras).

    • Permite crear objetos GRanges para almacenar esta información.

  • library(ggplot2):

    • Framework de visualización de datos en R.

    • Proporciona funciones como geom_segment y geom_text para crear gráficos personalizados.

  • GRanges:

    • Crea un objeto que almacena información genómica.

    • Componentes:

      • seqnames: Nombre del cromosoma donde están los genes.

      • ranges: Rangos definidos por las posiciones inicial (start) y final (end) en pares de bases.

      • strand: Hebra en la que se encuentra cada gen (+ para positiva, - para negativa).

      • gene: Nombre o etiqueta del gen.

Conversión de Coordenadas a Megabases

  • IRanges:

    • Define las posiciones de inicio y fin de cada rango genómico.
  • start(genes_real) y end(genes_real):

    • Obtienen las posiciones de inicio y fin de cada gen en el objeto GRanges.
  • División por 1e6:

    • Convierte las posiciones de pares de bases (bp) a megabases (Mb), facilitando la interpretación gráfica.
  • Nuevas Columnas:

    • start_mb y end_mb: Guardan las posiciones en Mb para su uso en el gráfico.

Coordenada Auxiliar para Etiquetas

y:

  • Asigna un valor en el eje Y para cada gen.

  • Esto permite alinear las barras y etiquetas de manera uniforme.

Construcción del Gráfico

  1. geom_segment:

    • Dibuja una línea horizontal que representa el cromosoma.

    • Parámetros:

      • x y xend: Inicio y fin de la línea (en Mb).

      • y y yend: Altura de la línea en el eje Y.

      • color: Color de la línea.

      • size: Grosor de la línea.

    Barras de los Genes

    • Representan la ubicación y longitud de cada gen en el cromosoma.

    • Parámetros:

      • x y xend: Posiciones inicial y final en Mb.

      • y y yend: Altura en el eje Y (definida por genes_real$y).

      • color: Asigna un color a cada gen según su nombre.

    Líneas Punteadas

    Conexión al Cromosoma:

    • Dibuja líneas verticales punteadas que conectan cada barra con la línea del cromosoma.

    • Parámetros:

      • x y xend: Punto medio entre inicio y fin del gen.

      • y y yend: De la posición del gen a la línea del cromosoma.

      • linetype: Define un estilo de línea punteada.

    Etiquetas de los Genes

    Agregar Nombres:

    • Etiqueta cada gen con su nombre.

    • Parámetros:

      • x: Punto medio entre inicio y fin del gen.

      • y: Un poco por encima de la barra (y + 0.2).

      • label: El nombre del gen.

    Personalización del Tema (fondo del gráfico)

    • theme_minimal:

      • Aplica un tema limpio y simple al gráfico.
    • Quitar Elementos del Eje Y:

      • panel.grid = element_blank(): Elimina la cuadrícula.

      • axis.text.y = element_blank(): Oculta las etiquetas del eje Y.

      • axis.ticks.y = element_blank(): Oculta las marcas del eje Y.

    Asignar Colores:

    scale_color_manual

    • Asocia colores específicos a cada gen:

      • BRCA1: Azul.

      • TP53: Naranja.

      • APOE: Verde.

Visualización Circular de Genomas

La visualización circular de genomas es una herramienta poderosa en bioinformática para representar datos genómicos de manera compacta y atractiva. A continuación, se integra y explica el código proporcionado, destacando el fundamento, la utilidad y el significado de cada línea.

  • Mapas circulares de genomas

    • Representan información genómica (e.g., genes, puntuaciones, regiones) en un formato circular.

    • Útil para visualizar relaciones, distribuciones o patrones a lo largo de un genoma o entre múltiples cromosomas.

  • Aplicaciones:

    • Mostrar la organización y relaciones entre regiones genómicas.

    • Visualizar datos genómicos complejos como puntuaciones, interacciones y anotaciones funcionales.

  • El Paquete ggbio:

    • Permite generar gráficos genómicos circulares de manera sencilla.

    • Incluye funcionalidades para integrar múltiples capas como barras, puntos y enlaces.

Ejemplo 1: Representación Básica de Genomas Circulares

Explicación del Código:

  1. GRanges:

    • Crea datos genómicos simulados con:

      • seqnames: Nombres de los cromosomas (e.g., chr1, chr2).

      • ranges: Posiciones de inicio y fin.

      • score: Puntuaciones asociadas a cada rango.

  2. layout_circle:

    • Crea una representación circular de los datos genómicos.

    • Parámetros:

      • aes(fill = seqnames): Colorea las regiones según el cromosoma.

      • geom = "rect": Usa rectángulos para representar cada rango genómico.

  3. Visualización:

    • Este gráfico muestra una representación básica donde cada cromosoma es coloreado y representado como un segmento circular.
library(ggbio)

# Crear datos genómicos simulados
gr <- GRanges(
  seqnames = c("chr1", "chr2", "chr3"),               # Cromosomas
  ranges = IRanges(start = c(1, 2, 3), end = c(400, 500, 700)), # Rango genómico
  score = c(5, 10, 15)                                # Puntuaciones asociadas
)

# Generar un gráfico circular básico
ggplot(gr) + layout_circle(aes(fill = seqnames), geom = "rect")

Crear un Mapa Circular Usando Datos Reales

Vamos a crear un mapa circular utilizando un conjunto de datos real.

Este archivo está comprimido en formato .gz. Para descargar y descomprimir el archivo en R, puedes utilizar el siguiente código:

Paso 1: Descargar y Descomprimir el Archivo

Este código ya fue proporcionado y explicado previamente. Aquí está para referencia:

Este código descargará el archivo comprimido y luego lo descomprimirá para que puedas utilizarlo en tus análisis. Asegúrate de tener instalada la librería R.utils para utilizar la función gunzip. Si no la tienes instalada, puedes hacerlo con:

  • download.file(): Descarga el archivo GFF3 comprimido desde el enlace proporcionado.

  • R.utils::gunzip(): Descomprime el archivo .gz al formato .gff.

# Descargar el archivo GFF3 comprimido
#download.file(
 # url = "https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/000/005/845/GCF_000005845.2_ASM584v2/GCF_000005845.2_ASM584v2_genomic.gff.gz",
#  destfile = "ecoli_genome.gff.gz"
#)

# Descomprimir el archivo
#if (!requireNamespace("R.utils", quietly = TRUE)) install.packages("R.utils")
#library(R.utils)
#gunzip("ecoli_genome.gff.gz", remove = FALSE)

Ahora que hemos descargado y descomprimido el archivo GFF3 del genoma de Escherichia coli, continuamos con el análisis de los genes clave. Cada paso incluye una descripción detallada de las funciones y líneas de código utilizadas.

Paso 2: Cargar Librerías y Datos

Cargamos las librerías necesarias y leemos el archivo GFF3.

  • ggbio: Permite crear gráficos genómicos avanzados.

  • GenomicRanges: Proporciona estructuras de datos para manejar regiones genómicas.

  • rtracklayer::import.gff3(): Lee el archivo GFF3 y lo convierte en un objeto manipulable.

# Cargar librerías
if (!requireNamespace("ggbio", quietly = TRUE)) install.packages("ggbio")
if (!requireNamespace("GenomicRanges", quietly = TRUE)) install.packages("GenomicRanges")
if (!requireNamespace("rtracklayer", quietly = TRUE)) BiocManager::install("rtracklayer")

library(ggbio)        # Para gráficos genómicos
library(GenomicRanges) # Para manipular datos genómicos
library(rtracklayer)   # Para importar datos genómicos

# Leer el archivo GFF3
genomic_data <- import.gff3("ecoli_genome.gff")

Paso 3: Filtrar Genes Clave

Buscamos genes relacionados con la resistencia a antibióticos (bla, tetA, etc.).

  • grepl(): Busca patrones en el campo attributes del archivo GFF3, como “resistance”, “bla” o “tetA”.

  • seqnames(): Devuelve los nombres de las secuencias (cromosomas/plásmidos) en los datos filtrados.

  • unique(): Elimina duplicados para listar las secuencias únicas.

# Filtrar genes específicos por nombre
key_genes <- genomic_data[genomic_data$type == "gene" & grepl("thr", genomic_data$gene, ignore.case = TRUE)]

# Mostrar los resultados
print(as.data.frame(key_genes))
     seqnames   start     end width strand source type score phase         ID
1 NC_000913.3     190     255    66      + RefSeq gene    NA    NA gene-b0001
2 NC_000913.3     337    2799  2463      + RefSeq gene    NA    NA gene-b0002
3 NC_000913.3    2801    3733   933      + RefSeq gene    NA    NA gene-b0003
4 NC_000913.3    3734    5020  1287      + RefSeq gene    NA    NA gene-b0004
5 NC_000913.3  262871  262946    76      + RefSeq gene    NA    NA gene-b0244
6 NC_000913.3 1800642 1802570  1929      - RefSeq gene    NA    NA gene-b1719
7 NC_000913.3 3423580 3423655    76      - RefSeq gene    NA    NA gene-b3273
8 NC_000913.3 4175388 4175463    76      + RefSeq gene    NA    NA gene-b3976
9 NC_000913.3 4175754 4175829    76      + RefSeq gene    NA    NA gene-b3979
        Dbxref Is_circular Name gbkey genome mol_type strain substrain gene
1 ASAP:ABE....        <NA> thrL  Gene   <NA>     <NA>   <NA>      <NA> thrL
2 ASAP:ABE....        <NA> thrA  Gene   <NA>     <NA>   <NA>      <NA> thrA
3 ASAP:ABE....        <NA> thrB  Gene   <NA>     <NA>   <NA>      <NA> thrB
4 ASAP:ABE....        <NA> thrC  Gene   <NA>     <NA>   <NA>      <NA> thrC
5 ASAP:ABE....        <NA> thrW  Gene   <NA>     <NA>   <NA>      <NA> thrW
6 ASAP:ABE....        <NA> thrS  Gene   <NA>     <NA>   <NA>      <NA> thrS
7 ASAP:ABE....        <NA> thrV  Gene   <NA>     <NA>   <NA>      <NA> thrV
8 ASAP:ABE....        <NA> thrU  Gene   <NA>     <NA>   <NA>      <NA> thrU
9 ASAP:ABE....        <NA> thrT  Gene   <NA>     <NA>   <NA>      <NA> thrT
    gene_biotype gene_synonym locus_tag Parent orig_transcript_id product
1 protein_coding      ECK0001     b0001                      <NA>    <NA>
2 protein_coding ECK0002,....     b0002                      <NA>    <NA>
3 protein_coding      ECK0003     b0003                      <NA>    <NA>
4 protein_coding      ECK0004     b0004                      <NA>    <NA>
5           tRNA      ECK0245     b0244                      <NA>    <NA>
6 protein_coding      ECK1717     b1719                      <NA>    <NA>
7           tRNA      ECK3260     b3273                      <NA>    <NA>
8           tRNA      ECK3967     b3976                      <NA>    <NA>
9           tRNA      ECK3970     b3979                      <NA>    <NA>
  protein_id transl_table mobile_element_type Note pseudo orig_protein_id
1       <NA>         <NA>                <NA>        <NA>            <NA>
2       <NA>         <NA>                <NA>        <NA>            <NA>
3       <NA>         <NA>                <NA>        <NA>            <NA>
4       <NA>         <NA>                <NA>        <NA>            <NA>
5       <NA>         <NA>                <NA>        <NA>            <NA>
6       <NA>         <NA>                <NA>        <NA>            <NA>
7       <NA>         <NA>                <NA>        <NA>            <NA>
8       <NA>         <NA>                <NA>        <NA>            <NA>
9       <NA>         <NA>                <NA>        <NA>            <NA>
  exception transl_except
1      <NA>          <NA>
2      <NA>          <NA>
3      <NA>          <NA>
4      <NA>          <NA>
5      <NA>          <NA>
6      <NA>          <NA>
7      <NA>          <NA>
8      <NA>          <NA>
9      <NA>          <NA>

Cada línea corresponde a una característica genómica. Algunos campos importantes son:

  1. seqnames: Nombre de la secuencia (e.g., cromosoma o plásmido).

  2. start y end: Posiciones de inicio y fin en la secuencia.

  3. type: Tipo de característica (e.g., gene, CDS, region).

  4. attributes: Información adicional, como:

    • gene: Nombre del gen.

    • product: Producto codificado (e.g., proteína).

    • protein_id: Identificador único de la proteína.

Paso 4: Configurar Longitudes de los Cromosomas

Asignamos manualmente las longitudes de las secuencias.

  • seqlengths(): Asigna o recupera las longitudes de las secuencias.
# Configurar la longitud del cromosoma principal
seqlengths(key_genes) <- c("NC_000913.3" = 4641652)

Paso 5: Validar y Limpiar los Datos

Nos aseguramos de que los datos sean válidos y completos.

  • width(): Calcula el tamaño de los rangos genómicos.

  • complete.cases(): Identifica filas completas (sin valores NA).

  • values(): Accede o asigna metadatos asociados a las regiones genómicas.

# Eliminar rangos inválidos
key_genes <- key_genes[width(key_genes) > 0]

# Agregar puntuaciones aleatorias
values(key_genes)$score <- runif(length(key_genes), 1, 10)

Paso 6: Crear el Gráfico Circular

Creamos un gráfico circular para visualizar los genes clave.

# Crear gráfico circular
ggplot() +
  layout_circle(key_genes, geom = "ideo", fill = "gray85", radius = 7, trackWidth = 2) +
  layout_circle(key_genes, geom = "bar", radius = 10, trackWidth = 3,
                aes(fill = score, y = score)) +
  layout_circle(key_genes, geom = "text", aes(label = gene), radius = 14, size = 3, color = "blue") +
  ggtitle("Mapa Circular: Genes Clave en Escherichia coli") +
  xlab("Posición Genómica (Mb)") +
  ylab("") +
  theme_minimal(base_size = 14) +
  theme(
    plot.title = element_text(size = 16, face = "bold", hjust = 0.5),
    axis.text.x = element_text(size = 12),
    panel.grid = element_blank(),
    legend.position = "right"
  ) +
  scale_fill_gradient(low = "lightblue", high = "darkblue")

Tracks Genómicos

Agregar Variantes y Datos Experimentales

  • Tracks Genómicos: Permiten superponer múltiples datos en un mismo gráfico.

Tracks Genómicos: Visualización de Variantes y Datos Experimentales

Los tracks genómicos permiten superponer múltiples capas de información sobre un genoma. Esto es especialmente útil para comparar datos experimentales, variantes genómicas y anotaciones funcionales en una representación integrada.

Objetivo

  • Crear un gráfico de tracks genómicos.

  • Representar:

    1. Anotaciones genómicas (genes clave).

    2. Datos de variantes (SNPs, mutaciones).

    3. Datos experimentales (expresión génica o puntuaciones).

Paso 1: Preparar el Entorno

Instalamos y cargamos las librerías necesarias:

# Instalar y cargar librerías
if (!requireNamespace("ggbio", quietly = TRUE)) install.packages("ggbio")
if (!requireNamespace("GenomicRanges", quietly = TRUE)) install.packages("GenomicRanges")
if (!requireNamespace("rtracklayer", quietly = TRUE)) BiocManager::install("rtracklayer")

library(ggbio)        # Gráficos genómicos
library(GenomicRanges) # Manipulación de datos genómicos
library(ggplot2)       # Personalización gráfica
library(rtracklayer)   # Importación/exportación de datos genómicos

Paso 2: Crear Datos Genómicos

Generamos datos simulados para los tracks genómicos:

# Semilla para reproducibilidad
set.seed(123)

# Crear datos simulados para genes
genes <- GRanges(
  seqnames = "chr1",
  ranges = IRanges(
    start = c(100000, 200000, 300000),
    end = c(150000, 250000, 350000)
  ),
  strand = c("+", "-", "+"),
  gene = c("Gene1", "Gene2", "Gene3")
)

# Crear variantes genómicas (SNPs)
variants <- GRanges(
  seqnames = "chr1",
  ranges = IRanges(
    start = c(120000, 220000, 320000),
    end = c(120001, 220001, 320001)  # SNPs tienen un ancho de 1
  ),
  type = c("SNP", "SNP", "SNP"),
  y = c(1, 1, 1)  # Coordenadas para `geom_point`
)

# Crear datos experimentales
experimental_data <- GRanges(
  seqnames = "chr1",
  ranges = IRanges(
    start = c(100000, 200000, 300000),
    end = c(150000, 250000, 350000)
  ),
  score = c(5, 7, 9)  # Puntuaciones asociadas a los genes
)

Paso 3: Configurar el Gráfico con Tracks

Usamos la función tracks() de ggbio para superponer las capas:

# Comprobación de datos: eliminar valores inválidos
genes <- genes[width(genes) > 0]
variants <- variants[width(variants) > 0]
experimental_data <- experimental_data[width(experimental_data) > 0]

# Agregar valores `y` para variantes si no existen
if (!"y" %in% colnames(as.data.frame(variants))) {
  variants$y <- 1
}

Paso 4: Crear el Gráfico de Tracks

Integramos las capas en un gráfico de tracks utilizando tracks().

# Crear el gráfico de tracks
p <- tracks(
  Genes = autoplot(genes, aes(color = gene)) + ggtitle("Anotaciones Genómicas"),  # Track de genes
  Variants = autoplot(variants, geom = "point", aes(y = y)) + ggtitle("Variantes (SNPs)"),  # Track de variantes
  Experimental = autoplot(experimental_data, aes(y = score, fill = score)) +     # Track de datos experimentales
    ggtitle("Datos Experimentales") +
    scale_fill_gradient(low = "lightblue", high = "darkblue"),
  heights = c(3, 2, 4)  # Proporciones de altura
)
# Mostrar el gráfico
print(p)
Warning in !vapply(ggl, fixed, logical(1L)) & !vapply(PlotList, is, "Ideogram",
: longitud de objeto mayor no es múltiplo de la longitud de uno menor

Datos Simulados

  1. genes:

    • Se crean rangos genómicos para tres genes (Gene1, Gene2, Gene3).

    • La columna gene etiqueta cada región con un nombre.

  2. variants:

    • Representa SNPs (Single Nucleotide Polymorphisms).

    • Incluye coordenadas y un valor y necesario para geom_point.

  3. experimental_data:

    • Contiene puntuaciones (score) asociadas a rangos genómicos.

Gráfico con tracks

  1. Genes:

    • Usa autoplot() para representar las anotaciones genómicas.

    • Los genes se colorean según su etiqueta.

  2. Variants:

    • Los SNPs se representan como puntos (geom = "point") con coordenadas y.
  3. Experimental:

    • Representa puntuaciones como barras coloreadas usando un gradiente.
  4. Altura de Tracks:

    • heights = c(3, 2, 4) asigna proporciones de altura entre los tracks.

Resultados Esperados

Un gráfico compuesto por tres tracks:

  1. Genes en el cromosoma 1.

  2. Variantes genómicas (SNPs) representadas como puntos.

  3. Puntuaciones experimentales en barras coloreadas

Visualización bioinformática aplicada a la investigación en infectómica y patogénesis molecular.

Heatmap para la Expresión Génica Diferencial

Un heatmap (mapa de calor) es útil para analizar patrones de expresión génica diferencial entre condiciones experimentales (por ejemplo, células infectadas vs. no infectadas).

pheatmap (Ejemplo 1: Heatmap)

  • Propósito: Crear mapas de calor para visualizar matrices de datos, como expresión génica diferencial.

  • Funciones principales:

    • pheatmap():

      • mat: La matriz de datos a visualizar.

      • cluster_rows y cluster_cols: Habilita/deshabilita agrupamiento jerárquico de filas y columnas.

      • color: Gradiente de color para los valores en la matriz.

      • annotation_col: Agrega anotaciones a las columnas, útil para identificar condiciones experimentales.

      • matrix(): Crea datos de expresión simulados con valores aleatorios.

      • rownames y colnames: Asigna nombres a genes y condiciones.

      • annotation_col: Agrega información sobre las condiciones experimentales.

      • pheatmap(): Genera un heatmap con:

        • Agrupamiento de filas (cluster_rows).

        • Gradiente de color personalizado (color).

        • Anotaciones visibles en columnas (annotation_col).

# Instalar pheatmap si es necesario
if (!requireNamespace("pheatmap", quietly = TRUE)) {
  install.packages("pheatmap")
}

library(pheatmap)

# Crear matriz de datos de expresión
expresion <- matrix(
  data = rnorm(20),   # Valores aleatorios para demostración
  nrow = 4,           # 4 genes
  ncol = 5            # 5 condiciones
)
rownames(expresion) <- paste0("Gene", 1:4)  # Etiquetas de genes
colnames(expresion) <- paste0("Cond", 1:5) # Etiquetas de condiciones

# Crear anotaciones para las columnas
annotation_col <- data.frame(
  Condition = c("Control", "Infectado", "Control", "Infectado", "Control")
)
rownames(annotation_col) <- colnames(expresion)

# Generar el heatmap
pheatmap(
  expresion,
  cluster_rows = TRUE,  # Agrupar genes
  cluster_cols = FALSE, # No agrupar condiciones
  color = colorRampPalette(c("blue", "white", "red"))(50),
  main = "Expresión Génica Diferencial",
  annotation_col = annotation_col
)

Aplicación

Este gráfico es relevante para identificar genes diferencialmente expresados en estudios de transcriptómica.

El heatmap muestra patrones de expresión génica entre diferentes condiciones experimentales, permitiendo identificar grupos de genes con comportamientos similares y posibles biomarcadores asociados a ciertas condiciones.

Análisis de Redes de Interacción Proteica

Descripción

Paquete Utilizado: igraph

El paquete igraph es una herramienta poderosa para analizar y visualizar grafos y redes. Se utiliza ampliamente en bioinformática para representar redes de interacción, como redes proteicas, redes metabólicas y redes regulatorias.

Funciones principales del paquete:

  1. graph_from_data_frame(): Crea un grafo a partir de un data.frame que contiene relaciones (nodos y aristas).

  2. plot(): Visualiza el grafo con varias opciones personalizables, como colores, tamaños y etiquetas.

  • proteinas: Vector que representa los nodos (proteínas).

  • interacciones: data.frame que representa las conexiones entre proteínas. Tiene dos columnas:

    • from: Nodo de origen.

    • to: Nodo de destino.

Ejemplo de Interacciones:

  • ProteinA interactúa con ProteinB y ProteinC.

  • ProteinB interactúa con ProteinD.

  • ProteinC interactúa con ProteinE.

  • ProteinD interactúa con ProteinE.

graph_from_data_frame(): Crea un objeto de tipo igraph a partir del data.frame.

  • interacciones: Define las aristas entre nodos.

  • directed = FALSE: Especifica que la red es no dirigida, es decir, las interacciones son bidireccionales.

Visualización de la red

  • plot(): Genera una visualización del grafo.

    • vertex.color = "lightblue": Color de los nodos.

    • vertex.size = 30: Tamaño de los nodos.

    • vertex.label.cex = 1: Tamaño del texto de las etiquetas de los nodos.

    • edge.color = "gray": Color de las aristas (líneas que conectan los nodos).

    • main = "Red de Interacción Proteica": Título del gráfico.

# Instalar y cargar librerías necesarias
if (!requireNamespace("igraph", quietly = TRUE)) install.packages("igraph")
library(igraph)

Adjuntando el paquete: 'igraph'
The following objects are masked from 'package:rtracklayer':

    blocks, path
The following object is masked from 'package:GenomicRanges':

    union
The following object is masked from 'package:IRanges':

    union
The following object is masked from 'package:S4Vectors':

    union
The following objects are masked from 'package:BiocGenerics':

    normalize, path, union
The following objects are masked from 'package:stats':

    decompose, spectrum
The following object is masked from 'package:base':

    union
# Datos simulados: red de interacción de proteínas
proteinas <- c("ProteinA", "ProteinB", "ProteinC", "ProteinD", "ProteinE")
interacciones <- data.frame(
  from = c("ProteinA", "ProteinA", "ProteinB", "ProteinC", "ProteinD"),
  to = c("ProteinB", "ProteinC", "ProteinD", "ProteinE", "ProteinE")
)

# Crear el grafo
grafo <- graph_from_data_frame(interacciones, directed = FALSE)

# Visualizar la red
plot(
  grafo,
  vertex.color = "lightblue",
  vertex.size = 30,
  vertex.label.cex = 1,
  edge.color = "gray",
  main = "Red de Interacción Proteica"
)

El resultado es una red de interacción proteica visualizada como un grafo:

  • Cada nodo representa una proteína.

  • Cada arista representa una interacción entre proteínas.

  • Los colores, tamaños y etiquetas se personalizan para mejorar la legibilidad.

Interpretación Biológica: En un contexto de bioinformática, este grafo puede representar relaciones funcionales entre proteínas, como:

  • Complejos proteicos.

  • Interacciones físicas o funcionales entre proteínas relevantes en un proceso biológico, como rutas de señalización.

Aplicación

Utilizado en estudios de sistemas para analizar redes de proteínas relevantes para la patogénesis.

Visualización de SNPs en un Cromosoma

Descripción

Mostrar variantes genómicas (SNPs) mapeadas en un cromosoma, resaltando variantes de alto impacto.

GEO (Gene Expression Omnibus) es una base de datos pública de acceso libre del NCBI (National Center for Biotechnology Information). GEO almacena y distribuye datos de estudios de expresión génica y otros datos funcionales de alto rendimiento. Estos datos provienen de diversas plataformas, como microarrays, secuenciación RNA-Seq y estudios epigenómicos.

Principales Usos:

  • Descarga de datos experimentales para análisis secundario.

  • Comparación de datos entre estudios y condiciones biológicas.

  • Identificación de genes diferencialmente expresados y rutas biológicas clave

# Instalar y cargar librerías necesarias
if (!requireNamespace("ggplot2", quietly = TRUE)) install.packages("ggplot2")
library(ggplot2)

# Datos simulados: variantes en un cromosoma
set.seed(123)
snp_data <- data.frame(
  Position = sample(1:1000000, 100, replace = FALSE),
  Impact = sample(c("High", "Moderate", "Low"), 100, replace = TRUE)
)

# Visualizar SNPs en un cromosoma
ggplot(snp_data, aes(x = Position, y = 1, color = Impact)) +
  geom_point(size = 3) +
  labs(
    title = "Distribución de SNPs en el Cromosoma",
    x = "Posición Genómica",
    y = ""
  ) +
  scale_color_manual(values = c("High" = "red", "Moderate" = "orange", "Low" = "blue")) +
  theme_minimal() +
  theme(axis.text.y = element_blank(), axis.ticks.y = element_blank())

Relevante para mapear variantes en estudios de genómica de patógenos.

Volcano Plot para Análisis de Expresión

Descripción

Visualización de genes diferencialmente expresados en función del fold-change y p-valor.

# Datos simulados: análisis de expresión
set.seed(42)
volcano_data <- data.frame(
  Gene = paste0("Gene", 1:100),
  log2FoldChange = rnorm(100, mean = 0, sd = 2),
  pValue = runif(100, min = 0.001, max = 0.1)
)

# Crear el Volcano Plot
ggplot(volcano_data, aes(x = log2FoldChange, y = -log10(pValue))) +
  geom_point(aes(color = pValue < 0.05), size = 2) +
  scale_color_manual(values = c("TRUE" = "red", "FALSE" = "gray")) +
  labs(
    title = "Volcano Plot",
    x = "Log2 Fold Change",
    y = "-log10(p-Value)"
  ) +
  theme_minimal()

Destacar genes relevantes en condiciones experimentales para estudios de patogénesis.

Ejercicio

Utilizaremos datos de expresión génica relacionados con la infección por el virus de la influenza. Realizaremos un análisis detallado, generando un heatmap que nos permita visualizar patrones de expresión génica diferencial entre muestras control e infectadas.

El conjunto de datos identificado por el código de acceso GSE147507 en el Gene Expression Omnibus (GEO). Este estudio, titulado “Transcriptional response to SARS-CoV-2 infection”, se centra en la respuesta transcripcional a la infección por SARS-CoV-2

Planteamiento del Problema

El objetivo es identificar y analizar los genes diferencialmente expresados (DEGs) en muestras infectadas con Influenza. Además, se busca interpretar su funcionalidad biológica y explorar redes de co-expresión para entender los mecanismos moleculares involucrados en la patogénesis.

Descarga de Datos

Vamos a utilizar un dataset público de expresión génica diferencial para Influenza. Este archivo será descargado de GEO (Gene Expression Omnibus).

  • Paquete GEOquery: Este paquete es una interfaz para obtener datos directamente desde la base de datos GEO.

    • Funciones clave:

      • getGEO(): Descarga y carga conjuntos de datos GEO directamente en R.

      • exprs(): Extrae la matriz de expresión de los datos.

      • pData(): Obtiene información fenotípica (metadatos) de las muestras.

    • getGEO()

      • "GSE147507": Identificador único del estudio en GEO. Este ejemplo corresponde a datos relacionados con infección por Influenza.

      • GSEMatrix = TRUE: Descarga el conjunto de datos en formato de matriz para facilitar el análisis.

      • AnnotGPL = TRUE: Descarga las anotaciones asociadas al dataset, como información sobre genes o sondas.

    Extracción de Datos

  • exprs()

    • Extrae la matriz de expresión génica en formato numérico. Cada fila corresponde a un gen y cada columna a una muestra.
  • pData()

    • Extrae la información sobre las muestras, como el grupo experimental (control o infectado), plataforma, o características fenotípicas.Los objeto de lista que contiene:
    1. Matriz de expresión: Información sobre la intensidad de la expresión génica.

    2. Metadatos: Información asociada a las muestras, como la condición experimental (control o infectado).

Descripción de las bases de datos

Estas bases de datos provienen de un experimento relacionado con células epiteliales bronquiales humanas primarias infectadas con SARS-CoV-2. La información incluye:

  • Datos experimentales de NHBE (Normal Human Bronchial Epithelial cells):

    • Mock treated: Células no infectadas utilizadas como control.

    • Infected: Células infectadas con SARS-CoV-2, cepa USA-WA1/2020.

    • Plataforma utilizada: RNA-Seq en un Illumina NextSeq 500.

    • Tiempo de tratamiento: 24 horas post tratamiento (infección).

    • Preparación de RNA: RNA total extraído con RNeasy Mini Kit (Qiagen), y librerías de cDNA creadas con TruSeq Stranded mRNA LP.

    • Datos brutos: Lecturas alineadas al genoma humano (hg19) usando herramientas bioinformáticas de Illumina.

    • Análisis de expresión diferencial: Realizado con DESeq2 para identificar genes diferencialmente expresados.

2. Componentes clave de los metadatos

Cada muestra incluye:

  • Células Mock o infectadas: Identifica si la muestra es control o infectada.

  • Método de tratamiento: Mock-treated o infectadas con un virus.

  • Cepas: NHBE infectadas con SARS-CoV-2.

  • Tiempo de tratamiento: 24 horas.

  • Tipo de RNA: polyA RNA enriquecido, secuenciado por RNA-Seq.

  • Número de acceso a bases de datos:

Librerías Necesarias

A continuación, instalamos y cargamos las principales librerías que serán utilizadas para realizar los análisis.

# Instalación de librerías necesarias
if (!requireNamespace("limma", quietly = TRUE)) install.packages("limma")
if (!requireNamespace("clusterProfiler", quietly = TRUE)) BiocManager::install("clusterProfiler")
if (!requireNamespace("org.Hs.eg.db", quietly = TRUE)) BiocManager::install("org.Hs.eg.db")
if (!requireNamespace("igraph", quietly = TRUE)) install.packages("igraph")
if (!requireNamespace("pheatmap", quietly = TRUE)) install.packages("pheatmap")
if (!requireNamespace("ggplot2", quietly = TRUE)) install.packages("ggplot2")

# Carga de librerías
library(limma)         # Análisis diferencial

Adjuntando el paquete: 'limma'
The following object is masked from 'package:BiocGenerics':

    plotMA
library(clusterProfiler) # Enriquecimiento funcional
clusterProfiler v4.14.4 Learn more at https://yulab-smu.top/contribution-knowledge-mining/

Please cite:

S Xu, E Hu, Y Cai, Z Xie, X Luo, L Zhan, W Tang, Q Wang, B Liu, R Wang,
W Xie, T Wu, L Xie, G Yu. Using clusterProfiler to characterize
multiomics data. Nature Protocols. 2024, 19(11):3292-3320

Adjuntando el paquete: 'clusterProfiler'
The following object is masked from 'package:igraph':

    simplify
The following object is masked from 'package:IRanges':

    slice
The following object is masked from 'package:S4Vectors':

    rename
The following object is masked from 'package:stats':

    filter
library(org.Hs.eg.db)    # Anotación genómica para humanos
Cargando paquete requerido: AnnotationDbi
Cargando paquete requerido: Biobase
Welcome to Bioconductor

    Vignettes contain introductory material; view with
    'browseVignettes()'. To cite Bioconductor, see
    'citation("Biobase")', and for packages 'citation("pkgname")'.

Adjuntando el paquete: 'AnnotationDbi'
The following object is masked from 'package:clusterProfiler':

    select
library(igraph)          # Análisis y visualización de redes
library(pheatmap)        # Visualización de heatmaps
library(ggplot2)         # Visualización gráfica
# Instalar paquetes necesarios si no están disponibles
if (!requireNamespace("DESeq2", quietly = TRUE)) BiocManager::install("DESeq2")
if (!requireNamespace("pheatmap", quietly = TRUE)) install.packages("pheatmap")
if (!requireNamespace("EnhancedVolcano", quietly = TRUE)) BiocManager::install("EnhancedVolcano")
if (!requireNamespace("R.utils", quietly = TRUE)) install.packages("R.utils")

# Cargar las librerías necesarias
library(DESeq2)        # Para análisis diferencial de expresión
Cargando paquete requerido: SummarizedExperiment
Cargando paquete requerido: MatrixGenerics
Cargando paquete requerido: matrixStats

Adjuntando el paquete: 'matrixStats'
The following objects are masked from 'package:Biobase':

    anyMissing, rowMedians

Adjuntando el paquete: 'MatrixGenerics'
The following objects are masked from 'package:matrixStats':

    colAlls, colAnyNAs, colAnys, colAvgsPerRowSet, colCollapse,
    colCounts, colCummaxs, colCummins, colCumprods, colCumsums,
    colDiffs, colIQRDiffs, colIQRs, colLogSumExps, colMadDiffs,
    colMads, colMaxs, colMeans2, colMedians, colMins, colOrderStats,
    colProds, colQuantiles, colRanges, colRanks, colSdDiffs, colSds,
    colSums2, colTabulates, colVarDiffs, colVars, colWeightedMads,
    colWeightedMeans, colWeightedMedians, colWeightedSds,
    colWeightedVars, rowAlls, rowAnyNAs, rowAnys, rowAvgsPerColSet,
    rowCollapse, rowCounts, rowCummaxs, rowCummins, rowCumprods,
    rowCumsums, rowDiffs, rowIQRDiffs, rowIQRs, rowLogSumExps,
    rowMadDiffs, rowMads, rowMaxs, rowMeans2, rowMedians, rowMins,
    rowOrderStats, rowProds, rowQuantiles, rowRanges, rowRanks,
    rowSdDiffs, rowSds, rowSums2, rowTabulates, rowVarDiffs, rowVars,
    rowWeightedMads, rowWeightedMeans, rowWeightedMedians,
    rowWeightedSds, rowWeightedVars
The following object is masked from 'package:Biobase':

    rowMedians
library(pheatmap)      # Para heatmap
library(EnhancedVolcano) # Para volcano plot
Cargando paquete requerido: ggrepel

Paso 2: Descargar y Preparar Datos GEO

  1. Descargar archivos crudos desde GEO:
library(R.utils)       # Para manejo de archivos comprimidos
Cargando paquete requerido: R.oo
Cargando paquete requerido: R.methodsS3
R.methodsS3 v1.8.2 (2022-06-13 22:00:14 UTC) successfully loaded. See ?R.methodsS3 for help.
R.oo v1.27.0 (2024-11-01 18:00:02 UTC) successfully loaded. See ?R.oo for help.

Adjuntando el paquete: 'R.oo'
The following object is masked from 'package:R.methodsS3':

    throw
The following object is masked from 'package:SummarizedExperiment':

    trim
The following object is masked from 'package:igraph':

    hierarchy
The following object is masked from 'package:GenomicRanges':

    trim
The following object is masked from 'package:IRanges':

    trim
The following objects are masked from 'package:methods':

    getClasses, getMethods
The following objects are masked from 'package:base':

    attach, detach, load, save
R.utils v2.12.3 (2023-11-18 01:00:02 UTC) successfully loaded. See ?R.utils for help.

Adjuntando el paquete: 'R.utils'
The following object is masked from 'package:ggbio':

    reset
The following object is masked from 'package:utils':

    timestamp
The following objects are masked from 'package:base':

    cat, commandArgs, getOption, isOpen, nullfile, parse, use, warnings
# Descargar datos crudos de GEO
#download.file(
 # "https://ftp.ncbi.nlm.nih.gov/geo/series/GSE147nnn/GSE147507/suppl/GSE147507_RawReadCounts_Human.tsv.gz",
#  destfile = "RawReadCounts_Human.tsv.gz"
#)

# Descomprimir el archivo descargado
#gunzip("RawReadCounts_Human.tsv.gz", remove = FALSE)

Cargar los datos de expresión génica:

# Leer datos de expresión crudos
counts <- read.table("RawReadCounts_Human.tsv", header = TRUE, sep = "\t", row.names = 1)

# Inspeccionar los primeros datos
head(counts)
          Series1_NHBE_Mock_1 Series1_NHBE_Mock_2 Series1_NHBE_Mock_3
DDX11L1                     0                   0                   0
WASH7P                     29                  24                  23
FAM138A                     0                   0                   0
FAM138F                     0                   0                   0
OR4F5                       0                   0                   0
LOC729737                 112                 119                 113
          Series1_NHBE_SARS.CoV.2_1 Series1_NHBE_SARS.CoV.2_2
DDX11L1                           0                         0
WASH7P                           34                        19
FAM138A                           0                         0
FAM138F                           0                         0
OR4F5                             0                         0
LOC729737                       127                        84
          Series1_NHBE_SARS.CoV.2_3 Series2_A549_Mock_1 Series2_A549_Mock_2
DDX11L1                           0                   0                   0
WASH7P                           44                  68                  43
FAM138A                           0                   0                   0
FAM138F                           0                   0                   0
OR4F5                             0                   0                   0
LOC729737                       270                  11                   3
          Series2_A549_Mock_3 Series2_A549_SARS.CoV.2_1
DDX11L1                     0                         0
WASH7P                     33                        65
FAM138A                     0                         0
FAM138F                     0                         0
OR4F5                       0                         0
LOC729737                   6                         8
          Series2_A549_SARS.CoV.2_2 Series2_A549_SARS.CoV.2_3
DDX11L1                           1                         1
WASH7P                           79                        48
FAM138A                           0                         0
FAM138F                           0                         0
OR4F5                             0                         0
LOC729737                        10                        10
          Series3_A549_Mock_1 Series3_A549_Mock_2 Series3_A549_RSV_1
DDX11L1                     1                   0                  0
WASH7P                    184                 128                 51
FAM138A                     0                   0                  0
FAM138F                     0                   0                  0
OR4F5                       0                   0                  0
LOC729737                 108                  95                 37
          Series3_A549_RSV_2 Series4_A549_Mock_1 Series4_A549_Mock_2
DDX11L1                    0                   0                   0
WASH7P                    43                  15                  12
FAM138A                    0                   0                   0
FAM138F                    0                   0                   0
OR4F5                      0                   0                   0
LOC729737                 11                   1                   5
          Series4_A549_IAV_1 Series4_A549_IAV_2 Series5_A549_Mock_1
DDX11L1                    0                  0                   0
WASH7P                     3                  3                  64
FAM138A                    0                  0                   0
FAM138F                    0                  0                   0
OR4F5                      0                  0                   0
LOC729737                  0                  2                   7
          Series5_A549_Mock_2 Series5_A549_Mock_3 Series5_A549_SARS.CoV.2_1
DDX11L1                     0                   0                         0
WASH7P                     53                  37                        38
FAM138A                     0                   0                         0
FAM138F                     0                   0                         0
OR4F5                       0                   0                         0
LOC729737                  14                  11                         1
          Series5_A549_SARS.CoV.2_2 Series5_A549_SARS.CoV.2_3
DDX11L1                           0                         0
WASH7P                           47                        65
FAM138A                           0                         0
FAM138F                           0                         0
OR4F5                             0                         0
LOC729737                        13                         4
          Series6_A549.ACE2_Mock_1 Series6_A549.ACE2_Mock_2
DDX11L1                          0                        0
WASH7P                          37                        4
FAM138A                          0                        0
FAM138F                          0                        0
OR4F5                            0                        0
LOC729737                       13                        2
          Series6_A549.ACE2_Mock_3 Series6_A549.ACE2_SARS.CoV.2_1
DDX11L1                          0                              0
WASH7P                          22                              1
FAM138A                          0                              0
FAM138F                          0                              0
OR4F5                            0                              0
LOC729737                       18                              9
          Series6_A549.ACE2_SARS.CoV.2_2 Series6_A549.ACE2_SARS.CoV.2_3
DDX11L1                                0                              0
WASH7P                                 2                              4
FAM138A                                0                              0
FAM138F                                0                              0
OR4F5                                  0                              0
LOC729737                              2                              1
          Series7_Calu3_Mock_1 Series7_Calu3_Mock_2 Series7_Calu3_Mock_3
DDX11L1                      0                    0                    0
WASH7P                      25                   60                   84
FAM138A                      0                    0                    0
FAM138F                      0                    0                    0
OR4F5                        0                    0                    0
LOC729737                   65                  184                  435
          Series7_Calu3_SARS.CoV.2_1 Series7_Calu3_SARS.CoV.2_2
DDX11L1                            1                          0
WASH7P                            47                         32
FAM138A                            0                          0
FAM138F                            0                          0
OR4F5                              0                          0
LOC729737                        271                        137
          Series7_Calu3_SARS.CoV.2_3 Series8_A549_Mock_1 Series8_A549_Mock_2
DDX11L1                            0                   0                   0
WASH7P                            41                  68                  17
FAM138A                            0                   0                   0
FAM138F                            0                   0                   0
OR4F5                              0                   0                   0
LOC729737                        265                   4                   3
          Series8_A549_Mock_3 Series8_A549_RSV_1 Series8_A549_RSV_2
DDX11L1                     0                  0                  0
WASH7P                     21                 18                  9
FAM138A                     0                  0                  0
FAM138F                     0                  0                  0
OR4F5                       0                  0                  0
LOC729737                   5                 13                  9
          Series8_A549_RSV_3 Series8_A549_HPIV3_3 Series8_A549_HPIV3_2
DDX11L1                    1                    0                    0
WASH7P                    28                   12                   23
FAM138A                    0                    0                    0
FAM138F                    0                    0                    0
OR4F5                      0                    0                    0
LOC729737                  9                    3                    5
          Series8_A549_HPIV3_1 Series9_NHBE_Mock_1 Series9_NHBE_Mock_2
DDX11L1                      0                   0                   0
WASH7P                      14                  57                  58
FAM138A                      0                   0                   0
FAM138F                      0                   0                   0
OR4F5                        0                   0                   0
LOC729737                    5                  58                  51
          Series9_NHBE_Mock_3 Series9_NHBE_Mock_4 Series9_NHBE_IAV_1
DDX11L1                     0                   0                  0
WASH7P                     53                  89                102
FAM138A                     0                   0                  0
FAM138F                     0                   0                  0
OR4F5                       0                   0                  0
LOC729737                  44                  93                107
          Series9_NHBE_IAV_2 Series9_NHBE_IAV_3 Series9_NHBE_IAV_4
DDX11L1                    0                  0                  0
WASH7P                    26                 21                  7
FAM138A                    0                  0                  0
FAM138F                    0                  0                  0
OR4F5                      0                  0                  0
LOC729737                 37                 30                 10
          Series9_NHBE_IAVdNS1_1 Series9_NHBE_IAVdNS1_2 Series9_NHBE_IAVdNS1_3
DDX11L1                        0                      0                      0
WASH7P                        41                     56                     36
FAM138A                        0                      0                      0
FAM138F                        0                      0                      0
OR4F5                          0                      0                      0
LOC729737                     52                     52                     42
          Series9_NHBE_IAVdNS1_4 Series9_NHBE_IFNB_4h_1 Series9_NHBE_IFNB_4h_2
DDX11L1                        0                      0                      0
WASH7P                       131                     72                     66
FAM138A                        0                      0                      0
FAM138F                        0                      0                      0
OR4F5                          0                      0                      0
LOC729737                    101                     94                    102
          Series9_NHBE_IFNB_6h_1 Series9_NHBE_IFNB_6h_2 Series9_NHBE_IFNB_12h_1
DDX11L1                        0                      0                       0
WASH7P                        46                     35                      48
FAM138A                        0                      0                       0
FAM138F                        0                      0                       0
OR4F5                          0                      0                       0
LOC729737                     52                     41                      41
          Series9_NHBE_IFNB_12h_2 Series15_HealthyLungBiopsy_2
DDX11L1                         0                            0
WASH7P                         46                          261
FAM138A                         0                            0
FAM138F                         0                            0
OR4F5                           0                            0
LOC729737                      60                           15
          Series15_HealthyLungBiopsy_1 Series15_COVID19Lung_2
DDX11L1                              0                      0
WASH7P                             140                      0
FAM138A                              0                      0
FAM138F                              0                      0
OR4F5                                0                      0
LOC729737                           70                     17
          Series15_COVID19Lung_1 Series16_A549.ACE2_Mock_1
DDX11L1                        0                         0
WASH7P                         0                         0
FAM138A                        0                         0
FAM138F                        0                         0
OR4F5                          0                         0
LOC729737                      0                         1
          Series16_A549.ACE2_Mock_2 Series16_A549.ACE2_Mock_3
DDX11L1                           0                         0
WASH7P                           11                         7
FAM138A                           0                         0
FAM138F                           0                         0
OR4F5                             0                         0
LOC729737                         2                         2
          Series16_A549.ACE2_SARS.CoV.2_1 Series16_A549.ACE2_SARS.CoV.2_2
DDX11L1                                 0                               0
WASH7P                                  2                               6
FAM138A                                 0                               0
FAM138F                                 0                               0
OR4F5                                   0                               0
LOC729737                               0                               0
          Series16_A549.ACE2_SARS.CoV.2_3 Series16_A549.ACE2_SARS.CoV.2_Rux_1
DDX11L1                                 0                                   0
WASH7P                                  5                                  12
FAM138A                                 0                                   0
FAM138F                                 0                                   0
OR4F5                                   0                                   0
LOC729737                               1                                   4
          Series16_A549.ACE2_SARS.CoV.2_Rux_2
DDX11L1                                     0
WASH7P                                      6
FAM138A                                     0
FAM138F                                     0
OR4F5                                       0
LOC729737                                   0
          Series16_A549.ACE2_SARS.CoV.2_Rux_3
DDX11L1                                     0
WASH7P                                      8
FAM138A                                     0
FAM138F                                     0
OR4F5                                       0
LOC729737                                   2

Paso 3: Preparar Metadatos

  1. Definir las condiciones experimentales para las muestras:
# Crear un marco de datos de metadatos
metadata <- data.frame(
  sample = colnames(counts),
  condition = c("Control", "Infectado", "Control", "Infectado", "Control", "Infectado")
)
rownames(metadata) <- metadata$sample

# Inspeccionar los metadatos
print(metadata)
                                                                 sample
Series1_NHBE_Mock_1                                 Series1_NHBE_Mock_1
Series1_NHBE_Mock_2                                 Series1_NHBE_Mock_2
Series1_NHBE_Mock_3                                 Series1_NHBE_Mock_3
Series1_NHBE_SARS.CoV.2_1                     Series1_NHBE_SARS.CoV.2_1
Series1_NHBE_SARS.CoV.2_2                     Series1_NHBE_SARS.CoV.2_2
Series1_NHBE_SARS.CoV.2_3                     Series1_NHBE_SARS.CoV.2_3
Series2_A549_Mock_1                                 Series2_A549_Mock_1
Series2_A549_Mock_2                                 Series2_A549_Mock_2
Series2_A549_Mock_3                                 Series2_A549_Mock_3
Series2_A549_SARS.CoV.2_1                     Series2_A549_SARS.CoV.2_1
Series2_A549_SARS.CoV.2_2                     Series2_A549_SARS.CoV.2_2
Series2_A549_SARS.CoV.2_3                     Series2_A549_SARS.CoV.2_3
Series3_A549_Mock_1                                 Series3_A549_Mock_1
Series3_A549_Mock_2                                 Series3_A549_Mock_2
Series3_A549_RSV_1                                   Series3_A549_RSV_1
Series3_A549_RSV_2                                   Series3_A549_RSV_2
Series4_A549_Mock_1                                 Series4_A549_Mock_1
Series4_A549_Mock_2                                 Series4_A549_Mock_2
Series4_A549_IAV_1                                   Series4_A549_IAV_1
Series4_A549_IAV_2                                   Series4_A549_IAV_2
Series5_A549_Mock_1                                 Series5_A549_Mock_1
Series5_A549_Mock_2                                 Series5_A549_Mock_2
Series5_A549_Mock_3                                 Series5_A549_Mock_3
Series5_A549_SARS.CoV.2_1                     Series5_A549_SARS.CoV.2_1
Series5_A549_SARS.CoV.2_2                     Series5_A549_SARS.CoV.2_2
Series5_A549_SARS.CoV.2_3                     Series5_A549_SARS.CoV.2_3
Series6_A549.ACE2_Mock_1                       Series6_A549.ACE2_Mock_1
Series6_A549.ACE2_Mock_2                       Series6_A549.ACE2_Mock_2
Series6_A549.ACE2_Mock_3                       Series6_A549.ACE2_Mock_3
Series6_A549.ACE2_SARS.CoV.2_1           Series6_A549.ACE2_SARS.CoV.2_1
Series6_A549.ACE2_SARS.CoV.2_2           Series6_A549.ACE2_SARS.CoV.2_2
Series6_A549.ACE2_SARS.CoV.2_3           Series6_A549.ACE2_SARS.CoV.2_3
Series7_Calu3_Mock_1                               Series7_Calu3_Mock_1
Series7_Calu3_Mock_2                               Series7_Calu3_Mock_2
Series7_Calu3_Mock_3                               Series7_Calu3_Mock_3
Series7_Calu3_SARS.CoV.2_1                   Series7_Calu3_SARS.CoV.2_1
Series7_Calu3_SARS.CoV.2_2                   Series7_Calu3_SARS.CoV.2_2
Series7_Calu3_SARS.CoV.2_3                   Series7_Calu3_SARS.CoV.2_3
Series8_A549_Mock_1                                 Series8_A549_Mock_1
Series8_A549_Mock_2                                 Series8_A549_Mock_2
Series8_A549_Mock_3                                 Series8_A549_Mock_3
Series8_A549_RSV_1                                   Series8_A549_RSV_1
Series8_A549_RSV_2                                   Series8_A549_RSV_2
Series8_A549_RSV_3                                   Series8_A549_RSV_3
Series8_A549_HPIV3_3                               Series8_A549_HPIV3_3
Series8_A549_HPIV3_2                               Series8_A549_HPIV3_2
Series8_A549_HPIV3_1                               Series8_A549_HPIV3_1
Series9_NHBE_Mock_1                                 Series9_NHBE_Mock_1
Series9_NHBE_Mock_2                                 Series9_NHBE_Mock_2
Series9_NHBE_Mock_3                                 Series9_NHBE_Mock_3
Series9_NHBE_Mock_4                                 Series9_NHBE_Mock_4
Series9_NHBE_IAV_1                                   Series9_NHBE_IAV_1
Series9_NHBE_IAV_2                                   Series9_NHBE_IAV_2
Series9_NHBE_IAV_3                                   Series9_NHBE_IAV_3
Series9_NHBE_IAV_4                                   Series9_NHBE_IAV_4
Series9_NHBE_IAVdNS1_1                           Series9_NHBE_IAVdNS1_1
Series9_NHBE_IAVdNS1_2                           Series9_NHBE_IAVdNS1_2
Series9_NHBE_IAVdNS1_3                           Series9_NHBE_IAVdNS1_3
Series9_NHBE_IAVdNS1_4                           Series9_NHBE_IAVdNS1_4
Series9_NHBE_IFNB_4h_1                           Series9_NHBE_IFNB_4h_1
Series9_NHBE_IFNB_4h_2                           Series9_NHBE_IFNB_4h_2
Series9_NHBE_IFNB_6h_1                           Series9_NHBE_IFNB_6h_1
Series9_NHBE_IFNB_6h_2                           Series9_NHBE_IFNB_6h_2
Series9_NHBE_IFNB_12h_1                         Series9_NHBE_IFNB_12h_1
Series9_NHBE_IFNB_12h_2                         Series9_NHBE_IFNB_12h_2
Series15_HealthyLungBiopsy_2               Series15_HealthyLungBiopsy_2
Series15_HealthyLungBiopsy_1               Series15_HealthyLungBiopsy_1
Series15_COVID19Lung_2                           Series15_COVID19Lung_2
Series15_COVID19Lung_1                           Series15_COVID19Lung_1
Series16_A549.ACE2_Mock_1                     Series16_A549.ACE2_Mock_1
Series16_A549.ACE2_Mock_2                     Series16_A549.ACE2_Mock_2
Series16_A549.ACE2_Mock_3                     Series16_A549.ACE2_Mock_3
Series16_A549.ACE2_SARS.CoV.2_1         Series16_A549.ACE2_SARS.CoV.2_1
Series16_A549.ACE2_SARS.CoV.2_2         Series16_A549.ACE2_SARS.CoV.2_2
Series16_A549.ACE2_SARS.CoV.2_3         Series16_A549.ACE2_SARS.CoV.2_3
Series16_A549.ACE2_SARS.CoV.2_Rux_1 Series16_A549.ACE2_SARS.CoV.2_Rux_1
Series16_A549.ACE2_SARS.CoV.2_Rux_2 Series16_A549.ACE2_SARS.CoV.2_Rux_2
Series16_A549.ACE2_SARS.CoV.2_Rux_3 Series16_A549.ACE2_SARS.CoV.2_Rux_3
                                    condition
Series1_NHBE_Mock_1                   Control
Series1_NHBE_Mock_2                 Infectado
Series1_NHBE_Mock_3                   Control
Series1_NHBE_SARS.CoV.2_1           Infectado
Series1_NHBE_SARS.CoV.2_2             Control
Series1_NHBE_SARS.CoV.2_3           Infectado
Series2_A549_Mock_1                   Control
Series2_A549_Mock_2                 Infectado
Series2_A549_Mock_3                   Control
Series2_A549_SARS.CoV.2_1           Infectado
Series2_A549_SARS.CoV.2_2             Control
Series2_A549_SARS.CoV.2_3           Infectado
Series3_A549_Mock_1                   Control
Series3_A549_Mock_2                 Infectado
Series3_A549_RSV_1                    Control
Series3_A549_RSV_2                  Infectado
Series4_A549_Mock_1                   Control
Series4_A549_Mock_2                 Infectado
Series4_A549_IAV_1                    Control
Series4_A549_IAV_2                  Infectado
Series5_A549_Mock_1                   Control
Series5_A549_Mock_2                 Infectado
Series5_A549_Mock_3                   Control
Series5_A549_SARS.CoV.2_1           Infectado
Series5_A549_SARS.CoV.2_2             Control
Series5_A549_SARS.CoV.2_3           Infectado
Series6_A549.ACE2_Mock_1              Control
Series6_A549.ACE2_Mock_2            Infectado
Series6_A549.ACE2_Mock_3              Control
Series6_A549.ACE2_SARS.CoV.2_1      Infectado
Series6_A549.ACE2_SARS.CoV.2_2        Control
Series6_A549.ACE2_SARS.CoV.2_3      Infectado
Series7_Calu3_Mock_1                  Control
Series7_Calu3_Mock_2                Infectado
Series7_Calu3_Mock_3                  Control
Series7_Calu3_SARS.CoV.2_1          Infectado
Series7_Calu3_SARS.CoV.2_2            Control
Series7_Calu3_SARS.CoV.2_3          Infectado
Series8_A549_Mock_1                   Control
Series8_A549_Mock_2                 Infectado
Series8_A549_Mock_3                   Control
Series8_A549_RSV_1                  Infectado
Series8_A549_RSV_2                    Control
Series8_A549_RSV_3                  Infectado
Series8_A549_HPIV3_3                  Control
Series8_A549_HPIV3_2                Infectado
Series8_A549_HPIV3_1                  Control
Series9_NHBE_Mock_1                 Infectado
Series9_NHBE_Mock_2                   Control
Series9_NHBE_Mock_3                 Infectado
Series9_NHBE_Mock_4                   Control
Series9_NHBE_IAV_1                  Infectado
Series9_NHBE_IAV_2                    Control
Series9_NHBE_IAV_3                  Infectado
Series9_NHBE_IAV_4                    Control
Series9_NHBE_IAVdNS1_1              Infectado
Series9_NHBE_IAVdNS1_2                Control
Series9_NHBE_IAVdNS1_3              Infectado
Series9_NHBE_IAVdNS1_4                Control
Series9_NHBE_IFNB_4h_1              Infectado
Series9_NHBE_IFNB_4h_2                Control
Series9_NHBE_IFNB_6h_1              Infectado
Series9_NHBE_IFNB_6h_2                Control
Series9_NHBE_IFNB_12h_1             Infectado
Series9_NHBE_IFNB_12h_2               Control
Series15_HealthyLungBiopsy_2        Infectado
Series15_HealthyLungBiopsy_1          Control
Series15_COVID19Lung_2              Infectado
Series15_COVID19Lung_1                Control
Series16_A549.ACE2_Mock_1           Infectado
Series16_A549.ACE2_Mock_2             Control
Series16_A549.ACE2_Mock_3           Infectado
Series16_A549.ACE2_SARS.CoV.2_1       Control
Series16_A549.ACE2_SARS.CoV.2_2     Infectado
Series16_A549.ACE2_SARS.CoV.2_3       Control
Series16_A549.ACE2_SARS.CoV.2_Rux_1 Infectado
Series16_A549.ACE2_SARS.CoV.2_Rux_2   Control
Series16_A549.ACE2_SARS.CoV.2_Rux_3 Infectado

Paso 4: Análisis Diferencial de Expresión

  1. Crear un objeto de análisis diferencial con DESeq2:
# Crear un DESeqDataSet para el análisis
dds <- DESeqDataSetFromMatrix(
  countData = counts,
  colData = metadata,
  design = ~ condition
)
Warning in DESeqDataSet(se, design = design, ignoreRank): some variables in
design formula are characters, converting to factors
# Filtrar genes con pocas lecturas
dds <- dds[rowSums(counts(dds)) > 10, ]

# Ejecutar el análisis diferencial
dds <- DESeq(dds)
estimating size factors
estimating dispersions
gene-wise dispersion estimates
mean-dispersion relationship
final dispersion estimates
fitting model and testing
-- replacing outliers and refitting for 2017 genes
-- DESeq argument 'minReplicatesForReplace' = 7 
-- original counts are preserved in counts(dds)
estimating dispersions
fitting model and testing

Obtener los resultados del análisis diferencial:

# Extraer los resultados
results <- results(dds)

# Ordenar por significancia
results <- results[order(results$padj), ]

# Inspeccionar los resultados
head(results)
log2 fold change (MLE): condition Infectado vs Control 
Wald test p-value: condition Infectado vs Control 
DataFrame with 6 rows and 6 columns
         baseMean log2FoldChange     lfcSE      stat      pvalue        padj
        <numeric>      <numeric> <numeric> <numeric>   <numeric>   <numeric>
C1QB     11.94245      -25.10047  2.904699  -8.64133 5.55604e-18 1.01498e-13
IGLL5     6.74850      -24.32512  2.905038  -8.37343 5.59668e-17 5.11201e-13
SFTPC   101.23857       -9.19429  1.671895  -5.49932 3.81251e-08 2.32156e-04
SLCO2A1  20.55099        5.74560  1.077679   5.33146 9.74289e-08 4.44958e-04
GMFG      6.50483       -3.88432  0.755528  -5.14119 2.72997e-07 9.97422e-04
JAM2      6.97858        3.32840  0.688877   4.83163 1.35419e-06 4.12306e-03

Paso 5: Visualización de Resultados

5.1 Heatmap de Genes Significativos

  1. Seleccionar genes diferencialmente expresados:

    pero antes Filtrar Genes con padj no Nulo valor (NA)

    El objetivo aquí es eliminar genes con valores NA en la columna padj para evitar errores en el filtrado.

# Filtrar genes con valores no nulos en padj
results_no_na <- results[!is.na(results$padj), ]


# Filtrar genes con padj < 0.05
significant_genes <- results_no_na[results_no_na$padj < 0.05, ]

# Verificar la cantidad de genes significativos
cat("Número de genes significativos:", nrow(significant_genes), "\n")
Número de genes significativos: 13 
print(head(significant_genes))
log2 fold change (MLE): condition Infectado vs Control 
Wald test p-value: condition Infectado vs Control 
DataFrame with 6 rows and 6 columns
         baseMean log2FoldChange     lfcSE      stat      pvalue        padj
        <numeric>      <numeric> <numeric> <numeric>   <numeric>   <numeric>
C1QB     11.94245      -25.10047  2.904699  -8.64133 5.55604e-18 1.01498e-13
IGLL5     6.74850      -24.32512  2.905038  -8.37343 5.59668e-17 5.11201e-13
SFTPC   101.23857       -9.19429  1.671895  -5.49932 3.81251e-08 2.32156e-04
SLCO2A1  20.55099        5.74560  1.077679   5.33146 9.74289e-08 4.44958e-04
GMFG      6.50483       -3.88432  0.755528  -5.14119 2.72997e-07 9.97422e-04
JAM2      6.97858        3.32840  0.688877   4.83163 1.35419e-06 4.12306e-03

Crear Submatriz de Expresión

Extraemos las filas correspondientes a los genes significativos desde la matriz de expresión inicial.

# Obtener nombres de los genes significativos
significant_gene_names <- rownames(significant_genes)

# Submatriz de expresión de genes significativos
sig_matrix <- counts[significant_gene_names, ]

head(sig_matrix)
        Series1_NHBE_Mock_1 Series1_NHBE_Mock_2 Series1_NHBE_Mock_3
C1QB                      0                   0                   0
IGLL5                     0                   0                   0
SFTPC                     0                   0                   0
SLCO2A1                   4                   1                   0
GMFG                      0                   1                   0
JAM2                      0                   1                   3
        Series1_NHBE_SARS.CoV.2_1 Series1_NHBE_SARS.CoV.2_2
C1QB                            0                         0
IGLL5                           0                         0
SFTPC                           0                         0
SLCO2A1                         0                         0
GMFG                            1                         0
JAM2                            0                         0
        Series1_NHBE_SARS.CoV.2_3 Series2_A549_Mock_1 Series2_A549_Mock_2
C1QB                            0                   0                   0
IGLL5                           0                   0                   0
SFTPC                           0                   1                   0
SLCO2A1                         0                   0                   0
GMFG                            3                   1                   2
JAM2                            0                   4                   1
        Series2_A549_Mock_3 Series2_A549_SARS.CoV.2_1 Series2_A549_SARS.CoV.2_2
C1QB                      0                         0                         0
IGLL5                     0                         0                         0
SFTPC                     0                         0                         2
SLCO2A1                   0                         0                         0
GMFG                      3                         3                         4
JAM2                      1                         4                         2
        Series2_A549_SARS.CoV.2_3 Series3_A549_Mock_1 Series3_A549_Mock_2
C1QB                            0                   0                   0
IGLL5                           0                   0                   0
SFTPC                           2                  10                   6
SLCO2A1                         0                   0                   0
GMFG                            0                   0                   1
JAM2                            6                   1                   6
        Series3_A549_RSV_1 Series3_A549_RSV_2 Series4_A549_Mock_1
C1QB                     0                  0                   0
IGLL5                    0                  0                   0
SFTPC                    0                  1                   0
SLCO2A1                  0                  0                   0
GMFG                     0                  1                   1
JAM2                     2                  0                   0
        Series4_A549_Mock_2 Series4_A549_IAV_1 Series4_A549_IAV_2
C1QB                      0                  0                  0
IGLL5                     0                  0                  0
SFTPC                     0                  0                  0
SLCO2A1                   0                  0                  0
GMFG                      0                  5                  0
JAM2                      1                  1                  1
        Series5_A549_Mock_1 Series5_A549_Mock_2 Series5_A549_Mock_3
C1QB                      0                   0                   0
IGLL5                     0                   0                   0
SFTPC                     1                   2                   1
SLCO2A1                   0                   0                   0
GMFG                      3                   0                   1
JAM2                      0                   3                   0
        Series5_A549_SARS.CoV.2_1 Series5_A549_SARS.CoV.2_2
C1QB                            0                         0
IGLL5                           0                         0
SFTPC                           0                         1
SLCO2A1                         0                         0
GMFG                            2                         0
JAM2                            3                         1
        Series5_A549_SARS.CoV.2_3 Series6_A549.ACE2_Mock_1
C1QB                            0                        0
IGLL5                           0                        0
SFTPC                           0                        5
SLCO2A1                         0                        0
GMFG                            7                        5
JAM2                            4                        0
        Series6_A549.ACE2_Mock_2 Series6_A549.ACE2_Mock_3
C1QB                           0                        0
IGLL5                          0                        0
SFTPC                          0                        0
SLCO2A1                        0                        0
GMFG                           0                        1
JAM2                           0                        0
        Series6_A549.ACE2_SARS.CoV.2_1 Series6_A549.ACE2_SARS.CoV.2_2
C1QB                                 0                              0
IGLL5                                0                              0
SFTPC                                0                              0
SLCO2A1                              0                              0
GMFG                                 0                              1
JAM2                                 1                              0
        Series6_A549.ACE2_SARS.CoV.2_3 Series7_Calu3_Mock_1
C1QB                                 0                    0
IGLL5                                0                    0
SFTPC                                0                    0
SLCO2A1                              0                    1
GMFG                                 0                    0
JAM2                                 0                    0
        Series7_Calu3_Mock_2 Series7_Calu3_Mock_3 Series7_Calu3_SARS.CoV.2_1
C1QB                       0                    0                          0
IGLL5                      0                    0                          0
SFTPC                      0                    0                          0
SLCO2A1                    1                    1                          3
GMFG                       1                    0                          0
JAM2                       0                    1                          2
        Series7_Calu3_SARS.CoV.2_2 Series7_Calu3_SARS.CoV.2_3
C1QB                             0                          0
IGLL5                            0                          0
SFTPC                            0                          0
SLCO2A1                          4                          2
GMFG                             0                          0
JAM2                             3                          1
        Series8_A549_Mock_1 Series8_A549_Mock_2 Series8_A549_Mock_3
C1QB                      0                   0                   0
IGLL5                     0                   0                   0
SFTPC                     2                   0                   0
SLCO2A1                   0                   0                   0
GMFG                      1                   0                   4
JAM2                      0                   0                   0
        Series8_A549_RSV_1 Series8_A549_RSV_2 Series8_A549_RSV_3
C1QB                     0                  0                  0
IGLL5                    0                  0                  0
SFTPC                    0                  1                  0
SLCO2A1                  1                  0                  0
GMFG                     0                  1                  1
JAM2                     1                  0                  0
        Series8_A549_HPIV3_3 Series8_A549_HPIV3_2 Series8_A549_HPIV3_1
C1QB                       2                    0                    0
IGLL5                      0                    0                    0
SFTPC                      0                    0                    0
SLCO2A1                    0                    1                    0
GMFG                       0                    1                    1
JAM2                       0                    0                    0
        Series9_NHBE_Mock_1 Series9_NHBE_Mock_2 Series9_NHBE_Mock_3
C1QB                      0                   0                   0
IGLL5                     0                   0                   0
SFTPC                     0                   0                   0
SLCO2A1                   2                   1                   0
GMFG                      0                   0                   0
JAM2                      0                   0                   2
        Series9_NHBE_Mock_4 Series9_NHBE_IAV_1 Series9_NHBE_IAV_2
C1QB                      0                  0                  0
IGLL5                     0                  0                  0
SFTPC                     0                  1                  1
SLCO2A1                   1                  6                  0
GMFG                      1                  5                  1
JAM2                      0                  1                  1
        Series9_NHBE_IAV_3 Series9_NHBE_IAV_4 Series9_NHBE_IAVdNS1_1
C1QB                     0                  0                      0
IGLL5                    0                  0                      0
SFTPC                    0                  0                      0
SLCO2A1                  4                  0                      0
GMFG                     0                  0                      1
JAM2                     2                  0                      1
        Series9_NHBE_IAVdNS1_2 Series9_NHBE_IAVdNS1_3 Series9_NHBE_IAVdNS1_4
C1QB                         1                      0                      0
IGLL5                        0                      0                      0
SFTPC                        0                      0                      0
SLCO2A1                      1                      4                      3
GMFG                         1                      2                      0
JAM2                         0                      1                      1
        Series9_NHBE_IFNB_4h_1 Series9_NHBE_IFNB_4h_2 Series9_NHBE_IFNB_6h_1
C1QB                         0                      0                      0
IGLL5                        0                      0                      0
SFTPC                        0                      0                      0
SLCO2A1                      4                      4                      1
GMFG                         0                      0                      1
JAM2                         2                      1                      0
        Series9_NHBE_IFNB_6h_2 Series9_NHBE_IFNB_12h_1 Series9_NHBE_IFNB_12h_2
C1QB                         0                       0                       0
IGLL5                        0                       0                       0
SFTPC                        0                       0                       0
SLCO2A1                      2                       1                       3
GMFG                         0                       0                       0
JAM2                         1                       2                       1
        Series15_HealthyLungBiopsy_2 Series15_HealthyLungBiopsy_1
C1QB                            4219                         3569
IGLL5                          16792                         2022
SFTPC                          40763                        88283
SLCO2A1                        14867                         3425
GMFG                            1982                         1627
JAM2                            2328                          601
        Series15_COVID19Lung_2 Series15_COVID19Lung_1 Series16_A549.ACE2_Mock_1
C1QB                       503                     68                         0
IGLL5                      658                    109                         0
SFTPC                      370                     50                         0
SLCO2A1                    116                     18                         0
GMFG                       482                     32                         1
JAM2                        34                      0                         1
        Series16_A549.ACE2_Mock_2 Series16_A549.ACE2_Mock_3
C1QB                            0                         0
IGLL5                           0                         0
SFTPC                           1                         0
SLCO2A1                         0                         0
GMFG                            8                         2
JAM2                            1                         1
        Series16_A549.ACE2_SARS.CoV.2_1 Series16_A549.ACE2_SARS.CoV.2_2
C1QB                                  0                               0
IGLL5                                 0                               0
SFTPC                                 0                               0
SLCO2A1                               1                               1
GMFG                                  2                               1
JAM2                                  2                               1
        Series16_A549.ACE2_SARS.CoV.2_3 Series16_A549.ACE2_SARS.CoV.2_Rux_1
C1QB                                  0                                   0
IGLL5                                 0                                   0
SFTPC                                 0                                   0
SLCO2A1                               0                                   0
GMFG                                  0                                   0
JAM2                                  4                                   2
        Series16_A549.ACE2_SARS.CoV.2_Rux_2 Series16_A549.ACE2_SARS.CoV.2_Rux_3
C1QB                                      0                                   0
IGLL5                                     0                                   0
SFTPC                                     0                                   0
SLCO2A1                                   0                                   0
GMFG                                      2                                   4
JAM2                                      4                                   3

Normalizar la Matriz de Expresión

Se realiza una transformación logarítmica regularizada para estabilizar la varianza en los datos de expresión (Este paso tardará)

# Aplicar transformación logarítmica regularizada
log_transformed <- rlogTransformation(dds)
rlog() may take a long time with 50 or more samples,
vst() is a much faster transformation
# Extraer la matriz normalizada
norm_matrix <- assay(log_transformed)[significant_gene_names, ]

Crear un Heatmap

Generamos un heatmap que muestra la expresión diferencial de los genes significativos.

# Configurar anotaciones para las columnas (condiciones)
annotation_col <- data.frame(
  Condition = metadata$condition
)
rownames(annotation_col) <- rownames(metadata)

# Crear el heatmap
pheatmap(
  norm_matrix,
  cluster_rows = TRUE,   # Agrupar genes
  cluster_cols = TRUE,   # Agrupar condiciones
  color = colorRampPalette(c("blue", "white", "red"))(50),
  main = "Heatmap de Expresión Génica Diferencial",
  annotation_col = annotation_col,
  fontsize_row = 6,      # Tamaño de texto para genes
  fontsize_col = 8       # Tamaño de texto para condiciones
)

Volcano Plot

Un volcano plot combina información de significancia estadística (eje Y, -log10(pvalue)) y magnitud del cambio (eje X, log2FoldChange) para identificar genes altamente regulados y significativos.

  • volcano_data:

    • data frame que contiene las columnas:

      • log2FoldChange: Cambios en la expresión log2 entre condiciones.

      • log10Pvalue_neg: -log10 de los valores p para medir la significancia.

      • Significant: Indica si un gen es significativo basado en padj < 0.05.

  • aes(x = log2FoldChange, y = log10Pvalue_neg):

    • Asigna log2FoldChange al eje X y log10Pvalue_neg al eje Y.
  • Colores:

    • Genes significativos (padj < 0.05) se destacan en rojo, mientras que los demás son grises.
  • Líneas de Referencia:

    • geom_hline: Umbral de significancia estadística (p-value < 0.05).

    • geom_vline: Límites de cambio significativo (log2FoldChange > 1 o < -1).

# Crear el dataframe para el Volcano Plot
volcano_data <- data.frame(
  log2FoldChange = results_no_na$log2FoldChange,
  log10Pvalue_neg = -log10(results_no_na$pvalue),  # Cambiar nombre de la columna
  Significant = results_no_na$padj < 0.05         # Columna para genes significativos
)

# Generar el Volcano Plot
library(ggplot2)
ggplot(volcano_data, aes(x = log2FoldChange, y = log10Pvalue_neg, color = Significant)) +
  geom_point(alpha = 0.5) +
  scale_color_manual(values = c("gray", "red")) +
  geom_hline(yintercept = -log10(0.05), linetype = "dashed", color = "blue") +
  geom_vline(xintercept = c(-1, 1), linetype = "dashed", color = "blue") +
  ggtitle("Volcano Plot") +
  xlab("Log2 Fold Change") +
  ylab("-log10(p-value)") +
  theme_minimal()

Identificar los Genes Más Regulados

Seleccionamos los 10 genes con mayor cambio en la expresión basado en el valor absoluto de log2FoldChange.

# Seleccionar los 10 genes más regulados
top_genes <- head(significant_genes[order(abs(significant_genes$log2FoldChange), decreasing = TRUE), ], 10)

# Mostrar los resultados
cat("Top 10 genes más regulados:\n")
Top 10 genes más regulados:
print(top_genes)
log2 fold change (MLE): condition Infectado vs Control 
Wald test p-value: condition Infectado vs Control 
DataFrame with 10 rows and 6 columns
         baseMean log2FoldChange     lfcSE      stat      pvalue        padj
        <numeric>      <numeric> <numeric> <numeric>   <numeric>   <numeric>
C1QB     11.94245      -25.10047  2.904699  -8.64133 5.55604e-18 1.01498e-13
IGLL5     6.74850      -24.32512  2.905038  -8.37343 5.59668e-17 5.11201e-13
SFTPC   101.23857       -9.19429  1.671895  -5.49932 3.81251e-08 2.32156e-04
SLCO2A1  20.55099        5.74560  1.077679   5.33146 9.74289e-08 4.44958e-04
CTSE     67.97635       -5.68643  1.216363  -4.67495 2.94028e-06 5.96811e-03
CXCL12    3.95770        4.69855  1.132023   4.15058 3.31627e-05 4.66013e-02
TMEM204   5.91505        4.26647  0.956703   4.45955 8.21326e-06 1.50040e-02
GMFG      6.50483       -3.88432  0.755528  -5.14119 2.72997e-07 9.97422e-04
PTGDS     7.48557       -3.50818  0.796713  -4.40331 1.06609e-05 1.65601e-02
JAM2      6.97858        3.32840  0.688877   4.83163 1.35419e-06 4.12306e-03

Visualizar un Gen de Interés

Creamos un boxplot para visualizar cómo se expresa un gen específico entre las condiciones.

# Seleccionar un gen de interés
gene_of_interest <- rownames(top_genes)[1]

# Extraer datos para el gen
data_for_plot <- plotCounts(dds, gene = gene_of_interest, intgroup = "condition", returnData = TRUE)

# Generar boxplot
library(ggplot2)
ggplot(data_for_plot, aes(x = condition, y = count, fill = condition)) +
  geom_boxplot() +
  ggtitle(paste("Expresión del gen:", gene_of_interest)) +
  ylab("Conteo normalizado") +
  xlab("Condición") +
  theme_minimal()