Volver al catálogo
Season 21 16 Episodios 1h 5m 2026

Scanpy Single-Cell Analysis

v1.11 — Edición 2026. Una guía exhaustiva para el análisis single-cell utilizando Scanpy (v1.11 - 2026). Aprende a preprocesar, visualizar, agrupar e inferir trayectorias para datos escalables de expresión génica single-cell.

Computación científica Análisis unicelular Bioinformática
Scanpy Single-Cell Analysis
Reproduciendo ahora
Click play to start
0:00
0:00
1
La identidad de Scanpy y AnnData
Descubre las ideas fundamentales detrás de Scanpy y por qué fue creado para el análisis single-cell escalable. Exploramos el objeto AnnData, la estructura de datos central que mantiene matrices, anotaciones y embeddings perfectamente alineados. Aprenderás el modelo mental necesario para navegar por el ecosistema de Scanpy.
4m 20s
2
Métricas de control de calidad
Exploramos cómo realizar el control de calidad inicial en datos single-cell utilizando Scanpy. Al aislar poblaciones de genes específicas como el ARN mitocondrial, podemos identificar células estresadas o moribundas. Aprenderás a calcular e interpretar estas métricas de control de calidad cruciales.
4m 02s
3
Filtrado y normalización
Este episodio cubre los pasos críticos de filtrado y normalización de matrices de expresión single-cell. Explicamos cómo descartar datos de baja calidad y aplicar el escalado de profundidad de conteo con una transformación log1p. Aprenderás a hacer que células con diferentes profundidades de secuenciación sean directamente comparables.
4m 02s
4
Detección de dobletes con Scrublet
Nos sumergimos en la detección de dobletes, un paso crucial para detectar artefactos técnicos en la secuenciación single-cell de microfluidos. Desglosamos cómo Scrublet simula dobletes artificiales para marcar células sospechosas. Aprenderás a identificar y eliminar estas combinaciones artificiales de tu conjunto de datos.
4m 05s
5
Selección de características y genes altamente variables
Examinamos el concepto de selección de características y por qué es necesario identificar genes altamente variables. Al descartar el ruido de los genes constitutivos (housekeeping), centramos el análisis en los impulsores biológicos. Aprenderás a usar Scanpy para aislar los genes más informativos para los pasos posteriores.
3m 59s
6
Puntuación del ciclo celular y regresión
Exploramos cómo manejar factores de confusión puntuando y eliminando mediante regresión las fases del ciclo celular. Discutimos cómo calcular las puntuaciones S y G2M y usar la regresión para eliminar su influencia. Aprenderás a evitar que la división celular activa arruine la topología de tu clustering.
3m 57s
7
Reducción de dimensionalidad con PCA
Este episodio explica el Análisis de Componentes Principales (PCA) en el contexto de los datos single-cell. Discutimos cómo PCA elimina el ruido del conjunto de datos y por qué es importante seleccionar el número correcto de componentes. Aprenderás a reducir miles de genes a una base manejable para algoritmos avanzados.
3m 48s
8
El grafo de vecinos más cercanos y UMAP
Desglosamos el núcleo absoluto de la topología single-cell moderna: el grafo de vecinos más cercanos. Luego explicamos cómo UMAP traduce esta compleja red en un gráfico 2D legible. Aprenderás por qué el grafo de vecinos es el requisito previo para casi todas las herramientas avanzadas en Scanpy.
3m 23s
9
Clustering con Leiden
Exploramos cómo encontrar poblaciones discretas de células utilizando el algoritmo de clustering Leiden. Al optimizar la modularidad en el grafo de vecindad, Leiden aísla comunidades altamente conectadas. Aprenderás a ajustar el parámetro de resolución para encontrar grupos estables y biológicamente significativos.
4m 11s
10
Descubrimiento de genes marcadores
Nos sumergimos en el descubrimiento de genes marcadores y las pruebas de expresión diferencial. Explicamos cómo las pruebas estadísticas identifican las firmas transcriptómicas únicas de tus clústeres. Aprenderás a pasar de clústeres numerados anónimos a tipos celulares biológicos etiquetados con confianza.
4m 39s
11
Integración de datos con Ingest
Este episodio cubre la integración de datos utilizando la herramienta Ingest. Explicamos cómo proyectar nuevos conjuntos de datos en el espacio PCA y UMAP de un atlas de referencia preanotado. Aprenderás un método rápido e invariante para mapear etiquetas entre diferentes experimentos.
3m 51s
12
Visualización de patrones de expresión
Exploramos técnicas de visualización avanzadas para evaluar la expresión génica en los clústeres. Nos centramos en los dot plots y matrix plots, detallando cómo codifican tanto la intensidad de expresión como la dispersión. Aprenderás a validar visualmente tus anotaciones de tipos celulares de un vistazo.
3m 42s
13
Exploración de variedades con Diffusion Maps
Introducimos Diffusion Maps, una potente técnica de embedding para datos biológicos continuos. Lo contrastamos con UMAP, explicando por qué la difusión es más adecuada para analizar la diferenciación celular. Aprenderás a visualizar transiciones continuas y procesos de desarrollo.
4m 32s
14
Grafos abstraídos con PAGA
Este episodio cubre la Abstracción de Grafos basada en Particiones, o PAGA. Discutimos cómo medir la conectividad real entre clústeres para preservar la topología global. Aprenderás a usar PAGA para descubrir las verdaderas relaciones de linaje ocultas en tus datos.
4m 02s
15
Inferencia de trayectorias con DPT
Exploramos la inferencia de trayectorias utilizando Diffusion Pseudotime (DPT). Explicamos cómo designar una célula raíz y calcular distancias geodésicas a través del grafo celular. Aprenderás a organizar las células a lo largo de una línea de tiempo de desarrollo continua.
4m 16s
16
Escalado experimental con Dask
En nuestro episodio final, analizamos la frontera experimental de Scanpy: el escalado con Dask. Explicamos cómo manejar conjuntos de datos que superan la memoria RAM de tu máquina utilizando evaluación perezosa (lazy evaluation) y procesamiento out-of-core. ¡Gracias por acompañarnos en esta inmersión profunda en Scanpy!
4m 16s

Episodios

1

La identidad de Scanpy y AnnData

4m 20s

