El promedio de los tejidos miente
Imaginemos que tomamos un trozo de hígado, lo homogeneizamos y extraemos ARN para secuenciarlo. El resultado es la "expresión génica media del tejido hepático". Sin embargo, ese fragmento contiene una mezcla de hepatocitos, células de Kupffer, células epiteliales de los conductos biliares, linfocitos y células endoteliales vasculares. Cada tipo celular activa conjuntos diferentes de genes. El promedio es un fantasma que no se parece a ninguna de las células.
En el tejido tumoral esto es aún más pronunciado. Las células tumorales son heterogéneas. Células sensibles a la quimioterapia y células resistentes coexisten en el mismo fragmento. Con el RNA-seq de masa (bulk), la señal de las células resistentes queda enterrada bajo la señal de las células sensibles. Gran parte del fracaso clínico proviene de aquí.
El RNA-seq de célula única lucha contra este fantasma. Separa el tejido en células individuales y lee el transcriptoma de cada una por separado. El resultado no es un "promedio del tejido hepático", sino un "mapa de transcriptomas de 12.438 células individuales". La heterogeneidad celular comienza a hacerse visible.
Cómo secuenciar 30.000 células a la vez
La plataforma más famosa es 10x Genomics Chromium. Su principio es sorprendentemente elegante.
- En un chip de microfluídica, se fluyen células, perlas de gel y gotas de aceite.
- Cada gota (GEM: Gel Bead-in-Emulsion) contiene idealmente una célula más una perla de gel.
- Las perlas de gel tienen millones de cebadores unidos y cada perla tiene un código de barras único (cell barcode, 16 pb).
- Cuando la célula se rompe dentro de la gota, el ARNm se libera y los cebadores de la perla lo capturan para realizar la transcripción inversa. En este proceso, se añade a cada molécula un UMI aleatorio (Unique Molecular Identifier, 12 pb).
- Se rompen las gotas nuevamente, se recogen y se construye la librería para secuenciar.
Cada lectura del resultado de la secuenciación tiene este aspecto:
[cell barcode: 16bp][UMI: 12bp][cDNA sequence: ~90bp]- Lecturas con el mismo código de barras celular → proceden de la misma célula.
- Lecturas con el mismo UMI → duplicados de PCR procedentes de la misma molécula de ARNm.
Así, los UMI permiten eliminar el sesgo de PCR y realizar una cuantificación a escala molecular, una capacidad transformadora que no ofrece el RNA-seq a granel.
Resultados de Cell Ranger
Cell Ranger, el pipeline oficial de 10x, procesa estas lecturas sin tratar y genera tres archivos.
matrix.mtx.gz: matriz de recuentos gen × célula, una matriz dispersa cuyos valores son casi todos cero.barcodes.tsv.gz: lista de códigos de barras celulares.features.tsv.gz: lista de genes.
Estos tres archivos son el punto de partida del análisis. El conjunto tutorial estándar PBMC 3k está disponible en las descargas oficiales de 10x y contiene unas 2.700 células y 32.738 genes.
AnnData: ¿por qué tiene esta estructura?
Scanpy (Python) y Seurat (R) almacenan estos datos a su manera. En este episodio examinaremos directamente la estructura AnnData de Scanpy; SingleCellExperiment de Seurat es conceptualmente equivalente.
AnnData tiene la siguiente estructura.
adata (objeto AnnData)
├── .X → matriz de recuentos (n_obs × n_vars, dispersa)
├── .obs → metadatos de células (DataFrame, filas = células)
├── .var → metadatos de genes (DataFrame, filas = genes)
├── .obsm → embeddings multidimensionales por célula (coordenadas PCA, UMAP, etc.)
├── .varm → valores multidimensionales por gen (cargas de PC, etc.)
├── .obsp → matrices de distancia y adyacencia entre células
├── .uns → información adicional (paleta de colores, parámetros de clustering)
└── .layers → matrices alternativas (recuentos sin tratar, normalizados, log1p, etc.)Lo fundamental es que todo está unido a un solo objeto. Al filtrar las células, no solo se recortan .X, sino también automáticamente .obs, .obsm y .obsp. Esto elimina el infierno de índices que surge al gestionar manualmente múltiples arreglos de Numpy.
Abrir PBMC 3k con Scanpy
# Ejecutar en Kaggle Notebook o Colab!pip install scanpy leidenalg -q
import scanpy as scimport numpy as np
# Descargar automáticamente los datos tutoriales PBMC 3kadata = sc.datasets.pbmc3k()print(adata)Al ejecutar esto, aparecerá lo siguiente.
AnnData object with n_obs × n_vars = 2700 × 327382,700 células × 32,738 genes. Además, .X es una matriz extremadamente dispersa donde el 99,6 % de sus 800 millones de celdas son cero. Por eso, la representación de matrices dispersas (sparse matrix) es imprescindible: almacenarla como densa ocuparía 700 MB, mientras que con la representación dispersa se reduce a 40 MB.
Indexación de células y genes
# Códigos de barras de las primeras cinco célulasprint(adata.obs.head())
# Información de los primeros cinco genesprint(adata.var.head())
# Expresión del gen CD3D en una célula concretaadata_cell = adata[0, :] # primera célulacd3d_col = adata.var_names.get_loc("CD3D") # índice del genprint(adata_cell.X[0, cd3d_col])El indexado es tan natural como en un DataFrame de pandas. Además, el rebanado adata[cells, genes] devuelve una vista, por lo que no copia la memoria de inmediato. Esta es la razón por la que la exploración interactiva es posible incluso en conjuntos de datos de 300.000 células.
Mapeo CS
- Matriz dispersa (Sparse matrix): Sigue los formatos CSR/CSC tratados en DryBench. No almacena los conteos que son 0. El
.Xde AnnData es elscipy.sparse.csr_matrixpor defecto. - Indexado multidimensional:
.obsm['X_umap']es una matriz numpy de 2.700 × 2. El indexado avanzado (fancy indexing) de NumPy funciona directamente. - Vista vs. Copia: AnnData también tiene la trampa de las vistas de pandas, como
SettingWithCopyWarning. Escribir valores en una vista modifica el original. Para mayor seguridad, utilicemos.copy(). - Formato de almacenamiento Zarr:
adata.write_zarr()proporciona un almacenamiento compatible con la nube. Es una alternativa a HDF5. En lugar de.h5ad, se almacena en una estructura de carpetas.zarr, lo que permite una carga parcial libre.
El viaje después de esta sección (Guía de la serie de células individuales, parte 6)
- Siguiente S27: Control de calidad celular (QC) — Cómo filtrar las células moribundas (% mitocondrial, detección de dobletes)
- S28: Normalización y selección de genes de alta varianza (HVG) — Separar la señal del ruido
- S29: Reducción de dimensionalidad — Principios geométricos de PCA / t-SNE / UMAP
- S30: Clustering de Leiden + determinación de tipos celulares con genes marcadores
- S31: Corrección de lotes — Combinar de forma segura diferentes lotes experimentales (Harmony, scVI)
Al completar estas 6 partes, tendrás en tus manos un pipeline de scRNA-seq vertical (de un solo experimento). Posteriormente, en S32~S34, se ampliará hacia trayectorias, velocidad del ARN y comunicación intercelular (CellChat).
Defectos comunes encontrados en la práctica
.Xya es un valor normalizado logarítmico — Si se introduce en una función que requiere conteos crudos (similar a DESeq2), fallará. Adoptemos el hábito de hacer una copia de seguridad de.layers['counts'].- Trampa de
inplace=True— La mayoría de las funciones de Scanpy tienen como valor predeterminadoinplace=True. Es fácil destruir accidentalmente el original. - Error en el orden del filtrado celular — Si se invierte el orden: filtro mitocondrial → filtro de genes → doblete, las estadísticas se distorsionan. Se tratará detalladamente en S27.
- Confusión entre química 10x v2 y v3 — Utilizan listas blancas diferentes para los códigos de barras celulares. Es esencial especificar la versión de Cell Ranger.
Si desea profundizar más
El texto principal es una narrativa reconstruida por BPD. Para profundizar, utilice los siguientes materiales canónicos.
- Wellcome Sanger Institute — Analysis of Single Cell RNA-seq Data (Part 1) del equipo de bioinformática (60 minutos, subtítulos con traducción automática estándar). Es un taller práctico organizado por el consorcio de células individuales más grande del mundo.
- Harvard STAT115 — Intro to scRNA-seq and Preprocessing del profesor Xiaole Shirley Liu (45 minutos, subtítulos completos, excelente traducción automática). Tiene una base estadística sólida para el filtrado de UMI y los criterios de control de calidad.
- EMBL-EBI Training — Single-Cell Transcriptomics Analysis with Scanpy (42 minutos, subtítulos completos). Contiene mucha información sobre la estructura de AnnData y consejos para la gestión de memoria.
- MIT 6.874 — Single-Cell Analysis del profesor Manolis Kellis (subtítulos completos, subtítulos manuales). Ofrece una perspectiva integrada con aprendizaje profundo (scVI).
- Libro web gratuito de referencia: Bioconductor Orchestrating Single-Cell Analysis with Bioconductor (bioconductor.org/books/release/OSCA). Aunque no es Scanpy, es el estándar en el ecosistema R y los conceptos se mapean directamente.
Abra un cuaderno en Kaggle y comience con sc.datasets.pbmc3k(). La práctica de control de calidad del siguiente capítulo S27 seguirá naturalmente.