Cómo construir una canalización de análisis de secuenciación de ARN unicelular con Scanpy para agrupación, anotación y descubrimiento de trayectorias de PBMC

En este tutorial, realizamos un flujo de trabajo avanzado de análisis de secuencia de ARN unicelular utilizando Scanpy en el conjunto de datos de referencia PBMC-3k. Comenzamos cargando el conjunto de datos, inspeccionando su estructura y aplicando controles de calidad para evaluar los recuentos de genes, los recuentos totales, el contenido mitocondrial y las señales de genes ribosomales. Luego filtramos células y genes de baja calidad, detectamos dobletes potenciales con Scrublet, normalizamos los datos, aplicamos transformación logarítmica e identificamos genes altamente variables para análisis posteriores. Además, puntuamos las fases del ciclo celular, eliminamos variaciones técnicas no deseadas, escalamos los datos y reducimos la dimensionalidad utilizando PCA, UMAP y t-SNE. También agrupamos células con el algoritmo de Leiden, identificamos genes marcadores, anotamos poblaciones de células utilizando marcadores PBMC canónicos, exploramos la estructura de la trayectoria con PAGA y pseudotiempo de difusión, calculamos una puntuación personalizada de respuesta al interferón y, finalmente, guardamos el objeto AnnData completamente analizado para uso futuro.

Copiar códigocopiadoUtilice un navegador diferente

!pip install -q scanpy leidenalg python-igraph Scrublet importar scanpy como sc importar numpy como np importar pandas como pd importar matplotlib.pyplot como plt importar advertencias advertencias.filterwarnings(“ignorar”) sc.settings.verbosity = 3 sc.settings.set_figure_params(dpi=80, facecolor=”white”, figsize=(5, 5)) sc.logging.print_header() adata = sc.datasets.pbmc3k() adata.var_names_make_unique() print(adata) adata.var[“mt”] = adata.var_names.str.startswith(“MT-“) adata.var[“ribo”] = adata.var_names.str.startswith((“RPS”, “RPL”)) sc.pp.calculate_qc_metrics( adata, qc_vars=[“mt”, “ribo”]percent_top=Ninguno, log1p=False, inplace=True ) sc.pl.violin( adata,
[“n_genes_by_counts”, “total_counts”, “pct_counts_mt”]jitter=0.4, multi_panel=True, ) sc.pl.scatter(adata, x=”total_counts”, y=”pct_counts_mt”) sc.pl.scatter(adata, x=”total_counts”, y=”n_genes_by_counts”)

Instalamos las bibliotecas de análisis unicelular necesarias e importamos Scanpy, NumPy, Pandas, Matplotlib y controles de advertencia. Cargamos el conjunto de datos de referencia PBMC-3k, hacemos que los nombres de los genes sean únicos e inspeccionamos la estructura del objeto AnnData. Luego calculamos métricas de control de calidad para genes mitocondriales y ribosómicos y visualizamos patrones de calidad a nivel de recuento utilizando gráficos de violín y de dispersión.

Copiar códigocopiadoUtilice un navegador diferente

sc.pp.filter_cells(adata, min_genes=200) sc.pp.filter_genes(adata, min_cells=3) adata = adata[adata.obs.n_genes_by_counts < 2500, :].copiar() adatos = adatos[adata.obs.pct_counts_mt < 5, :].copy() sc.pp.scrublet(adata) print(“Dobletes previstos:”, int(adata.obs[“predicted_doublet”].sum())) adatos = adatos[~adata.obs[“predicted_doublet”]:].copy() adata.capas[“counts”] = adata.X.copy() sc.pp.normalize_total(adata, target_sum=1e4) sc.pp.log1p(adata) sc.pp.highly_variable_genes(adata, min_mean=0.0125, max_mean=3, min_disp=0.5) sc.pl.highly_variable_genes(adata) adata.raw = adata adata = adata[:, adata.var.highly_variable].Copiar()

Filtramos células de baja calidad y genes rara vez detectados para mejorar la confiabilidad del conjunto de datos. Usamos Scrublet a través de Scanpy para identificar dobletes predichos y eliminarlos antes de un análisis más profundo. Luego preservamos los recuentos sin procesar, normalizamos los valores de expresión, aplicamos la transformación logarítmica, seleccionamos genes altamente variables y conservamos solo las características más informativas.