Descubre las ideas fundamentales detrás de Scanpy y por qué fue creado para el análisis single-cell escalable. Exploramos el objeto AnnData, la estructura de datos central que mantiene matrices, anotaciones y embeddings perfectamente alineados. Aprenderás el modelo mental necesario para navegar por el ecosistema de Scanpy.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis single-cell con Scanpy, episodio 1 de 16. Los datasets de single-cell han crecido exponencialmente, pasando de miles a millones de células en tan solo unos años. Prueba a cargar esa escala en toolkits más antiguos que consumen mucha memoria, y tu ordenador se quedará colgado. Ese es precisamente el problema que resuelve Scanpy. Scanpy es un toolkit escalable creado para analizar datasets masivos de expresión génica single-cell en Python. Gestiona la memoria de forma eficiente gracias a una estructura de datos fundamental muy específica. Esa estructura se llama Annotated Data, o AnnData. Quienes vienen de los datos tabulares estándar suelen asumir que AnnData es solo un dataframe de pandas personalizado. No lo es. Un único dataframe es demasiado plano para la biología single-cell. En un experimento single-cell, tienes una matriz masiva de recuentos de expresión, pero también tienes metadatos complejos sobre las células y metadatos totalmente independientes sobre los genes. AnnData es un contenedor multidimensional que une estrechamente la matriz principal y todos sus metadatos asociados en un único objeto sincronizado. Imagina un escenario en el que estás cargando un dataset de un millón de células. En el centro de tu objeto AnnData se encuentra la matriz de datos principal, a la que accedes a través del atributo dot X. Esta es una matriz bidimensional que contiene tus valores numéricos reales, normalmente recuentos de expresión génica. Las filas siempre representan observaciones, que son tus células individuales, y las columnas siempre representan variables, que son tus genes. Para un dataset de un millón de células, dot X casi siempre se almacena como una sparse matrix para conservar memoria RAM. Aquí está la clave. La matriz en dot X no almacena sus propios nombres de filas o columnas. Depende completamente de dos dataframes de metadatos específicos para proporcionar ese contexto. El primero son los metadatos de observación, a los que accedes mediante el atributo dot obs. Este es un dataframe estándar de pandas mapeado directamente a las filas de tu matriz dot X. Contiene todo lo que sabes sobre las células. Para tu dataset de un millón de células, dot obs tendrá exactamente un millón de filas. Aquí es donde viven tus cell barcodes, las batch labels, las métricas de control de calidad y las asignaciones de clustering. El segundo son los metadatos de variables, a los que accedes mediante el atributo dot var. Este es otro dataframe mapeado directamente a las columnas de tu matriz dot X. Contiene todo lo que sabes sobre los genes o features que has medido. Aquí es donde guardas los símbolos de los genes, las ubicaciones en los cromosomas y las métricas estadísticas, como los flags de genes altamente variables. Dado que dot obs y dot var están estrictamente alineados con las dimensiones de dot X, puedes hacer un slice del objeto AnnData de forma segura. Si filtras las células muertas de dot obs, el objeto AnnData elimina automáticamente las filas correspondientes de la matriz dot X. La alineación dimensional nunca se rompe. Hay una capa crucial más en la estructura de AnnData. A medida que procesas tus datos single-cell, generas representaciones multidimensionales de tus células, como componentes principales o coordenadas UMAP. Estos resultados no encajan bien en una sola columna de dot obs. En su lugar, van a un diccionario separado llamado dot obsm, que significa observation matrices. La única regla es que cualquier matriz que coloques en dot obsm debe tener exactamente el mismo número de filas que dot X. Al mantener la matriz principal, los metadatos de las células y los metadatos de los genes integrados en una única estructura autoactualizable, AnnData garantiza que tus datos se mantengan perfectamente sincronizados desde el primer paso de filtrado hasta la visualización final. Si estos episodios te resultan útiles, puedes apoyar el programa buscando DevStoriesEU en Patreon. Como siempre, gracias por escuchar. Nos vemos en el próximo episodio.
2

Métricas de control de calidad

4m 02s

Exploramos cómo realizar el control de calidad inicial en datos single-cell utilizando Scanpy. Al aislar poblaciones de genes específicas como el ARN mitocondrial, podemos identificar células estresadas o moribundas. Aprenderás a calcular e interpretar estas métricas de control de calidad cruciales.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis single-cell con Scanpy, episodio 2 de 16. La forma más rápida de arruinar un análisis single-cell es mantener, sin darte cuenta, células moribundas o vacías en el dataset. Puedes pensar que estás descubriendo una nueva subpoblación, pero en realidad solo estás haciendo clustering de restos celulares. Exponer estas células comprometidas depende por completo de las métricas de Quality Control. Vamos a aclarar algo desde el principio. La gente suele confundir el cálculo de métricas de calidad con el filtrado de datos malos. No son lo mismo. La función calculate qc metrics de Scanpy no elimina ni una sola célula o gen de tu dataset. Es estrictamente una herramienta de anotación. Calcula estadísticas y las añade como nuevas columnas a tu dataframe de observación, que rastrea las células, y a tu dataframe de variables, que rastrea los genes. La eliminación real de las células malas ocurre en un paso aparte. ¿Por qué necesitamos estas métricas específicas? Piensa en una muestra de médula ósea. Durante la extracción, el estrés físico puede romper las células frágiles. Cuando la membrana celular se rompe, el ARN citoplasmático se filtra y se pierde. Sin embargo, las mitocondrias están encerradas en sus propias membranas, por lo que el ARN mitocondrial queda atrapado dentro del caparazón de la célula rota. Si secuencias este droplet, obtendrás una alta concentración de genes mitocondriales y muy poco más. Esto es una célula muerta. Para identificar estas células rotas, necesitas rastrear poblaciones de genes específicas. En datasets humanos, los genes mitocondriales suelen empezar con el prefijo MT guion. Los genes ribosomales pueden empezar por RPS o RPL. Antes de que puedas calcular métricas para estas poblaciones, tienes que etiquetarlas en tu dataset. Esto lo haces creando una nueva columna boolean en tu dataframe var. Por ejemplo, creas una columna llamada mt que se evalúa como True si el nombre del gen empieza por MT guion, y False en caso contrario. Una vez que has marcado estos genes, ejecutas la función calculate qc metrics. Por defecto, esta función calcula estadísticas base estándar, como el número total de counts de ARN por célula y el número de genes expresados por célula. Pero también puedes decirle que analice las poblaciones de genes específicas que acabas de definir. Le pasas el nombre de tu columna boolean, como mt, al argumento qc vars. La función entonces calcula la proporción de counts que provienen de ese grupo de genes específico. Añade nuevas columnas a tu dataframe obs. Una columna mostrará los counts totales de genes mitocondriales para cada célula. Otra columna, más crítica, mostrará el porcentaje de counts totales que provienen de genes mitocondriales. Si una célula muestra que el treinta por ciento de su ARN es mitocondrial, sabes que probablemente sea una célula rota y moribunda del proceso de extracción. Aquí está la clave. La función calculate qc metrics transforma matrices de counts raw e ininterpretables en señales biológicas sobre la salud celular. No toma decisiones por ti, pero al etiquetar poblaciones de genes específicas, te da la evidencia numérica exacta que necesitas para separar la biología real del ruido de extracción. Gracias por pasar unos minutos conmigo. Hasta la próxima, cuídate.
3

Filtrado y normalización

4m 02s

Este episodio cubre los pasos críticos de filtrado y normalización de matrices de expresión single-cell. Explicamos cómo descartar datos de baja calidad y aplicar el escalado de profundidad de conteo con una transformación log1p. Aprenderás a hacer que células con diferentes profundidades de secuenciación sean directamente comparables.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis single-cell con Scanpy, episodio 3 de 16. Observas dos células en tu dataset. Una parece expresar el doble de ARN que la otra. Pero no es una diferencia biológica: una droplet simplemente fue secuenciada con el doble de profundidad por la máquina. Si las comparas directamente, todo tu downstream analysis se verá distorsionado por artefactos técnicos. El filtrado y la normalización son las herramientas que resuelven esta disparidad. Antes de poder ajustar por la profundidad de secuenciación, tienes que eliminar la basura. Los datos raw de single-cell están llenos de células muertas, droplets vacías y ruido aleatorio. Limpias esto a lo largo de dos ejes distintos: las células y los genes. La gente a veces confunde estos dos pasos, pero hacen cosas completamente diferentes. Primero manejas las células usando la función filter cells. Le dices a Scanpy que descarte cualquier célula que exprese menos de un número mínimo de genes. Si una droplet contiene solo doscientos genes detectados cuando una célula sana debería tener dos mil, es probable que esa droplet esté vacía o contenga una célula rota y moribunda. La descartas por completo. A continuación, filtras los genes en todo tu dataset. Usando la función filter genes, eliminas los genes que se expresan en muy pocas células. Si un gen específico solo se detecta en una o dos células de entre diez mil, no aporta ningún valor estadístico para agrupar o clasificar tipos celulares más adelante. Es simplemente ruido computacional. Descartas ese gen por completo. Una vez que las células de baja calidad y los genes sin información han desaparecido, aún te enfrentas al problema de la profundidad de secuenciación. Aquí es donde normalizas los total counts. El objetivo es escalar cada célula para que todas parezcan tener el mismo número total de read counts. Imagina un escenario donde la Célula A tiene cinco mil total counts y la Célula B tiene veinte mil. Eliges un size factor común, normalmente diez mil. Scanpy aplica un scaling factor a cada célula individualmente. Duplica los counts en la Célula A y reduce a la mitad los counts en la Célula B. Ahora, ambas células suman diez mil total counts. Cuando miras un gen específico en ambas células, estás comparando su verdadera expresión relativa, de forma completamente independiente de cuánto las haya muestreado la máquina de secuenciación. Igualar los totales es solo la mitad de las matemáticas. Los datos de expresión biológica están masivamente sesgados. Un puñado de genes tendrá números de counts enormes, mientras que la mayoría tendrá muy pocos. Si luego pasas estos datos sesgados a cálculos de variance o algoritmos de dimensionality reduction, esos pocos genes masivos dominarán las matemáticas y ahogarán las señales biológicas sutiles. Arreglas esto usando una transformación log plus one. Llamas a la función log one p en Scanpy, que aplica un logaritmo natural a todos tus counts normalizados. La parte del plus one de la función es crítica porque tu data matrix está compuesta en su mayoría por ceros, que representan genes que no se expresan en una célula determinada. El logaritmo de cero es indefinido, pero el logaritmo de cero más uno es cero. Este sencillo paso comprime los valores extremadamente altos mientras mantiene los ceros exactamente donde están, resultando en una distribución mucho más equilibrada. Aquí está la clave. El filtrado y la normalización no alteran la biología subyacente de tu muestra. Eliminan los sesgos mecánicos del hardware de secuenciación para que la biología real pueda emerger. ¡Gracias por escuchar, happy coding a todos!
4

