单细胞CNV分析-copyKAT
对于肿瘤的单细胞样本,在做完细胞质控和细胞类型鉴定之后,可以进入CNV分析。
CNV(Copy number variation, 拷贝数变异)是由基因组发生重排而导致的, 一般指长度为1 kb 以上的基因组大片段的拷贝数增加或者减少, 主要表现为亚显微水平的缺失和重复。CNV 是基因组结构变异(Structural variation, SV) 的重要组成部分。CNV位点的突变率远高于SNP(Single nucleotide polymorphism), 是人类疾病的重要致病因素之一。
目前常用于单细胞CNV分析的软件包括inferCNV
和copyKAT
,实测copyKAT效果好于inferCNV,准确性更高,速度也更快。(copyKAT是专门为了单细胞CNV分析设计的,inferCNV不是。)
1. copyKAT简介
copyKAT文章- 流程图:
- CopyKAT算法概述:
在统计学上,CopyKAT将贝叶斯方法与层次聚类相结合,计算单个细胞的基因组拷贝数分布,并从高通量单细胞转录组数据中定义克隆子结构。
首先,单细胞转录组数据的Unique Molecular Identifier(UMI)的基因表达矩阵作为CopyKAT的输入,通过它们的基因组坐标对它们进行排序,并对基因的排列进行注释。之后,用Freeman-Tukey变换来稳定方差,然后采用多项式动态线性建模矫正单细胞UMI计数矩阵中的异常值。
下一步是建立一个高可信度的正常二倍体细胞子集,用来推测正常二倍体细胞的拷贝数基线值。为此,研究人员将所有单细胞集中到几个小的亚群分类中,并使用高斯混合模型估算每个分类的方差。通过严格的分类标准,具有最小估计方差的聚类被定义为“标准的二倍体细胞”。
为了检测染色体断点,他们整合泊松-伽玛模型和马尔可夫链蒙特卡罗迭代生成每个基因窗口的后验均值,然后应用Kolmogorov-Smirnov检验对均值无显著差异的相邻窗口进行合并,然后计算每个窗口的最终拷贝数值,以此作为跨越每个细胞中相邻染色体断点的所有基因的后验平均值。
2. copyKAT分析实操
2.1 数据准备
library(Seurat)
library(copykat)
library(tidyverse)
rm(list = ls())
scRNA <- readRDS("scRNAsclc.rds")
# scRNA <- UpdateSeuratObject(scRNA)
counts <- as.matrix(scRNA@assays$RNA@counts)
⚠️:做CNV输入的是原始的count数据。有文献提示,使用count数据和log后的data数据来做分析没有什么差别(copyKAT和inferCNV都是),但还是建议使用count数据,因为它自己会进行log标准化。
2.2 CNV分析
copyKAT进行CNV分析不需要给正常的/恶性的参考细胞,它会自己从数据集中判断哪些是最接近于2倍体的正常细胞,以正常细胞为参考,其他细胞跟正常细胞相比来推测CNV变异。
cnv <- copykat(rawmat=counts, ngene.chr=5, sam.name="SCLC", n.cores=8)
# ngene.chr参数是过滤细胞的一个标准,它要求被用来做CNV预测的细胞,一个染色体上至少有5个基因。
# sam.name定义样本名称 (sample name),会给出来的文件加前缀
saveRDS(cnv, "cnv.rds")
绿色是正常细胞,橘色是copykat判断的恶性细胞。热图中蓝色是缺失的,橙色是多于二倍体的。
上一步运行得到的cnv的结构:
# SCLC_copykat_prediction.txt是上一步生成的结果
mallignant <- read.delim("SCLC_copykat_prediction.txt", row.names = 1)
# 原始count中有889个细胞,malignant只有824个,有65个细胞被ngene.chr=5过滤掉了
# 把细胞的良恶性信息加入metadata
scRNA <- AddMetaData(scRNA, metadata = mallignant)
p1 <- DimPlot(scRNA, group.by = "celltype", label = T) + ggsci::scale_color_lancet()
p2 <- DimPlot(scRNA, group.by = "copykat.pred") + scale_color_manual(values = c("red", "gray"))
pc <- p1 + p2
ggsave("pred_mallignant.pdf", pc, width = 12, height = 5)
神经元细胞发生了恶变
scRNA$celltype2 <- scRNA$celltype
scRNA$celltype2[scRNA$copykat.pred=="aneuploid"] <- "mallignant_cell"
table(scRNA$celltype2)
# B_cell mallignant_cell Monocyte Neurons
# 123 91 60 23
# NK_cell T_cells
# 105 487
把神经元细胞分成了恶性的和非恶性的,可以看到,非恶性的有23个,恶性的有91个。
后续可以根据需要使用subset将恶性细胞提出来进行后续更深入的分析。