Volver a la lista

Introducción al RNA-seq de células individuales: por qué se secuencian las células una a una y cómo es el formato AnnData

¿Por qué mienten las medias de la población? ¿Cómo puede Chromium de 10x secuenciar 30,000 células a la vez? Abramos PBMC 3k con Scanpy y manipulemos manualmente obs, var y X de AnnData.

Intermedio
|
18min
|
Verificado (2026-07-19)
single cellScanpyAnnDataPBMC 3k
Progreso0/120 (0%)

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.

  1. En un chip de microfluídica, se fluyen células, perlas de gel y gotas de aceite.
  2. Cada gota (GEM: Gel Bead-in-Emulsion) contiene idealmente una célula más una perla de gel.
  3. Las perlas de gel tienen millones de cebadores unidos y cada perla tiene un código de barras único (cell barcode, 16 pb).
  4. 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).
  5. 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:

text
[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.

text
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

python
# Ejecutar en Kaggle Notebook o Colab
!pip install scanpy leidenalg -q
import scanpy as sc
import numpy as np
# Descargar automáticamente los datos tutoriales PBMC 3k
adata = sc.datasets.pbmc3k()
print(adata)

Al ejecutar esto, aparecerá lo siguiente.

text
AnnData object with n_obs × n_vars = 2700 × 32738

2,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

python
# Códigos de barras de las primeras cinco células
print(adata.obs.head())
# Información de los primeros cinco genes
print(adata.var.head())
# Expresión del gen CD3D en una célula concreta
adata_cell = adata[0, :] # primera célula
cd3d_col = adata.var_names.get_loc("CD3D") # índice del gen
print(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 .X de AnnData es el scipy.sparse.csr_matrix por 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

  • .X ya 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 predeterminado inplace=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 InstituteAnalysis 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 STAT115Intro 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 TrainingSingle-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.874Single-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.

💬 Preguntas y comentarios

0 comentarios

Puedes publicar sin iniciar sesión. Los comentarios de invitados no pueden editarse ni eliminarse después.

0/2000

Cargando...