Detección de dobletes con Scrublet

4m 05s

Nos sumergimos en la detección de dobletes, un paso crucial para detectar artefactos técnicos en la secuenciación single-cell de microfluidos. Desglosamos cómo Scrublet simula dobletes artificiales para marcar células sospechosas. Aprenderás a identificar y eliminar estas combinaciones artificiales de tu conjunto de datos.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis single-cell con Scanpy, episodio 4 de 16. A veces, dos células completamente diferentes quedan atrapadas en la misma gota microfluídica, creando una firma transcriptómica Frankenstein que parece un estado biológico totalmente nuevo. Esto no es un descubrimiento. Es un error, y si no lo detectas a tiempo, contaminará tu análisis. Ese es exactamente el problema que Doublet Detection con Scrublet está diseñado para resolver. Cuando ejecutas un experimento single-cell usando microfluídica de gotas, empujas una suspensión celular a través de un canal, buscando una célula por gota. Estadísticamente, este proceso no es perfecto. En ocasiones, dos células comparten una misma gota. Imagina un escenario en el que un monocito y una célula T quedan atrapados juntos. La máquina de secuenciación lee su ARN combinado como una sola entidad, generando un perfil que mezcla genes de ambos tipos celulares. La gente a menudo confunde estos perfiles mixtos con verdaderos estados de transición biológica, como una célula a mitad de la diferenciación. Tenemos que ser completamente claros. Los doublets son artefactos puramente técnicos. No existen en el tejido y hay que eliminarlos. En Scanpy, manejas esto usando la función scrublet en el módulo de preprocessing. Scrublet opera bajo una premisa muy eficaz para encontrar estas células falsas. Si quieres detectar doublets, necesitas saber qué aspecto tiene un doublet en tu dataset específico. Como el algoritmo no sabe cuáles de tus células observadas son errores, fabrica las suyas propias. Primero, Scrublet toma la expression matrix de tus células observadas. Luego, selecciona aleatoriamente pares de estas células reales y suma computacionalmente sus perfiles de expresión génica. Estos perfiles combinados son tus doublets simulados. Ahora, Scrublet mapea tanto tus células observadas reales como estos nuevos doublets simulados en el mismo espacio de alta dimensión. Construye un clasificador nearest-neighbor para analizar las relaciones entre ellos. Esta es la clave. Scrublet evalúa el vecindario inmediato de cada célula real en tu dataset. Si una célula observada está rodeada principalmente de doublets simulados, esa célula real se ve matemáticamente idéntica a un mashup artificial. Scrublet le asigna un doublet score alto. Por el contrario, si una célula observada se encuentra en un cluster con otras células reales y muy pocos doublets simulados, recibe un score bajo. Es muy probable que sea una single cell genuina. La función no se queda solo en asignar un score continuo. Evalúa la distribución de todos los doublet scores en tu dataset para calcular automáticamente un threshold de corte. Busca una separación entre el gran pico de células normales y la cola más pequeña de doublets sospechosos. Basándose en este threshold, Scrublet etiqueta cada célula de tu dataset con un valor boolean, marcándola como true si es un doublet predicho, y como false si es un singlet. Estos resultados se guardan directamente en tu data object, permitiéndote filtrar las células falsas antes de pasar al downstream analysis. La principal fortaleza de Scrublet es que no depende de bases de datos de referencia externas para encontrar errores técnicos. Aprende los modos de fallo exactos de tu experimento específico combinando las mismas células que secuenciaste. Eso es todo por este episodio. Gracias por escuchar, ¡y sigue creando!
5

Selección de características y genes altamente variables

3m 59s

Examinamos el concepto de selección de características y por qué es necesario identificar genes altamente variables. Al descartar el ruido de los genes constitutivos (housekeeping), centramos el análisis en los impulsores biológicos. Aprenderás a usar Scanpy para aislar los genes más informativos para los pasos posteriores.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis Single-Cell con Scanpy, episodio 5 de 16. De los aproximadamente 30.000 genes del genoma humano, la mayoría solo se dedican al mantenimiento celular básico. Si intentas analizarlos todos a la vez, el enorme volumen de actividad basal enmascarará la biología real que estás buscando. Para encontrar la señal real, necesitas Feature Selection y Highly Variable Genes. Primero, una aclaración rápida. Ya has utilizado una función de filtrado básica para descartar los genes que apenas se detectan en tu dataset. Ese paso elimina el ruido técnico y los empty droplets. La selección de Highly Variable Genes hace algo completamente diferente. Asume que los genes restantes son reales, pero se pregunta cuáles de ellos son realmente informativos. Piénsalo así. Examinar decenas de miles de genes para encontrar los que generan diferencias entre los tipos de células implica descartar los aburridos genes housekeeping basales. Un gen housekeeping está activo en casi todas las células aproximadamente al mismo nivel. Su expresión es estable, lo que lo hace inútil para distinguir una célula T de una célula B. Buscamos genes que se expresen intensamente en algunas células y estén totalmente silenciados en otras. Estos son los Highly Variable Genes. Normalmente, quieres reducir tu dataset a unos dos mil de estos drivers clave. En Scanpy, esto lo manejas con la función de Highly Variable Genes. Pero no puedes simplemente ordenar los genes por su varianza raw. En los datos de secuenciación, la varianza escala con la expresión media. Si un gen se expresa intensamente de forma generalizada, su varianza raw será naturalmente alta, aunque no sea biológicamente interesante. El algoritmo tiene que desacoplar la varianza de la expresión media. Para ello, divide los genes en bins basándose en sus niveles de expresión media. Luego, calcula una dispersión normalizada dentro de cada bin. Esto te dice cuánto varía un gen en comparación únicamente con otros genes que se expresan a niveles basales similares. Scanpy ofrece diferentes métodos estadísticos para hacer estos cálculos, llamados flavors. El flavor tradicional de Seurat espera que tus datos estén log-normalizados primero. Calcula la dispersión, divide los datos en bins y estandariza los valores. También hay un flavor más nuevo, Seurat v3, que requiere explícitamente datos de counts raw, sin logaritmo, para modelar correctamente la varianza. Alternativamente, el flavor de CellRanger usa un enfoque ligeramente diferente para calcular la dispersión normalizada basándose en los counts. El flavor que elijas simplemente dicta la distribución estadística específica usada para modelar esa relación entre la media y la varianza. Cuando ejecutas esta función, no borra el resto de tus datos. En su lugar, añade unas cuantas columnas nuevas a tu array de anotaciones de variables. La más importante es una columna boolean llamada simplemente highly variable, que marca true para los dos mil genes principales y false para el resto. Los futuros pasos de tu pipeline buscarán automáticamente este flag y solo usarán esos genes seleccionados para el análisis downstream. Aquí está la clave. El Feature Selection no es solo un truco computacional para que tu código se ejecute más rápido; es el proceso deliberado de eliminar el ruido blanco biológico para que las verdaderas identidades celulares tengan espacio para emerger. Gracias por estar ahí. Espero que hayas aprendido algo nuevo.
6

Puntuación del ciclo celular y regresión

