TAREA 3
PROFESORES Manuel Villalobos Cid
Mario Inostroza Ponta
 
AUTORES Claudia Rivera Alarcón
Juan Giglio Gutiérrez
Adolfo González Cruz
11-12-2023  


1.0.- Instalación


Paso 1: Instalar Bioconductor Bioconductor es una plataforma de software utilizada para el análisis y la gestión de datos biológicos. Para instalar Bioconductor, se debe entrara en el ambiente de R y ejecuta el siguiente código:

# Instalar Bioconductor (si aún no está instalado)
if (!require("BiocManager", quietly = TRUE))
  install.packages("BiocManager")
## Bioconductor version '3.16' is out-of-date; the current release version '3.18'
##   is available with R version '4.3'; see https://bioconductor.org/install
# Instalar o cargar Bioconductor
BiocManager::install()
## Bioconductor version 3.16 (BiocManager 1.30.22), R 4.2.3 (2023-03-15)
## Old packages: 'igraph', 'rJava'

Este código instalará o cargará Bioconductor en el entorno R, según sea necesario.

Paso 2: Instalar GEOquery Una vez que Bioconductor esté instalado, se procede a instalar la biblioteca GEOquery desde Bioconductor. Ejecuta el siguiente código:

# Instalar GEOquery desde Bioconductor
BiocManager::install("GEOquery")
## Bioconductor version 3.16 (BiocManager 1.30.22), R 4.2.3 (2023-03-15)
## Warning: package(s) not installed when version(s) same as or greater than current; use
##   `force = TRUE` to re-install: 'GEOquery'
## Old packages: 'igraph', 'rJava'

Este comando descargará e instalará la biblioteca GEOquery desde Bioconductor en el entorno de R.

Paso 3: Cargar GEOquery Después de instalar GEOquery, se puede cargar en la sesión de R cada vez que lo necesites. Para utilizar la librería se de ejecutar el siguiente el siguiente código:

# Cargar la biblioteca GEOquery
library(GEOquery)
## Loading required package: Biobase
## Loading required package: BiocGenerics
## 
## Attaching package: '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, setdiff, sort,
##     table, tapply, union, unique, unsplit, which.max, which.min
## Welcome to Bioconductor
## 
##     Vignettes contain introductory material; view with
##     'browseVignettes()'. To cite Bioconductor, see
##     'citation("Biobase")', and for packages 'citation("pkgname")'.
## Setting options('download.file.method.GEOquery'='auto')
## Setting options('GEOquery.inmemory.gpl'=FALSE)

Con esto se podrá usar la biblioteca GEOquery para análisis de datos de expresión génica y acceso a bases de datos de GEO (Gene Expression Omnibus).



2.0.- Carga de Datos


Se utiliza la biblioteca GEOquery en R para descargar datos de expresión génica y metadatos asociados desde el repositorio GEO (Gene Expression Omnibus) de NCBI (National Center for Biotechnology Information).

Paso 1: Se carga la biblioteca GEOquery, que es una biblioteca de R que permite acceder a datos de expresión génica desde GEO.

library(GEOquery)

Paso 2: Se utiliza la función getGEO para descargar el conjunto de datos con el código de acceso “GSE75819” desde GEO. Este conjunto de datos corresponde a un experimento de expresión génica específico.

gse <- getGEO("GSE75819")
## Found 1 file(s)
## GSE75819_series_matrix.txt.gz

Paso 3: Se accede a los datos de expresión génica del conjunto de datos descargado y se almacenan en la variable expr_data. gse[[1]] se utiliza para acceder al primer conjunto de datos dentro de la lista de conjuntos de datos descargados.

expr_data <- exprs(gse[[1]])

Paso 4: Se acceden a los metadatos asociados al conjunto de datos y se almacenan en la variable metadata. De nuevo, gse[[1]] se utiliza para acceder a los metadatos del primer conjunto de datos.

metadata <- pData(gse[[1]])

