单细胞分析实录(11): inferCNV的基本用法
InferCNV可以用于肿瘤单细胞RNA-Seq数据中鉴定大规模染色体拷贝数变异,例如整个染色体或大片段染色体的扩增或缺失。基本思路是在整个基因组范围内,将每个肿瘤细胞基因表达与平均表达或“正常”参考细胞基因表达对比,确定其表达强度。
这段话来自InferCNV官方文档:https://github.com/broadinstitute/inferCNV/wiki
实际分析中,我们经常用inferCNV来判断肿瘤细胞。当然还可以做肿瘤异质性、克隆进化方面的探索,这部分我会在下一期的推文中介绍,本期推文介绍基本使用。公众号后台回复20210404获取今天的代码和测试数据。
1. 安装
初次安装加载时,可能会提示你安装JAGS,根据提示安装JAGS后,再加载InferCNV就没问题
BiocManager::install("infercnv")
library("infercnv")
错误: package or namespace load failed for ‘infercnv’:
loadNamespace()里算'rjags'时.onLoad失败了,详细内容:
调用: fun(libname, pkgname)
错误: Failed to locate any version of JAGS version 4
The rjags package is just an interface to the JAGS library
Make sure you have installed JAGS-4.x.y.exe (for any x >=0, y>=0) from
http://www.sourceforge.net/projects/mcmc-jags/files
2. 输入
在进行分析之前,需要准备三个文件:
- Raw Counts Matrix for Genes x Cells
- 细胞的注释文件
共两列,一列CB,一列细胞来源,tab分割,无列名;
如果肿瘤细胞的注释类似malignant_{patient},则在后续聚类画图时,设置cluster_by_groups=T
会根据patient的来源进行区分
该文件的CB可以小于count矩阵,此时inferCNV只会对这部分细胞进行分析; - 基因排序文件
tab分割,无列名
只有该文件和count矩阵共有的基因才会被分析(可以去掉不想画图的基因,比如线粒体基因),且该文件的染色体顺序决定了最终热图的染色体顺序(有些文章的图,inferCNV热图的染色体顺序是颠倒的,问题就出在这儿)。
我一般是根据cellranger提供的参考基因组gtf注释文件,得到基因排序文件
格式如下
WASH7P chr1 14363 29806
LINC00115 chr1 761586 762902
NOC2L chr1 879584 894689
MIR200A chr1 1103243 1103332
3. 流程
看一下这张流程图
我比较关注最后两步,去噪和CNV预测是分开的,一些已发表的文章这部分的分析都是基于去噪之后的结果(比如那张热图),CNV预测结果用的比较少,个人觉得使用analysis_mode = "subclusters"模式后的热图更好看,而且只有6个值
这是官网的一张对比图
4. 使用
主要步骤只有两步,如下
library(infercnv)
#使用inferCNV之前,最好过滤掉低质量的细胞
infercnv_obj = CreateInfercnvObject(raw_counts_matrix="oligodendroglioma_expression_downsampled.counts.matrix",
annotations_file="oligodendroglioma_annotations_downsampled.txt",
delim="\t",
gene_order_file="gencode_downsampled.EXAMPLE_ONLY_DONT_REUSE.txt",
ref_group_names=c("Microglia/Macrophage","Oligodendrocytes (non-malignant)")
)
#ref_group_names参数根据细胞注释文件填写,在示例中,这两种细胞是非恶性细胞,所以作为参照;
#ref_group_names=NULL,则会选用所有细胞的平均表达作为参照,这种模式下,最好能确保细胞内在有足够的差异
infercnv_obj = infercnv::run(infercnv_obj,
cutoff=1,
out_dir="try",
cluster_by_groups=TRUE,
#analysis_mode="subclusters", #默认是"samples"
denoise=TRUE,
HMM=TRUE,
num_threads=4
)
#去噪,HMM预测CNV这两项我一般都选上
关于cutoff
参数,官网是这样说的:cutoff=1 works well for Smart-seq2, and cutoff=0.1 works well for 10x Genomics,表示基因在所有参照细胞中,表达count的平均值的最小阈值,10X数据更稀疏,所以这个值小
cluster_by_groups
:先区分细胞来源,再做层次聚类
out_dir
表示输出文件夹的名字,没有会自动创建
5. 输出
我认为重要的输出文件
infercnv.png
降噪之后生成的最终热图,图中的数值是"Residual expression values",可以简单理解为基因表达值的另一种形式;
infercnv.references.txt : the 'normal' cell matrix data values
对应热图的参照panel
infercnv.observations.txt : the tumor cell matrix data values
对应热图的观测panel
infercnv.observation_groupings.txt
group memberships for the tumor cells as clustered,对应热图的观测panel的两个bar
"Dendrogram Group" "Dendrogram Color" "Annotation Group" "Annotation Color"
"MGH36_P9_B01" "1" "#8DD3C7" "1" "#8DD3C7"
"MGH36_P3_E06" "1" "#8DD3C7" "1" "#8DD3C7"
#2 3列只有一类值
#4 5列有四类值
infercnv.observations_dendrogram.txt
树状图的newick格式,对应热图的观测panel的“树”
run.final.infercnv_obj这个rds文件,以及包含在其中的三个子文件
如下
@expr.data:对应最终热图的表达文件
@reference_grouped_cell_indices:对应最终热图的reference细胞名称
@observation_grouped_cell_indices:对应最终热图的observation细胞名称
HMM_CNV_predictions.*.pred_cnv_regions.dat:
第二列是CNV的name,唯一;
第一列是CNV所属的group,inferCNV默认的模式(analysis_mode = "samples")是将一个patient作为一个整体找CNV,所以示例会有四个group;
4 5 6列包含CNV的坐标;
第三列表示状态:
State 1: 0x: complete loss
State 2: 0.5x: loss of one copy
State 3: 1x: neutral
State 4: 1.5x: addition of one copy
State 5: 2x: addition of two copies
State 6: 3x: essentially a placeholder for >2x copies but modeled as 3x
$ less -S HMM_CNV_predictions.HMMi6.hmm_mode-samples.Pnorm_0.5.pred_cnv_regions.dat | head -n 3
cell_group_name cnv_name state chr start end
malignant_MGH36.malignant_MGH36_s1 chr1-region_2 2 chr1 6281253 144341756
malignant_MGH36.malignant_MGH36_s1 chr1-region_4 3 chr1 151336778 156213123
HMM_CNV_predictions.*.cell_groupings
tumor subclusters和cell的对应关系
只有analysis_mode = "subclusters"模式下才会生成,这个模式挺慢,但肿瘤异质性和克隆进化都是在这种模式下做的
cell_group_name cell
malignant_MGH36.malignant_MGH36_s1 MGH36_P3_E06
malignant_MGH36.malignant_MGH36_s1 MGH36_P10_E07
HMM_CNV_predictions.*.pred_cnv_genes.dat
每一个group(第一列), 每一个CNV片段(第二列)上面每一个基因(第四列)的CNV状态(第三列),文件中基因这一列是唯一的
$ less -S HMM_CNV_predictions.*.pred_cnv_genes.dat | head -n 3
cell_group_name gene_region_name state gene chr start end
malignant_MGH36.malignant_MGH36_s1 chr1-region_2 2 ACOT7 chr1 6281253 6296032
malignant_MGH36.malignant_MGH36_s1 chr1-region_2 2 NOL9 chr1 6324329 6454451
该文件可以查询感兴趣基因的CNV状态,如下:
$ grep EGFR HMM_CNV_predictions.HMMi6.hmm_mode-samples.Pnorm_0.5.pred_cnv_genes.dat | head -n 3
malignant_MGH36.malignant_MGH36_s1 chr7-region_16 5 EGFR chr7 54819943 54827667
malignant_93.malignant_93_s1 chr7-region_98 4 EGFR chr7 54819943 54827667
malignant_97.malignant_97_s1 chr7-region_142 4 EGFR chr7 54819943 54827667
这种方法看基因的CNV状态,也有局限性,只有当这个基因与它所处的CNV region的CNV状态比较一致才会被找出来,如果这个基因的CNV状态比周围一些基因的CNV状态强很多,则找不出来。
个人猜测是因为inferCNV是画窗口针对相邻的多个基因做推断,如果只有一个基因表达很高或很低,则被平均掉
上述的这些输出文件,对于深入分析CNV很有用,但是如果只区分肿瘤细胞,则用不到这么多文件。
6. 画图
infercnv包也包含了画图函数plot_cnv,这个知道的人不多,
library(RColorBrewer)
infercnv::plot_cnv(infercnv_obj, #上两步得到的infercnv对象
plot_chr_scale = T, #画染色体全长,默认只画出(分析用到的)基因
output_filename = "better_plot",output_format = "pdf", #保存为pdf文件
custom_color_pal = color.palette(c("#8DD3C7","white","#BC80BD"), c(2, 2))) #改颜色
后续应该还有两篇inferCNV的内容,敬请期待~
因水平有限,有错误的地方,欢迎批评指正!