3m 57s

Exploramos cómo manejar factores de confusión puntuando y eliminando mediante regresión las fases del ciclo celular. Discutimos cómo calcular las puntuaciones S y G2M y usar la regresión para eliminar su influencia. Aprenderás a evitar que la división celular activa arruine la topología de tu clustering.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 6 de 16. Tu algoritmo de clustering acaba de dividir células T idénticas en dos grupos distintos. Son exactamente del mismo tipo celular, pero el algoritmo las separó simplemente porque un grupo se está dividiendo activamente mientras que el otro está en reposo. Para solucionar esto, utilizamos Cell-Cycle Scoring y Regression. La heterogeneidad del ciclo celular es una fuente enorme de varianza en los datos single-cell. Si no lo controlas, los genes altamente expresados que impulsan la mitosis eclipsarán las sutiles firmas genéticas que definen los tipos celulares reales. Acabas teniendo clusters definidos por un estado temporal en lugar de una verdadera identidad biológica. Para resolver esto, Scanpy proporciona una función dedicada para calcular el score de los genes basándose en el ciclo celular. Le pasas a esta función tu dataset single-cell junto con dos listas específicas de genes marcadores conocidos. Una lista contiene genes que están activos durante la fase S, la fase de síntesis del ciclo celular. La otra lista contiene genes activos durante la fase G2M, la fase de mitosis. La función de scoring evalúa cada célula individual y calcula dos métricas continuas: un S-score y un G2M-score. Lo hace analizando con qué fuerza se expresan esos genes de fase específicos en comparación con el nivel de expresión background de la célula. Basándose en estos dos scores, la función también asigna una etiqueta de fase categórica a cada célula en tu metadata, etiquetándola como S, G2M o G1 si ninguno de los scores es particularmente alto. Ahora que has cuantificado este efecto, necesitas limpiar su influencia del dataset. Aquí es donde usas la función regress out. Le indicas a regress out que mire las columnas S-score y G2M-score que se acaban de añadir a la metadata de tu célula. Entonces, el algoritmo construye un modelo lineal para la expresión de cada gen en todas las células, usando esos dos scores del ciclo celular como variables predictoras. Calcula el residual, que es la cantidad exacta de expresión génica que no puede explicarse por la posición de la célula en el ciclo celular. Este valor residual se convierte en el nuevo nivel de expresión corregido en tu dataset. Aquí está la clave. La gente a menudo confunde la regresión con batch correction. Son conceptos relacionados, pero son herramientas fundamentalmente diferentes. Los métodos de batch correction están diseñados para alinear grupos discretos y categóricos, como muestras recogidas en días diferentes o secuenciadas en distintas máquinas. Regress out está diseñado específicamente para variables de confusión continuas. Lo usas para gradientes numéricos continuos como estos scores del ciclo celular, los total counts por célula, o el porcentaje de genes mitocondriales. Modela una pendiente matemática y la aplana. Una vez que ejecutas este paso de regresión, el fuerte sesgo biológico de la división celular se elimina matemáticamente de la matriz de expresión. Cuando vuelves a ejecutar tu algoritmo de clustering en estos datos corregidos, esas células T en división y células T en reposo volverán a unirse en un único cluster cohesivo. El algoritmo ya no se distrae con el ruido de la replicación del ADN. Aplicar regress out a los scores del ciclo celular asegura que tu downstream analysis agrupe las células estrictamente por lo que son, en lugar de por lo que da la casualidad que estaban haciendo en el momento en que fueron secuenciadas. Eso es todo por este episodio. Gracias por escuchar, ¡y sigue construyendo!
7

Reducción de dimensionalidad con PCA

3m 48s

Este episodio explica el Análisis de Componentes Principales (PCA) en el contexto de los datos single-cell. Discutimos cómo PCA elimina el ruido del conjunto de datos y por qué es importante seleccionar el número correcto de componentes. Aprenderás a reducir miles de genes a una base manejable para algoritmos avanzados.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 7 de 16. La mente humana no puede visualizar dos mil dimensiones. Peor aún, los algoritmos de clustering complejos se paralizan computacionalmente, atascados por una mezcla de señal biológica real y ruido técnico aleatorio. Necesitas una forma de extraer la estructura central de tus datos antes de analizarlos. La reducción de dimensionalidad con Principal Component Analysis es cómo solucionas esto. Antes de entrar en la mecánica, debemos aclarar un malentendido común. La gente suele pensar que el PCA es solo un scatter plot que muestra el PC1 frente al PC2, pensado como una visualización final para el ojo humano. No lo es. Si bien puedes plotear los dos componentes principales, el PCA es fundamentalmente una base matemática. Comprime una matriz dispersa y ruidosa en un formato denso para alimentar herramientas downstream como los neighbor graphs. Piensa en tu punto de partida. Acabas de aislar unos dos mil genes altamente variables. Cada gen representa una dimensión independiente en tu dataset. Ejecutas la función scanpy tools pca para calcular los componentes principales. Esta función evalúa todo tu dataset y reduce esas dos mil dimensiones de genes a un conjunto mucho menor de dimensiones sintéticas, generalmente alrededor de cincuenta. Estas dimensiones sintéticas se ordenan según la varianza que explican. El primer componente principal representa el eje de variación más fuerte en tus células. El segundo representa el siguiente más fuerte, y así sucesivamente. Aquí está la clave. Los primeros componentes capturan las diferencias biológicas reales y estructuradas. A medida que avanzas en la lista de componentes, estos capturan progresivamente menos biología y más ruido técnico aleatorio. Al recortar la parte final de estos componentes, básicamente estás haciendo denoising en tu matriz de datos. Para evaluar esta reducción, tienes que decidir cuántos componentes conservar. Utilizas la función scanpy plot pca variance ratio. Este comando genera un gráfico de líneas que muestra la fracción de la varianza total explicada por cada componente individual. Revisas esta línea buscando el elbow point, que es donde la caída pronunciada se aplana repentinamente formando una cola larga. Si la curva se aplana en el componente quince, podrías suponer que solo necesitas quince componentes. Sin embargo, en los workflows de single-cell, sobreestimamos deliberadamente el número de componentes principales. Podrías ver el elbow en quince, pero aun así, le dices a tus funciones downstream que utilicen cincuenta. Los algoritmos de clustering downstream son muy robustos. Pueden ignorar fácilmente el ligero ruido técnico contenido en los componentes dieciséis al cincuenta. Lo que no pueden hacer es recuperar la señal biológica que descartaste demasiado pronto. Si el componente veintidós contiene la firma de varianza para un tipo de célula muy raro, descartarlo significa que ese tipo de célula desaparece por completo de tu análisis. Calculas los componentes, verificas el variance ratio para confirmar la estructura de los datos y continúas. La conclusión más importante es que el PCA no es una imagen para mirar, sino un filtro matemático específico que sacrifica profundidad dimensional bruta para eliminar el ruido y exponer los verdaderos ejes biológicos de tus datos. Espero que te haya sido útil. Gracias por escuchar y disfruta del resto de tu día.
8

El grafo de vecinos más cercanos y UMAP

3m 23s