Paso 5: Se muestra las primeras 5 filas de las columnas específicas (“GSM1968434”, “GSM1968435”, etc.) en los datos de expresión génica. Esto es útil para inspeccionar los datos.

head(expr_data[, c("GSM1968434", "GSM1968435", "GSM1968436", "GSM1968437", "GSM1968438", "GSM1968439")])
##                 GSM1968434    GSM1968435   GSM1968436   GSM1968437
## ILMN_1343291 24061.1300000  2.721604e+04 34407.450000 27615.240000
## ILMN_1343295  8286.7650000  4.762797e+03  9855.074000  5483.595000
## ILMN_1651199    -3.9300070 -1.441241e+00     1.926446    -1.336510
## ILMN_1651209    10.0743200  4.587432e+00    18.413650    20.867340
## ILMN_1651210    -0.6527377 -8.313171e-02     1.078110    -5.831952
## ILMN_1651221     1.8175920  6.876435e+00     7.039004     2.771002
##                 GSM1968438   GSM1968439
## ILMN_1343291  3.195022e+04 2.738239e+04
## ILMN_1343295  1.067385e+04 4.391301e+03
## ILMN_1651199 -4.697017e+00 2.702771e+00
## ILMN_1651209  2.519860e+01 7.600074e+00
## ILMN_1651210 -6.164585e+00 2.111455e+00
## ILMN_1651221  7.098158e-02 8.274244e-02
head(metadata[, c("title", "geo_accession", "status", "submission_date", "last_update_date", "type")])
##            title geo_accession                status submission_date
## GSM1968434 VD13N    GSM1968434 Public on Nov 01 2016     Dec 08 2015
## GSM1968435 VD13V    GSM1968435 Public on Nov 01 2016     Dec 08 2015
## GSM1968436 VD18N    GSM1968436 Public on Nov 01 2016     Dec 08 2015
## GSM1968437 VD18V    GSM1968437 Public on Nov 01 2016     Dec 08 2015
## GSM1968438 VD19N    GSM1968438 Public on Nov 01 2016     Dec 08 2015
## GSM1968439 VD19V    GSM1968439 Public on Nov 01 2016     Dec 08 2015
##            last_update_date type
## GSM1968434      Nov 01 2016  RNA
## GSM1968435      Nov 01 2016  RNA
## GSM1968436      Nov 01 2016  RNA
## GSM1968437      Nov 01 2016  RNA
## GSM1968438      Nov 01 2016  RNA
## GSM1968439      Nov 01 2016  RNA

Paso 6: Se calcula el número de registros (filas) y el número de columnas en los datos de expresión génica. Esto proporciona información sobre el tamaño del conjunto de datos.

num_registros <- nrow(expr_data)
num_columnas <- ncol(expr_data)

# Imprimir el número de registros
cat("El número de registros en expr_data es:", num_registros, "\n")
## El número de registros en expr_data es: 48803
# Imprimir el número de columnas
cat("El número de columnas en expr_data es:", num_columnas, "\n")
## El número de columnas en expr_data es: 30

Paso 7: Se genera un Sub_Conjunto de Datos, se realiza un proceso similar para crear un subconjunto de datos expr_data_subset y metadata_subset tomando las primeras 5000 filas de los datos originales. Se calcula el número de filas en estos subconjuntos y se imprime en la consola. Esto se realiza para tener un set de datos que ayude a configuraciones del código antes de trabajar con todos los datos

# Obtener 5000 registros
expr_data_subset <- expr_data[1:5000, ]
num_expr_data_subset <- nrow(expr_data_subset)
# Imprimir el número de columnas
cat("El número de columnas en expr_data_subset es:", num_expr_data_subset, "\n")
## El número de columnas en expr_data_subset es: 5000
# Obtener 5000 registros
metadata_subset <- metadata[1:5000, ]
num_metadata_subset <- nrow(metadata_subset)
# Imprimir el número de columnas
cat("El número de columnas en num_metadata_subset es:", num_metadata_subset, "\n")
## El número de columnas en num_metadata_subset es: 5000


