单细胞拷贝数推断¶
一句话概述¶
利用inferCNV、CopyKAT、SCEVAN等工具从单细胞RNA-seq数据中推断拷贝数变异(CNV),区分肿瘤细胞与正常细胞,揭示肿瘤内异质性和克隆结构。
核心知识点总览¶
| 知识点 | 关键内容 | 重要程度 |
|---|---|---|
| 原理基础 | 基因表达量与拷贝数的相关性 | ⭐⭐⭐⭐⭐ |
| inferCNV | Broad开发的经典scRNA-CNV推断 | ⭐⭐⭐⭐⭐ |
| CopyKAT | 贝叶斯分割检测CNV/区分良恶性 | ⭐⭐⭐⭐⭐ |
| SCEVAN | 自动化变分推断CNV检测 | ⭐⭐⭐⭐ |
| 参考细胞选择 | 正常细胞作为基线的重要性 | ⭐⭐⭐⭐ |
| 肿瘤细胞鉴定 | CNV pattern区分恶性/非恶性 | ⭐⭐⭐⭐ |
| 克隆结构 | 基于CNV的亚克隆分群 | ⭐⭐⭐ |
| 与WGS/WES验证 | 与DNA水平CNV的一致性 | ⭐⭐⭐ |
各步骤详解¶
第一步:从表达推断拷贝数的原理¶
白话解释: 基因拷贝数增加(扩增)时,该区域的基因表达量通常也会升高;拷贝数减少(缺失)时表达量也会降低。虽然这种关系不是完美的(基因表达还受表观遗传等因素调控),但在基因组大片段水平上统计地成立。因此可以通过单细胞表达数据"反推"拷贝数变化。
技术细节: 核心方法论: 1. 将基因按染色体位置排序 2. 对每个细胞,计算滑动窗口内基因的平均表达量 3. 用正常细胞(免疫/基质细胞)作为基线参考 4. 残差信号即为推断的CNV(高于基线=扩增,低于=缺失)
局限性: - 分辨率有限(不能检测单基因水平的CNV) - 对表达沉默区域无法推断 - 依赖参考正常细胞的质量 - 与真实DNA水平CNV不完全一致
# 基因表达-拷贝数关系示意
# 假设chr8p存在缺失(loss):
# 正常细胞:chr8p基因表达 = baseline
# 肿瘤细胞:chr8p基因表达 < baseline → 推断为deletion
#
# 假设chr8q存在扩增(gain):
# 正常细胞:chr8q基因表达 = baseline
# 肿瘤细胞:chr8q基因表达 > baseline → 推断为amplification
第二步:inferCNV分析流程¶
白话解释: inferCNV是Broad研究所开发的最经典的scRNA-CNV推断工具。它需要三个输入:表达矩阵、细胞注释(指明哪些是参考正常细胞)、基因位置信息。它会生成一张热图,横轴是染色体位置,纵轴是细胞,颜色代表推断的拷贝数(红=扩增,蓝=缺失)。
技术细节:
# === inferCNV 完整流程 ===
library(infercnv)
# 1. 准备输入文件
# a) 原始count矩阵(基因×细胞)
# 从Seurat对象提取
counts_matrix <- GetAssayData(seurat_obj, slot = "counts")
# 保存为文件
write.table(as.matrix(counts_matrix), "inferCNV_counts.txt",
sep = "\t", quote = FALSE)
# b) 细胞注释文件(细胞ID + 类型)
# 需要标注哪些是"参考"正常细胞
annotations <- data.frame(
cell = colnames(seurat_obj),
type = seurat_obj$celltype
)
# 参考细胞类型:免疫细胞、内皮细胞、成纤维细胞等
write.table(annotations, "inferCNV_annotations.txt",
sep = "\t", quote = FALSE, col.names = FALSE, row.names = FALSE)
# c) 基因位置文件(基因名, chr, start, end)
# 从GTF提取
gene_order <- read.table("gene_ordering_file.txt", header = FALSE,
row.names = 1, sep = "\t")
# 格式:gene_symbol chr start end
# 2. 创建inferCNV对象
infercnv_obj <- CreateInfercnvObject(
raw_counts_matrix = "inferCNV_counts.txt",
annotations_file = "inferCNV_annotations.txt",
gene_order_file = "gene_ordering_file.txt",
delim = "\t",
ref_group_names = c("T_cells", "B_cells", "Macrophages", "Endothelial")
# 指定参考细胞类型
)
# 3. 运行inferCNV
infercnv_obj <- infercnv::run(
infercnv_obj,
cutoff = 0.1, # 10x Genomics用0.1,Smart-seq2用1
out_dir = "inferCNV_output",
cluster_by_groups = TRUE,
denoise = TRUE,
HMM = TRUE, # 使用HMM预测CNV状态
HMM_type = "i6", # 6状态HMM
num_threads = 16,
analysis_mode = "subclusters", # 亚克隆分析
tumor_subcluster_partition_method = "random_trees",
no_prelim_plot = TRUE
)
# 4. 结果文件
# inferCNV_output/infercnv.png - CNV热图
# inferCNV_output/infercnv.observations.txt - 观测CNV矩阵
# inferCNV_output/HMM_CNV_predictions.*.txt - HMM预测的CNV状态
第三步:CopyKAT分析流程¶
白话解释: CopyKAT(Copy number Karyotyping of Aneuploid Tumors)是一个更简便的替代工具。它的特点是:不需要你事先指定哪些是正常细胞——它能自动区分非整倍体(肿瘤)细胞和二倍体(正常)细胞。
技术细节: CopyKAT使用贝叶斯分割(Bayesian segmentation)将基因组分成不同拷贝数状态的区段。然后基于CNV模式的层次聚类自动将细胞分为"整倍体"(diploid/正常)和"非整倍体"(aneuploid/肿瘤)两类。
# === CopyKAT 分析 ===
library(copykat)
# 输入:原始count矩阵
raw_counts <- as.matrix(GetAssayData(seurat_obj, slot = "counts"))
# 运行CopyKAT
copykat_results <- copykat(
rawmat = raw_counts,
id.type = "S", # "S" for 10X, "E" for ENSEMBL
ngene.chr = 5, # 每个染色体最少基因数
win.size = 25, # 滑动窗口大小(基因数)
KS.cut = 0.1, # KS检验阈值
sam.name = "tumor_sample",
distance = "euclidean",
norm.cell.names = NULL, # NULL=自动检测;也可指定已知正常细胞
n.cores = 16,
output.seg = FALSE
)
# 查看预测结果
head(copykat_results$prediction)
# 列:cell.names, copykat.pred (aneuploid/diploid/not.defined)
# 将预测结果添加到Seurat对象
pred <- copykat_results$prediction
seurat_obj$copykat_pred <- pred$copykat.pred[match(colnames(seurat_obj), pred$cell.names)]
# 可视化
DimPlot(seurat_obj, group.by = "copykat_pred")
# 查看CNV矩阵
cnv_matrix <- copykat_results$CNAmat
# 行=基因组区段, 列=细胞
# 热图可视化
# CopyKAT自动生成热图:tumor_sample_copykat_heatmap.jpeg
# === 基于CNV的亚克隆分析 ===
# 提取肿瘤细胞
tumor_cells <- pred$cell.names[pred$copykat.pred == "aneuploid"]
tumor_cnv <- cnv_matrix[, tumor_cells]
# 层次聚类
hc <- hclust(dist(t(tumor_cnv)), method = "ward.D2")
# 切割树获得亚克隆
subclones <- cutree(hc, k = 3) # 假设3个亚克隆
# 添加到Seurat
seurat_obj$subclone <- NA
seurat_obj$subclone[match(names(subclones), colnames(seurat_obj))] <-
paste0("Clone_", subclones)
DimPlot(seurat_obj, group.by = "subclone")
第四步:SCEVAN分析流程¶
白话解释: SCEVAN是较新的工具,使用变分推断自动检测CNV、识别肿瘤细胞、推断亚克隆。它的优势是高度自动化——不需要手动指定参考细胞,也不需要调太多参数。
技术细节:
# === SCEVAN 分析 ===
# devtools::install_github("AntonioDeFalco/SCEVAN")
library(SCEVAN)
# 输入:count矩阵
count_matrix <- as.matrix(GetAssayData(seurat_obj, slot = "counts"))
# 运行SCEVAN(自动模式)
results <- pipelineCNA(
count_matrix,
sample = "tumor_sample",
par_cores = 16,
SUBCLONES = TRUE, # 是否检测亚克隆
plotTree = TRUE # 是否绘制进化树
)
# 结果解析
# results包含:
# - class_label: 每个细胞的分类(tumor/normal)
# - CNV_matrix: CNV推断矩阵
# - subclones: 亚克隆归属
# 提取肿瘤/正常分类
cell_classification <- results[[1]]
tumor_cells <- names(cell_classification[cell_classification == "tumor"])
normal_cells <- names(cell_classification[cell_classification == "normal"])
cat(sprintf("Tumor cells: %d\nNormal cells: %d\n",
length(tumor_cells), length(normal_cells)))
# 查看亚克隆
if (!is.null(results$subclones)) {
subclone_table <- table(results$subclones)
print(subclone_table)
}
第五步:参考细胞选择策略¶
白话解释: CNV推断的质量很大程度上取决于参考细胞的选择。理想的参考细胞应该是确定无CNV的二倍体细胞。在肿瘤组织中,免疫细胞(T/B/NK/Myeloid)、血管内皮细胞和成纤维细胞通常是好的参考选择。
技术细节:
# === 参考细胞选择策略 ===
# 策略1:基于细胞类型注释(推荐)
# 使用高置信度注释的免疫/基质细胞
reference_types <- c("T_cell", "B_cell", "NK_cell", "Macrophage",
"Monocyte", "Endothelial", "Fibroblast")
ref_cells <- colnames(seurat_obj)[seurat_obj$celltype %in% reference_types]
# 策略2:使用外部正常组织的scRNA数据
# 如果肿瘤样本中正常细胞太少,可以引入配对正常组织数据
normal_tissue <- readRDS("normal_tissue_seurat.rds")
# 合并作为参考
# 策略3:使用已知的CNV-free markers验证参考细胞
# 检查参考细胞在已知频繁扩增/缺失区域的表达是否正常
# 如:chr7 gain和chr10 loss在GBM中常见
chr7_genes <- gene_order$gene[gene_order$chr == "chr7"]
chr10_genes <- gene_order$gene[gene_order$chr == "chr10"]
# 参考细胞的chr7/chr10表达应接近1(无CNV)
ref_chr7_mean <- mean(colMeans(counts_matrix[chr7_genes, ref_cells]))
ref_chr10_mean <- mean(colMeans(counts_matrix[chr10_genes, ref_cells]))
# 策略4:CopyKAT自动检测后验证
# 先用CopyKAT自动分离diploid细胞
# 然后检查diploid细胞的marker表达是否符合正常细胞特征
diploid_cells <- pred$cell.names[pred$copykat.pred == "diploid"]
# 验证这些细胞是否表达免疫/基质markers
第六步:CNV结果解读与下游分析¶
白话解释: 得到每个细胞的CNV pattern后,可以做很多有意义的下游分析:根据CNV将肿瘤细胞分成不同亚克隆、分析各亚克隆的转录特征差异、识别驱动CNV事件等。
技术细节:
# === CNV下游分析 ===
# 1. 基于CNV的聚类得到亚克隆
library(ComplexHeatmap)
# inferCNV输出的CNV矩阵
cnv_obs <- read.table("inferCNV_output/infercnv.observations.txt",
header = TRUE, check.names = FALSE)
# 只取肿瘤细胞
tumor_cnv <- cnv_obs[, tumor_cells]
# 聚类
set.seed(42)
hc_tumor <- hclust(as.dist(1 - cor(tumor_cnv)), method = "ward.D2")
k_clones <- 3 # 根据树形图选择合适的k
clone_assignment <- cutree(hc_tumor, k = k_clones)
# 热图展示亚克隆CNV特征
Heatmap(as.matrix(tumor_cnv),
name = "CNV",
column_split = factor(clone_assignment),
cluster_rows = FALSE,
show_column_names = FALSE,
col = colorRamp2(c(0.8, 1, 1.2), c("blue", "white", "red")))
# 2. 各亚克隆的差异基因表达
seurat_tumor <- subset(seurat_obj, cells = tumor_cells)
seurat_tumor$clone <- paste0("Clone_", clone_assignment[colnames(seurat_tumor)])
# 找各克隆间差异基因
clone_markers <- FindAllMarkers(seurat_tumor, group.by = "clone",
only.pos = TRUE, min.pct = 0.25)
# 3. CNV驱动基因识别
# 找到在CNV区域内且表达与CN同步变化的基因
# 这些可能是被CNV驱动的功能基因
gained_regions <- rownames(tumor_cnv)[rowMeans(tumor_cnv > 1.1) > 0.5]
# gained_regions中高表达的基因可能是驱动基因
# 4. 与bulk WGS/WES CNV比较验证
# 如果有配对的bulk CNV数据,可以验证scRNA推断的准确性
bulk_cnv <- read.table("bulk_cnv_segments.txt", header = TRUE)
# 计算相关性或一致性
第七步:工具比较与最佳实践¶
白话解释: 三个工具各有优劣,选择取决于你的数据特点和分析目标。对于需要精细亚克隆分析的用户,推荐用inferCNV(结果丰富);对于快速筛查肿瘤/正常细胞,CopyKAT更方便;SCEVAN适合全自动化流程。
技术细节:
# === 工具比较 ===
# | 特性 | inferCNV | CopyKAT | SCEVAN |
# |------|----------|---------|--------|
# | 需要参考细胞 | 是 | 可选 | 否 |
# | 自动肿瘤/正常分类 | 否 | 是 | 是 |
# | 亚克隆检测 | 是(HMM) | 是(聚类) | 是 |
# | 计算速度 | 慢 | 中 | 快 |
# | HMM状态预测 | 是 | 否 | 是 |
# | 所需细胞数 | >100 | >200 | >50 |
# | 文献引用数 | 最多 | 较多 | 较少 |
# 最佳实践建议:
# 1. 用CopyKAT快速区分肿瘤/正常
# 2. 用inferCNV做精细的亚克隆分析
# 3. 多工具交叉验证提高可靠性
# 4. 如有配对bulk数据,做一致性验证
实战命令速查¶
# inferCNV快速命令
infercnv_obj <- CreateInfercnvObject(raw_counts_matrix, annotations_file,
gene_order_file, ref_group_names)
infercnv_obj <- infercnv::run(infercnv_obj, cutoff=0.1, out_dir="output",
denoise=TRUE, HMM=TRUE, num_threads=16)
# CopyKAT快速命令
results <- copykat(rawmat=counts, id.type="S", n.cores=16)
# SCEVAN快速命令
results <- pipelineCNA(count_matrix, sample="sample1", par_cores=16, SUBCLONES=TRUE)
面试常问点¶
Q1: 从scRNA-seq推断CNV的基本假设是什么?局限性在哪里?¶
A: 基本假设是基因表达量与DNA拷贝数正相关——扩增区域基因表达上调,缺失区域下调。局限性:(1) 基因表达受多因素调控(表观遗传、转录因子),不完全由CN决定;(2) 分辨率低(需滑动窗口平滑,不能精确到单基因);(3) 对低表达区域(如异染色质)无法推断;(4) 无法检测拷贝中性的LOH。
Q2: inferCNV中参考细胞如果选错了会怎样?¶
A: 如果参考细胞本身含有CNV(如误将肿瘤细胞选为参考),则肿瘤细胞的推断CNV会被"抵消"——该扩增区域可能不再显示为扩增。反之,正常细胞可能被推断出虚假的CNV。建议使用高置信度注释的免疫细胞作为参考,并验证参考细胞在已知频繁CNV区域的表达是否正常。
Q3: CopyKAT如何自动区分肿瘤和正常细胞?¶
A: CopyKAT先将细胞分成小层次聚类簇,用Gaussian mixture model(GMM)计算各簇的方差,方差最小的簇被认定为二倍体参考细胞。然后以此为基线,用贝叶斯分割(Poisson-gamma模型+MCMC)推断所有细胞的CNV profile,再对CNV矩阵做层次聚类。非整倍体(aneuploid)细胞有明显的CNV波动,二倍体(diploid)细胞趋于平坦,通过聚类距离或GMM分布检验分离两类细胞。
Q4: 基于scRNA推断的CNV如何验证?¶
A: (1) 与同一样本的bulk WGS/WES或SNP array CNV结果比较一致性;(2) 检查已知的组织特异CNV是否被正确检测(如GBM中chr7 gain/chr10 loss);(3) 验证正常细胞(immune/stroma)是否确实没有推断出CNV;(4) 多工具交叉验证(inferCNV + CopyKAT + SCEVAN取一致结果)。
Q5: 如何利用CNV推断结果做亚克隆分析?¶
A: 将肿瘤细胞的CNV矩阵进行聚类(层次聚类或k-means),各cluster代表不同的亚克隆。同一亚克隆的细胞共享相同的大尺度CNV模式。可以进一步分析各亚克隆的差异基因表达、通路活性差异,以及用CNV pattern构建简单的进化树(基于共有/特有CNV事件的嵌套关系)。
易错点¶
1. 使用归一化数据而非原始counts¶
inferCNV和CopyKAT需要原始UMI counts作为输入,不要使用log-normalized或SCTransform后的数据。工具内部会做自己的归一化处理。
2. 参考细胞数量太少¶
参考细胞应有足够数量(建议>100-200个)以建立稳定的基线。太少的参考细胞会使基线不稳定,增加假阳性。
3. 未过滤低质量细胞¶
含有大量ambient RNA或doublet的细胞会干扰CNV推断。应在运行CNV分析之前完成严格的QC过滤。
4. 对正常组织scRNA数据运行得到虚假CNV¶
正常组织中不应有大面积CNV,如果inferCNV在正常数据中推断出"CNV",说明参数或参考细胞设置有问题。应该用正常组织做sanity check。
5. 过度解读小区域的CNV信号¶
scRNA-CNV推断在大区域(整个染色体臂)最可靠,对小focal CNV(如单个基因扩增)灵敏度很低。不要过度解读小范围的信号波动。
补充知识¶
其他scRNA-CNV工具¶
- HoneyBADGER:同时利用表达水平和等位基因信号
- CaSpER:结合表达和BAF(B allele frequency)
- Numbat:利用SNP信息的单细胞CNV+LOH推断
临床应用场景¶
- 手术样本中区分残留肿瘤细胞和反应性基质
- 判断脑胶质瘤的亚型(1p/19q共缺失 = 少突胶质细胞瘤)
- 在组织微环境研究中排除肿瘤细胞干扰
引用推荐¶
- inferCNV: Tirosh et al., Science, 2016
- CopyKAT: Gao et al., Nature Biotechnology, 2021
- SCEVAN: De Falco et al., Nature Communications, 2023
- Numbat: Gao et al., Nature Biotechnology, 2022