Desglosamos el núcleo absoluto de la topología single-cell moderna: el grafo de vecinos más cercanos. Luego explicamos cómo UMAP traduce esta compleja red en un gráfico 2D legible. Aprenderás por qué el grafo de vecinos es el requisito previo para casi todas las herramientas avanzadas en Scanpy.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis Single-Cell con Scanpy, episodio 8 de 16. El secreto del análisis single-cell moderno no es solo plotear puntos en un grid. Es entender exactamente qué células son vecinas en un espacio masivo de alta dimensionalidad. Si te equivocas con esa estructura subyacente, cualquier visualización posterior te va a engañar. El mecanismo para capturar esta estructura es el nearest neighbor graph, y hoy vamos a ver cómo construirlo y proyectarlo usando UMAP. En esta etapa de un pipeline típico, ya has ejecutado un Principal Component Analysis. Has condensado miles de genes en quizás cuarenta o cincuenta componentes principales. Pero cincuenta dimensiones sigue siendo imposible de visualizar, y no nos dice explícitamente qué células pertenecen a la misma comunidad local. Necesitamos construir una red de conexiones. En Scanpy, esto lo haces usando la función sc punto pp punto neighbors. Este paso calcula el neighborhood graph de tus células. Calcular distancias entre decenas de miles de células a través de treinta mil genes raw es computacionalmente brutal y muy susceptible al ruido. Al calcular los vecinos sobre los componentes principales en su lugar, las matemáticas son rápidas y el ruido técnico ya se ha eliminado. Para cada célula individual, el algoritmo mira sus coordenadas en esos componentes principales y encuentra sus pares más cercanos. Por defecto, enlaza una célula con sus quince vecinos más cercanos. El output es una red matemática donde las células son nodos, y los edges entre ellas representan una alta similitud. Este neighborhood graph se convierte en la estructura de datos fundamental para las tareas downstream. Una vez que tienes esta red, lo que quieres es verla. Aquí es donde entra UMAP, al que llamas a través de sc punto tl punto umap. Aquí está la clave. Un error muy común es pensar que UMAP calcula las distancias directamente a partir de tus datos raw de expresión génica. No lo hace. UMAP es completamente ciego a tus genes. Es simplemente un layout engine. Su único trabajo es coger ese nearest neighbor graph precalculado y aplanarlo en un espacio bidimensional. UMAP funciona optimizando un layout para que coincida con el grafo. Atrae a los vecinos conectados para acercarlos, mientras aleja a las células desconectadas. Como depende completamente de las conexiones locales definidas en el paso anterior, es excepcionalmente bueno preservando la estructura local. Si un grupo de células estaba fuertemente conectado en el grafo de alta dimensionalidad, formarán una isla distinta y compacta en tu plot 2D de UMAP. Pero ten en cuenta que el espacio vacío entre las islas separadas en un plot de UMAP significa muy poco. UMAP sacrifica la precisión espacial global para asegurar que los vecinos locales se mantengan pegados. Esta separation of concerns es vital. La forma que ves en un UMAP está completamente dictada por el neighbor graph construido justo antes. Si quieres cambiar lo sensible que es tu layout a los tipos de células raras, no ajustas UMAP. Vuelves atrás y ajustas el número de vecinos en la propia construcción del grafo. Si estos episodios te resultan útiles y quieres apoyar el programa, puedes buscar DevStoriesEU en Patreon. Eso es todo por este episodio. Gracias por escuchar, ¡y sigue construyendo!
9

Clustering con Leiden

4m 11s

Exploramos cómo encontrar poblaciones discretas de células utilizando el algoritmo de clustering Leiden. Al optimizar la modularidad en el grafo de vecindad, Leiden aísla comunidades altamente conectadas. Aprenderás a ajustar el parámetro de resolución para encontrar grupos estables y biológicamente significativos.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis Single-Cell con Scanpy, episodio 9 de 16. Los algoritmos de clustering tradicionales asumen que tus datos existen en nubes perfectamente redondas organizadas alrededor de un punto central. Pero los datos biológicos reales son desordenados, están interconectados y crean formas continuas y complejas. Cuando intentas forzar esas estructuras complejas en esferas simples, acabas dividiendo tipos celulares únicos en fragmentos artificiales. El clustering con Leiden resuelve esto fijándose en cómo se conectan las células entre sí, en lugar de mirar solo dónde se ubican en un espacio abstracto. La gente suele pensar por defecto en el clustering tipo K-means, donde defines un punto central y agrupas todo lo que hay cerca usando distancias físicas estándar. Leiden no funciona así. Es un algoritmo de clustering basado en grafos. Ignora por completo las distancias euclidianas a un centroide. En su lugar, se basa completamente en la densidad de aristas del neighbor graph que construiste antes en tu análisis. Imagina el neighbor graph como una enorme red social. Las células son individuos, y las aristas entre ellas son amistades. Leiden realiza lo que se conoce como detección de comunidades. Busca grupos de células que tengan un número muy alto de conexiones dentro de su grupo específico, pero muy pocas conexiones con la red externa. Para lograr esto, el algoritmo optimiza una métrica llamada modularidad. La modularidad mide la densidad de enlaces dentro de las comunidades en comparación con los enlaces que esperarías si la red fuera totalmente aleatoria. El algoritmo comienza asignando cada célula a su propia comunidad individual. Luego, fusiona iterativamente estas comunidades, moviendo nodos de un lado a otro, comprobando constantemente si la nueva agrupación aumenta el score general de modularidad. Leiden está diseñado específicamente para refinar estas particiones cuidadosamente, garantizando que las comunidades finales estén densamente conectadas internamente y no sufran de fragmentos desconectados, un problema conocido en el antiguo algoritmo de Louvain. En Scanpy, ejecutas esto usando la tool function Leiden. Le pasas tu data object principal, y opera directamente sobre el neighbor graph existente. El output es una nueva columna categórica añadida a tus datos, que contiene un número de cluster para cada célula. Aquí está la clave. El control más importante que tienes sobre todo este proceso es el parámetro resolution. Este parámetro actúa como un dial que dicta con qué agresividad el algoritmo divide los grupos. Por defecto, Scanpy usa un resolution de uno. Si aumentas el valor de resolution, obtienes más clusters. El algoritmo se vuelve muy sensible, rompiendo el grafo en subpoblaciones más pequeñas y muy específicas. Si disminuyes el valor de resolution, obtienes menos clusters. El algoritmo se vuelve más tolerante, agrupando porciones más grandes del grafo. Supón que ejecutas Leiden y miras el mapa resultante. Puede que notes que un único tipo celular biológico conocido se ha dividido en cinco subpoblaciones diminutas y excesivamente fragmentadas. El algoritmo encontró ligeras diferencias, pero biológicamente, esos cinco grupos forman parte de un único estado celular distinto. Para arreglar esto, simplemente ejecutas la función Leiden de nuevo, pero esta vez le pasas explícitamente un número más bajo al argumento resolution. Al bajar el resolution, le indicas al algoritmo que relaje sus criterios. Esos cinco fragmentos diminutos se volverán a fusionar en un cluster sólido y con sentido biológico. El resolution exacto que necesitas nunca es una verdad matemática fija; es un dial ajustable que giras hasta que las comunidades estadísticas en el grafo reflejen con precisión las realidades biológicas de tu tejido. Gracias por pasarte. Espero que hayas aprendido algo nuevo.
10

Descubrimiento de genes marcadores

4m 39s