3.0.- Clustering


3.1.- Hclust (Jerarquía de Clustering):
hclust es una función que se utiliza para realizar agrupaciones jerárquicas en base a una matriz de distancias. Para ejemplificar el uso, primero de calcular la matriz de distancias con una función como dist y luego usar hclust para realizar el clustering jerárquico de datos de expresión génica.[2]

# Cargar la biblioteca necesaria para el clustering jerárquico
library(stats)

# Calcular la matriz de distancias euclidianas en los datos de expresión
dist_matrix <- dist(expr_data_subset)

# Realizar el clustering jerárquico utilizando el método "ward.D2"
hclust_result <- hclust(dist_matrix, method = "complete")

# Dibujar el dendrograma
plot(hclust_result)

3.2.- K-means Clustering:

Es una función que se utiliza para realizar el clustering de K-means en un conjunto de datos de expresión. Se debe especificar el número de clústeres (K) que deseas crear.[2]

# Cargar la biblioteca necesaria
library(stats)

# Calcular la matriz de distancias euclidianas en los datos de expresión
dist_matrix <- dist(expr_data_subset)

# Realizar K-means Clustering con k=3 (o el número de grupos deseado)
k <- 3
kmeans_result <- kmeans(expr_data_subset, centers = k, nstart = 25)  # Puedes ajustar nstart según tus necesidades

# Dibujar un gráfico de dispersión (scatter plot) de los datos de expresión
plot(expr_data_subset, col = kmeans_result$cluster)

# Se pueden agregar etiquetas a los puntos utilizando los metadatos, por ejemplo, bajo el supuesto que los metadatos incluyen información sobre grupos o condiciones, si los metadatos tienen una columna "type" que indica a qué grupo pertenece cada muestra:
# metadata_group <- metadata$ title
# text(expr_data, labels = metadata_group, cex = 0.8, col = "blue")

3.3.- DBSCAN Clustering:

El algoritmo DBSCAN (Density-Based Spatial Clustering of Applications with Noise) es un método de agrupamiento (clustering) utilizado en aprendizaje automático y minería de datos. A diferencia de otros algoritmos de agrupamiento, como k-means, DBSCAN no requiere que especifiques el número de clústeres de antemano. En su lugar, DBSCAN se basa en la densidad de los puntos de datos en el espacio para agruparlos en clústeres.

# Instala y carga la biblioteca necesaria (si no está instalada)
if (!requireNamespace("dbscan", quietly = TRUE)) {
  install.packages("dbscan")
}
# Se carga la Liberia a utilizar
library(dbscan)
## 
## Attaching package: 'dbscan'
## The following object is masked from 'package:stats':
## 
##     as.dendrogram
# Define los parámetros para DBSCAN
eps <- 0.5  # Radio epsilon (ajusta según tus datos)
minPts <- 5  # Número mínimo de puntos en un grupo (ajusta según tus datos)

# Realiza el clustering DBSCAN en los datos de expresión
dbscan_result <- dbscan(expr_data_subset, eps = eps, minPts = minPts)

# Obtén las etiquetas de grupos del resultado
cluster_labels <- dbscan_result$cluster

# Dibuja un gráfico para visualizar el resultado del clustering (puede variar según tus datos)
plot(expr_data_subset, col = cluster_labels, pch = 20)
legend("topright", legend = unique(cluster_labels), col = unique(cluster_labels), pch = 20)



4.0.- Funciones


4.1.- DESeq2:
Es una herramienta bioinformática utilizada para el análisis de datos de expresión génica de alto rendimiento, especialmente en estudios de secuenciación de ARN (RNA-Seq). El nombre DESeq2 significa “Differential Expression analysis for Sequence data, version 2” (Análisis de Expresión Diferencial para Datos de Secuenciación, versión 2). Fue desarrollado para identificar diferencias en la expresión génica entre diferentes condiciones o grupos de muestras en estudios biológicos.[2]

