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")
输入文件
- 单细胞 RNA-seq 表达量的原始矩阵(行为基因,列为细胞)
- 注释文件,记录肿瘤和正常细胞(第一行为细胞名,第二行为细胞分组)
- 基因或染色体位置文件(第一列为基因名,第二列为所在染色体,第三、四列为起始终止位置)
运行细节
# 准备输入文件构建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结果解读
可以看到图片存在明显的差别,中间细胞是不存在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)