Nos sumergimos en el descubrimiento de genes marcadores y las pruebas de expresión diferencial. Explicamos cómo las pruebas estadísticas identifican las firmas transcriptómicas únicas de tus clústeres. Aprenderás a pasar de clústeres numerados anónimos a tipos celulares biológicos etiquetados con confianza.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 10 de 16. Has aislado un cluster de células bien definido en tu dataset, pero ¿cómo sabes si es una célula T, una célula B o un estado completamente desconocido? Las matemáticas las han agrupado, pero la biología tiene que decirte qué son. Ese paso de traducción depende completamente del descubrimiento de genes marcadores. Antes de ver las herramientas, tenemos que trazar una línea clara entre clustering y anotación. Los algoritmos de clustering simplemente agrupan células basándose en su similitud estadística a través de miles de dimensiones y les asignan una etiqueta arbitraria, como Cluster 0 o Cluster 1. Ese número no significa nada biológicamente. El descubrimiento de genes marcadores es el proceso de encontrar los genes específicos que impulsan ese clustering estadístico, permitiéndote asignar nombres biológicos reales a esos clusters. En Scanpy, encuentras estos genes impulsores usando una función llamada rank genes groups. Esta función realiza un análisis de expresión diferencial. Toma una agrupación categórica, normalmente tus clusters calculados, y compara la expresión génica de las células dentro de un cluster contra las células de todos los demás clusters combinados. El objetivo es encontrar genes que están altamente expresados en tu cluster objetivo, pero prácticamente silenciados en el resto. Por defecto, compara cada cluster con la unión del resto de las células, pero también puedes configurarlo para comparar un cluster contra un grupo de referencia específico si buscas diferencias sutiles entre dos tipos de células muy relacionadas. Para decidir si un gen es realmente un marcador, Scanpy ejecuta un test estadístico para puntuar la diferencia de expresión. Puedes elegir un t-test estándar, pero el test de Wilcoxon es muy recomendable y es la opción estándar para datos single-cell. La expresión génica single-cell no sigue una curva de campana normal; es muy variable, fuertemente sesgada y está llena de valores cero donde un gen simplemente no fue detectado. El test de Wilcoxon no asume una distribución normal. En lugar de mirar los valores medios en bruto, clasifica los valores de expresión en todas las células y compara los rangos entre tu cluster objetivo y el resto del dataset. Esto lo hace mucho más robusto frente a outliers extremos. Veamos un escenario específico. Tienes un dataset con varios clusters y quieres interrogar el Cluster 3. Llamas a la función rank genes groups, le dices que use tus etiquetas de cluster existentes y configuras el método en Wilcoxon. Scanpy procesa los números y clasifica cada gen basándose en lo bien que define de forma única al Cluster 3. Luego inspeccionas los primeros resultados. Ves que los genes mejor clasificados son CD8A y GZMK. Si sabes de inmunología, reconoces inmediatamente que estos son marcadores clásicos para células T citotóxicas. Como estos genes específicos están upregulated de forma única aquí en comparación con el resto del dataset, puedes etiquetar con confianza el Cluster 3 como una célula T CD8 positiva. El output de esta función se guarda discretamente en tu objeto AnnData bajo el atributo uns. Scanpy guarda arrays de nombres de genes, puntuaciones estadísticas, p-values y log-fold changes para cada cluster simultáneamente. Puedes extraer estos arrays para construir dataframes, guardarlos en un archivo csv, o pasarlos directamente a herramientas de anotación downstream. Aquí está la clave. La expresión diferencial convierte formas matemáticas arbitrarias en identidades biológicas accionables. Sin genes marcadores, solo tienes un mapa de números; con ellos, tienes un sistema biológico mapeado. Eso es todo por este episodio. Gracias por escuchar, ¡y sigue creando!
11

Integración de datos con Ingest

3m 51s

Este episodio cubre la integración de datos utilizando la herramienta Ingest. Explicamos cómo proyectar nuevos conjuntos de datos en el espacio PCA y UMAP de un atlas de referencia preanotado. Aprenderás un método rápido e invariante para mapear etiquetas entre diferentes experimentos.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Scanpy Single-Cell Analysis, episodio 11 de 16. Tienes un dataset de referencia perfectamente anotado y una nueva muestra de paciente que necesitas analizar. Normalmente, combinarlos implica ejecutar un batch correction, recalcular tus principal components y esperar a que se renderice un UMAP conjunto masivo desde cero. Data Integration con Ingest ofrece una alternativa más rápida y no destructiva. La gente a menudo confunde ingest con el batch correction estándar. Las herramientas tradicionales de batch correction cogen varios datasets y calculan un modelo conjunto totalmente nuevo. Modifican la representación subyacente de tus datos de referencia para forzar un alineamiento. Ingest hace lo contrario. Es una proyección asimétrica. Tu dataset de referencia actúa como el ground truth absoluto. El modelo espacial se bloquea, y los nuevos datos simplemente se pasan a través de él sin alterar el modelo original para nada. Coge un atlas de referencia de células mononucleares de sangre periférica perfectamente anotado. Cada cluster está verificado y etiquetado. Acabas de recibir una muestra de paciente sin anotar y hecha un desastre. Quieres aplicar esas etiquetas del atlas a tu nueva muestra, y quieres plotear las nuevas células exactamente en el mismo espacio de coordenadas que la referencia. Para que esto funcione, las variables de tus dos datasets deben alinearse. Esto significa que ambos datasets necesitan compartir exactamente los mismos genes. En la práctica, filtras tu nuevo query dataset para que sus genes coincidan con los genes altamente variables ya identificados en tu atlas de referencia. Tu dataset de referencia debe estar completamente procesado antes de empezar. Necesita un Principal Component Analysis existente, un neighborhood graph calculado y una representación UMAP. También contiene las etiquetas categóricas que quieres transferir, guardadas en sus observation metadata. La ejecución es un solo command. Llamas a la function ingest, pasándole tu nuevo query dataset, tu dataset de referencia anotado y la observation column específica que quieres mapear, como la etiqueta del tipo de célula. Aquí está la clave. Cuando lanzas la function, ingest coge los expression profiles de tus nuevas células y los proyecta matemáticamente en el espacio de principal components existente del atlas de referencia. Se salta por completo el cálculo de un nuevo Principal Component Analysis global. Una vez que las query cells aterrizan en esa disposición espacial compartida, el algoritmo busca los nearest neighbors. Mapea las query cells directamente sobre el neighbor graph preexistente del dataset de referencia. El trabajo computacional pesado de construir un grafo ya lo ha hecho el modelo de referencia. Como las nuevas células ahora tienen neighbors establecidos en los datos de referencia, ocurren dos transferencias finales. Primero, las coordenadas UMAP de los neighbors de referencia se asignan a las nuevas células. Segundo, las etiquetas de metadata, como tus tipos de células, se copian basándose en el voto de la mayoría de esos nearest neighbors de referencia. El resultado es un query dataset que lleva la disposición UMAP exacta y las anotaciones de tipo de célula de tu atlas. Puedes superponer la muestra del paciente previamente sin anotar directamente sobre tu visualización de referencia, y las poblaciones biológicas coincidentes encajarán limpiamente en los clusters visuales establecidos. Al proyectar nuevas células sobre un modelo existente, ingest cambia tu workflow de reconstruir constantemente espacios globales frágiles a construir un atlas de referencia robusto y pasar fluidamente todos los experimentos futuros a través de él. Eso es todo por este episodio. ¡Gracias por escuchar, y sigue construyendo!
12

Visualización de patrones de expresión

3m 42s

Exploramos técnicas de visualización avanzadas para evaluar la expresión génica en los clústeres. Nos centramos en los dot plots y matrix plots, detallando cómo codifican tanto la intensidad de expresión como la dispersión. Aprenderás a validar visualmente tus anotaciones de tipos celulares de un vistazo.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis Single-Cell con Scanpy, episodio 12 de 16. Un feature plot estándar está genial para mostrar dónde está activo un gen específico, pero falla por completo cuando necesitas comparar veinte genes diferentes en diez clusters distintos a la vez. Para resolver eso, vamos a ver cómo visualizar patrones de expresión. Al revisar marker genes, el primer instinto suele ser recurrir a un heatmap. Pones en fila todas tus células, pones en fila tus genes y buscas bloques de color. Pero los datos de secuenciación de ARN single-cell son notoriamente sparse. La mayoría de las células tienen counts a cero para la mayoría de los genes. En un heatmap estándar de single-cell, esta sparsity crea ruido visual. Terminas mirando un mar de color de fondo, intentando adivinar si un gen es realmente un marcador específico para un cluster o si simplemente ha sufrido un dropout aleatorio en el resto. Aquí es donde entra en juego el dot plot. En lugar de plotear células individuales, un dot plot las agrega. Colocas tus grupos de células, como tus clusters de Leiden, en un eje, y tus genes de interés en el otro. En cada intersección, obtienes un círculo. Aquí está la clave. Un dot plot codifica dos datos completamente diferentes en ese único círculo. Primero, el color del punto representa el nivel de expresión media del gen en esas células. Los colores más oscuros o intensos indican una mayor expresión. Segundo, el tamaño del punto representa la fracción de células en ese cluster que realmente llegan a expresar el gen. Un punto grande significa que casi todas las células del cluster tienen al menos algo de ARN para ese gen. Un punto pequeño significa que solo unas pocas células lo expresan. Esta doble codificación es increíblemente potente para datos sparse. Separa qué cantidad de un gen está presente de cómo de amplia es su distribución. Pongamos que estás analizando quince marker genes candidatos en cinco clusters de Leiden. Le pasas tus datos, tu lista de genes y los labels de tus clusters a la función dot plot. Puedes ver al instante si tus marcadores de monocitos esperados tienen una expresión alta y amplia en el Cluster uno, mientras que están totalmente ausentes en los otros cuatro clusters. No tienes que dejarte los ojos mirando las filas de células individuales. Los puntos grandes y oscuros en la fila del Cluster uno te dan una validación inmediata. A veces, no necesitas la información de frecuencia que proporciona el tamaño del punto. Solo quieres un grid limpio que muestre la expresión media. Para ello, Scanpy ofrece la función matrix plot. Piensa en un matrix plot como un heatmap agrupado. Sigue agrupando tus células por cluster, pero rellena todo el cuadrado del grid con un color que representa el valor medio de expresión. Aquí no cambian los tamaños de los puntos. Es una forma más rápida y densa de verificar patrones de expresión amplios cuando tienes una lista enorme de genes y la fracción de células que lo expresan te importa menos. Ambas herramientas reciben tu data object, una lista de tus target genes y la categoría de metadata por la que quieres agrupar. Se ejecutan rápidamente y escalan de maravilla a docenas de genes. Cuando lidias con la sparsity de single-cell, separar la intensidad de expresión de la frecuencia de expresión es la forma más fiable de confirmar que un marker gene realmente define un cluster. Eso es todo por este episodio. ¡Gracias por escuchar y sigue programando!
13