Copiar códigocopiadoUtilice un navegador diferente

s_genes = [“MCM5″,”PCNA”,”TYMS”,”FEN1″,”MCM2″,”MCM4″,”RRM1″,”UNG”,”GINS2″,
“MCM6″,”CDCA7″,”DTL”,”PRIM1″,”UHRF1″,”HELLS”,”RFC2″,”NASP”,
“RAD51AP1″,”GMNN”,”WDR76″,”SLBP”,”CCNE2″,”UBR7″,”POLD3″,”MSH2″,
“ATAD2″,”RAD51″,”RRM2″,”CDC45″,”CDC6″,”EXO1″,”TIPIN”,”DSCC1″,
“BLM”,”CASP8AP2″,”USP1″,”CLSPN”,”POLA1″,”CHAF1B”,”E2F8″]
genes_g2m = [“HMGB2″,”CDK1″,”NUSAP1″,”UBE2C”,”BIRC5″,”TPX2″,”TOP2A”,”NDC80″,
“CKS2″,”NUF2″,”CKS1B”,”MKI67″,”TMPO”,”CENPF”,”TACC3″,”SMC4″,
“CCNB2″,”CKAP2L”,”CKAP2″,”AURKB”,”BUB1″,”KIF11″,”ANP32E”,
“TUBB4B”,”GTSE1″,”KIF20B”,”HJURP”,”CDCA3″,”CDC20″,”TTK”,
“CDC25C”,”KIF2C”,”RANGAP1″,”NCAPD2″,”DLGAP5″,”CDCA2″,”CDCA8″,
“ECT2″,”KIF23″,”HMMR”,”AURKA”,”PSRC1″,”ANLN”,”LBR”,”CKAP5″,
“CENPE”,”NEK2″,”G2E3″,”CBX5″,”CENPA”]
s_genes = [g for g in s_genes if g in adata.var_names]
genes_g2m = [g for g in g2m_genes if g in adata.var_names]
sc.tl.score_genes_cell_cycle(adata, s_genes=s_genes, g2m_genes=g2m_genes) sc.pp.regress_out(adata, [“total_counts”, “pct_counts_mt”]) sc.pp.scale(adata, max_value=10) sc.tl.pca(adata, svd_solver=”arpack”) sc.pl.pca_variance_ratio(adata, log=True, n_pcs=50) sc.pp.neighbors(adata, n_neighbors=10, n_pcs=40) sc.tl.umap(adata) sc.tl.tsne(adatos, n_piezas=40)

Definimos genes marcadores de fase S y fase G2/M y conservamos solo los presentes en el conjunto de datos. Calificamos cada célula para la fase del ciclo celular, eliminamos variaciones no deseadas de los recuentos totales y el porcentaje mitocondrial, y escalamos los datos para el modelado posterior. Luego ejecutamos PCA, inspeccionamos la varianza explicada, construimos el gráfico de vecindad y generamos incrustaciones de UMAP y t-SNE.

Copiar códigocopiadoUtilice un navegador diferente

sc.tl.leiden(adata, resolución=0.5, sabor=”igraph”, n_iterations=2, dirigido=False) sc.pl.umap(adata, color=”leiden”, legend_loc=”on data”, title=”clusters de Leiden”) sc.pl.tsne(adata, color=”leiden”, legend_loc=”on data”, title=”clusters de t-SNE”) sc.tl.rank_genes_groups(adata, “leiden”, método=”wilcoxon”) sc.pl.rank_genes_groups(adata, n_genes=20, sharey=False) resultado = adata.uns[“rank_genes_groups”]
grupos = resultado[“names”].dtype.names top_df = pd.DataFrame({g: resultado[“names”][g][:10] para g en grupos}) print(“\nTop 10 marcadores por grupo:\n”, top_df) Marker_genes = { “B-cell”: [“CD79A”, “MS4A1″]”células T CD8”: [“CD8A”, “CD8B”]”células T CD4″: [“IL7R”, “CD4″]”NK”: [“GNLY”, “NKG7″]”Monocito CD14”: [“CD14”, “LYZ”]”Monocito FCGR3A”: [“FCGR3A”, “MS4A7″]”Dendrítico”: [“FCER1A”, “CST3″]”Megacariocito”: [“PPBP”]} sc.pl.dotplot(adata, marcador_genes, groupby=”leiden”, standard_scale=”var”) sc.pl.stacked_violin(adata, marcador_genes, groupby=”leiden”, swap_axes=True)

