CopyKAT:从高通量单细胞RNASeq数据推断人类肿瘤的基因组拷贝数和亚克隆结构
人类肿瘤单细胞RNA测序的一个主要挑战是区分癌细胞和非恶性细胞类型,以及存在多个肿瘤亚克隆。CopyKAT(肿瘤的复制数量Karyotyping)是一种计算工具,使用综合性的贝叶斯方法在单个细胞中以5MB分辨率识别全基因组阳极,将肿瘤细胞与正常细胞分离,肿瘤亚克龙使用高通量sc-RNAseq数据。从RNASeq数据中计算DNA拷贝数事件的基本逻辑是,许多相邻基因的基因表达水平可以提供深度信息来推断该地区的基因组拷贝数。CopyKAT 估计的副本编号配置文件可以实现高度一致 (80%)通过全基因组DNA测序获得的实际DNA拷贝编号。预测肿瘤/正常细胞状态的理由是,阳极性在人类癌症中很常见(90%)。具有广泛全基因组拷贝数畸变(非多体)的细胞被视为肿瘤细胞,而频闪正常细胞和免疫细胞通常具有2N双倍体或近双倍体拷贝数特征。在此晕影中,我们将通过从 10X 单细胞 RNA 数据中计算单细胞拷贝编号配置文件、预测肿瘤和正常细胞以及从使用 [copykat} R 包推断肿瘤子片的例子。
第 1 步:安装
从 GitHub 安装复印件
library(devtools)
install_github("navinlabcode/copykat")
当前版本为 V1.0.4。要更新,请删除并拆卸旧版本,然后重新安装。
这个名为exp.rawdata的包包含一个由10X 3'RNAseq协议测序的乳腺肿瘤的原始UMI基质。
要测试软件包,只需在 R/Rstudio 中发布此行代码:
copykat.test <- copykat(rawmat=exp.rawdata, sam.name="test")
第 2 步:准备读数输入文件
运行 copykat 所需的唯一输入文件是原始基因表达矩阵,其中行中带有基因 ID,列中带有细胞名称。基因 ID 可以是基因符号或合奏 ID。矩阵值通常是来自当今高倍数单细胞RNASeq数据的独特分子标识符(UMI)的计数。早期生成的 scRNASeq 数据可以归纳为 TPM 值或总读数,这也应有效。下面我提供了一个从 10 倍输出生成此 UMI 计数矩阵的示例。
从 10 x基因组学细胞排列器 V3 输出生成输入文件的示例
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)
我可以保存矩阵供将来使用。
write.table(exp.rawdata, file="exp.rawdata.txt", sep="\t", quote = FALSE, row.names = TRUE)
在此晕影中,我们将使用 UMI 计数矩阵、exp.rawdata 来演示工作流程。
第 3 步: 运行复制品
现在我已经准备了唯一的一个输入,原始UMI计数矩阵,我准备运行复印机。细胞排列器输出中的默认基因 ID 是基因符号,因此我放置了"符号"或"S"。要过滤掉细胞,我要求每个染色体中至少有5个基因来计算DNA拷贝数。我可以调低到ngene.chr=1,以保持尽可能多的细胞,但我认为使用至少5个基因来表示一个染色体不是很严格。要过滤掉基因,我可以调整参数,只保留在LOW中表达的基因。博士到上。DR细胞的分数。我把默认值放低。博士=0.05,向上。博士=0.2。我可以调低这些值,以保持更多的基因在分析中。我需要确保低。DR小于向上。博士虽然。
我要求复制品每段至少取25个基因。我可以玩其他选项, 每个垃圾箱 15 - 150 个基因。KS.cut 是细分参数,范围从 0 到 1 不等。增加 KS.cut 会降低灵敏度,即减少细分市场/断点。通常工作范围为 0.05-0.15。
在这里,我通过设置n.核心=4进行并行计算。默认值为 1。
我还通过设置 sam.name+"测试"来给出示例名称。
一个挣扎和测试的观察是,没有一个聚类方法可以适应所有数据集。在此版本中,我添加了聚类的距离参数,包括"欧几里德"分离和相关距离,即。1- "皮尔森" 和 "斯皮尔曼" 相似性。一般来说,皮质距离倾向于嘈杂的数据,而欧几里德距离则倾向于具有较大 CN 段的数据。
我添加一个选项来输入已知的正常单元格名称作为矢量对象。默认值为空。
我添加了一个只有无倍体或二倍体细胞的细胞线数据模式。按单元格设置此单元格线模式。组织样本的默认值为单元格。行="否"。此细胞线模式使用数据变体中的系统基线,该基线不代表已发布的算法。此细胞线模式既不能保证成功,也不能保证准确性。
现在运行代码:
library(copykat)
copykat.test <- copykat(rawmat=exp.rawdata, id.type="S", ngene.chr=5, win.size=25, KS.cut=0.1, sam.name="test", distance="euclidean", norm.cell.names="", n.cores=4)
运行一个具有超过 10,000 个单个单元的数据集可能需要一段时间。建议使用"Rscript"在终端运行大型数据集,而不是在 R/Rstudio 的交互式模式下运行复印机。我通常运行'脚本run_copycat。R'在分离,并采取10倍输出或原始UMI计数矩阵作为输入使用参数。
在此步骤之后,复制卡特自动保存计算的拷贝号矩阵、热图和肿瘤/正常预测导致我的工作目录。我也可以从对象中提取它们如下:
pred.test <- data.frame(copykat.test$prediction)
CNA.test <- data.frame(copykat.test$CNAmat)
第 4 步:导航预测结果
现在让我们来看看预测结果。预测的无倍体细胞被推断为肿瘤细胞:双体细胞是频闪正常细胞。
请注意,筛选的单元格未包含在结果中。我正在争论我是否应该在结果中包括所有细胞。
head(pred.test)
CNA 矩阵中的前 3 列是基因组坐标。行是220KB箱的基因组订单。
head(CNA.test[ , 1:5])
Copykat 还生成估计副本编号的热图图。行是单个单元格:列是220kb箱的基因组顺序。
my_palette <- colorRampPalette(rev(RColorBrewer::brewer.pal(n = 3, name = "RdBu")))(n = 999)
chr <- as.numeric(CNA.test$chrom) %% 2+1
rbPal1 <- colorRampPalette(c('black','grey'))
CHR <- rbPal1(2)[as.numeric(chr)]
chr1 <- cbind(CHR,CHR)
rbPal5 <- colorRampPalette(RColorBrewer::brewer.pal(n = 8, name = "Dark2")[2:1])
com.preN <- pred.test$copykat.pred
pred <- rbPal5(2)[as.numeric(factor(com.preN))]
cells <- rbind(pred,pred)
col_breaks = c(seq(-1,-0.4,length=50),seq(-0.4,-0.2,length=150),seq(-0.2,0.2,length=600),seq(0.2,0.4,length=150),seq(0.4, 1,length=50))
heatmap.3(t(CNA.test[,4:ncol(CNA.test)]),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", paste("pred.",names(table(com.preN)),sep=""), pch=15,col=RColorBrewer::brewer.pal(n = 8, name = "Dark2")[2:1], cex=0.6, bty="n")
第5步:定义非多体肿瘤细胞的亚种群
我观察了双倍体细胞和双倍细胞。下一步是提取在非多样肿瘤中被视为肿瘤细胞的非倍体细胞,以定义单个肿瘤细胞的两个拷贝编号亚种群。
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')
现在我已经定义了两个具有重大亚克隆差异的亚种群,我可以继续比较它们的基因表达特征,并评估亚克隆拷贝数变化的基因剂量效应。
最后一点,我还把一些有用的注释数据连同复印件:
- 完整。anno:56051基因(hg38)的完整注释,包括绝对位置,chr,开始,结束,合奏ID,基因符号和G波段。
- DNA.hg20:不包括Y染色体的220kb变量箱hg38中的坐标。
- 循环基因:从复制品分析中删除。
- 原始数据:来自乳房肿瘤的UMI基质。
最后一点是,CopyKAT很难预测肿瘤和正常细胞在儿科和液体肿瘤的情况下,有几个CNA。CopyKAT 提供了两种方法来绕过这一点,以给出某些输出,而不是死星光:1) 从同一数据集输入已知正常细胞的细胞名称的载体 2) 或尝试搜索 T 细胞。
Citation:
Gao, R., Bai, S., Henderson, Y. C., Lin, Y., Schalck, A., Yan, Y., Kumar, T., Hu, M., Sei, E., Davis, A., Wang, F., Shaitelman, S. F., Wang, J. R., Chen, K., Moulder, S., Lai, S. Y. & Navin, N. E. (2021). Delineating copy number and clonal substructure in human tumors from single-cell transcriptomes. Nat Biotechnol. doi:10.1038/s41587-020-00795-2.