Руководство по программированию для создания полного конвейера анализа данных одиночных клеток РНК-секвенирования с использованием Scanpy для визуализации кластеризации и аннотации типов клеток

В этом руководстве мы создадим полный конвейер для анализа данных одиночных клеток РНК-секвенирования с использованием Scanpy. Мы начнём с установки необходимых библиотек и загрузки набора данных PBMC 3k, затем выполним контроль качества, фильтрацию и нормализацию, чтобы подготовить данные для последующего анализа. Затем мы идентифицируем высоко вариабельные гены, выполним PCA для уменьшения размерности и построим граф соседства для генерации вложений UMAP и кластеров Leiden. С помощью обнаружения маркерных генов и визуализации мы изучим, как кластеры соответствуют биологическим популяциям клеток, и реализуем простую стратегию аннотации на основе правил для определения типов клеток.

Установка зависимостей

«`python
import sys
import subprocess
import importlib

def pip_install(*packages):
subprocess.check_call([sys.executable, «-m», «pip», «install», «-q», *packages])

required = [
«scanpy»,
«anndata»,
«leidenalg»,
«igraph»,
«harmonypy»,
«seaborn»
]
pip_install(*required)
«`

Загрузка данных

«`python
import os
import warnings
warnings.filterwarnings(«ignore»)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scanpy as sc
import anndata as ad

sc.settings.verbosity = 2
sc.settings.setfigureparams(dpi=110, facecolor=»white», frameon=False)
np.random.seed(42)

print(«Scanpy version:», sc.version)

adata = sc.datasets.pbmc3k()
adata.varnamesmake_unique()

print(«\nInitial AnnData:»)
print(adata)
«`

Контроль качества

«`python
adata.layers[«counts»] = adata.X.copy()

adata.var[«mt»] = adata.var_names.str.upper().str.startswith(«MT-«)
sc.pp.calculateqcmetrics(adata, qcvars=[«mt»], percenttop=None, log1p=False, inplace=True)

print(«\nQC summary:»)
display(
adata.obs[[«ngenesbycounts», «totalcounts», «pctcountsmt»]].describe().T
)
«`

Визуализация контроля качества

«`python
fig, axs = plt.subplots(1, 3, figsize=(15, 4))
sc.pl.violin(adata, [«ngenesby_counts»], jitter=0.4, ax=axs[0], show=False)
sc.pl.violin(adata, [«total_counts»], jitter=0.4, ax=axs[1], show=False)
sc.pl.violin(adata, [«pctcountsmt»], jitter=0.4, ax=axs[2], show=False)
plt.tight_layout()
plt.show()
«`

Фильтрация данных

«`python
adata = adata[adata.obs[«ngenesby_counts»] >= 200].copy()
adata = adata[adata.obs[«ngenesby_counts»] <= 5000].copy()
adata = adata[adata.obs[«pctcountsmt»] < 10].copy()
sc.pp.filtergenes(adata, mincells=3)

print(«\nAfter filtering:»)
print(adata)
«`

Нормализация и преобразование данных

«`python
sc.pp.normalizetotal(adata, targetsum=1e4)
sc.pp.log1p(adata)
adata.raw = adata.copy()

sc.pp.highlyvariablegenes(
adata,
flavor=»seurat»,
min_mean=0.0125,
max_mean=3,
min_disp=0.5
)

print(«\nHighly variable genes selected:», int(adata.var[«highly_variable»].sum()))

sc.pl.highlyvariablegenes(adata)

adata = adata[:, adata.var[«highly_variable»]].copy()
«`

Регрессия и масштабирование

«`python
sc.pp.regressout(adata, [«totalcounts», «pctcountsmt»])
sc.pp.scale(adata, max_value=10)

sc.tl.pca(adata, svd_solver=»arpack»)
sc.pl.pcavarianceratio(adata, log=True)
sc.pl.pca(adata, color=None)
«`

Построение графа соседства и UMAP

«`python
sc.pp.neighbors(adata, nneighbors=12, npcs=30, metric=»euclidean»)
sc.tl.umap(adata, min_dist=0.35, spread=1.0)
sc.tl.leiden(adata, resolution=0.6, key_added=»leiden»)
«`

Идентификация маркерных генов

«`python
sc.tl.rankgenesgroups(adata, groupby=»leiden», method=»wilcoxon»)
sc.pl.rankgenesgroups(adata, n_genes=20, sharey=False)
«`

Аннотирование типов клеток