Exploración de variedades con Diffusion Maps

4m 32s

Introducimos Diffusion Maps, una potente técnica de embedding para datos biológicos continuos. Lo contrastamos con UMAP, explicando por qué la difusión es más adecuada para analizar la diferenciación celular. Aprenderás a visualizar transiciones continuas y procesos de desarrollo.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis de células individuales con Scanpy, episodio 13 de 16. UMAP es fantástico para separar distintos tipos de células, pero puede fragmentar drásticamente procesos biológicos continuos. Cuando estudias el desarrollo celular, no quieres islas de células desconectadas; necesitas ver el continuo fluido de los cambios de estado. Explorar manifolds con Diffusion Maps resuelve precisamente este problema. En Scanpy, calculas esto usando la herramienta diffmap. Los usuarios suelen usar UMAP por defecto para toda la reducción de dimensionalidad. Entiende que UMAP es una técnica de embedding optimizada para encontrar clusters distintos y preservar vecindarios locales. Los Diffusion Maps son fundamentalmente diferentes. Preservan la probabilidad matemática continua de transición entre estados. Esto los convierte en la opción ideal para analizar procesos continuos como la diferenciación celular. El algoritmo diffmap trata el manifold de tus datos como una red continua. Se basa completamente en el nearest neighbor graph de tus células. Una vez establecido ese grafo, el algoritmo simula un random walk a través de las conexiones. Imagínatelo como la modelización de un proceso de difusión, similar a cómo el calor se propaga a través de un material físico. El algoritmo evalúa la facilidad con la que una señal puede viajar a través de las regiones densas de tus datos. Calcula la probabilidad de pasar de un estado celular a otro en un número específico de pasos. Las células que comparten una alta probabilidad de transición se colocan más cerca unas de otras en el espacio final de menor dimensión. Considera el seguimiento de una célula madre hematopoyética que se diferencia en un eritrocito. Si proyectas estos datos utilizando un embedding que favorece la separación discreta, las células progenitoras intermedias suelen verse forzadas en clusters artificiales y separados. Las matemáticas subyacentes fracturan la línea de tiempo biológica. Si, en cambio, ejecutas diffmap, el algoritmo calcula las probabilidades de transición a lo largo de toda la trayectoria de desarrollo. El resultado es una trayectoria suave y continua. La célula madre se sitúa en un extremo, y el eritrocito maduro en el otro. Cada estado intermedio se representa a lo largo de una ruta conectada basada estrictamente en la probabilidad de transición de estado. No estás mirando instantáneas aisladas de distintos tipos de células. Estás mirando un evento biológico fluido. Aplicar esto en Scanpy sigue una secuencia rígida. Primero, debes calcular el neighborhood graph en tu objeto. El Diffusion Map no puede ejecutarse sin esas conexiones de vecinos precalculadas. A continuación, llamas a la herramienta diffmap y le pasas tu objeto AnnData. Opcionalmente, puedes especificar el número de componentes que quieres calcular, lo que establece las dimensiones del output. Scanpy calcula el Diffusion Map y almacena las nuevas coordenadas en el atributo de observación multidimensional de tu objeto, bajo la key X diffmap. La herramienta también almacena los eigenvalues en el atributo de datos no estructurados. Estos valores te dicen cuánta varianza captura cada componente de difusión. Una caída pronunciada en estos eigenvalues indica que has capturado las transiciones biológicas más importantes, y es probable que los componentes subsiguientes sean ruido. En un dataset de diferenciación típico, el primer componente de difusión no trivial se alinea directamente con el eje temporal de desarrollo principal. Aquí está la clave. En un Diffusion Map, la distancia física entre dos células en el plot no es solo una medida genérica de similitud transcriptómica. Esa distancia representa explícitamente la probabilidad matemática de que ocurra una transición biológica entre esos dos estados específicos. Eso es todo por este episodio. ¡Hasta la próxima!
14

Grafos abstraídos con PAGA

4m 02s

Este episodio cubre la Abstracción de Grafos basada en Particiones, o PAGA. Discutimos cómo medir la conectividad real entre clústeres para preservar la topología global. Aprenderás a usar PAGA para descubrir las verdaderas relaciones de linaje ocultas en tus datos.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis Single-Cell con Scanpy, episodio 14 de 16. El hecho de que dos clusters de células estén uno al lado del otro en un plot de UMAP no significa que estén biológicamente relacionados. La proximidad visual en dos dimensiones suele ser una ilusión matemática, y si te fías de ella para dibujar trayectorias de desarrollo, podrías conectar puntos que en realidad no se tocan en un espacio de alta dimensionalidad. Para mapear la conectividad real y respaldada estadísticamente, necesitas Abstracted Graphs con PAGA. PAGA significa Partition-based Graph Abstraction. Tenemos que aclarar un malentendido muy común de inmediato. PAGA no es un embedding de reducción de dimensionalidad como t-SNE o UMAP. No calcula coordenadas para células individuales para dibujar un scatter plot. En su lugar, PAGA crea un grafo simplificado y coarse-grained. Los nodos de este grafo son clusters enteros, o particiones, de células. Los edges que conectan esos nodos representan la confianza estadística de que esos clusters comparten una frontera continua. Cuando llamas a la función PAGA en tus datos anotados, le pasas un conjunto específico de etiquetas de grupo, normalmente tus clusters de Leiden o Louvain. El algoritmo evalúa entonces las fronteras entre estos grupos analizando el neighborhood graph de single-cell subyacente. Examina las células individuales del cluster A y cuenta cuántos de sus vecinos directos pertenecen al cluster B. Al sumar todas estas conexiones cross-cluster y compararlas con un modelo aleatorio, PAGA genera una matriz de conectividad cuantificable. Un valor alto significa que los clusters están profundamente entrelazados, lo que sugiere una transición biológica. Un valor bajo significa que son islas separadas. Imagina un escenario concreto. Estás haciendo un seguimiento del desarrollo de células inmunitarias y necesitas demostrar que un cluster progenitor específico da lugar directamente a un cluster de células T efectoras. En un plot visual estándar, el algoritmo de layout podría meter un cluster que no tiene nada que ver justo entre ellos, haciendo que su relación parezca indirecta. Al examinar la matriz de conectividad de PAGA, evitas esta distorsión visual. Miras directamente el edge weight matemático entre tus grupos progenitor y efector. PAGA te permite establecer un threshold de conectividad mínimo. Cuando aplicas este threshold, filtras las conexiones espurias y de baja confianza. Si el edge fuerte entre tus dos clusters objetivo sobrevive al corte, habrás establecido un vínculo estadísticamente robusto. Esta es la parte que importa. PAGA no solo acompaña a tus embeddings; puede arreglarlos. Como PAGA preserva la topología global con tanta fiabilidad, puedes usar el grafo abstracto para inicializar un embedding de UMAP. En lugar de dejar que UMAP parta de un layout espacial aleatorio, le dices que posicione las células individuales basándose en el grafo coarse-grained de PAGA. Esto ancla tu visualización bidimensional final a la verdadera realidad de alta dimensionalidad, asegurando que los estados biológicos distantes no se compriman artificialmente. Las visualizaciones siempre distorsionarán los datos complejos para que quepan en una pantalla plana, pero la abstracción de un neighborhood graph se basa completamente en la proximidad matemática. Fíate más del grafo que de la imagen. Eso es todo por este episodio. ¡Gracias por escuchar, y sigue creando!
15