# Verificar si la librería DESeq2 está instalada
if (!requireNamespace("DESeq2", quietly = TRUE)) {
  # Si no está instalada, instalarla usando BiocManager
  if (!requireNamespace("BiocManager", quietly = TRUE)) {
    install.packages("BiocManager")
  }
  BiocManager::install("DESeq2")
}



# Cargar la librería DESeq2
library(DESeq2)
## Loading required package: S4Vectors
## Loading required package: stats4
## 
## Attaching package: 'S4Vectors'
## The following objects are masked from 'package:base':
## 
##     expand.grid, I, unname
## Loading required package: IRanges
## Loading required package: GenomicRanges
## Loading required package: GenomeInfoDb
## Loading required package: SummarizedExperiment
## Loading required package: MatrixGenerics
## Loading required package: matrixStats
## 
## Attaching package: 'matrixStats'
## The following objects are masked from 'package:Biobase':
## 
##     anyMissing, rowMedians
## 
## Attaching package: '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
# Redondear los valores en la matriz de conteo a enteros
expr_data <- round(expr_data)

# Verificar si hay valores negativos en la matriz de conteo
if (any(expr_data < 0)) {
  # Realizar acciones para corregir los valores negativos, por ejemplo, establecerlos en cero
  expr_data[expr_data < 0] <- 0
}

# Mostrar los nombres de las columnas en el metadata_subset
colnames(metadata_subset)
##  [1] "title"                   "geo_accession"          
##  [3] "status"                  "submission_date"        
##  [5] "last_update_date"        "type"                   
##  [7] "channel_count"           "source_name_ch1"        
##  [9] "organism_ch1"            "characteristics_ch1"    
## [11] "treatment_protocol_ch1"  "molecule_ch1"           
## [13] "extract_protocol_ch1"    "label_ch1"              
## [15] "label_protocol_ch1"      "taxid_ch1"              
## [17] "hyb_protocol"            "scan_protocol"          
## [19] "description"             "description.1"          
## [21] "data_processing"         "platform_id"            
## [23] "contact_name"            "contact_email"          
## [25] "contact_laboratory"      "contact_institute"      
## [27] "contact_address"         "contact_city"           
## [29] "contact_state"           "contact_zip/postal_code"
## [31] "contact_country"         "supplementary_file"     
## [33] "data_row_count"          "tissue:ch1"
# Crear un objeto DESeqDataSet a partir de la matriz de conteo (expr_data), los metadatos (metadata), y especificando un diseño básico (~ 1)
dds <- DESeqDataSetFromMatrix(countData = expr_data,
                              colData = metadata,
                              design = ~ 1)
## converting counts to integer mode
# Realizar la normalización y el ajuste del modelo DESeq
options(warn = -1)
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 77 genes
## -- DESeq argument 'minReplicatesForReplace' = 7 
## -- original counts are preserved in counts(dds)
## estimating dispersions
## fitting model and testing
options(warn = 0)

# Realizar el análisis de expresión diferencial sin especificar una variable de diseño
results <- results(dds)

