El análisis de datos de secuenciación de ARN con resolución espacial requiere la aplicación de flujos de trabajo que fusionen la información molecular con las coordenadas histológicas. Este proceso abarca la normalización, el agrupamiento no supervisado, la detección de patrones de variabilidad espacial y la integración con transcriptómica de células individuales.
Reducción de Dimensionalidad, Clustering y Representación Gráfica
El procesamiento inicial de las matrices de expresión génica sigue una metodología análoga a la empleada en el aálisis de scRNA-seq. Se aplican técnicas de reducción de dimensionalidad y algoritmos de agrupamiento para estructurar los datos espaciales.
tissue_sample <- RunPCA(tissue_sample, assay = "SCT", verbose = FALSE, npcs = 40)
tissue_sample <- FindNeighbors(tissue_sample, reduction = "pca", dims = 1:25)
tissue_sample <- FindClusters(tissue_sample, resolution = 0.5, verbose = FALSE)
tissue_sample <- RunUMAP(tissue_sample, reduction = "pca", dims = 1:25)
Una vez definidos los clústeres, su distribución puede examinarse tanto en el espacio de baja dimensión (UMAP) como directamente sobre la topología del tejido original.
umap_view <- DimPlot(tissue_sample, reduction = "umap", label = TRUE, repel = TRUE)
spatial_view <- SpatialDimPlot(tissue_sample, label = TRUE, label.size = 4)
umap_view | spatial_view
En tejidos con alta heterogeneidad, la superposición de múltiples colores puede dificultar la interpretación. Para mitigar esto, es posible resaltar selectivamente poblaciones celulares específicas, aislando clústeres de interés biológico para facilitar el análisis de su nicho espacial.
target_clusters <- CellsByIdentities(object = tissue_sample, idents = c("1", "4", "7", "9"))
SpatialDimPlot(tissue_sample,
cells.highlight = target_clusters,
facet.highlight = TRUE,
ncol = 2,
cols.highlight = c("#FF0000", "grey80"))
Detección de Genes con Variabilidad Espacial
La identificación de firmas moleculares asociadas a nichos anatómicos puede abordarse realizando un análisis de expresión diferencial comparando regiones predefinidas, ya sea por conocimiento histológico previo o mediante los clústeres generados.
spatial_markers <- FindMarkers(tissue_sample, ident.1 = "3", ident.2 = "8", min.pct = 0.25)
genes_to_plot <- rownames(spatial_markers)[1:4]
SpatialFeaturePlot(object = tissue_sample, features = genes_to_plot, alpha = c(0.2, 1), ncol = 2)
Alternativamente, cuando no existen anotaciones previas, se pueden emplear modelos estadísticos como el Índice de Moran. Este algoritmo evalúa la autocorrelación espacial, determinando si los niveles de transcripción en un punto (spot) están correlacionados con sus vecinos inmediatos. Para optimizar el rendimiento computacional, esta evaluación suele restringirse a un subconjunto de genes altamente variables.
tissue_sample <- FindSpatiallyVariableFeatures(tissue_sample,
assay = "SCT",
features = VariableFeatures(tissue_sample)[1:2000],
selection.method = "moransi")
Los patrones de expresión de los genes con mayor puntuación de variabilidad espacial pueden mapearse directamente sobre la imagen histológica para su validación.
top_spatial_genes <- head(SpatiallyVariableFeatures(tissue_sample, selection.method = "moransi"), n = 4)
SpatialFeaturePlot(tissue_sample, features = top_spatial_genes, ncol = 2, alpha = c(0.2, 1), pt.size.factor = 1.2)
Aislamiento de Regiones Anatómicas Específicas
Es habitual requerir el análisis enfocado de una estructura anatómica concreta, por ejemplo, aislando la corteza cerebral para una posteroir integrcaión con atlas de referencia de scRNA-seq. Este filtrado se logra combinando las identidades de los clústeres con coordenadas espaciales precisas.
cortical_tissue <- subset(tissue_sample, idents = c("1", "2", "4", "5", "7"))
# Filtrado iterativo basado en coordenadas de la imagen
cortical_tissue <- subset(cortical_tissue, anterior1_imagerow > 420 | anterior1_imagecol < 160, invert = TRUE)
cortical_tissue <- subset(cortical_tissue, anterior1_imagerow > 280 & anterior1_imagecol > 380, invert = TRUE)
cortical_tissue <- subset(cortical_tissue, anterior1_imagerow > 260 & anterior1_imagecol > 450, invert = TRUE)
fig_cropped <- SpatialDimPlot(cortical_tissue, crop = TRUE, label = TRUE, pt.size.factor = 1.5)
fig_uncropped <- SpatialDimPlot(cortical_tissue, crop = FALSE, label = TRUE, pt.size.factor = 1, label.size = 4)
fig_cropped + fig_uncropped