引言

本系列讲解 使用Scanpy分析单细胞(scRNA-seq)数据 教程,持续更新,欢迎关注,转发!

归一化

接下来的预处理步骤是归一化。一种常用的方法是先进行计数深度缩放,然后进行对数加一(log1p)转换。计数深度缩放是将数据标准化到一个“尺寸因子”,比如数据集中所有样本的中位数计数深度、每万(CP10k)或每百万(CPM)计数。通过调整 pp.normalize_total 中的 target_sum 参数,可以控制计数深度缩放的尺寸因子。采用中位数计数深度进行归一化,并结合 log1p 转换(也就是 log1PF)来处理数据。

# Saving count data
adata.layers["counts"] = adata.X.copy()

# Normalizing to median total counts
sc.pp.normalize_total(adata)
# Logarithmize the data
sc.pp.log1p(adata)

特征选择

接下来,希望减少数据集的复杂性,只保留那些最有信息量的基因。这个过程通常被称为特征选择。scanpy 的 pp.highly_variable_genes 函数会根据所选的方法,来识别出高变基因。

sc.pp.highly_variable_genes(adata, n_top_genes=2000, batch_key="sample")

sc.pl.highly_variable_genes(adata)

降维

通过主成分分析(PCA)来降低数据的维度。PCA 可以揭示数据中主要的变化方向,并去除噪声。

sc.tl.pca(adata)

可以检查每个主成分对数据总方差的贡献,从而判断在计算细胞之间的相似性(例如用于聚类分析的 leiden() 或 tsne() 函数)时,应该考虑多少主成分。根据的经验,即使多选一些主成分,也不会有明显的负面影响。

sc.pl.pca_variance_ratio(adata, n_pcs=50, log=True)

此外,还可以绘制主成分图,看看是否有某些不期望的因素(比如批次效应或质量控制指标)在数据中导致了显著的变异。虽然在这个案例中没有发现特别严重的问题,但进行这样的探索还是很有必要的。

sc.pl.pca(
    adata,
    color=["sample", "sample", "pct_counts_mt", "pct_counts_mt"],
    dimensions=[(0, 1), (2, 3), (0, 1), (2, 3)],
    ncols=2,
    size=2,
)

最近邻图的构建和可视化

利用数据矩阵的主成分分析(PCA)结果来构建细胞的邻域图。

sc.pp.neighbors(adata)

接着,通过 UMAP,将该图映射到二维空间中,以便进行可视化展示:

sc.tl.umap(adata)

现在,可以根据样本类型对 UMAP 图进行可视化处理。

sc.pl.umap(
    adata,
    color="sample",
    # Setting a smaller point size to get prevent overlap
    size=2,
)

虽然本教程涉及的数据包含了两个不同的样本,但发现它们之间的批次效应非常小,因此可以继续对数据进行聚类分析和注释。

如果你在 UMAP 图中发现了批次效应,那么进行跨样本整合以及批次校正或整合可能会有所帮助。建议你可以参考 scanoramascvi-tools 这两个工具来进行批次整合。

聚类

Seurat 以及其他许多分析框架一样,推荐使用 Leiden 图聚类方法。需要注意的是,Leiden 聚类是直接对细胞的邻域图进行操作的,而这个邻域图已经在前面的步骤中计算完成了。

# Using the igraph implementation and a fixed number of iterations can be significantly faster, especially for larger datasets
sc.tl.leiden(adata, flavor="igraph", n_iterations=2)

sc.pl.umap(adata, color=["leiden"])

本文由mdnice多平台发布


科学冷冻工厂
29 声望3 粉丝