# Mostrar los primeros 10 resultados de expresión diferencial
head(results, n = 10)
## log2 fold change (MLE): Intercept 
## Wald test p-value: Intercept 
## DataFrame with 10 rows and 6 columns
##                baseMean log2FoldChange     lfcSE      stat       pvalue
##               <numeric>      <numeric> <numeric> <numeric>    <numeric>
## ILMN_1343291 18103.2637       14.14396  0.147479  95.90503  0.00000e+00
## ILMN_1343295  5217.4749       12.34914  0.158579  77.87361  0.00000e+00
## ILMN_1651199    22.8675        4.51523  0.399152  11.31206  1.14377e-29
## ILMN_1651209    28.0975        4.81237  0.243826  19.73688  1.04008e-86
## ILMN_1651210    19.5927        4.29224  0.441011   9.73274  2.18633e-22
## ILMN_1651221    24.9828        4.64286  0.304349  15.25505  1.52370e-52
## ILMN_1651228  3963.6577       11.95262  0.241498  49.49364  0.00000e+00
## ILMN_1651229   157.6840        7.30089  0.136850  53.34962  0.00000e+00
## ILMN_1651230    21.5003        4.42628  0.442100  10.01195  1.35065e-23
## ILMN_1651232    33.8499        5.08108  0.144869  35.07366 1.69978e-269
##                      padj
##                 <numeric>
## ILMN_1343291  0.00000e+00
## ILMN_1343295  0.00000e+00
## ILMN_1651199  1.53228e-29
## ILMN_1651209  2.31228e-86
## ILMN_1651210  2.49013e-22
## ILMN_1651221  2.71937e-52
## ILMN_1651228  0.00000e+00
## ILMN_1651229  0.00000e+00
## ILMN_1651230  1.57860e-23
## ILMN_1651232 5.58390e-269

4.2.- edgeR:
El paquete edgeR (Exact Tests for Differences between Two Groups of Negative Binomial Counts) es una herramienta en R diseñada para realizar análisis de expresión génica diferencial en datos de secuenciación de ARN (RNA-seq). edgeR se utiliza principalmente para identificar genes cuya expresión varía significativamente entre dos o más grupos de muestras [1][4].

Paso 1: Preparación de datos

# Definir la ruta completa de la carpeta que contiene los archivos
ruta_completa <- "/Users/adolfogonzalez/desa_r/bioinformatica/"

# Definir los nombres de los archivos y las condiciones
sampleNames <- c("trapnell_counts_C1_R1", "trapnell_counts_C1_R2", "trapnell_counts_C1_R3", "trapnell_counts_C2_R1", "trapnell_counts_C2_R2", "trapnell_counts_C2_R3")
sampleFiles <- c("trapnell_counts_C1_R1.tab", "trapnell_counts_C1_R2.tab", "trapnell_counts_C1_R3.tab", "trapnell_counts_C2_R1.tab", "trapnell_counts_C2_R2.tab", "trapnell_counts_C2_R3.tab")
sampleConditions <- c("C1", "C1", "C1", "C2", "C2", "C2")

# Construir las rutas completas de los archivos
sampleFiles_ruta_completa <- file.path(ruta_completa, sampleFiles)

# Crear el data frame de muestra
sampleTable <- data.frame(sampleName = sampleNames,
                          fileName = sampleFiles_ruta_completa,  # Usar las rutas completas
                          condition = sampleConditions)

# Verificar el data frame de muestra
sampleTable
##              sampleName
## 1 trapnell_counts_C1_R1
## 2 trapnell_counts_C1_R2
## 3 trapnell_counts_C1_R3
## 4 trapnell_counts_C2_R1
## 5 trapnell_counts_C2_R2
## 6 trapnell_counts_C2_R3
##                                                                 fileName
## 1 /Users/adolfogonzalez/desa_r/bioinformatica//trapnell_counts_C1_R1.tab
## 2 /Users/adolfogonzalez/desa_r/bioinformatica//trapnell_counts_C1_R2.tab
## 3 /Users/adolfogonzalez/desa_r/bioinformatica//trapnell_counts_C1_R3.tab
## 4 /Users/adolfogonzalez/desa_r/bioinformatica//trapnell_counts_C2_R1.tab
## 5 /Users/adolfogonzalez/desa_r/bioinformatica//trapnell_counts_C2_R2.tab
## 6 /Users/adolfogonzalez/desa_r/bioinformatica//trapnell_counts_C2_R3.tab
##   condition
## 1        C1
## 2        C1
## 3        C1
## 4        C2
## 5        C2
## 6        C2
# Leer los archivos y combinar los datos
tabs <- lapply(sampleFiles_ruta_completa, function(x) read.table(x, col.names = c("Gene", basename(x))))
countdata <- Reduce(f = function(x, y) merge(x, y, by="Gene"), x = tabs)

