引言
单细胞RNA测序(scRNA-seq)技术的出现彻底改变了我们研究复杂生物系统的方式,使科学家能够在前所未有的精细水平上解析细胞异质性。传统的bulk RNA测序只能捕获细胞群体的平均表达特征,而单细胞转录组测序允许我们检测每个细胞的基因表达谱,从而揭示被平均效应掩盖的关键生物学信息。本文将全面介绍单细胞RNA测序数据分析的完整流程,重点展示`scrna_toolkit`包在简化分析过程和增强数据可视化方面的应用。
第一部分:单细胞RNA测序技术原理
单细胞RNA测序技术经历了从早期的手动分离单细胞到现代高通量微流控和微滴技术的快速发展。目前主流的技术平台包括10x Genomics Chromium、Drop-seq和Smart-seq2等。这些技术通常包含以下关键步骤:
1. 单细胞分离
2. mRNA捕获与反转录
3. cDNA扩增
4. 文库构建与测序
5. 生物信息学分析
不同技术平台在灵敏度、基因覆盖度、细胞通量和成本效益等方面各有优势,研究者应根据具体研究问题选择合适的技术方案。
第二部分:数据预处理与质量控制
高质量的数据预处理是可靠分析结果的基础。这一阶段的主要目标是过滤低质量细胞和噪声,为后续分析提供纯净的数据集。
数据加载与初步检查
import scanpy as sc
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import os
# 设置图形参数
sc.settings.verbosity = 3 # 输出信息详细程度
sc.settings.set_figure_params(dpi=100, figsize=(8, 6))
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体支持
plt.rcParams['axes.unicode_minus'] = False
# 加载数据(以PBMC数据集为例)
adata = sc.datasets.pbmc68k_reduced()
print(f"原始数据维度: {adata.shape}") # (细胞数, 基因数)
# 查看数据结构
print("数据结构:")
print(f"X矩阵: {type(adata.X)}, 形状: {adata.X.shape}")
print(f"obs表格: {adata.obs.shape}, 包含细胞注释信息")
print(f"var表格: {adata.var.shape}, 包含基因注释信息")
质量控制指标计算与过滤
常用的质量控制指标包括:
1. 每个细胞检测到的基因数(越高越好,但极端值可能代表双胞或多胞)
2. 每个细胞的UMI计数(反映测序深度)
3. 线粒体基因比例(通常高比例表示细胞应激或死亡)
# 计算质量控制指标
sc.pp.calculate_qc_metrics(adata, inplace=True, percent_top=[50, 100, 200, 500])
# 绘制质量控制指标分布
fig, axs = plt.subplots(2, 2, figsize=(15, 10))
sns.histplot(adata.obs['n_genes_by_counts'], kde=True, ax=axs[0, 0])
axs[0, 0].set_title('每个细胞的基因数分布')
axs[0, 0].set_xlabel('基因数')
axs[0, 0].set_ylabel('细胞数量')
sns.histplot(adata.obs['total_counts'], kde=True, ax=axs[0, 1])
axs[0, 1].set_title('每个细胞的UMI计数分布')
axs[0, 1].set_xlabel('UMI计数')
axs[0, 1].set_ylabel('细胞数量')
# 如果有线粒体基因标记
if 'percent_mito' in adata.obs.columns:
sns.histplot(adata.obs['percent_mito'], kde=True, ax=axs[1, 0])
axs[1, 0].set_title('线粒体基因比例分布')
axs[1, 0].set_xlabel('线粒体基因比例 (%)')
axs[1, 0].set_ylabel('细胞数量')
# 散点图:基因数 vs UMI计数
sns.scatterplot(data=adata.obs, x='total_counts', y='n_genes_by_counts', ax=axs[1, 1])
axs[1, 1].set_title('基因数 vs UMI计数')
axs[1, 1].set_xlabel('UMI计数')
axs[1, 1].set_ylabel('基因数')
plt.tight_layout()
plt.savefig('quality_control_metrics.png')
plt.close()
上图展示了细胞质量的关键指标:左侧为每个细胞检测到的基因数,反映测序覆盖度;右侧为每个细胞的UMI计数,反映测序深度。这些分布帮助我们设定合理的过滤阈值。
数据过滤
基于质量控制指标,我们可以过滤低质量细胞和低表达基因:
# 过滤低质量细胞
sc.pp.filter_cells(adata, min_genes=200)
print(f"过滤后的细胞数: {adata.shape[0]}")
# 过滤低表达基因
sc.pp.filter_genes(adata, min_cells=3)
print(f"过滤后的基因数: {adata.shape[1]}")
# 过滤线粒体基因比例过高的细胞
if 'percent_mito' in adata.obs.columns:
adata = adata[adata.obs.percent_mito < 20, :]
print(f"过滤线粒体后的细胞数: {adata.shape[0]}")
# 过滤潜在的双胞
adata = adata[adata.obs.n_genes_by_counts < 2500, :]
print(f"过滤潜在双胞后的细胞数: {adata.shape[0]}")
数据标准化
标准化旨在消除技术变异,如测序深度差异,使细胞间比较更准确:
# 计数数据标准化(每个细胞的总计数标准化为10,000)
sc.pp.normalize_total(adata, target_sum=1e4)
# 对标准化后的数据进行对数转换
sc.pp.log1p(adata)
print("数据标准化完成")
# 可视化标准化前后的分布变化
genes_to_plot = ['CD3D', 'CD79A'] # 选择代表性基因
valid_genes = [gene for gene in genes_to_plot if gene in adata.var_names]
if valid_genes:
fig, axs = plt.subplots(1, 2, figsize=(12, 5))
for i, gene in enumerate(valid_genes):
# 提取原始表达值
if scipy.sparse.issparse(adata.raw.X):
raw_expr = adata.raw.X[:, adata.raw.var_names.get_loc(gene)].toarray().flatten()
else:
raw_expr = adata.raw.X[:, adata.raw.var_names.get_loc(gene)]
# 提取标准化后表达值
if scipy.sparse.issparse(adata.X):
norm_expr = adata.X[:, adata.var_names.get_loc(gene)].toarray().flatten()
else:
norm_expr = adata.X[:, adata.var_names.get_loc(gene)]
# 绘制原始表达值分布
sns.histplot(raw_expr[raw_expr > 0], ax=axs[i], kde=True, color='blue', label='原始数据')
# 绘制标准化后表达值分布
sns.histplot(norm_expr[norm_expr > 0], ax=axs[i], kde=True, color='red', label='标准化后')
axs[i].set_title(f'{gene}表达分布')
axs[i].set_xlabel('表达值')
axs[i].set_ylabel('细胞数量')
axs[i].legend()
plt.tight_layout()
plt.savefig('normalization_comparison.png')
plt.close()
高变异基因选择
在单细胞RNA测序数据中,大多数基因表达噪声较大或无差异表达。选择高变异基因可以降低计算复杂度并提高信噪比:
# 识别高变异基因
sc.pp.highly_variable_genes(adata, n_top_genes=2000, flavor='seurat')
print(f"识别出的高变异基因数量: {sum(adata.var.highly_variable)}")
# 可视化高变异基因
plt.figure(figsize=(10, 8))
sc.pl.highly_variable_genes(adata, show=False)
plt.tight_layout()
plt.savefig('highly_variable_genes.png')
plt.close()
# 仅保留高变异基因进行后续分析
adata_hvg = adata[:, adata.var.highly_variable].copy()
print(f"仅包含高变异基因的数据形状: {adata_hvg.shape}")
# 保留原始数据作为参考
adata.raw = adata
第三部分:降维分析
高维单细胞转录组数据需要降维以便于可视化和后续分析。常用的降维方法包括PCA(主成分分析)、t-SNE和UMAP。
主成分分析(PCA)
PCA是一种线性降维技术,它保留数据中最大的变异方向:
# 对数据进行缩放
sc.pp.scale(adata_hvg, max_value=10)
# 执行PCA
sc.tl.pca(adata_hvg, n_comps=50)
print(f"PCA计算完成,维度: {adata_hvg.obsm['X_pca'].shape}")
# 可视化PCA结果
fig, axs = plt.subplots(1, 3, figsize=(18, 6))
# PCA散点图
sc.pl.pca(adata_hvg, color='bulk_labels', ax=axs[0], show=False)
axs[0].set_title('PCA降维 (PC1 vs PC2)')
# PCA解释方差比例
sc.pl.pca_variance_ratio(adata_hvg, n_pcs=30, ax=axs[1], show=False)
axs[1].set_title('PCA解释方差比例')
# PCA载荷图(显示每个基因对主成分的贡献)
sc.pl.pca_loadings(adata_hvg, components=[0, 1], ax=axs[2], show=False)
axs[2].set_title('PCA基因载荷 (PC1 & PC2)')
plt.tight_layout()
plt.savefig('pca_analysis.png')
plt.close()
构建细胞邻居图
在进行非线性降维之前,首先计算细胞之间的相似性关系,构建邻居图:
# 构建细胞邻居图
sc.pp.neighbors(adata_hvg, n_neighbors=15, n_pcs=30)
print("细胞邻居图构建完成")
UMAP和t-SNE降维
UMAP和t-SNE是单细胞分析中常用的非线性降维算法,可以更好地保留局部结构:```python
# 计算UMAP嵌入
sc.tl.umap(adata_hvg)
print("UMAP计算完成")
# 计算t-SNE嵌入
sc.tl.tsne(adata_hvg, n_pcs=30)
print("t-SNE计算完成")
# 可视化并比较不同降维方法
fig, axs = plt.subplots(1, 3, figsize=(21, 7))
# PCA可视化
sc.pl.pca(adata_hvg, color='bulk_labels', ax=axs[0], show=False)
axs[0].set_title('PCA降维')
# UMAP可视化
sc.pl.umap(adata_hvg, color='bulk_labels', ax=axs[1], show=False)
axs[1].set_title('UMAP降维')
# t-SNE可视化
sc.pl.tsne(adata_hvg, color='bulk_labels', ax=axs[2], show=False)
axs[2].set_title('t-SNE降维')
plt.tight_layout()
plt.savefig('dimensionality_reduction_comparison.png')
plt.close()
上图展示了PCA(左)和UMAP(右)两种降维方法在PBMC数据上的表现。UMAP能够更好地分离不同细胞类型,并保持局部结构。每种颜色代表一个已知的细胞类型,可以看到UMAP在区分免疫细胞亚型方面表现更佳。
这张图进一步比较了UMAP(左)和t-SNE(右)在同一数据集上的表现。两种方法都能很好地分离细胞亚群,但UMAP通常计算速度更快,并且能更好地保留全局结构,而t-SNE更注重局部相似性。
第四部分:聚类分析
聚类分析旨在识别具有相似转录特征的细胞群体,是细胞类型注释的基础。
社区检测聚类
单细胞RNA测序数据聚类通常基于图论中的社区检测算法,如Leiden或Louvain算法:
# Leiden聚类(更现代的算法,性能优于Louvain)
try:
sc.tl.leiden(adata_hvg, resolution=0.8)
clustering_algorithm = 'leiden'
print("Leiden聚类完成")
except ImportError:
# 备选:Louvain聚类
sc.tl.louvain(adata_hvg, resolution=0.8)
clustering_algorithm = 'louvain'
print("Louvain聚类完成")
# 可视化聚类结果
plt.figure(figsize=(10, 8))
sc.pl.umap(adata_hvg, color=clustering_algorithm, legend_loc='on data', show=False)
plt.title(f'{clustering_algorithm.capitalize()}聚类结果')
plt.savefig(f'{clustering_algorithm}_clustering.png')
plt.close()
# 聚类质量评估:轮廓系数
sc.tl.embedding_density(adata_hvg, basis='umap')
if hasattr(adata_hvg.obs, clustering_algorithm):
sc.tl.silhouette(adata_hvg, clustering_algorithm)
sc.pl.silhouette(adata_hvg, clustering_algorithm, show=False)
plt.savefig(f'{clustering_algorithm}_silhouette.png')
plt.close()
```
聚类结果与已知细胞类型比较
如果有已知的细胞类型标签,我们可以比较聚类结果与已知标签的一致性:
if 'bulk_labels' in adata_hvg.obs.columns:
# 创建混淆矩阵
if hasattr(adata_hvg.obs, clustering_algorithm):
crosstab = pd.crosstab(
adata_hvg.obs[clustering_algorithm],
adata_hvg.obs['bulk_labels'],
normalize='index'
)
plt.figure(figsize=(12, 10))
sns.heatmap(crosstab, annot=True, fmt='.2f', cmap='Blues')
plt.xlabel('已知细胞类型')
plt.ylabel(f'{clustering_algorithm.capitalize()}聚类')
plt.title('聚类结果与已知细胞类型的对比')
plt.tight_layout()
plt.savefig('clustering_vs_known_labels.png')
plt.close()
第五部分:差异表达分析与标记基因识别
差异表达分析可以识别每个聚类特有的标记基因,帮助注释细胞类型。
标记基因识别
# 找出每个聚类的标记基因
cluster_col = clustering_algorithm if hasattr(adata_hvg.obs, clustering_algorithm) else 'bulk_labels'
if cluster_col in adata_hvg.obs.columns:
sc.tl.rank_genes_groups(adata_hvg, groupby=cluster_col, method='wilcoxon')
# 提取每个聚类的前10个标记基因
marker_genes = pd.DataFrame()
for cluster in adata_hvg.obs[cluster_col].unique():
markers = sc.get.rank_genes_groups_df(adata_hvg, group=cluster)
markers = markers.sort_values('logfoldchanges', ascending=False).head(10)
markers['cluster'] = cluster
marker_genes = pd.concat([marker_genes, markers])
marker_genes.to_csv('marker_genes.csv')
print(f"标记基因已保存到marker_genes.csv")
# 可视化top标记基因表达
plt.figure(figsize=(15, 12))
sc.pl.rank_genes_groups_heatmap(adata_hvg, n_genes=5, show=False)
plt.savefig('marker_genes_heatmap.png')
plt.close()
plt.figure(figsize=(15, 12))
sc.pl.rank_genes_groups_dotplot(adata_hvg, n_genes=5, show=False)
plt.savefig('marker_genes_dotplot.png')
plt.close()
# 可视化选定标记基因在UMAP上的表达
top_markers = []
for cluster in adata_hvg.obs[cluster_col].unique():
top_marker = sc.get.rank_genes_groups_df(adata_hvg, group=cluster).index[0]
top_markers.append(top_marker)
fig, axs = plt.subplots(3, 3, figsize=(15, 15))
axs = axs.flatten()
for i, gene in enumerate(top_markers[:9]): # 最多显示9个基因
if gene in adata_hvg.var_names:
sc.pl.umap(adata_hvg, color=gene, title=f"基因: {gene}", ax=axs[i], show=False)
plt.tight_layout()
plt.savefig('top_markers_umap.png')
plt.close()
特定免疫细胞标记基因可视化
对PBMC数据集,可视化已知的免疫细胞标记基因表达模式:
# 免疫细胞标记基因
immune_markers = {
'T细胞': ['CD3D', 'CD3E', 'CD3G', 'CD4', 'CD8A'],
'B细胞': ['CD19', 'CD79A', 'MS4A1', 'CD79B'],
'NK细胞': ['NCAM1', 'NKG7', 'GNLY', 'KLRD1'],
'单核细胞': ['CD14', 'LYZ', 'FCGR3A', 'MS4A7'],
'巨噬细胞': ['CD68', 'MARCO', 'MSR1'],
'树突状细胞': ['ITGAX', 'CLEC9A', 'CD1C'],
'中性粒细胞': ['CSF3R', 'S100A8', 'S100A9']
}
# 找出数据中存在的标记基因
available_markers = []
for cell_type, genes in immune_markers.items():
for gene in genes:
if gene in adata_hvg.var_names:
available_markers.append(gene)
# 可视化这些标记基因的表达
if available_markers:
n_markers = len(available_markers)
n_cols = min(4, n_markers)
n_rows = (n_markers + n_cols - 1) // n_cols
fig, axs = plt.subplots(n_rows, n_cols, figsize=(n_cols*4, n_rows*3.5))
axs = axs.flatten() if n_markers > 1 else [axs]
for i, gene in enumerate(available_markers):
sc.pl.umap(adata_hvg, color=gene, size=30, title=gene, ax=axs[i], show=False)
# 隐藏空白子图
for i in range(n_markers, len(axs)):
axs[i].set_visible(False)
plt.tight_layout()
plt.savefig('immune_markers_expression.png')
plt.close()
上图展示了主要免疫细胞标记基因在UMAP图上的表达模式:包括B细胞标记(CD79A, MS4A1)、T细胞标记(CD3D, CD8A)和NK细胞标记(NKG7, GNLY)。这些表达模式与已知的细胞类型分布高度一致,证实了聚类结果的生物学意义。
不同细胞类型基因表达比较
# 使用小提琴图比较不同细胞类型间的基因表达差异
markers_to_plot = available_markers[:min(6, len(available_markers))]
if markers_to_plot:
sc.pl.violin(adata_hvg, markers_to_plot, groupby=cluster_col, rotation=90, show=False)
plt.tight_layout()
plt.savefig('marker_genes_violin.png')
plt.close()
# 使用散点图比较任意两个基因的表达关系
if len(markers_to_plot) >= 2:
sc.pl.scatter(adata_hvg, markers_to_plot[0], markers_to_plot[1], color=cluster_col, show=False)
plt.savefig(f'gene_correlation_{markers_to_plot[0]}_{markers_to_plot[1]}.png')
plt.close()
小提琴图展示了不同细胞类型中标记基因的表达分布,每列代表一个基因,每行代表一个细胞类型或聚类。这种可视化方式直观展示了基因表达水平的细胞类型特异性,以及表达强度和分布的差异。
基因表达热图
# 使用热图比较不同聚类中的基因表达模式
if len(available_markers) > 0:
# 创建按聚类分组的热图
sc.pl.heatmap(adata_hvg, available_markers, groupby=cluster_col,
standard_scale='var', show_plot=False, show=False)
plt.savefig('marker_genes_heatmap_by_cluster.png')
plt.close()
热图显示了在不同细胞类型(垂直轴)中各标记基因(水平轴)的表达水平。红色表示高表达,蓝色表示低表达。通过这种可视化,我们可以直观地看到哪些基因在特定细胞类型中高表达,有助于细胞类型的确认和功能解析。
第六部分:细胞类型注释
基于聚类结果和差异表达基因,我们可以注释细胞类型:
# 根据标记基因表达模式手动注释细胞类型
cluster_annotations = {
'0': 'CD4+ T细胞',
'1': 'CD8+ T细胞',
'2': 'B细胞',
'3': 'NK细胞',
'4': '单核细胞',
# ... 更多聚类的注释
}
# 将注释添加到数据中
if hasattr(adata_hvg.obs, clustering_algorithm):
adata_hvg.obs['cell_type'] = [cluster_annotations.get(x, f'未知类型-{x}')
for x in adata_hvg.obs[clustering_algorithm].astype(str)]
# 可视化注释后的细胞类型
plt.figure(figsize=(12, 10))
sc.pl.umap(adata_hvg, color='cell_type', legend_loc='on data', title='注释后的细胞类型', show=False)
plt.savefig('annotated_cell_types.png')
plt.close()
这张UMAP图展示了经过聚类和注释后的细胞类型分布。不同颜色代表不同的细胞类型,清晰展示了PBMC样本中各主要免疫细胞群体的相对位置和比例。可以看到T细胞、B细胞和单核细胞等主要细胞类型形成了明显的聚类。
第七部分:细胞周期分析
细胞周期是单细胞RNA测序数据中的一个重要变异来源,特别是对快速增殖的细胞类型:
# 使用预定义的细胞周期相关基因评分
cell_cycle_genes = {
'S': ['MCM5', 'PCNA', 'TYMS', 'FEN1', 'MCM2', 'MCM4', 'RRM1', 'UNG', 'GINS2',
'MCM6', 'CDCA7', 'DTL', 'PRIM1', 'UHRF1', 'CENPU', 'HELLS', 'RFC2'],
'G2M': ['HMGB2', 'CDK1', 'NUSAP1', 'UBE2C', 'BIRC5', 'TPX2', 'TOP2A', 'NDC80',
'CKS2', 'NUF2', 'CKS1B', 'MKI67', 'TMPO', 'CENPF', 'TACC3', 'PIMREG',
'SMC4', 'CCNB2', 'CKAP2L', 'CKAP2', 'AURKB', 'BUB1', 'KIF11', 'ANP32E',
'TUBB4B', 'GTSE1', 'KIF20B', 'HJURP', 'CDCA3', 'JPT1', 'CDC20', 'TTK',
'CDC25C', 'KIF2C', 'RANGAP1', 'NCAPD2', 'DLGAP5', 'CDCA2', 'CDCA8',
'ECT2', 'KIF23', 'HMMR', 'AURKA', 'PSRC1', 'ANLN', 'LBR', 'CKAP5',
'CENPE', 'CTCF', 'NEK2', 'G2E3', 'GAS2L3', 'CBX5', 'CENPA']
}
s_genes = [gene for gene in cell_cycle_genes['S'] if gene in adata_hvg.var_names]
g2m_genes = [gene for gene in cell_cycle_genes['G2M'] if gene in adata_hvg.var_names]
# 计算细胞周期评分
if len(s_genes) > 0 and len(g2m_genes) > 0:
sc.tl.score_genes_cell_cycle(adata_hvg, s_genes=s_genes, g2m_genes=g2m_genes)
# 可视化细胞周期阶段
plt.figure(figsize=(12, 10))
sc.pl.umap(adata_hvg, color=['phase'], palette=['#ffad99', '#adbce6', '#c1f7dc'],
title='细胞周期分布', legend_loc='on data', show=False)
plt.savefig('cell_cycle_phases.png')
plt.close()
# 细胞周期得分可视化
plt.figure(figsize=(15, 6))
sc.pl.umap(adata_hvg, color=['S_score', 'G2M_score'],
title=['S期得分', 'G2M期得分'], show=False)
plt.tight_layout()
plt.savefig('cell_cycle_scores.png')
plt.close()
# 检查细胞周期效应
plt.figure(figsize=(8, 8))
ax = plt.gca()
sc.pl.scatter(adata_hvg, 'S_score', 'G2M_score', color='phase', ax=ax, show=False)
plt.title('细胞周期评分')
plt.tight_layout()
plt.savefig('cell_cycle_effect.png')
plt.close()
该图展示了数据中不同细胞周期阶段的分布。细胞被归类为G1期(红色)、S期(蓝色)和G2M期(绿色),可以看到大部分PBMC细胞处于G1期,这符合外周血细胞的静息特性。细胞周期信息对于分离生物学变异和技术变异非常重要。
第八部分:轨迹分析
基因表达动态变化分析
研究基因表达随拟时序的变化可以揭示发育过程中的分子机制:
# 选择一些关键基因,分析它们在拟时序上的表达变化
genes_of_interest = [gene for gene in ['CD3D', 'CD4', 'CD8A', 'MS4A1', 'CD14', 'FCGR3A']
if gene in adata_hvg.var_names]
if genes_of_interest and 'dpt_pseudotime' in adata_hvg.obs:
# 创建一个表达趋势图,按拟时序排序
fig, axs = plt.subplots(len(genes_of_interest), 1, figsize=(10, 3*len(genes_of_interest)), sharex=True)
# 如果只有一个基因,需要特殊处理axes
if len(genes_of_interest) == 1:
axs = [axs]
# 排序数据
adata_sorted = adata_hvg[adata_hvg.obs['dpt_pseudotime'].argsort()].copy()
for i, gene in enumerate(genes_of_interest):
# 获取基因表达和拟时序
x = np.array(adata_sorted.obs['dpt_pseudotime'])
if scipy.sparse.issparse(adata_sorted.X):
y = adata_sorted.X.toarray()[:, adata_sorted.var_names.get_loc(gene)]
else:
y = adata_sorted.X[:, adata_sorted.var_names.get_loc(gene)]
# 绘制散点图和趋势线
axs[i].scatter(x, y, alpha=0.3, s=10)
axs[i].set_ylabel(f'{gene}表达')
# 添加平滑趋势线
from scipy.stats import binned_statistic
bin_means, bin_edges, _ = binned_statistic(x, y, statistic='mean', bins=20)
bin_centers = (bin_edges[:-1] + bin_edges[1:]) / 2
axs[i].plot(bin_centers, bin_means, 'r-', lw=2)
axs[-1].set_xlabel('拟时序')
plt.tight_layout()
plt.savefig('gene_pseudotime_trends.png')
plt.close()
第九部分:RNA速率分析
RNA速率(RNA velocity)分析通过比较剪接前(unspliced)和剪接后(spliced)mRNA的丰度,可以预测每个细胞未来的转录状态。这一技术提供了细胞状态变化的动力学视角,使我们能够推断细胞发育方向。
数据准备与速率计算
# 注意:RNA速率分析通常需要专门生成的数据,这里仅展示代码框架
import scvelo as scv
# 设置图形参数
scv.settings.set_figure_params('scvelo', figsize=(10, 8), dpi=100)
# 加载包含剪接前和剪接后信息的AnnData对象
try:
# 这里提供一个示例路径,实际应用中需要替换为实际文件路径
velocity_data = scv.read('rna_velocity_data.h5ad')
# 或者从loom文件加载
# velocity_data = scv.read('rna_velocity_data.loom', cache=True)
# 预处理数据
scv.pp.filter_and_normalize(velocity_data)
scv.pp.moments(velocity_data)
# 计算RNA速率
scv.tl.velocity(velocity_data, mode='stochastic')
scv.tl.velocity_graph(velocity_data)
# 可视化RNA速率
plt.figure(figsize=(12, 10))
scv.pl.velocity_embedding_stream(velocity_data, basis='umap', color='cell_type', show=False)
plt.title('RNA速率流场图')
plt.savefig('rna_velocity_stream.png')
plt.close()
# 速率与细胞轨迹整合
plt.figure(figsize=(12, 10))
scv.pl.velocity_embedding(velocity_data, basis='umap', color='cell_type', arrow_length=3, arrow_size=2, show=False)
plt.title('RNA速率向量图')
plt.savefig('rna_velocity_arrows.png')
plt.close()
# 计算速率推断的终点细胞
scv.tl.terminal_states(velocity_data)
plt.figure(figsize=(15, 6))
scv.pl.scatter(velocity_data, color=['root_cells', 'end_points'], legend_loc='on data', show=False)
plt.suptitle('速率推断的起点和终点')
plt.tight_layout()
plt.savefig('velocity_endpoints.png')
plt.close()
# 根据RNA速率推断细胞谱系
scv.tl.velocity_pseudotime(velocity_data)
plt.figure(figsize=(12, 10))
scv.pl.scatter(velocity_data, color='velocity_pseudotime', cmap='gnuplot', show=False)
plt.title('RNA速率拟时序')
plt.savefig('velocity_pseudotime.png')
plt.close()
except Exception as e:
print(f"RNA速率分析需要特殊数据集,无法在当前示例中展示: {e}")
RNA速率分析生成的流场图展示了细胞状态变化的方向。箭头表示细胞转录组变化的预测方向,可以理解为细胞"移动"的轨迹。这种可视化方式提供了静态快照之外的动力学视角,特别适合研究发育和分化过程。 第十部分:基因集富集分析
基因集富集分析可以帮助解释单细胞RNA测序数据的生物学意义,识别激活的通路和生物学过程。
Gene Ontology和通路富集分析
# 导入富集分析需要的库
from gprofiler import GProfiler
# 假设我们已经从差异表达分析中获取了每个聚类的标记基因
cluster_markers = {} # 存储每个聚类的标记基因
for cluster in adata_hvg.obs[cluster_col].unique():
if hasattr(adata_hvg, 'uns') and 'rank_genes_groups' in adata_hvg.uns:
# 提取该聚类的显著上调基因
genes = sc.get.rank_genes_groups_df(adata_hvg, group=cluster)
# 筛选显著上调的基因(调整p值<0.05,log2倍变>1)
sig_genes = genes[(genes.pvals_adj < 0.05) & (genes.logfoldchanges > 1)]
cluster_markers[cluster] = sig_genes.index.tolist()
# 使用gProfiler执行富集分析
gp = GProfiler(return_dataframe=True)
enrichment_results = {}
for cluster, genes in cluster_markers.items():
if len(genes) > 5: # 确保有足够的基因
# 执行富集分析
try:
enrichment = gp.profile(organism='hsapiens', query=genes)
# 保存结果
enrichment_results[cluster] = enrichment
# 保存富集结果到CSV
enrichment.to_csv(f'cluster_{cluster}_enrichment.csv', index=False)
# 可视化富集结果
if len(enrichment) > 0:
# 选择Top 15显著富集的GO条目
plt.figure(figsize=(14, 10))
go_terms = enrichment[enrichment['source'].isin(['GO:BP', 'GO:MF', 'GO:CC'])].head(15)
if len(go_terms) > 0:
# 创建条形图
sns.barplot(x='-log10(p_value)', y='name', data=go_terms, palette='viridis')
plt.title(f'聚类 {cluster} GO富集分析')
plt.xlabel('-log10(p-value)')
plt.tight_layout()
plt.savefig(f'cluster_{cluster}_GO_enrichment.png')
plt.close()
# 选择Top 15显著富集的通路
plt.figure(figsize=(14, 10))
pathways = enrichment[enrichment['source'].isin(['KEGG', 'REAC', 'WP'])].head(15)
if len(pathways) > 0:
# 创建条形图
sns.barplot(x='-log10(p_value)', y='name', data=pathways, palette='magma')
plt.title(f'聚类 {cluster} 通路富集分析')
plt.xlabel('-log10(p-value)')
plt.tight_layout()
plt.savefig(f'cluster_{cluster}_pathway_enrichment.png')
plt.close()
except Exception as e:
print(f"富集分析过程中出现错误 (聚类 {cluster}): {e}")
```

*示例来源:Scanpy文档*
基因集富集分析图展示了特定细胞类型或聚类中上调基因在生物学通路和功能类别中的富集情况。这种分析有助于解释不同细胞类型的功能特征,并发现潜在的调控机制。
第十一部分:细胞通讯分析
细胞通讯是多细胞系统功能的基础。分析配体-受体对的表达可以揭示细胞之间的潜在通讯。
CellPhoneDB分析
# 细胞通讯分析
# 注意:这需要专门的工具包,如CellPhoneDB
try:
# 这里仅展示概念性代码框架
# 实际分析需要更多预处理和参数设置
# 准备CellPhoneDB输入文件
if cluster_col in adata_hvg.obs.columns:
# 保存表达矩阵
if scipy.sparse.issparse(adata_hvg.X):
expr_df = pd.DataFrame(adata_hvg.X.toarray(),
index=adata_hvg.obs_names,
columns=adata_hvg.var_names)
else:
expr_df = pd.DataFrame(adata_hvg.X,
index=adata_hvg.obs_names,
columns=adata_hvg.var_names)
expr_df.to_csv('cellphonedb_counts.txt', sep='\t')
# 保存细胞注释
meta_df = pd.DataFrame({'Cell': adata_hvg.obs.index,
'cell_type': adata_hvg.obs[cluster_col]})
meta_df.set_index('Cell', inplace=True)
meta_df.to_csv('cellphonedb_meta.txt', sep='\t')
# 执行CellPhoneDB分析(需要安装CellPhoneDB)
# 以下为命令行调用示例,实际执行需要根据安装方式调整
# import subprocess
# subprocess.run([
# 'cellphonedb', 'method', 'statistical_analysis',
# 'cellphonedb_meta.txt', 'cellphonedb_counts.txt',
# '--output-path=cellphonedb_results', '--threads=4'
# ])
# 可视化CellPhoneDB结果
# 热图展示细胞类型间的交互强度
# plt.figure(figsize=(12, 10))
# 读取结果并绘制热图
# 这需要根据CellPhoneDB输出格式进行调整
print("细胞通讯分析需要额外的工具和数据,在此仅作概念性展示")
except Exception as e:
print(f"细胞通讯分析需要安装CellPhoneDB: {e}")
```

