Las células cargadas no son todas células reales
En S26 abrimos 3k PBMC y obtuvimos una matriz de 2.700 células × 32.738 genes. Sin embargo, muchas de estas "2.700 células" no son células reales. Esto se debe a que lo que ocurre dentro de las gotas microfluídicas (GEM) no es ideal.
- Gotas vacías (empty droplet): Solo contienen ARN ambiental circundante sin células → número de genes extremadamente bajo
- Células en proceso de muerte: La membrana celular se rompe, el ARNm del citoplasma se filtra y solo queda el ARNm mitocondrial → proporción mitocondrial anormalmente alta
- Dobletes (doublet): Dos células en una sola gota → número de genes y recuentos anormalmente altos, con marcadores de diferentes tipos celulares mezclados
Si no filtramos esta basura, todo el análisis posterior estará contaminado. Garbage in, garbage out. Este capítulo trata sobre los fundamentos estadísticos de ese filtro.
Tres indicadores de control de calidad (QC)
Se calculan tres números para cada célula.
- n_genes_by_counts — número de tipos de genes detectados en esa célula
- total_counts — número total de UMI de esa célula
- pct_counts_mt — proporción de genes mitocondriales (con prefijo
MT-para humanos) respecto al recuento total
La intuición clave: número de genes demasiado bajo = gota vacía/baja calidad, número de genes y recuentos demasiado altos = sospecha de doblete, alta proporción mitocondrial = célula en proceso de muerte. La base del QC consiste en recortar los extremos de cada indicador.
¿Cómo definir los umbrales — la trampa de los números fijos
Un error común entre principiantes es usar un número fijo como "eliminar si mito > 20%" en todas partes. La proporción mitocondrial normal varía según el tejido. El miocardio y los hepatocitos tienen un metabolismo activo, por lo que su proporción mitocondrial es naturalmente alta. Un umbral fijo elimina células sanas.
Una mejor opción son los umbrales robustos basados en datos. Se mide cuánto se desvía la mediana utilizando el MAD (Desviación Absoluta de la Mediana), y por ejemplo, se consideran valores atípicos las células que superan 5 MAD.
La razón para usar la mediana y el MAD en lugar de la media y la desviación estándar es la robustez. Esto evita que los propios valores atípicos contaminen la media y la desviación estándar, arruinando así el umbral. Esto es exactamente lo que establece las estadísticas robustas en estadística e informática.
Ajustar manualmente el MAD
Supongamos que hay 7 células con proporciones mitocondriales [3, 4, 4, 5, 5, 6, 40] (%). La mediana es 5. Los valores absolutos de los desvíos son [2,1,1,0,0,1,35], cuya mediana MAD = 1. El umbral de 5 MAD = Mediana + 5×1 = 10%. La última célula (40%) supera ampliamente el umbral → se elimina como célula en proceso de muerte. Si se usara la media (9.6) y la desviación estándar (aproximadamente 12.9), el umbral se ampliaría hasta el 74%, sin poder detectar esa célula. La robustez del MAD es lo que genera esta diferencia.
Doublet — se detecta mediante simulación
Los doublets no se detectan con un único indicador. No todas las células con alto número de genes son doublets. La idea de Scrublet es ingeniosa.
- Se seleccionan aleatoriamente dos células reales y se suman sus expresiones para simular en masa doublets falsos.
- Las células reales y los doublets simulados se incrustan conjuntamente en el espacio de expresión.
- Si la proporción de doublets simulados entre los k-vecinos más cercanos alrededor de cada célula real es alta, se asigna una puntuación (doublet score) indicando que esa célula tiene alta probabilidad de ser un doublet.
Es decir, es una inferencia basada en kNN bajo la lógica: "si tus vecinos son mayoritariamente doublets artificiales, tú también probablemente lo seas". DoubletFinder sigue la misma estructura.
Práctica de QC con PBMC 3k usando Scanpy
Se ejecuta en Kaggle T4.
!pip install scanpy scrublet -qimport scanpy as sc
adata = sc.datasets.pbmc3k()
# Marcado de genes mitocondriales + cálculo de indicadores QCadata.var["mt"] = adata.var_names.str.startswith("MT-")sc.pp.calculate_qc_metrics(adata, qc_vars=["mt"], inplace=True)
# Visualizar la distribución primero (obligatorio antes de recortar)sc.pl.violin(adata, ["n_genes_by_counts", "total_counts", "pct_counts_mt"], jitter=0.4, multi_panel=True)Es una regla fundamental observar primero el gráfico de violín. Si se realiza el corte sin analizar la distribución, se perderán las características específicas del tejido.
import numpy as np# Umbral robusto basado en MAD (ej.: límite superior 5 MAD para mitocondrias)def mad_outlier(x, nmads=5): med = np.median(x); mad = np.median(np.abs(x - med)) return (x > med + nmads*mad) | (x < med - nmads*mad)
adata = adata[~mad_outlier(adata.obs["pct_counts_mt"].values)].copy()adata = adata[adata.obs["n_genes_by_counts"] > 200].copy() # Límite inferior de goteros vacíos
# Detección de dobletessc.pp.scrublet(adata) # obs['predicted_doublet'], obs['doublet_score']adata = adata[~adata.obs["predicted_doublet"]].copy()print(adata) # Verificar el número de células restantesRegistremos siempre el número de células antes y después del control de calidad (QC). La cantidad de células que se pierden desde las 2,700 iniciales es el primer indicador de la calidad de los datos y se incluye tal cual en la sección de métodos del artículo.
Mapeo de CS
- Detección de valores atípicos (outlier detection): El QC consiste esencialmente en eliminar valores atípicos multivariantes. Esto se relaciona directamente con el capítulo sobre estadística robusta y valores atípicos de DryBench.
- Umbral robusto basado en MAD: El uso de la mediana y la MAD (desviación absoluta mediana) no contaminada por valores atípicos es fundamental para las estadísticas robustas.
- Simulación kNN (Scrublet): Crear muestras artificiales y determinar su pertenencia mediante la configuración de los vecinos es una aplicación de la clasificación vecina más cercana semi-supervisada.
- Compensación por pérdida de información: Si se ajusta el umbral, se reducen los dobletes pero también se pierden células reales. Esto representa en sí mismo la compensación entre precisión y exhaustividad (precision-recall).
Defectos comunes
- Aplicar un umbral fijo de mitocondriales (por ejemplo, 20%) a todos los tejidos — Esto elimina las células normales de tejidos con alto metabolismo. Debemos observar la distribución y ajustarla mediante MAD.
- Filtrar directamente sin verificar la distribución — Si pasamos por alto una distribución bimodal bio-modal (dos picos), podríamos eliminar por completo un tipo celular.
- Realizar el QC después de la normalización — El QC debe realizarse primero con los recuentos brutos (raw counts). La normalización puede ocultar los valores atípicos.
- Descubrir "nuevos tipos celulares" debido a dobletes no eliminados — Confundir un doblete formado por la mezcla de dos tipos celulares como una nueva especie celular es un error clásico en los artículos de scRNA-seq.
Para profundizar más
El texto principal ha sido reescrito directamente por BPD. Para el estudio avanzado, utilicemos los siguientes materiales canónicos:
- Libro web gratuito de referencia: Single-cell best practices (sc-best-practices.org, Theis Lab). Los capítulos sobre QC y dobletes son la definición actual del estándar.
- Artículo original (mejores prácticas): Luecken & Theis (2019), Current best practices in single-cell RNA-seq analysis: a tutorial, Molecular Systems Biology 15:e8746.
- Artículo original (Scrublet): Wolock, Lopez, Klein (2019), Scrublet: Computational Identification of Cell Doublets in Single-Cell Transcriptomic Data, Cell Systems 8:281.
- Wellcome Sanger — Taller sobre Quality Control in scRNA-seq del equipo de bioinformática (la traducción automática de subtítulos suele estar disponible). Proporciona intuición práctica para el ajuste de umbrales.
Una vez que las células han sido filtradas adecuadamente, en el siguiente episodio S28 pasamos a la etapa de normalizar la expresión de las células restantes y seleccionar solo los genes altamente variables (HVG) que actúan como señales. A partir de este punto, comienza a revelarse la verdadera estructura biológica.