掌握Scanpy:从零开始玩转单细胞数据分析
掌握Scanpy:从零开始玩转单细胞数据分析
单细胞测序技术的出现,让科学家们能够以前所未有的精度研究生物样本中每个细胞的基因表达情况。而Scanpy,作为单细胞数据分析领域最常用的Python库之一,提供了从数据预处理到降维、聚类、差异表达分析等全套功能,是生物信息学研究人员不可或缺的工具。
本文将带你从零开始,逐步了解如何使用Scanpy进行单细胞数据分析。无论你是生物信息学的初学者,还是希望深入了解单细胞数据分析的研究人员,这篇文章都将为你提供一个完整的实践指南。
环境准备
在开始之前,你需要确保已经安装了Python环境,并且安装了Scanpy及其依赖项。以下是推荐的安装步骤:
使用pip安装
pip install scanpy
pip install anndata
pip install numpy
pip install scipy
pip install pandas
pip install scikit-learn
pip install matplotlib
pip install seaborn
pip install umap-learn
pip install louvain
pip install leidenalg
使用conda安装
如果你使用的是Anaconda或Miniconda,推荐使用以下命令:
conda install -c conda-forge scanpy
conda install -c conda-forge anndata
conda install -c conda-forge numpy
conda install -c conda-forge scipy
conda install -c conda-forge pandas
conda install -c conda-forge scikit-learn
conda install -c conda-forge matplotlib
conda install -c conda-forge seaborn
conda install -c conda-forge umap-learn
conda install -c conda-forge louvain
conda install -c conda-forge leidenalg
单细胞数据分析基础
在开始实战之前,让我们先了解一些单细胞数据分析的基本概念。
单细胞计数矩阵
单细胞数据分析通常从一个计数矩阵开始,这个矩阵包含了每个细胞中每个基因的表达量。矩阵的行代表基因,列代表细胞,每个元素表示对应基因在对应细胞中的表达量。
数据预处理
在进行任何分析之前,都需要对原始数据进行预处理,包括过滤低质量的细胞、去除噪音等。这些步骤对于保证后续分析的准确性至关重要。
实战操作:使用Scanpy进行单细胞数据分析
为了帮助你更好地理解Scanpy的使用方法,我们将通过一个具体的案例,演示如何使用Scanpy进行数据预处理、质量控制、降维、聚类和标记基因检测等关键步骤。
1. 导入所需库
import numpy as np
import pandas as pd
import scanpy as sc
import matplotlib.pyplot as plt
import seaborn as sns
2. 读取数据
假设你已经有一个单细胞计数矩阵,可以使用以下代码读取:
adata = sc.read_10x_mtx(
'./filtered_gene_bc_matrices/hg19/', # mtx文件目录
var_names='gene_symbols', # 使用gene_symbols作为变量名
cache=True) # 写入缓存,可以更快地读取文件
3. 数据预处理
在进行任何分析之前,都需要对数据进行预处理,包括过滤低质量的细胞和基因。
# 过滤低质量细胞
sc.pp.filter_cells(adata, min_genes=200)
sc.pp.filter_genes(adata, min_cells=3)
# 计算质量控制指标
adata.var['mt'] = adata.var_names.str.startswith('MT-') # 标记线粒体基因
sc.pp.calculate_qc_metrics(adata, qc_vars=['mt'], percent_top=None, 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')
# 过滤线粒体基因表达过高或总表达量异常的细胞
adata = adata[adata.obs.pct_counts_mt < 5, :]
adata = adata[adata.obs.n_genes_by_counts < 2500, :]
4. 数据标准化和降维
在进行降维和聚类之前,需要对数据进行标准化处理。
# 数据标准化
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 = adata[:, adata.var.highly_variable]
# 数据缩放
sc.pp.scale(adata, max_value=10)
# 主成分分析(PCA)
sc.tl.pca(adata, svd_solver='arpack')
sc.pl.pca(adata, color='CST3')
5. 细胞聚类
使用PCA降维后的数据进行细胞聚类分析。
# 构建领域图
sc.pp.neighbors(adata, n_neighbors=10, n_pcs=40)
# 进行Louvain聚类
sc.tl.louvain(adata)
# 可视化聚类结果
sc.pl.umap(adata, color=['louvain'])
6. 标记基因检测
最后,我们可以检测每个聚类中的标记基因。
sc.tl.rank_genes_groups(adata, 'louvain', method='t-test')
sc.pl.rank_genes_groups(adata, n_genes=25, sharey=False)
常见问题及解决方案
在使用Scanpy的过程中,你可能会遇到一些常见问题。以下是一些解决方案:
模块未找到错误
如果遇到
ModuleNotFoundError: No module named 'scanpy'
,说明你的Python环境中没有安装Scanpy。请按照本文开头的安装步骤重新安装。数据下载失败
Scanpy内置的数据集下载功能有时可能会失败。你可以手动从网上下载数据集,然后使用本地路径读取。例如:
import scanpy as sc import h5py import anndata as ad filename = "/path/to/your/dataset.h5" with h5py.File(filename, 'r') as f: X = f['data.debatched'][()] gene_names = f['data.debatched_rownames'][()].astype(str) cell_names = f['data.debatched_colnames'][()].astype(str) clusters = f['cluster.id'][()].flatten().astype(int) adata = ad.AnnData(X.transpose(), dtype=X.dtype) adata.var_names = gene_names adata.obs_names = cell_names
依赖冲突
如果在安装或运行过程中遇到依赖冲突,建议创建一个新的虚拟环境,并在其中安装所有必要的包。
总结与展望
通过本文的介绍,你已经掌握了使用Scanpy进行单细胞数据分析的基本流程。从数据预处理到降维、聚类,再到标记基因检测,Scanpy提供了一套完整的解决方案。随着单细胞测序技术的不断发展,Scanpy也在持续更新和完善,相信它将成为你科研道路上的得力助手。