inferCNV

inferCNV原理及在植物单细胞应用可能性

Posted by CHY on September 7, 2020

inferCNV 用于分析单细胞 RNA-seq 数据,分析是否存在一定的染色体拷贝数变异 CNV。
工作原理是,以一组”正常”细胞作为参考,分析肿瘤基因组上各个位置的基因表达量强度变化. 通过热图的形式展示每条染色体上的基因相对表达量,相对于正常细胞,肿瘤基因组总会过表达或者低表达。

可以将拟南芥根各细胞类型注释清楚后,选择分生组织与其他细胞类型进行 CNV 分析。

安装

# 安装JAGS
tar xf JAGS-4.3.0.tar.gz
cd JAGS-4.3.0
./configure --libdir=/usr/local/lib64
make -j 20 && make install

# 安装R包
install.packages("rjags")
if (!requireNamespace("BiocManager", quietly = TRUE))
     install.packages("BiocManager")
BiocManager::install("infercnv")

输入文件

  1. 单细胞 RNA-seq 表达量的原始矩阵(行为基因,列为细胞)
  2. 注释文件,记录肿瘤和正常细胞(第一行为细胞名,第二行为细胞分组)
  3. 基因或染色体位置文件(第一列为基因名,第二列为所在染色体,第三、四列为起始终止位置)

运行细节

# 准备输入文件构建inferCNV对象
infercnv_obj = CreateInfercnvObject(raw_counts_matrix=matrix,
                                    annotations_file="cellAnnotations.txt",
                                    delim="\t",
                                    gene_order_file="gene_ordering_file.txt",
                                    ref_group_names=c("normal"))
# ref_group_names指定参考组的名称,当不知道时,设定ref_group_name=NULL

# 运行标准inferCNV流程
infercnv_obj = infercnv::run(infercnv_obj,
                             cutoff=1,  # use 1 for smart-seq, 0.1 for 10x-genomics
                             out_dir="output_dir",  # 输出文件夹
                             cluster_by_groups=T,   # 聚类
                             denoise=T, #去噪
                             HMM=T) # 是否基于HMM预测CNV
# 关键参数是cutoff, 用于选择哪些基因会被用于分析(在所有细胞的平均表达量需要大于某个阈值)

inferCNV结果解读

inferCNV结果解读.png inferCNV结果解读及利用之进阶
可以看到图片存在明显的差别,中间细胞是不存在CNV时间的。
inferCNV中最重要的两个文件:infercnv.observations_dendrogram.txt 和 infercnv.observations.txt;infercnv.observations_dendrogram.txt 文件,里面存储着inferCNV的CNV热图的细胞的层次聚类情况。

# 了解层级聚类信息
rm(list=ls())
options(stringsAsFactors = F)
library(phylogram)
library(gridExtra)
library(grid)
require(dendextend)
require(ggthemes)
library(tidyverse)
library(Seurat)
library(infercnv)
library(miscTools)

#  Import inferCNV dendrogram
infercnv.dend <- read.dendrogram(file = "plot_out/inferCNV_output2/infercnv.observations_dendrogram.txt")
# Cut tree 
infercnv.labels <- cutree(infercnv.dend, k = 6, order_clusters_as_data = FALSE)
table(infercnv.labels)
# Color labels
the_bars <- as.data.frame(tableau_color_pal("Tableau 20")(20)[infercnv.labels])
colnames(the_bars) <- "inferCNV_tree"
the_bars$inferCNV_tree <- as.character(the_bars$inferCNV_tree)
 
infercnv.dend %>% set("labels",rep("", nobs(infercnv.dend)) )  %>% plot(main="inferCNV dendrogram") %>%
  colored_bars(colors = as.data.frame(the_bars), dend = infercnv.dend, sort_by_labels_order = FALSE, add = T, y_scale=100 , y_shift = 0)

table(infercnv.labels)