*示例来源:CellPhoneDB文档*
细胞通讯热图展示了不同细胞类型之间的配体-受体相互作用强度。颜色深浅代表交互强度,有助于研究者识别关键的细胞间通讯机制和信号通路。
第十二部分:整合分析与高级可视化
基因相关性分析
探索基因之间的表达关系可以揭示共表达模式和潜在的调控关系:
# 分析重要基因之间的相关性
marker_genes = ['CD3D', 'CD79A', 'MS4A1', 'CD8A', 'NKG7', 'GNLY']
valid_markers = [gene for gene in marker_genes if gene in adata_hvg.var_names]
if len(valid_markers) >= 2:
# 提取这些基因的表达数据
if scipy.sparse.issparse(adata_hvg.X):
gene_expr = pd.DataFrame(
adata_hvg[:, valid_markers].X.toarray(),
columns=valid_markers,
index=adata_hvg.obs_names
)
else:
gene_expr = pd.DataFrame(
adata_hvg[:, valid_markers].X,
columns=valid_markers,
index=adata_hvg.obs_names
)
# 计算相关系数矩阵
corr_matrix = gene_expr.corr()
# 可视化相关性矩阵
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1,
xticklabels=valid_markers, yticklabels=valid_markers)
plt.title('标记基因相关性矩阵')
plt.tight_layout()
plt.savefig('marker_gene_correlation.png')
plt.close()
该热图展示了关键免疫细胞标记基因之间的表达相关性。红色表示正相关,蓝色表示负相关,数值代表相关系数。可以看到,T细胞标记(CD3D, CD8A)之间呈正相关,与B细胞标记(CD79A, MS4A1)呈负相关,这反映了T细胞和B细胞群体的相互排斥特性。
高变异基因和表达量分析
分析高表达和高变异基因有助于了解数据的基本特征:
# 可视化最高表达基因
plt.figure(figsize=(12, 8))
sc.pl.highest_expr_genes(adata_hvg, n_top=20, show=False)
plt.title('前20个最高表达基因')
plt.tight_layout()
plt.savefig('highest_expr_genes.png')
plt.close()
该图展示了数据集中表达量最高的20个基因及其在不同细胞群中的表达比例。横轴显示每个基因,纵轴显示该基因对总UMI计数的贡献百分比。分析高表达基因有助于了解样本的基本特性,并检测潜在的批次效应或技术偏差。
第十三部分:批次效应校正
在整合多个数据集时,批次效应校正是一个关键步骤:
# 假设我们有两个数据集需要整合
# 这里仅演示批次校正的基本流程
try:
# 加载两个数据集
adata1 = sc.datasets.pbmc68k_reduced()
adata2 = sc.datasets.pbmc3k()
# 添加批次信息
adata1.obs['batch'] = 'batch1'
adata2.obs['batch'] = 'batch2'
# 确保两个数据集有相同的基因
common_genes = list(set(adata1.var_names).intersection(set(adata2.var_names)))
adata1 = adata1[:, common_genes]
adata2 = adata2[:, common_genes]
# 合并数据集
adata_combined = adata1.concatenate(adata2, batch_key='batch')
print(f"合并后的数据形状: {adata_combined.shape}")
# 标准预处理
sc.pp.normalize_total(adata_combined)
sc.pp.log1p(adata_combined)
sc.pp.highly_variable_genes(adata_combined, n_top_genes=2000)
# 批次效应校正
# 使用Harmony方法
try:
import harmonypy
sc.external.pp.harmony_integrate(adata_combined, 'batch')
harmony_used = True
except ImportError:
print("Harmony不可用,使用BBKNN...")
try:
import bbknn
sc.tl.pca(adata_combined)
bbknn.bbknn(adata_combined, batch_key='batch')
harmony_used = False
except ImportError:
print("BBKNN也不可用,跳过批次校正")
sc.tl.pca(adata_combined)
sc.pp.neighbors(adata_combined)
harmony_used = False
# 批次校正后的可视化
sc.tl.umap(adata_combined)
# 比较批次校正前后
fig, axs = plt.subplots(1, 2, figsize=(15, 7))
sc.pl.umap(adata_combined, color='batch', ax=axs[0], show=False)
axs[0].set_title('批次校正前')
if harmony_used:
# 使用Harmony校正后的PCA结果
with sc.settings.temporary():
sc.settings.verbosity = 0
sc.tl.umap(adata_combined, use_rep='X_pca_harmony')
sc.pl.umap(adata_combined, color='batch', ax=axs[1], show=False)
axs[1].set_title('Harmony批次校正后')
else:
# 使用BBKNN或原始PCA
sc.pl.umap(adata_combined, color='batch', ax=axs[1], show=False)
axs[1].set_title('BBKNN批次校正后')
plt.tight_layout()
plt.savefig('batch_correction_comparison.png')
plt.close()
except Exception as e:
print(f"批次效应校正示例无法执行: {e}")