# Verificar los datos combinados
head(countdata)
##          Gene trapnell_counts_C1_R1.tab trapnell_counts_C1_R2.tab
## 1 FBgn0000003                         0                         0
## 2 FBgn0000008                       619                       620
## 3 FBgn0000014                        91                        81
## 4 FBgn0000015                        73                        67
## 5 FBgn0000017                      2668                      2404
## 6 FBgn0000018                       328                       343
##   trapnell_counts_C1_R3.tab trapnell_counts_C2_R1.tab trapnell_counts_C2_R2.tab
## 1                         0                         0                         0
## 2                       557                       531                       608
## 3                       104                        87                       125
## 4                        52                        55                        71
## 5                      2467                      2550                      2610
## 6                       363                       304                       288
##   trapnell_counts_C2_R3.tab
## 1                         0
## 2                       548
## 3                       102
## 4                        73
## 5                      2572
## 6                       345

Paso 2: Utilizar Función edgeR

# renombran las filas de countdata con los valores de la columna "Gene" y luego eliminan dicha columna para limpiar y preparar los datos para análisis posteriores.
rownames(countdata) <- as.character(countdata$Gene)
countdata$Gene<-NULL

# Cargar Liberia  edgeR en R.
library(edgeR)
## Loading required package: limma
## 
## Attaching package: 'limma'
## The following object is masked from 'package:DESeq2':
## 
##     plotMA
## The following object is masked from 'package:BiocGenerics':
## 
##     plotMA
# Se crea un vector "mygroups" que representa las condiciones experimentales de las muestras
mygroups <- c("C1","C1","C1","C2","C2","C2")

# Se crea  un objeto DGEList con los datos de expresión, nombres de genes y grupos de interés
y <- DGEList(counts=countdata, genes=rownames(countdata), group = mygroups)

# Calcular factores de normalización para los datos de expresión
y <- calcNormFactors(y)

# Estimar dispersiones para el análisis de expresión diferencial
y <- estimateDisp(y)
## Using classic mode.
# Realizar un test exacto de expresión diferencial
et <- exactTest(y)

# Convertir los resultados del test en un data frame y obtener los genes con FDR < 0.05
result_edgeR <- as.data.frame(topTags(et, n=nrow(countdata)))

# Crear una tabla que muestra cuántos genes tienen un FDR < 0.05
table(result_edgeR$FDR < 0.05)
## 
## FALSE  TRUE 
## 17224   266
# Crear un gráfico de tipo "volcano plot" para visualizar los resultados del análisis
plot(result_edgeR$logFC, -log10(result_edgeR$FDR), 
     col=ifelse(result_edgeR$FDR<0.05,"red","black"),
     main="FDR volcano plot",
     xlab="log2FC",
     ylab="-log10(FDR)")

# Crear un histograma que representa la distribución de valores de p-valor
hist(result_edgeR$PValue, breaks=20, xlab="P-Value", col="royalblue", ylab="Frequency", main="P-value distribution")

4.3.- LIMMA:
El paquete edgeR (Linear Models for Microarray Data), es una biblioteca de R utilizada para analizar datos de microarrays y secuenciación de próxima generación (NGS) en el contexto de expresión génica diferencial. LIMMA es especialmente útil cuando se trabaja con datos de alta dimensión y se busca identificar genes o características que están diferencialmente expresados entre diferentes grupos o condiciones experimentales.[3]

# Cargar Liberia  limma en R.
library(limma)
# Calcular factores de normalización para los datos de expresión
dge <- calcNormFactors(y)
# Crear un diseño que excluya la categoría no estimable
mod <- model.matrix(~0 + mygroups)  # Excluye la intercept
# Aplicar voom
vGene <- voom(dge, mod, plot = TRUE)


