El procesamiento enicial de los datos de secuenciación de ARN de célula única (scRNA-seq) es crítico para garantizar la validez de los análisis posteriores. Este flujo de trabajo se centra en la carga de datos provenientes de 10X Genomics, la aplicación de filtros de calidad y la eliminación sistemática de dobletes mediante herramientas bioinformáticas en R.
1. Configuración del entorno de trabajo
Para iniciar el análisis, es necesario cargar las librerías especializadas en genómica unicelular. Se utilizan principalmente Seurat para la manipulación de objetos y DoubletFinder para identificar capturas de múltiples células en una sola gota.
library(Seurat)
library(DoubletFinder)
library(dplyr)
library(ggplot2)
library(harmony)
library(cowplot)
library(reticulate)
library(anndata)
2. Definición de rutas y metadatos de las muestras
Es fundamental organizar las rutas de los directorios que contienen las matrices de conteo filtradas y asignar etiquetas correspondientes a cada condición experimental o etapa temporal.
# Directorios de entrada para matrices 10X
directorios_input <- c(
"./raw_data/dpi00_rep1/filtered_feature_bc_matrix/",
"./raw_data/dpi00_rep2/filtered_feature_bc_matrix/",
"./raw_data/dpi02_rep1/filtered_feature_bc_matrix/",
"./raw_data/dpi02_rep2/filtered_feature_bc_matrix/",
"./raw_data/dpi10_rep1/filtered_feature_bc_matrix/",
"./raw_data/dpi10_rep2/filtered_feature_bc_matrix/",
"./raw_data/dpi21_rep1/filtered_feature_bc_matrix/",
"./raw_data/dpi21_rep2/filtered_feature_bc_matrix/"
)
# Identificadores únicos y etiquetas de fase
ids_muestras <- c("dpi00_r1", "dpi00_r2", "dpi02_r1", "dpi02_r2", "dpi10_r1", "dpi10_r2", "dpi21_r1", "dpi21_r2")
grupos_fase <- c("fase00", "fase00", "fase02", "fase02", "fase10", "fase10", "fase21", "fase21")
3. Procesamiento iterativo y filtrado de dobletes
El siguiente bloque de código realiza una iteración sobre cada muestra para crear el objeto Seurat, normalizar los datos, identificar genes variables y ejecutar DoubletFinder para purificar el dataset, manteniendo únicamente los "Singlets".
lista_objetos_qc <- list()
for (idx in seq_along(ids_muestras)) {
# Carga de matriz de conteos
conteo_crudo <- Read10X(data.dir = directorios_input[idx])
seurat_obj <- CreateSeuratObject(
counts = conteo_crudo,
project = ids_muestras[idx],
min.cells = 3,
min.features = 200
)
# Asignación de metadatos
seurat_obj$stage <- grupos_fase[idx]
# Preprocesamiento estándar
seurat_obj <- NormalizeData(seurat_obj)
seurat_obj <- FindVariableFeatures(seurat_obj, selection.method = "vst", nfeatures = 2500)
seurat_obj <- ScaleData(seurat_obj, features = VariableFeatures(seurat_obj))
seurat_obj <- RunPCA(seurat_obj, npcs = 30, verbose = FALSE)
# Optimización de parámetros para DoubletFinder (pK)
analisis_sweep <- paramSweep(seurat_obj, PCs = 1:20, sct = FALSE)
resumen_sweep <- summarizeSweep(analisis_sweep, GT = FALSE)
pk_optimo <- find.pK(resumen_sweep)
valor_pk <- as.numeric(as.character(pk_optimo$pK[which.max(pk_optimo$BCmetric)]))
# Estimación de la tasa de dobletes (asumiendo ~7.5%)
nExp_poi <- round(0.075 * ncol(seurat_obj))
seurat_obj <- doubletFinder(seurat_obj, PCs = 1:20, pN = 0.25, pK = valor_pk, nExp = nExp_poi)
# Extracción de columna de clasificación y filtrado
nombre_col_df <- grep("DF.classification", colnames(seurat_obj@meta.data), value = TRUE)
seurat_obj <- subset(seurat_obj, subset = !!sym(nombre_col_df) == "Singlet")
lista_objetos_qc[[idx]] <- seurat_obj
}
4. Integración y segmentación del conjunto de datos
Una vez que las muestras individuales han sido filtradas, se procede a consolidar la información en un único objeto global y, opcionalmente, dividir el dataset por subgrupos exeprimentales para análisis comparativos específicos.
# Consolidación de todas las muestras
dataset_final <- merge(
x = lista_objetos_qc[[1]],
y = lista_objetos_qc[-1],
add.cell.ids = ids_muestras
)
# Exportación del objeto completo
saveRDS(dataset_final, file = "analisis_completo_qc.rds")
# Segmentación por etapas temporales
subset_temprano <- subset(dataset_final, subset = stage %in% c("fase00", "fase02"))
subset_tardio <- subset(dataset_final, subset = stage %in% c("fase10", "fase21"))
# Persistencia de subsets
saveRDS(subset_temprano, file = "datos_etapa_temprana.rds")
saveRDS(subset_tardio, file = "datos_etapa_tardia.rds")