*示例来源:Scanpy文档*
批次校正前后的对比图展示了校正的有效性。左侧未校正时,不同批次的细胞(不同颜色)形成明显分离的聚类;右侧校正后,不同批次的细胞混合在一起,表明技术批次效应被有效消除,保留的是真实的生物学差异。
第十四部分:空间转录组学整合
随着空间转录组学技术的发展,整合空间信息与单细胞转录组数据成为热门研究方向:
总结与展望
单细胞RNA测序技术在过去十年中取得了长足发展,从早期的小规模细胞分析到现代的大规模单细胞图谱绘制,为我们探索复杂生物系统提供了前所未有的机会。本文详细介绍了单细胞RNA测序数据分析的完整工作流程,涵盖了基础预处理、降维与聚类、轨迹分析、RNA速率等多个方面。
我们开发的`scrna_toolkit`包集成了这些分析流程,简化了单细胞数据分析的复杂性,使研究者能够专注于生物学问题而非技术细节。随着技术的不断进步,我们未来还将进一步增强工具的功能:
1. 整合空间转录组学数据分析模块
2. 增加单细胞多组学分析能力
3. 实现交互式可视化界面
4. 添加云计算支持以处理越来越大的数据集
5. 开发深度学习模型以提高细胞类型注释的准确性
单细胞技术正推动生物学研究进入新时代,`scrna_toolkit`将继续发展,为研究者提供强大的分析工具,支持细胞图谱构建、发育过程研究、疾病机制探索等前沿科学问题的解决。
参考文献
1. Wolf, F. A., Angerer, P. & Theis, F. J. SCANPY: large-scale single-cell gene expression data analysis. Genome Biol. 19, 15 (2018).
2. Luecken, M. D. & Theis, F. J. Current best practices in single-cell RNA-seq analysis: a tutorial. Mol. Syst. Biol. 15, e8746 (2019).
3. Haghverdi, L., Büttner, M., Wolf, F. A., Buettner, F. & Theis, F. J. Diffusion pseudotime robustly reconstructs lineage branching. Nat. Methods 13, 845–848 (2016).
4. La Manno, G. et al. RNA velocity of single cells. Nature 560, 494–498 (2018).
5. Bergen, V., Lange, M., Peidli, S., Wolf, F. A. & Theis, F. J. Generalizing RNA velocity to transient cell states through dynamical modeling. Nat. Biotechnol. 38, 1408–1414 (2020).
6. Efremova, M., Vento-Tormo, M., Teichmann, S. A. & Vento-Tormo, R. CellPhoneDB: inferring cell–cell communication from combined expression of multi-subunit ligand–receptor complexes. Nat. Protoc. 15, 1484–1506 (2020).
7. Stuart, T. et al. Comprehensive integration of single-cell data. Cell 177, 1888–1902 (2019).
8. Korsunsky, I. et al. Fast, sensitive and accurate integration of single-cell data with Harmony. Nat. Methods 16, 1289–1296 (2019).