class: title-slide, middle, center background-image: url(data:image/png;base64,#figures/Slide1.png) background-position: 90% 75%, 75% 75%, center background-size: 1210px,210px, cover .center-column[ # Single cell RNA seq ### ⚔<br/>Selección de genes altamente variables #### <span class="author">Dra. Evelia Coss</span> #### <span class="date">25/marzo/2026</span> ] .left[.footnote[ [R-Ladies Theme](https://www.apreshill.com/project/rladies-xaringan/)]] --- class: inverse, center, middle
# Pipeline con **un solo dataset** --- .pull-left[ ## Pipeline con **un solo dataset**: - Paso 1. Descarga e importación de datos en R - Paso 2. Estructura del objeto `Seurat` - Paso 3. Control de calidad con `Seurat` - Paso 4. Normalización de los datos - Paso 5. Selección de genes altamente variables - Paso 6. Escalamiento de los datos - Paso 7. Reducción de dimensiones inicial (PCA) - Paso 8. Decidir cuántas PCs usar - Paso 9. Clustering de células - Paso 10. Reducciones no lineales (UMAP/t-SNE) ] .pull-right[ <img src="data:image/png;base64,#figures/scRNAseq_workflow_v2_p2.png" alt="" width="50%" style="display: block; margin: auto;" /> ] .footnote[Imagen tomada de: [Best practices for single-cell analysis across modalities](https://www.nature.com/articles/s41576-023-00586-w)] --- # Instalar estos paquetes ``` r # CRAN install.packages("Matrix") install.packages("hdf5r") # Github remotes::install_github('chris-mcginnis-ucsf/DoubletFinder', force = TRUE) # Instalar con Bioconductor BiocManager::install("rhdf5") ``` --- ## Estos se ejecuto la semana pasada, de aquí partimos ``` r ## Cargar paquetes de R library(BiocFileCache) ## para descargar datos library(dplyr) ## para filtar datos library(Seurat) ## paquete principal de este capítulo library(patchwork) ## para graficar imágenes juntas library(SeuratData) # paquete de datos de Seurat ### ---- Paso 1. Descarga e importación de datos en R ----- # Descagar en archivo temporales bfc <- BiocFileCache() raw.path <- bfcrpath(bfc, file.path( "http://cf.10xgenomics.com/samples", "cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz" )) # Descomprimir archivo tar.gz untar(raw.path, exdir = file.path(tempdir(), "pbmc3k")) # Importar ruta del archivo fname <- file.path(tempdir(), "pbmc3k/filtered_gene_bc_matrices/hg19") # Cargar dataset de 10X genomics pbmc.data <- Read10X(data.dir = fname) ### ---- Paso 2. Estructura del objeto `Seurat` ------ # Generar objeto Seurat con raw data (non-normalized data). pbmc <- CreateSeuratObject(counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200) ### ---- Paso 3. Control de calidad con `Seurat` ---- pbmc[["percent.mt"]] <- PercentageFeatureSet(pbmc, pattern = "^MT-") pbmc <- subset(pbmc, subset = nFeature_RNA > 200 & nFeature_RNA < 2500 & percent.mt < 5) pbmc # An object of class Seurat # 13714 features across 2638 samples within 1 assay # Active assay: RNA (13714 features, 0 variable features) # 1 layer present: counts ### ---- Paso 4. Normalización de los datos ----- pbmc <- NormalizeData(pbmc) ``` --- class: inverse, center, middle
# Paso 5. Selección de genes altamente variables (HVGs) (feature selection) --- ## Selección de genes altamente variables (High Variable Genes, HVGs) - **Objetivo:** Identificar aquellos genes *cuya expresión cambia significativamente entre células*, ya que son los más informativos para distinguir subpoblaciones y reducir ruido técnico. - **Motivación:** No todos los genes aportan información útil. Muchos tienen expresión constante o solo reflejan ruido técnico. Los HVGs capturan la *heterogeneidad biológica* real entre células. - Ayuda a resaltar la **señal biológica** en los conjuntos de datos de célula única. - **Impacto:** La elección de estos genes afecta directamente el resultado de clustering, reducción de dimensionalidad (PCA, UMAP, t-SNE) y análisis posteriores. .green[ ### ¿Cuáles son los genes que muestran mayor variación de expresión entre células dentro de mi conjunto de datos? ] --- ## Proceso típico en `Seurat` 1. Calcular media y varianza de cada gen en todas las células. 2. Modelar la relación entre *media y varianza* (genes con mayor expresión tienden a tener mayor varianza). 3. Seleccionar genes con *varianza significativamente* mayor a lo esperado dado su nivel de expresión. 4. Guardar esta lista de HVGs para usar en PCA y clustering. .content-box-blue[ ### Riesgos y consideraciones - **Si seleccionas muy pocos genes**, puedes perder información biológica relevante. - **Si seleccionas demasiados**, aumentas el ruido y el costo computacional. - El número típico es entre **1,000 y 3,000 genes altamente variables**, pero depende del dataset. ] --- ## Funciones en `Seurat` ``` r FindVariableFeatures(object, selection.method = "vst", nfeatures = 2000) ``` - Método por defecto: “vst” (variance stabilizing transformation). - Por defecto, devolvemos 2,000 características por conjunto de datos. Estas se utilizarán en análisis posteriores, como PCA. ``` r VariableFeaturePlot(object) ``` - Visualiza la relación entre media y varianza, destacando los HVGs. ``` r VariableFeatures(object) ``` - Devuelve el vector con los nombres de los genes seleccionados como HVGs. --- ## Por defecto usaremos “vst” con `FindVariableFeatures` para identificar a los HVGs. <img src="data:image/png;base64,#figures/seurat_object.variablefeatures.png" alt="" width="60%" style="display: block; margin: auto;" /> .footnote[ [Quality Assessment/Clustering](https://rnabio.org/module-08-scrna/0008/02/01/QA_clustering/) ] --- ## Visualización de la relación entre media y varianza de las muestras .left-code[ ``` r pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000) # Obtener los 10 genes más variables top10 <- head(VariableFeatures(pbmc), 10) # Visualiza la relación entre media y varianza plot1 <- VariableFeaturePlot(pbmc) # Colocar la etiqueta de los genes plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE) # Combinar gráficos lado a lado y poner la leyenda arriba combined_plot <- plot1 + plot2 + plot_layout(guides = "collect") & theme(legend.position = "top") combined_plot ``` ] .right-plot[ ``` # Finding variable features for layer counts # When using repel, set xnudge and ynudge to 0 for optimal results ``` <!-- --> ] --- ## Dropout imputation .pull-left[ - Los *dropouts* son ceros en la matriz de expresión que no siempre representan ausencia real de expresión, sino limitaciones técnicas (p. ej. baja captura de ARN). - La imputación intenta “rellenar” esos ceros con valores estimados, usando modelos estadísticos o métodos de machine learning (ej. `MAGIC, SAVER, scImpute`). .content-box-yellow[ - No es parte del flujo estándar de Seurat: Seurat no realiza imputación de *dropouts* por defecto, porque puede introducir sesgos si se hace indiscriminadamente. - En muchos análisis, se prefiere trabajar con los datos normalizados y seleccionar HVGs, sin imputar, para evitar sobreinterpretar ruido como señal. ] ] .pull-right[ <img src="data:image/png;base64,#figures/scrna_seq_imputation.png" alt="" width="100%" style="display: block; margin: auto;" /> ] .footnote-right[ [Single-cell RNA sequencing data analysis](https://geneviatechnologies.com/bioinformatics-analyses/single-cell-rna-seq-data-analysis/) ] --- class: inverse, center, middle
# Paso 6. Escalado de los datos --- ## ¿Qué es el escalado de los datos? .pull-left[ - Aplicar una **transformación lineal** a cada variable (en este caso, cada gen) para que todas tengan la misma escala y puedan compararse de manera justa. - El paso de escalado de datos en Seurat responde a la necesidad de preparar la *matriz de expresión para técnicas de reducción de dimensionalidad como PCA*. - Función: `ScaleData` - Resultado: `scale.data` - **Objetivo:** dar el mismo peso a todos los genes en los análisis posteriores (como PCA, UMAP, clustering), evitando que los genes altamente expresados dominen los resultados. ] .pull-right[ <img src="data:image/png;base64,#figures/seurat_object.scaled.png" alt="" width="100%" style="display: block; margin: auto;" /> ] .footnote-right[ [Quality Assessment/Clustering](https://rnabio.org/module-08-scrna/0008/02/01/QA_clustering/) ] --- ## `ScaleData` aplica una transformación lineal a cada gen: - **Centra cada gen:** ajusta la expresión para que la media entre todas las células sea 0. - **Escala cada gen:** ajusta la varianza para que sea 1. - **Opción A:** Escalar todos los genes (más pesado, pero posible) ``` r all.genes <- rownames(pbmc) pbmc <- ScaleData(pbmc, features = all.genes) ``` - **Opción B:** Escalar solo los genes variables (más eficiente y recomendado) ``` r pbmc_var <- ScaleData(pbmc, features = VariableFeatures(pbmc)) # Centering and scaling data matrix # Verifica el resultado, ya no es el argumento slot ahora es layer GetAssayData(object = pbmc_var, layer = "scale.data")[1:2, 1:2] # AAACATACAACCAC-1 AAACATTGAGCTAC-1 # ISG15 -0.8353028 -0.8353028 # CPSF3L -0.2741145 -0.2741145 ``` --- ## Ejemplo Piensa que escalar todos los genes es como ajustar el volumen de **todos los instrumentos de una orquesta**, aunque **solo unos pocos son los que realmente marcan la melodía**. Por eso, en la práctica, se suele escalar solo los genes más informativos. <img src="data:image/png;base64,#figures/general_plot.png" alt="" width="60%" style="display: block; margin: auto;" /> .footnote-right[Imagen tomada de: [Allison Horst](https://allisonhorst.com/everything-else) ] --- class: inverse, center, middle
# Paso 7. Reducción de dimensiones inicial (PCA) --- .pull-left[ ## Objetivos principales - **Simplificar** los datos sin perder la señal biológica importante. - **Eliminar ruido y redundancia** de genes poco informativos. - Facilitar la visualización en 2D o 3D (`PCA, UMAP, t-SNE`). - Preparar el terreno para clustering y descubrimiento de poblaciones celulares. ] .pull-right[.content-box-blue[ Interpretación: - **Cada punto = una célula individual.** - **La cercanía entre puntos** = *similitud* en sus perfiles de expresión. - Clústeres o grupos = *poblaciones celulares distintas (tipos o estados)*. - Colores = **categorías:** tipo celular, condición experimental, expresión de un gen específico, etc. <img src="data:image/png;base64,#figures/UMAP_ex2.png" alt="" width="100%" style="display: block; margin: auto;" /> ]] .footnote-right[ [Explicación completa de un UMAP](https://biostatsquid.com/umap-simply-explained/)] --- ## Diferencias principales | Método | Qué hace | Ventajas | Limitaciones | |--------|----------|----------|--------------| | **PCA (Principal Component Analysis)** | Transformación lineal que resume la variabilidad en componentes principales. | Rápido, interpretable, conserva estructura global. | Solo captura relaciones lineales, puede perder patrones no lineales. | | **t-SNE (t-distributed Stochastic Neighbor Embedding)** | Algoritmo no lineal que preserva relaciones locales (vecindad). | Excelente para visualizar agrupamientos pequeños, separa bien poblaciones. | Computacionalmente más pesado, pierde estructura global, resultados pueden variar entre corridas. | | **UMAP (Uniform Manifold Approximation and Projection)** | Método no lineal basado en teoría de grafos y topología. | Preserva tanto estructura local como global, más rápido que t-SNE, reproducible. | Parámetros (`n_neighbors, min_dist`) afectan mucho la forma del embedding. | --- ## Elegir la mejor técnica para sus datos A la hora de elegir la técnica de **reducción de dimensionalidad adecuada**, piense en lo que más valora: la interpretabilidad, la velocidad o la capacidad de capturar patrones no lineales. .content-box-blue[ - **PCA:** útil para interpretar variabilidad global y relaciones lineales. - **t‑SNE:** excelente para visualizar agrupamientos locales, pero no conserva bien distancias globales. - **UMAP:** balancea estructura local y global, más rápido y reproducible que t‑SNE. ] <img src="data:image/png;base64,#figures/diferencias_dimensiones.png" alt="" width="70%" style="display: block; margin: auto;" /> .footnote-right[ [PCA vs. t-SNE vs. UMAP](https://aicompetence.org/pca-vs-t-sne-vs-umap/)] --- ## Análisis de componentes principales (PCA) .pull-left[ - Por defecto, `Seurat` usa únicamente los genes variables previamente seleccionados (con `FindVariableFeatures`) como entrada para `PCA`, porque son los más informativos. Sin embargo, puedes cambiar esto con el argumento `features` si quieres usar otro subconjunto de genes (por ejemplo, todos los genes). ``` r pbmc_pca <- RunPCA(pbmc_var, features = VariableFeatures(object = pbmc)) # PC_ 1 # Positive: CST3, TYROBP, LST1, AIF1, FTL, FTH1, LYZ, FCN1, S100A9, TYMP # FCER1G, CFD, LGALS1, S100A8, CTSS, LGALS2, SERPINA1, IFITM3, SPI1, CFP # PSAP, IFI30, SAT1, COTL1, S100A11, NPC2, GRN, LGALS3, GSTP1, PYCARD # Negative: MALAT1, LTB, IL32, IL7R, CD2, B2M, ACAP1, CD27, STK17A, CTSW # CD247, GIMAP5, AQP3, CCL5, SELL, TRAF3IP3, GZMA, MAL, CST7, ITM2A # MYC, GIMAP7, HOPX, BEX2, LDLRAP1, GZMK, ETS1, ZAP70, TNFAIP8, RIC3 # PC_ 2 # Positive: CD79A, MS4A1, TCL1A, HLA-DQA1, HLA-DQB1, HLA-DRA, LINC00926, CD79B, HLA-DRB1, CD74 # HLA-DMA, HLA-DPB1, HLA-DQA2, CD37, HLA-DRB5, HLA-DMB, HLA-DPA1, FCRLA, HVCN1, LTB # BLNK, P2RX5, IGLL5, IRF8, SWAP70, ARHGAP24, FCGR2B, SMIM14, PPP1R14A, C16orf74 # Negative: NKG7, PRF1, CST7, GZMB, GZMA, FGFBP2, CTSW, GNLY, B2M, SPON2 # CCL4, GZMH, FCGR3A, CCL5, CD247, XCL2, CLIC3, AKR1C3, SRGN, HOPX # TTC38, APMAP, CTSC, S100A4, IGFBP7, ANXA1, ID2, IL32, XCL1, RHOC # PC_ 3 # Positive: HLA-DQA1, CD79A, CD79B, HLA-DQB1, HLA-DPB1, HLA-DPA1, CD74, MS4A1, HLA-DRB1, HLA-DRA # HLA-DRB5, HLA-DQA2, TCL1A, LINC00926, HLA-DMB, HLA-DMA, CD37, HVCN1, FCRLA, IRF8 # PLAC8, BLNK, MALAT1, SMIM14, PLD4, P2RX5, IGLL5, LAT2, SWAP70, FCGR2B # Negative: PPBP, PF4, SDPR, SPARC, GNG11, NRGN, GP9, RGS18, TUBB1, CLU # HIST1H2AC, AP001189.4, ITGA2B, CD9, TMEM40, PTCRA, CA2, ACRBP, MMD, TREML1 # NGFRAP1, F13A1, SEPT5, RUFY1, TSC22D1, MPP1, CMTM5, RP11-367G6.3, MYL9, GP1BA # PC_ 4 # Positive: HLA-DQA1, CD79B, CD79A, MS4A1, HLA-DQB1, CD74, HIST1H2AC, HLA-DPB1, PF4, SDPR # TCL1A, HLA-DRB1, HLA-DPA1, HLA-DQA2, PPBP, HLA-DRA, LINC00926, GNG11, SPARC, HLA-DRB5 # GP9, AP001189.4, CA2, PTCRA, CD9, NRGN, RGS18, CLU, TUBB1, GZMB # Negative: VIM, IL7R, S100A6, IL32, S100A8, S100A4, GIMAP7, S100A10, S100A9, MAL # AQP3, CD2, CD14, FYB, LGALS2, GIMAP4, ANXA1, CD27, FCN1, RBP7 # LYZ, S100A11, GIMAP5, MS4A6A, S100A12, FOLR3, TRABD2A, AIF1, IL8, IFI6 # PC_ 5 # Positive: GZMB, NKG7, S100A8, FGFBP2, GNLY, CCL4, CST7, PRF1, GZMA, SPON2 # GZMH, S100A9, LGALS2, CCL3, CTSW, XCL2, CD14, CLIC3, S100A12, RBP7 # CCL5, MS4A6A, GSTP1, FOLR3, IGFBP7, TYROBP, TTC38, AKR1C3, XCL1, HOPX # Negative: LTB, IL7R, CKB, VIM, MS4A7, AQP3, CYTIP, RP11-290F20.3, SIGLEC10, HMOX1 # LILRB2, PTGES3, MAL, CD27, HN1, CD2, GDI2, CORO1B, ANXA5, TUBA1B # FAM110A, ATP1A1, TRADD, PPA1, CCDC109B, ABRACL, CTD-2006K23.1, WARS, VMO1, FYB ``` ] .pull-right[ ``` r # Verificar que la reducción existe Reductions(pbmc_pca) # [1] "pca" ``` <img src="data:image/png;base64,#figures/seurat_object.pca.png" alt="" width="80%" style="display: block; margin: auto;" /> ] .footnote-right[ [Quality Assessment/Clustering](https://rnabio.org/module-08-scrna/0008/02/01/QA_clustering/) ] --- ## Visualización del PCA .left-code[ ``` r DimPlot(pbmc_pca, reduction = "pca") + ggtitle("PCA con genes variables") ``` ] .right-plot[ <!-- --> ] --- ## Genes que impulsan PC1 y PC2 .left-code[ - Cada barra representa un gen. - Los genes con valores altos (positivos o negativos) son los que más influyen en esa componente principal. ``` r VizDimLoadings(pbmc_pca, dims = 1:2, reduction = "pca") ``` ] .right-plot[ <!-- --> ] --- class: inverse, center, middle
# Paso 8. Decidir cuántas PCs usar --- ## Exploración inicial con `ElbowPlot()` ### ¿Cuántas PCs aportan señal útil antes de saturarse? .left-code[ - Es rápido y visual: ves dónde la varianza explicada empieza a “doblarse” (el famoso elbow). - Te da una idea preliminar de cuántos PCs podrían ser útiles. - Pero es heurístico, no estadístico. ``` r ElbowPlot(pbmc_pca) ``` ] .right-plot[ <!-- --> ] --- .left-code[ - `JackStraw()` → hace **permutaciones** para evaluar si cada componente principal (PC) captura señal real o solo ruido. - `ScoreJackStraw()` → toma esos resultados y asigna **puntuaciones de significancia** a las PCs que especifiques (ej. 1:20). - `JackStrawPlot()` → **visualiza** los resultados estadísticos obtenidos con JackStraw() y ScoreJackStraw(). ``` r pbmc_jack <- JackStraw(pbmc_pca, num.replicate = 100) # Asignar puntuaciones de significancia a las PCs pbmc_jack <- ScoreJackStraw(pbmc_jack, dims = 1:20) # Visualizar las PCs significativas JackStrawPlot(pbmc_jack, dims = 1:20) ``` ] .right-plot[ ### ¿Qué PCs son estadísticamente significativos? <!-- --> Esto calcula qué tan significativas son las primeras 20 PCs en comparación con permutaciones aleatorias. ] --- .left-code[ ## `DimHeatmap()`: ¿Qué genes y células están impulsando cada PC? - Muestra un heatmap de las células ordenadas según una PC específica. - Resalta los genes que tienen mayor carga en esa PC. - Te permite interpretar biológicamente qué está capturando cada componente principal. ``` r DimHeatmap(pbmc_pca, dims = 1, cells = 500, balanced = TRUE) ``` ] .right-plot[ <!-- --> ] --- ## ¿Con cuáles componentes principales (PCs) nos quedamos para el análisis? .pull-left[ Recuerden: - Observar qué **genes** están asociados a cada PC. - Evaluar la *significancia estadística* de esos PCs. - Analizar el **comportamiento biológico** que reflejan (por ejemplo, si separan condiciones, sexos o tipos celulares). - 👉 En el tutorial se trabaja con los PCs 1 al 10, porque son los que capturan la mayor parte de la variabilidad y permiten un análisis estable. - 👉 Sin embargo, los PCs 12 y 13 también son interesantes, ya que contienen genes importantes asociados a subconjuntos inmunitarios raros (por ejemplo, MZB1 como marcador de células dendríticas plasmocitoides). ] .pull-right[ .content-box-blue[ NOTA: - Los PCs iniciales (1–10) son los más usados para análisis generales. - Los PCs posteriores (12, 13, etc.) pueden revelar información biológica más específica, aunque a veces difícil de distinguir del ruido. ]] --- class: inverse, center, middle
# Paso 9. Clustering de células --- ## Clustering de células .pull-left[ - **Objetivo:** agrupar las células en comunidades que comparten perfiles de expresión similares. - Permite identificar **subpoblaciones celulares** dentro de un tejido o muestra. - Es el paso previo a la **anotación biológica**, donde asignas identidades celulares (ej. linfocitos T, monocitos, células B). - Cada cluster representa un conjunto de células con **patrones de genes característicos**. ] .pull-right[ <img src="data:image/png;base64,#figures/seurat_object.cluster.png" alt="" width="100%" style="display: block; margin: auto;" /> ] .footnote-right[ [Quality Assessment/Clustering](https://rnabio.org/module-08-scrna/0008/02/01/QA_clustering/) ] --- ## Clustering de células .pull-left[ - `FindNeighbors()`: + Construye un **grafo de vecinos más cercanos (KNN graph)** usando las PCs seleccionadas (aquí, las primeras 10). + Básicamente, calcula qué células están más próximas entre sí en el espacio PCA. - `FindClusters()`: + Aplica un algoritmo de clustering basado en grafos (Louvain o Leiden). + Agrupa las células en comunidades según la estructura del grafo. + El parámetro resolution controla el nivel de granularidad: - Valores bajos (ej. 0.2) → menos clusters, más grandes. - Valores altos (ej. 1.0 o más) → más clusters, más pequeños. ] .pull-right[ ``` r pbmc_pca <- FindNeighbors(pbmc_pca, dims = 1:10) # Computing nearest neighbor graph # Computing SNN pbmc_pca <- FindClusters(pbmc_pca, resolution = 0.5) # Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck # # Number of nodes: 2638 # Number of edges: 95927 # # Running Louvain algorithm... # Maximum modularity in 10 random starts: 0.8728 # Number of communities: 9 # Elapsed time: 0 seconds ``` ] --- class: inverse, center, middle
# Paso 10. Reducciones no lineales (UMAP/t-SNE) --- ## PCA. vs t-SNE vs UMAP `Seurat` normalmente se corre `RunTSNE` y `RunUMAP` después de `RunPCA` es que ambos métodos suelen usar las componentes principales como entrada en lugar de trabajar directamente con todos los genes. .left-code[ ``` r # PCA pbmc_pca <- RunUMAP(pbmc_pca, dims = 1:10) # t-SNE pbmc_tsne <- RunTSNE(pbmc_pca, dims = 1:10) # UMAP pbmc_umap <- RunUMAP(pbmc_pca, dims = 1:10) wrap_plots( DimPlot(pbmc_pca, reduction = "pca"), DimPlot(pbmc_tsne, reduction = "tsne"), DimPlot(pbmc_umap, reduction = "umap"), ncol = 3 ) + plot_layout(guides = "collect") ``` ] .right-plot[ <!-- --> ] --- ## Guardar archivo de la clase ``` r saveRDS(pbmc_pca, file = "practica/output/pbmc3k_tutorial.rds") ``` --- class: inverse, center, middle
# Pipeline con **varios datasets** --- ## Pipeline con **varios datasets**: - Paso 1. Descarga e importación de datos en R - Paso 2. Estructura del objeto `Seurat` - Paso 3. Control de calidad con `Seurat` - Paso 4. Normalización de los datos - Paso 5. Selección de genes altamente variables de cada objeto - Paso 6. Escalamiento de los datos de cada objeto - **Paso 7. Encontrar “anchors” de integración** - **Paso 8. Integración de datasets** - Paso 9. Determinar dimensionalidad - Paso 10. Decidir cuántas PCs usar - Paso 11. Clustering de células - Paso 12. Reducciones no lineales (UMAP/t-SNE) --- ## Métodos MNN (Mutual Nearest Neighbors) .pull-left[ - Se usan para integrar varios datasets (por ejemplo, diferentes condiciones o experimentos). - Buscan pares de células que son “vecinas mutuas” entre datasets distintos. - Sirven para corregir *batch effects* y alinear datasets antes de hacer clustering. - En `Seurat`, el paso equivalente es `FindIntegrationAnchors()` + `IntegrateData()`, que conceptualmente se parece a MNN pero con su propia implementación. ] .pull-right[ <img src="data:image/png;base64,#figures/MNN.png" alt="" width="80%" style="display: block; margin: auto;" /> ] .footnote[Imagen tomada de: [scRNA-seq Dataset Integration](https://www.singlecellcourse.org/scrna-seq-dataset-integration.html) ] --- ## Eliminar el *batch effect* .pull-left[ - `Seurat v5` introduce `IntegrateLayers()`, que permite integrar directamente diferentes capas (datasets, tecnologías, modalidades) dentro de un mismo objeto. - Integración con IntegrateLayers(): + Aquí se especifica el método (ej. CCAIntegration). + Se toma la reducción original (orig.reduction = "pca") y se crea una nueva reducción integrada (new.reduction = "integrated.cca"). + Esto reemplaza el paso de anchors + IntegrateData. ] .pull-right[ ``` r # Corrección de batch effect pbmc <- IntegrateLayers(object = pbmc, method = CCAIntegration, orig.reduction = "pca", new.reduction = "integrated.cca", verbose = FALSE) # Recalcular el grafo de vecinos pbmc <- FindNeighbors(pbmc, reduction = "integrated.cca", dims = 1:30) # Correr nuevamente clustering pbmc <- FindClusters(pbmc, resolution = 1) ``` ] .footnote-right[ [Tipos de corrección batch effect](https://satijalab.org/seurat/articles/seurat5_integration); [Introduction to scRNA-seq integration](https://satijalab.org/seurat/articles/integration_introduction)] --- ## Métodos para corrección de *batch effect* - Anchor-based CCA integration (method= `CCAIntegration`) - Anchor-based RPCA integration (method= `RPCAIntegration`) - Harmony (method= `HarmonyIntegration`) - FastMNN (method= `FastMNNIntegration`) - scVI (method= `scVIIntegration`) --- ## Métodos para corrección de *batch effect* | Método | Idea principal | Ventajas | Limitaciones | |---------------------------------|--------------------------------------------------------------|----------------------------------------------------|---------------------------------------------------| | **Anchor-based CCAIntegration** | Usa correlaciones canónicas para encontrar *anchors* | Robusto, bien probado en Seurat, útil en datasets similares | Más lento, sensible a datasets muy distintos | | **Anchor-based RPCAIntegration**| Usa PCA restringida para encontrar *anchors* | Escalable, más rápido que CCA, menos costoso | Puede perder sensibilidad en datasets heterogéneos | | **HarmonyIntegration** | Ajusta embeddings (ej. PCA) iterativamente para remover batch| Muy rápido, flexible, mantiene estructura biológica| Riesgo de sobrecorrección si batch se mezcla con biología | | **FastMNNIntegration** | Método MNN optimizado para velocidad | Preciso en datasets grandes, buena corrección | Orden de integración importa, sensible a ruido | | **scVIIntegration** | Modelo probabilístico con *deep learning* (VAE) | Potente, captura relaciones complejas, multimodal | Requiere GPU, más técnico, menos plug‑and‑play | --- ## Ejercicio: pacientes con COVID-19 vs sanos - Descarga el archivo: [Practica1.qmd](https://github.com/EveliaCoss/Workshop_scRNAseq_presentacion/blob/main/practica/Practica1.qmd) - Visualización del reporte final: [Practica1](https://eveliacoss.github.io/Workshop_scRNAseq_presentacion/practica /Practica1.html) --- class: center, middle
## Gracias por su atención Respira y coméntame tus dudas. <img src="data:image/png;base64,#figures/cat.png" alt="" width="20%" style="display: block; margin: auto 0 auto auto;" /> .left[.footnote[.black[ Imagen tomada de: [Allison Horst](https://allisonhorst.com/) ]]]