«`python
topmarkersper_cluster = (
marker_table.groupby(«group»)
.head(10)
.loc[:, [«group», «names», «logfoldchanges», «pvals_adj»]]
.reset_index(drop=True)
)
print(«\nTop 10 markers per cluster:»)
display(topmarkersper_cluster)
«`

Визуализация маркерных генов

«`python
candidate_markers = [
«IL7R», «LTB», «MALAT1», «CCR7»,
«NKG7», «GNLY», «PRF1»,
«MS4A1», «CD79A», «CD79B»,
«LYZ», «S100A8», «FCER1A», «CST3»,
«PPBP», «FCGR3A», «LGALS3», «CTSS»,
«CD3D», «TRBC1», «TRAC»
]
candidatemarkers = [g for g in candidatemarkers if g in adata.var_names]

if candidate_markers:
sc.pl.dotplot(
adata,
varnames=candidatemarkers,
groupby=»leiden»,
standard_scale=»var»,
dendrogram=True
)
sc.pl.matrixplot(
adata,
varnames=candidatemarkers,
groupby=»leiden»,
standard_scale=»var»,
dendrogram=True
)
«`

Определение типов клеток

«`python
clustermarkerreference = {
«T_cells»: [«IL7R», «LTB», «CCR7», «CD3D», «TRBC1», «TRAC»],
«NK_cells»: [«NKG7», «GNLY», «PRF1»],
«B_cells»: [«MS4A1», «CD79A», «CD79B»],
«Monocytes»: [«LYZ», «FCGR3A», «LGALS3», «CTSS», «S100A8», «CST3»],
«Dendritic_cells»: [«FCER1A», «CST3»],
«Platelets»: [«PPBP»]
}
«`

Сохранение результатов

«`python
outputdir = «scanpypbmc3k_outputs»
os.makedirs(outputdir, existok=True)

adata.write(os.path.join(outputdir, «pbmc3kscanpy_advanced.h5ad»))
markertable.tocsv(os.path.join(outputdir, «clustermarkers.csv»), index=False)
celltypemarkers.tocsv(os.path.join(outputdir, «celltypemarkers.csv»), index=False)
clusterscores.tocsv(os.path.join(outputdir, «clusterscore_matrix.csv»))
«`

Заключение

Мы разработали полный рабочий процесс для анализа данных одиночных клеток РНК-секвенирования с использованием Scanpy. Мы выполнили препроцессинг, кластеризацию, анализ маркерных генов и аннотацию типов клеток, а также визуализировали структуру данных с помощью UMAP и графиков экспрессии генов. Сохранение обработанного объекта AnnData и выходных данных анализа позволило создать повторно используемый набор данных для дальнейшей биологической интерпретации и продвинутого моделирования. Этот рабочий процесс демонстрирует, как Scanpy обеспечивает масштабируемый и воспроизводимый анализ одиночных клеток через структурированный модульный конвейер Python.

1. Какие основные этапы включает в себя процесс анализа данных одиночных клеток РНК-секвенирования с использованием Scanpy, описанный в статье?

Ответ: процесс включает в себя установку необходимых библиотек, загрузку набора данных PBMC 3k, контроль качества, фильтрацию и нормализацию данных, идентификацию высоко вариабельных генов, выполнение PCA для уменьшения размерности, построение графа соседства для генерации вложений UMAP и кластеров Leiden, обнаружение маркерных генов и визуализацию, а также аннотацию типов клеток.

2. Какие библиотеки и инструменты используются для анализа данных в этом руководстве?

Ответ: для анализа данных используются библиотеки Scanpy, Anndata, Leidenalg, Igraph, HarmonyPy и Seaborn, а также инструменты NumPy, Pandas, Matplotlib и другие.

3. Какие методы используются для контроля качества данных в этом руководстве?

Ответ: для контроля качества данных используются методы расчёта метрик качества (QC metrics) с помощью функции sc.pp.calculateqcmetrics, а также визуализация данных с помощью функции sc.pl.violin для построения violin-графиков.

4. Какие шаги предпринимаются для нормализации и преобразования данных в этом руководстве?

Ответ: для нормализации данных используется функция sc.pp.normalizetotal, а для логарифмического преобразования — sc.pp.log1p. Затем выполняется отбор высоко вариабельных генов с помощью функции sc.pp.highlyvariable_genes и масштабирование данных с помощью sc.pp.scale.

5. Какие методы используются для визуализации данных в этом руководстве?

Ответ: для визуализации данных используются функции sc.pl.violin для построения violin-графиков, sc.pl.pca для визуализации PCA, sc.tl.umap для построения UMAP, sc.tl.leiden для кластеризации и другие функции для визуализации маркерных генов и кластеров.

Источник