В этом руководстве мы создадим полный конвейер для анализа данных одиночных клеток РНК-секвенирования с использованием 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 для кластеризации и другие функции для визуализации маркерных генов и кластеров.