InferCNV分析笔记
1. 分析目标
InferCNV(Inference of Copy Number Variations)是一种基于单细胞转录组数据推断**拷贝数变异(CNV)**的方法,推测其基因组变异情况。
2. 数据准备
2.1 载入数据
library(Seurat)
setwd(here::here()) # 设置工作目录
scRNA1 = readRDS('./scRNA_harmony_EP.rds')
- 载入单细胞RNA测序数据(已经过 Harmony 校正)。
scRNA1
是 Seurat 对象,包含元数据和表达矩阵。
2.2 选择分析细胞
2.2.1 细胞类型定义
library(dplyr)meta_data <- scRNA1@meta.data %>%mutate(cell_type = case_when(RNA_snn_res.0.6 %in% c("8", "18") ~ "Normal", # 参考细胞(正常/免疫)TRUE ~ "Tumor" # 观测细胞(肿瘤)))
- 正常细胞:RNA_snn_res.0.6 细胞亚群 8、18(参考细胞)。
- 肿瘤细胞:其余亚群。
2.2.2 仅对肿瘤细胞进行采样,保留所有参考细胞
# 提取细胞名称
tumor_cells <- meta_data %>% filter(cell_type == "Tumor") %>% pull(rownames)
normal_cells <- meta_data %>% filter(cell_type == "Normal") %>% pull(rownames)# 对肿瘤细胞进行随机采样(最多3000个)
set.seed(123)
tumor_sample <- sample(tumor_cells, min(3000, length(tumor_cells)), replace = FALSE)# 合并所有参考细胞(不采样)与采样后的肿瘤细胞
selected_cells <- c(tumor_sample, normal_cells)# 构建新的 Seurat 对象
new.scRNA <- subset(scRNA1, cells = selected_cells)
- 保留所有参考细胞(用于 CNV 归一化)。
- 对肿瘤细胞进行采样(最多3000个),避免计算负担过大。
3. 构建 InferCNV 对象
3.1 提取表达矩阵和细胞注释
exprMatrix <- as.matrix(GetAssayData(new.scRNA, slot='counts'))
cellAnnota <- subset(new.scRNA@meta.data, select='RNA_snn_res.0.6')
exprMatrix
:基因表达矩阵(raw counts)。cellAnnota
:细胞分类信息(用于 InferCNV 分组)。
3.2 创建 InferCNV 对象
library(infercnv)infercnv_obj = CreateInfercnvObject(raw_counts_matrix=exprMatrix,annotations_file=cellAnnota,delim="\t",gene_order_file= "/home/jianpeng/yard/BC_TLLZ/TLLZ02_LB/BC-TLLZ02-LB-process/data/gencode_v19_gene_pos.txt",ref_group_names=c("8", "18"))
gene_order_file
:基因的染色体位置信息(gencode_v19)。ref_group_names=c("8", "18")
:- 参考组(非恶性细胞)。
- 仅使用 Normal 细胞 作为参照,提高CNV推断精度。
4. 运行 InferCNV
infercnv_obj = infercnv::run(infercnv_obj,cutoff=0.1, # 10X数据推荐0.1,Smart-seq推荐1out_dir= './output/cnv_epithelial/',cluster_by_groups=F, # 是否按照组分类再聚类hclust_method="ward.D2", plot_steps=F, HMM = F, denoise=T, # 去噪write_expr_matrix = T)
cutoff=0.1
:基因表达阈值,适用于10X数据。denoise=T
:启用去噪处理,提高信噪比。hclust_method="ward.D2"
:层次聚类方法,适合CNV分析。
5. CNV评分计算
library(tidyverse)# 读取InferCNV结果
obs <- read.table("./output/cnv_epithelial/infercnv.observations.txt", header=T)
ref <- read.table("./output/cnv_epithelial/infercnv.references.txt", header=T)# 合并参考与观测细胞
expr <- cbind(obs, ref)
expr.scale <- scale(t(expr))# 归一化 CNV 评分计算
tmp1 <- sweep(expr.scale, 2, apply(expr.scale, 2, min),'-')
tmp2 <- apply(expr.scale, 2, max) - apply(expr.scale,2,min)
expr_1 <- t(2*sweep(tmp1, 2, tmp2, "/")-1)cnv_score <- as.data.frame(colSums(expr_1 * expr_1))
colnames(cnv_score) = "cnv_score"
cnv_score <- rownames_to_column(cnv_score, var='cell')
cnv_score$cell <- gsub("\\.", "-", cnv_score$cell)
- 计算 CNV评分(变异程度越高,评分越高)。
- 标准化后计算平方和 以量化CNV程度。
6. 结果可视化
6.1 关联 Seurat Meta 数据
scRNA_sample = subset(scRNA1, cells = cnv_score$cell)meta <- scRNA_sample@meta.data %>%rownames_to_column(var='cell') %>%inner_join(cnv_score, by='cell') %>%column_to_rownames(var='cell')
- 将CNV评分合并到元数据,用于可视化分析。
6.2 可视化 CNV 评分
library(ggpubr)
p = ggboxplot(meta, "RNA_snn_res.0.6", "cnv_score", fill = "RNA_snn_res.0.6") + scale_y_continuous(limits = c(0, 3000)) + xlab("Cluster") + ylab("CNV Score") +theme(panel.border = element_rect(colour = "black", fill = NA, size = 0.5)) +theme(legend.position = "none")ggsave(p, filename = './output/epithelial_cell/CNV/CNV_cluster_RNA_snn_res.0.6.pdf', width = 7, height = 4)
- 箱线图展示CNV评分与细胞群体的关系。
- 可用于对比不同细胞群体的CNV变异趋势。
7. 结果解读
- CNV评分较高的细胞群体可能包含恶性肿瘤细胞。
- 参考细胞(如免疫细胞)应具有较低CNV评分,用于区分正常/肿瘤细胞。
- 可结合其他单细胞分析方法(NicheNet, SCENIC)深入解析CNV相关的基因调控网络。
8. 总结
- 优化采样策略:
- 仅对肿瘤细胞进行采样(最大 3000 个),避免数据量过大。
- 保留所有参考细胞(Normal 细胞),确保 InferCNV 计算的准确性。
- InferCNV 主要流程:
- 数据筛选与预处理(分层采样,选择参考细胞)。
- 创建InferCNV对象(设定参考组,载入基因位置信息)。
- 运行 InferCNV 分析(聚类,去噪,计算CNV)。
- 计算 CNV 评分(标准化,平方和计算)。
- 可视化分析(展示 CNV 评分的分布)。