hello,大家好,隔离的第六天,一个人的日子总是很难熬,孤独的时候,还是很希望大家多与我交流交流单细胞空间的内容,以此来排解孤独的情绪,今天周六,我们不讲新的内容,回顾一下推断CNV的分析软件CopyCAT,之前呢,分享过一次,文章在copyKAT推断单细胞转录组肿瘤细胞CNV(自动识别肿瘤normal和tumor),这一篇我们来回顾一下这个软件,包括算法和示例代码。
单细胞转录组分析广泛用于研究肿瘤。然而,将肿瘤微环境中的正常细胞类型与恶性细胞区分开来并解析肿瘤内的克隆亚结构仍然具有挑战性(目前我们运用最多的还是inferCNV)。为了应对这些挑战,开发了一种集成的贝叶斯分割方法,称为CopyKAT,以从高通量单细胞 RNA 测序数据中的读取深度估计平均基因组分辨率为 5 Mb 的基因组拷贝数谱(这个地方的数据我们还是要详细说明一下)。
Overview of CopyKAT workflow
scRNA-seq 方法已成为描绘肿瘤微环境 (TME) 中正常细胞类型和了解各种癌症中肿瘤细胞表达程序的有力工具。然而,分析大规模数据集的一个主要挑战是将肿瘤细胞与 TME 中的基质细胞和免疫细胞区分开来,以便可以独立研究它们。区分肿瘤细胞与正常细胞的一种有效方法是鉴定非整倍体拷贝数谱,这在大多数肿瘤中很常见(88%),而在具有二倍体基因组的基质细胞类型中不存在。以前的方法,例如 inferCNV 和 HoneyBadger,已经表明可以根据足够大的基因组区域的 RNA 读取计数来估计基因组拷贝数谱。然而,这些方法是为分析来自第一代 scRNA-seq 技术的数据而设计的,这些技术具有较低的细胞通量和较高的覆盖深度(这个地方要注意一下)。这些方法不适用于分析来自新开发的高通量 scRNA-seq 平台(微滴和纳米孔平台)的数据,这些平台执行全转录组扩增和仅在非常稀疏的覆盖深度下对 mRNA 的 3' 或 5' 端进行测序。此外,以前的方法不能准确地解决特定染色体断点的基因组位置或从非整倍体拷贝数谱中对肿瘤和正常细胞进行分类。为了应对这些挑战,开发了 CopyKAT 并将其应用于各种肿瘤样本,以识别非整倍体肿瘤细胞并描绘肿瘤块内共存的不同亚群的克隆亚结构。
总结一下inferCNV的分析缺点(这个是文章中作者的观点)
- 为分析来自第一代 scRNA-seq 技术的数据而设计的,技术具有较低的细胞通量和较高的覆盖深度
- 不适用于分析来自新开发的高通量 scRNA-seq 平台(微滴和纳米孔平台)的数据,这些平台执行全转录组扩增和仅在非常稀疏的覆盖深度下对 mRNA 的 3' 或 5' 端进行测序(10X的单细胞技术具有这个特点)
- 不能准确地解决特定染色体断点的基因组位置或从非整倍体拷贝数谱中对肿瘤和正常细胞进行分类(这个地方的难度相当高,我们来看看CopyCAT如何解决这个问题)。
Overview of CopyKAT workflow.
CopyKAT 的统计工作流程将贝叶斯方法与层次聚类相结合(inferCNV其实也用到了层次聚类),以计算单个细胞的基因组拷贝数谱,并从高通量 3' scRNA-seq 数据中定义克隆子结构。该工作流程将唯一分子标识符 (UMI) 计数的基因表达矩阵作为计算的输入。分析从成行的基因注释开始,按照它们的基因组坐标对它们进行排序(跟inferCNV的原理一致)。执行 Freeman-Tukey 变换以稳定方差,然后执行多项式动态线性建模 (DLM) 以平滑单细胞 UMI 计数中的异常值。下一步是检测具有高置信度的二倍体细胞子集,以推断正常 2N 细胞的拷贝数基线值(这个好像是软件CopyCAT自动检测的)。为此,将单个细胞池化为几个小的层次聚类,并使用高斯混合模型 (GMM) 估计每个聚类的方差。通过遵循严格的分类标准,具有最小估计方差的cluster被定义为“自信的二倍体细胞”。当数据只有少数正常细胞或肿瘤细胞具有接近二倍体基因组且拷贝数畸变 (CNA) 事件有限时,可能会发生潜在的错误分类(软件的缺点,这个地方大家要注意)。在这种情况下,CopyKAT 提供了一种“GMM 定义”模式来逐个识别二倍体正常细胞,其中假设单个细胞中基因表达的三种高斯模型的混合代表基因组gain、loss和中性状态。当处于中性状态的基因占表达基因的至少 99% 时,单个细胞被定义为二倍体细胞。
为了检测染色体断点(chromosome breakpoints,),我们整合了泊松伽马模型和马尔可夫链蒙特卡洛 (MCMC) 迭代来生成每个基因窗口的后验均值,然后应用 Kolmogorov-Smirnov (KS) 检验来加入在它们之间没有显著差异的相邻窗口方法。为了加快计算速度,将数千个单细胞分成clusters,找到一致的染色体断点并将它们合并在一起,形成样本中整个细胞群的基因组断点的联合。然后将每个窗口的最终拷贝数值计算为跨越每个细胞中相邻染色体断点的所有基因的后验平均值。我们通过将基因重新排列到 220-kb 可变基因组bin中,进一步将得到的拷贝数值从基因空间转换为基因组位置,从而以大约 5 Mb 的分辨率获得每个单细胞的全基因组拷贝数谱。基因组分辨率是根据整个基因组的中位相邻基因距离(~20 kb)乘以基因窗口的大小(25个基因)来估计的(精度高于inferCNV)。然后我们对单细胞拷贝数数据进行层次聚类,以确定非整倍体肿瘤细胞和二倍体基质细胞之间的最大距离;但是,如果基因组距离不显著,我们切换到 GMM 定义模型来逐个预测单个肿瘤细胞。最后,我们对单细胞拷贝数数据进行聚类以识别克隆亚群并计算代表亚克隆基因型的共有谱,以进一步分析它们的基因表达差异。
算法原理
至于前面的数据预处理和推断参考细胞类型的部分,我们不过多讨论,主要就是CNV的推断。
Copy number segmentation.
为了执行segmentation,首先通过应用 R 包 MCMCpack 中的 MCpoissongamma 函数,使用基于具有伽马先验的泊松似然的蒙特卡罗模拟来转换clusters一致性以在细胞clusters内找到染色体断点。 假设分段均值的泊松分布和泊松参数的共轭伽马分布如下:
其中 y 是反向转换的 UMI 计数,α 和 β 是伽马分布的形状参数。 为每个窗口模拟 1,000 个后验均值,然后使用 Kolmogorov-Smirnov (KS) 检验来确定是否应将相邻窗口连接在一起。 将 KS 检验统计量 D 计算为两个相邻窗口的后验均值累积分布之间的最大垂直距离:
其中 x 对应于相邻窗口 i 和 j 的后验均值。 如果 KS 检验统计量 D 大于截止值,则定义断点。 如果在第一轮中使用初始截止值定义的断点少于 25 个,将截止值降低 50%。 我们对每个clusters最多重复这个过程两次。 统一来自每个clusters的所有断点,以形成整个群体的共识断点。 然后,通过将 MCpoissongamma 函数应用于每个单个细胞的所有共识窗口来计算相邻断点之间每个窗口的后验均值作为分段均值。 然后,对平均值进行对数转换,并将数据居中作为每个基因的最终相对拷贝数比率。 最后,通过计算落入human基因组中 220kb 基因组bin的基因的平均值,将单个基因拷贝数转换为基因组bin,以根据 scRNA-seq 数据估计每个细胞的全基因组拷贝数谱。
Theoretical estimation of genomic copy number resolution
为了估计从单细胞 RNA 数据推断出的拷贝数谱的预期分辨率,下载了 GRCh38 (v28) 中所有基因条目的 BED 文件。因为染色体 Y 不包括在拷贝数计算中,只考虑了位于染色体 1-22 和染色体 X 上的基因,它们共有 56,051 个基因条目。通过取基因起始位置和基因结束位置的平均值来估计单个基因的基因组中心位置。接下来,根据基因组位置对所有基因进行排序,并通过计算两个基因中心之间的距离来估计两个相邻基因之间的距离。总的来说,在整个基因组中定义了 56,028 个基因区间。从染色体 1-22 和染色体 X 中,基因区间的数量如下:5,127, 3,872, 2,925, 2,430, 2,779, 2,802, 2,292, 2,189, 2,137, 3,189, 2,857, 1,279, 2,152, 2,081, 2,440, 1,133、2,917、1,350、795、1,300 和 2,281。整个基因组中基因间隔的第一四分位数、中位数、平均值、第三四分位数和最大值如下:9,430 bp、24,532 bp、52,806 bp、58,485 bp 和 21,765,992 bp。因为基因区间的大小分布严重向右倾斜,计算了中值来估计拷贝数分辨率。因为需要在pipeline中的整个单细胞群中检测到至少 7,000 个基因,所以这个数字相当于基因检测率的中位数 7,000/56,051 ≈ 12.5%。最后,将分析中的最小基因间隔计算为每个基因间隔 24,532 bp ÷ 12.5% ≈ 200 kb。我们使用 25 个基因窗口启动了我们的拷贝数分析;因此,估计片段的最小大小为 200 kb × 25 = 5 Mb,用于检测每个细胞基因组中的拷贝数事件的基因组分辨率。
示例代码及结果解读
installation
library(devtools)
install_github("navinlabcode/copykat")
注意输入的矩阵是测序的原始矩阵
copykat.test <- copykat(rawmat=exp.rawdata, sam.name=“test”)
prepare readcount input
准备运行 copykat 的唯一一个直接输入是原始基因表达矩阵,其中行中包含基因,列中包含细胞名称。 基因 id 可以是基因符号或 ensemble id。 矩阵值通常是来自当今高通量单细胞 RNAseq 数据的唯一分子标识符 (UMI) 的计数。 早期生成的 scRNAseq 数据可以总结为 TPM 值或总读取计数,这也应该有效。 下面提供了一个从 10X 输出生成这个 UMI 计数矩阵的示例。
An example to generate input from 10X genomics cellranger V3 output
library(Seurat)
raw <-Read10X(data.dir =data.path.to.cellranger.outs)
raw <- CreateSeuratObject(counts =raw,project ="copycat.test",min.cells = 0,min.features = 0)
exp.rawdata <- as.matrix(raw@assays$RNA@counts)
run copykat
已经准备好唯一的一个输入,原始 UMI 计数矩阵,准备运行 copykat。 默认的基因 ids in cellranger 输出是基因符号,所以输入“符号”或“S”。 为了过滤掉细胞,需要每条染色体中至少有 5 个基因来计算 DNA 拷贝数。 可以将它调低到 ngene.chr=1 以保持尽可能多的细胞,但是认为使用至少 5 个基因来代表一个染色体并不是很严格。 为了过滤外基因,可以调整参数以仅保留在 LOW.DR 到 UP.DR 部分细胞中表达的基因。 这里设置默认 LOW.DR=0.05,UP.DR=0.2。 可以调低这些值以在分析中保留更多基因。 不过,需要确保 LOW.DR 小于 UP.DR。
要求 copykat 每个片段至少取 25 个基因。 也可以使用其他选项,范围为每箱bin 15-150 个基因。 KS.cut 是分段参数,范围从 0 到 1。增加 KS.cut 会降低灵敏度,即减少分段/断点。
一项艰难而有趣的观察是,没有一种聚类方法可以适合所有数据集。 在这个版本中,为聚类添加了一个距离参数,包括“欧几里得”距离和相关距离,即。 1-“pearson”和“spearman”的相似性。 一般来说,校正距离倾向于有利于噪声数据,而欧几里德距离倾向于有较大 CN 段的数据。
library(copykat)
copykat.test <- copykat(rawmat=exp.rawdata,id.type="S",cell.line="no",ngene.chr= 5,win.size=25,KS.cut=0.2,sam.name="test",distance="euclidean",n.cores=4)
pred.test <- data.frame(copykat.test$prediction)
CNA.test <- data.frame (copykat.test$CNAmat)
navigate prediction results
Predicted aneuploid cells are inferred as tumor cells; diploid cells arestromal normal cells.
The first 3 columns in the CNA matrix are the genomic coordinates. Rows are 220KB bins in genomic orders.
热图:
define subpopulations of aneuploid tumor cells
tumor.cells <- pred.test$cell.names[which(pred.test$copykat.pred=="aneuploid")]
tumor.mat <- CNA.test[, which(colnames(CNA.test) %in% tumor.cells)]
hcc <- hclust(parallelDist::parDist(t(tumor.mat),threads =4, method = "euclidean"), method = "ward.D2")
hc.umap <- cutree(hcc,2)
rbPal6 <- colorRampPalette(RColorBrewer::brewer.pal(n = 8, name = "Dark2")[3:4])
subpop <- rbPal6(2)[as.numeric(factor(hc.umap))]
cells <- rbind(subpop,subpop)
heatmap.3(t(tumor.mat),dendrogram="r", distfun = function(x) parallelDist::parDist(x,threads =4, method = "euclidean"), hclustfun = function(x) hclust(x, method="ward.D2"),
ColSideColors=chr1,RowSideColors=cells,Colv=NA, Rowv=TRUE,
notecol="black",col=my_palette,breaks=col_breaks, key=TRUE,
keysize=1, density.info="none", trace="none",
cexRow=0.1,cexCol=0.1,cex.main=1,cex.lab=0.1,
symm=F,symkey=F,symbreaks=T,cex=1, cex.main=4, margins=c(10,10))
legend("topright", c("c1","c2"), pch=15,col=RColorBrewer::brewer.pal(n = 8, name = "Dark2")[3:4], cex=0.9, bty='n')
现在已经定义了两个具有主要亚克隆差异的亚群,可以继续比较它们的基因表达谱,并评估亚克隆拷贝数变化对基因表达的影响。
最后一点,一些有用的注释数据和copykat:
- full.anno:56051个基因(hg38)的完整注释,包括绝对位置、chr、start、end ensemble id、基因符号和Gband。
- DNA.hg20:不包括 Y 染色体的 220kb 变量 bin 在 hg38 中的坐标。
- cyclegenes:从CNV分析中删除。
- exp.rawdata:来自乳腺肿瘤的 UMI 矩阵。
最后,CopyKAT 难以预测具有少量 CNA 的pediatric和liquid tumors的肿瘤和正常细胞。 CopyKAT 提供了两种方法来绕过它以提供特定的输出:1)输入来自同一数据集的已知正常细胞的细胞名称向量 2)或尝试搜索 T 细胞。(看来可以用免疫细胞作为ref)。
好了,生活很好,有你更好,希望疫情赶紧结束