Aplicamos la agrupación de Leiden para agrupar celdas según el gráfico de vecindad y visualizamos los grupos en gráficos UMAP y t-SNE. Realizamos análisis de expresión diferencial utilizando la prueba de Wilcoxon para identificar los genes marcadores principales para cada grupo. Luego utilizamos genes marcadores canónicos de PBMC para respaldar la anotación de tipos de células mediante diagramas de puntos y diagramas de violín apilados.

Copiar códigocopiadoUtilice un navegador diferente

sc.tl.paga(adata, groups=”leiden”) sc.pl.paga(adata, color=”leiden”, umbral=0.1) sc.tl.umap(adata, init_pos=”paga”) sc.pl.umap(adata, color=”leiden”, legend_loc=”on data”) sc.tl.diffmap(adata) sc.pp.neighbors(adata, n_neighbors=10, use_rep=”X_diffmap”) adata.uns[“iroot”] = np.planononzero(adata.obs[“leiden”] == adata.obs[“leiden”].cat.categorías[0])[0]
sc.tl.dpt(adata) sc.pl.umap(adata, color=[“leiden”, “dpt_pseudotime”]legend_loc=”en datos”) ifn_genes = [“ISG15”, “IFI6”, “IFIT1”, “IFIT3”, “MX1”, “OAS1”, “STAT1”, “IRF7″]
ifn_genes = [g for g in ifn_genes if g in adata.raw.var_names]
sc.tl.score_genes(adata, gene_list=ifn_genes, score_name=”IFN_score”) sc.pl.umap(adata, color=”IFN_score”, cmap=”viridis”) adata.write(“pbmc3k_analyzed.h5ad”) print(“\n Análisis completo: guardado en pbmc3k_analyzed.h5ad”) print(adata)

Ejecutamos PAGA para modelar la conectividad entre los grupos de Leiden y reinicializamos UMAP usando el gráfico PAGA para obtener una estructura de trayectoria más clara. Calculamos mapas de difusión y pseudotiempo de difusión para explorar posibles patrones de progresión entre estados celulares. También calculamos una puntuación del conjunto de genes de respuesta al interferón, la visualizamos en UMAP y guardamos el objeto analizado final como un archivo .h5ad.

En conclusión, construimos un canal Scanpy de extremo a extremo para el análisis de secuencias de ARN unicelular, transformando datos de PBMC sin procesar en conocimientos biológicos interpretables. Limpiamos y preprocesamos el conjunto de datos, eliminamos células y dobletes ruidosos, seleccionamos genes informativos y generamos incrustaciones significativas para visualizar la estructura celular. Luego utilizamos el análisis de expresión diferencial y agrupamiento de Leiden para descubrir genes marcadores y conectar grupos con tipos de células inmunes conocidos. Al agregar PAGA, pseudotiempo de difusión y puntuación de conjuntos de genes personalizados, ampliamos el flujo de trabajo más allá de la agrupación básica y mostramos cómo Scanpy admite una interpretación biológica más profunda. Por fin, teníamos un objeto .h5ad guardado que contiene los datos procesados, anotaciones, puntuaciones, grupos y resultados del análisis visual, listo para la exploración o generación de informes posteriores.

Consulte los códigos completos con Notebook aquí. Además, no dude en seguirnos en Twitter y no olvide unirse a nuestro SubReddit de más de 150.000 ML y suscribirse a nuestro boletín. ¡Esperar! estas en telegrama? Ahora también puedes unirte a nosotros en Telegram.

¿Necesita asociarse con nosotros para promocionar su repositorio de GitHub O su página principal de Hugging O su lanzamiento de producto O seminario web, etc.? Conéctate con nosotros

La publicación Cómo construir una canalización de análisis de secuencia de ARN unicelular con Scanpy para agrupación, anotación y descubrimiento de trayectorias de PBMC apareció por primera vez en MarkTechPost.