Inferencia de trayectorias con DPT

4m 16s

Exploramos la inferencia de trayectorias utilizando Diffusion Pseudotime (DPT). Explicamos cómo designar una célula raíz y calcular distancias geodésicas a través del grafo celular. Aprenderás a organizar las células a lo largo de una línea de tiempo de desarrollo continua.

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis Single-Cell con Scanpy, episodio 15 de 16. La secuenciación single-cell destruye la misma célula que intentas estudiar. Obtienes una instantánea estática de su expresión génica, lo que significa que no puedes grabar un vídeo de una célula madre diferenciándose hasta un estado maduro. Para ver ese viaje de desarrollo, tienes que inferir un timeline matemáticamente calculando distancias transcriptómicas. Eso es exactamente lo que hacemos usando Trajectory Inference con DPT. DPT significa Diffusion Pseudotime. Antes de ver cómo funciona el algoritmo, necesitamos aclarar qué significa realmente ese nombre. El pseudotime no es tiempo cronológico real. No mide horas, días ni la edad biológica de una célula. Es estrictamente una métrica de distancia transcriptómica. Mide cuántos cambios incrementales de expresión ha experimentado una célula en relación con un punto de partida específico. Para ejecutar esto en Scanpy, usas la función llamada sc punto tl punto dpt. Esta función opera sobre el neighborhood graph existente de tu dataset, que conecta las células basándose en su similitud. Sin embargo, un graph por sí solo no tiene una dirección inherente. Para darle dirección, debes definir un punto de partida. Esto lo haces configurando una root cell. Imagina un escenario en el que estás estudiando el desarrollo sanguíneo. Examinas tus clusters e identificas las células madre hematopoyéticas naive. Eliges un index celular específico de ese grupo y lo asignas como el root en la estructura de tu dataset. Esto actúa como el punto de origen, o tiempo cero, para todo el cálculo. Una vez establecido el root, ejecutas la función DPT. Aquí está la clave. El algoritmo no mide una distancia recta y lineal entre el root y otra célula. El desarrollo biológico no es una línea recta; sigue caminos complejos y ramificados. Para capturar esto, DPT calcula distancias geodésicas a lo largo de tu neighborhood graph. Evalúa la estructura de los datos simulando random walks desde el root. Avanza de célula en célula a través de los edges densos del graph, encontrando las rutas más probables de cambio transcriptómico. El resultado de este cálculo es un nuevo array de valores que se añade a las anotaciones de tus células. Cada célula de tu dataset recibe un score de pseudotime. La root cell se sitúa en cero. A medida que aumenta la distancia geodésica desde el root, el score sube. En nuestro escenario de desarrollo sanguíneo, una célula progenitora intermedia podría obtener un score de cero coma cuatro, mientras que una célula completamente madura en el extremo terminal de una rama obtiene un score cercano a uno. Has mapeado efectivamente un cluster estático de puntos en un orden de desarrollo continuo, ordenándolos de menos a más diferenciados. Ahora puedes usar este eje numérico para rastrear la dinámica de genes individuales, ploteando exactamente cuándo se activa un factor de transcripción específico a lo largo de la ruta de desarrollo. La fiabilidad de tu Trajectory Inference depende completamente de tu punto de partida, lo que significa que un root elegido incorrectamente dará como resultado un timeline perfectamente calculado, pero biológicamente sin sentido. Si estos episodios te resultan útiles y quieres apoyar el programa, puedes buscar DevStoriesEU en Patreon. Eso es todo por este episodio. ¡Gracias por escuchar y sigue construyendo!
16

Escalado experimental con Dask

4m 16s

En nuestro episodio final, analizamos la frontera experimental de Scanpy: el escalado con Dask. Explicamos cómo manejar conjuntos de datos que superan la memoria RAM de tu máquina utilizando evaluación perezosa (lazy evaluation) y procesamiento out-of-core. ¡Gracias por acompañarnos en esta inmersión profunda en Scanpy!

Descargar
Hola, soy Alex de DEV STORIES DOT EU. Análisis Single-Cell con Scanpy, episodio 16 de 16. ¿Qué pasa cuando tu dataset de single-cell alcanza los cinco millones de células y agota por completo la memoria de tu ordenador? No puedes filtrarlo, no puedes normalizarlo y tu kernel simplemente crashea. La solución a este límite estricto de memoria es el Scale-Up experimental con Dask. La gente suele escuchar Dask e inmediatamente piensa en procesamiento paralelo en un cluster distribuido para acelerar el código. Aunque Dask puede hacer eso, su principal superpoder en Scanpy ahora mismo es la gestión de memoria out-of-core mediante lazy evaluation. No se trata solo de hacer las cosas más rápido. Se trata de hacer cosas que antes eran imposibles en una sola máquina. Los workflows estándar de Scanpy dependen de arrays in-memory. Esto requiere que todo el dataset resida en tu RAM activa. Cuando usas el backend de Dask, Scanpy reemplaza estos arrays estándar dentro de tu objeto AnnData por arrays de Dask. Un array de Dask es esencialmente una colección de muchos arrays más pequeños, llamados chunks. En lugar de cargar toda la matriz en memoria de golpe, Dask deja la mayor parte de los datos a salvo en el disco. Cuando ejecutas una función de preprocesamiento de Scanpy con el backend de Dask, no calcula el resultado inmediatamente. Aquí es donde entra en juego la lazy evaluation. En lugar de procesar números, Dask crea una receta. Crea un task graph que detalla exactamente qué operaciones matemáticas deben realizarse en cada chunk de datos individual. Imagina un escenario en el que tienes un dataset masivo de dos millones de células en disco, y necesitas calcular métricas de control de calidad. Si intentas esto con un array estándar, tu sistema se quedará pillado al intentar volcar todo en la RAM. Pero si tu objeto AnnData contiene un array de Dask, simplemente llamas a la función estándar de control de calidad de Scanpy. La función retorna casi al instante. Tu memoria no se dispara porque, en realidad, aún no se ha procesado ningún número. Scanpy simplemente ha anotado tu intención. Cuando por fin estás listo para plotear esas métricas o guardar las estadísticas de resumen, le dices explícitamente a Dask que compute el resultado. Esta es la parte que importa. En este momento exacto, Dask saca el primer chunk de datos de tu disco duro, calcula las métricas solo para ese chunk, guarda el pequeño resultado y, de inmediato, saca el chunk de datos crudos de la memoria. Luego, pasa al siguiente chunk. Tu footprint de memoria activa se mantiene diminuto. Viene dictado completamente por el tamaño de un solo chunk, no por los millones de células de todo el dataset. Ahora mismo, este backend de Dask en Scanpy está catalogado como experimental. No todas las funciones del ecosistema lo soportan todavía. Sin embargo, los pasos core de preprocesamiento, como la normalización, el escalado y la selección de genes altamente variables, están totalmente equipados para manejar operaciones out-of-core masivas. Cuando pasas del eager processing en memoria al lazy processing en disco, el tamaño de tu dataset ya no está limitado por la RAM de tu hardware, sino únicamente por tu paciencia. Esto nos lleva al final de nuestra serie sobre single-cell. Te animo muchísimo a que explores la documentación oficial de Scanpy y pruebes a construir estos data graphs de forma práctica. Si tienes ideas sobre qué tecnologías deberíamos cubrir en nuestra próxima serie, visita devstories dot eu y cuéntanoslo. Gracias por escuchar, ¡happy coding a todos!