En cuanto al modelo probabilístico, tanto DESeq2 como EdgeR siguen estrategias similares, pero presentan diferencias significativas en algunos aspectos. El aspecto más relevante en el que difieren es su enfoque en el proceso de normalización de datos. EdgeR emplea el método TMM (Trimmed Mean of M-values), mientras que DESeq2 divide los conteos de cada gen en una muestra por el número total de lecturas en esa misma muestra. En la práctica, los factores de normalización suelen mostrar similitudes, pero la diferencia más significativa reside en la manera en que estiman la dispersión. EdgeR modera las estimaciones de dispersión a nivel de gen, ajustándolas hacia una tendencia media basada en la relación media-dispersión. Por otro lado, DESeq2 toma el valor máximo entre las estimaciones de dispersión individuales y la tendencia media de dispersión.[3]

La siguinete tabla, expone las características y diferencias más relevantes entre los principales paquetes empleados por Bioconductor para el análisis de expresión génica diferencial.[3]



5.0.- Hatmap y Heatmap2


5.1.- Hatmap:
La función heatmap en R se utiliza para crear mapas de calor (heatmaps) que representan visualmente datos numéricos en una matriz como colores. Los heatmaps son útiles para identificar patrones y tendencias en datos, especialmente en matrices de datos grandes, como en análisis de expresión génica o análisis de datos biológicos.

# Instalar y cargar la librería "gplots" para usar "heatmap"
if (!requireNamespace("gplots", quietly = TRUE)) {
  install.packages("gplots")
}


# Cargar la biblioteca necesaria
library(gplots)
## 
## Attaching package: 'gplots'
## The following object is masked from 'package:IRanges':
## 
##     space
## The following object is masked from 'package:S4Vectors':
## 
##     space
## The following object is masked from 'package:stats':
## 
##     lowess
# Crear una matriz de datos de ejemplo
matriz_ejemplo <- matrix(rnorm(100), nrow = 10, ncol = 10)

# Generar un heatmap básico
heatmap(matriz_ejemplo, 
        col = colorRampPalette(c("blue", "white", "red"))(100),  # Colores del heatmap
        scale = "none",  # Escalado de datos ("none" para ningún escalado)
        main = "Heatmap de Ejemplo",  # Título del gráfico
        xlab = "Columnas",  # Etiqueta del eje x
        ylab = "Filas"  # Etiqueta del eje y
)

5.2.- Heatmap2:
La función heatmap2 es una versión mejorada y más flexible que permite un mayor control sobre la apariencia del mapa de calor.

library("gplots")

# make matrix
mat <- matrix(rnorm(1200), ncol=6)

# Cargar la biblioteca necesaria
heatmap.2(x=mat)

# Generar un heatmap2 con la función heatmap2
heatmap.2(x=mat, 
          Colv=FALSE, 
          dendrogram="row",
          scale="row",
          col="bluered",
          trace="none",
          ColSideColors=rep(c("green","orange"), each=3),
          labRow=FALSE,
          main="my heatmap",
          ylab="Genes",
          xlab="Samples")



6.0.- Bibliografía

[1] [01] C. Gil, “Análisis de datos scRNA-Seq con bioconductor,” Rpubs, 2020.

[2] S. H. Holmes and W. Huber, “Modern Statistics for Modern Biology,” Cambridge University Press, 2018.

[3] G. K. Smyth, M. Ritchie, N. Thorne, J. Wettenhall, W. Shi, y Y. Hu, “limma: linear models for microarray and RNA-Seq data user’s guide,” Bioinformatics Division, The Walter and Eliza Hall Institute of Medical Research, Melbourne, Australia, 2002.

[4] C. Chamorro Poyo, “Análisis de datos de RNA-Seq empleando diferentes paquetes desarrollados dentro del proyecto Bioconductor para estudios de expresión génica diferencial,” Universitat Oberta de Catalunya (UOC), 2019.