InferCNV分析+结果可视化

作者: 汪汪队队长_莱德 | 来源:发表于2022-04-24 21:27 被阅读0次

    写在前面,其实现在网上很多对于一个包(一个/种分析)更多是讲分析代码或流程,但是对于分析结果可视化的教程讲的比较少,这导致我这种画图小白无法对结果进行plot,或者可视化不如意。所以我会在这次分析的后面加上一些可视化的教程,希望大家喜欢。
    首先还是讲一下inferCNV这个包能干嘛,个人的理解就是它能根据参比,推断(infer)出某一个细胞的拷贝数变异(CNV)的程度,而拷贝数变异与肿瘤细胞的发生发展有着密切的关系,一般来说,肿瘤细胞的拷贝数会比正常的细胞的高所以inferCNV主要应用于肿瘤的研究中

    inferCNV分析

    分析流程
    1.第一步:加载包+准备数据集 (这里的scRNA.data加载后的scRNA是我自己的seurat对象)

    #加载包,清空
    library(Seurat)
    library(tidyverse)
    library(ggplot2)
    library(infercnv)
    library(ComplexHeatmap)
    library(ggpubr)
    rm(list=ls())
    #加载数据
    load("scRNA.Rdata")
    # 随机提取2000个细胞演示    这里可以不比学,我是想跑一下流程而已
    tmp <- sample(colnames(scRNA),2000) 
    scRNA_harmony <- scRNA[,tmp]
    

    2.第二步:整理分析所需要的数据

    #########################################################################################################################################################
    #思考一下 如何推断cnv的  gene的表达量(count表达矩阵),gene的位置(基因染色体信息),比较信息(分组信息)
    #inferCNV需要三个文件1.count表达矩阵,2.分组信息,3.基因染色体信息
    
    #制作基因染色体位置信息 和提取表达矩阵
    dat <- GetAssayData(scRNA_harmony,assay = "RNA",slot = "counts")
    dat <- as.data.frame(dat)
    expFile=system.file("extdata", "oligodendroglioma_expression_downsampled.counts.matrix.gz", package = "infercnv")  #这个是inferCNV自带参比数据集  用来做infer
    geneFile=system.file("extdata", "oligodendroglioma_annotations_downsampled.txt", package = "infercnv")   #这个是inferCNV自带参比数据集  用来做infer
    groupFiles=system.file("extdata", "gencode_downsampled.EXAMPLE_ONLY_DONT_REUSE.txt", package = "infercnv")    #这个是inferCNV自带参比数据集  用来做infer
    
    library(AnnoProbe)    #用jimmy老师的包  这个包很强大,如同数据库,这一次我们用这个包做一个基因与其染色体位置
    geneInfor=annoGene(rownames(dat),"SYMBOL",'human')    #可能有一些gene 无法anno
    colnames(geneInfor)
    geneInfor=geneInfor[with(geneInfor, order(chr, start)),c(1,4:6)]      
    geneInfor=geneInfor[!duplicated(geneInfor[,1]),]
    length(unique(geneInfor[,1]))
    head(geneInfor)
    
    dat=dat[match(geneInfor[,1], rownames(dat)),]    #将表达矩阵的基因排列顺序与geneInfor的基因排列顺序弄成一致
    rownames(geneInfor) <- geneInfor$SYMBOL   
    geneInfor <- geneInfor[,-1]     #这样我们就制作好了染色体位置信息和排列顺序好的count表达矩阵
    
    #制作mate信息
    meta <- subset(scRNA_harmony@meta.data,select = c("celltype"))   #假如你后面是想分析每一个群的CNV的话  这里要改成seruat_cluster
    
    #验证1   表达矩阵的列名要与meta的行名一致
    identical(colnames(dat),rownames(meta))  
    #验证2   表达矩阵的行名要与geneInfor的行名一致
    identical(rownames(dat),rownames(geneInfor))
    
    #因此三个输入数据准备好了   dat-表达矩阵  meta-分组信息  geneInfor-基因染色体信息
    

    我大概有这么多基因没有注释到染色体的位置信息

    53b6f635ac1c5bdbeb05d1ff02541b1.png
    基因的位置信息
    83359298cf84d6ebdca3da4082d9bc5.png
    meta数据
    ea492ca8913e001154d02b05104aedd.png
    表达矩阵
    1799b93e8dba35564afc811225c442a.png
    3.第三步 inferCNV分析
    #二步法构建对象
    infercnv_obj = CreateInfercnvObject(raw_counts_matrix=dat,
                                        annotations_file=meta,
                                        delim="\t",
                                        gene_order_file=geneInfor,
                                        ref_group_names=c("T cells"))   #选基础的细胞  或者样本 看meta的输入类型   也可以不选择 算法根据平均值来自己算
    
    infercnv_obj = infercnv::run(infercnv_obj,
                                 cutoff=1, # cutoff=1 works well for Smart-seq2, and cutoff=0.1 works well for 10x Genomics
                                 out_dir="cnv1/", 
                                 cluster_by_groups=TRUE,  # 选择TRUE是按样本分组 改为FALSE会进行按另一个参数k_obs_groups给出的分组数(默认为1)进行分组
                                 denoise=F,     #是否去噪
                                 HMM=T)   # 是否基于HMM预测CNV,True的话时间很久
    #结果输出在当前工作路径下的out_dir文件夹下(最终会输出很多文件在out_dir的目录下)   可以直接用里面的热图
    
    #也就可以对热图进行改造  换颜色(用inferCNV的官方的画图函数)
    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已经结束了,但是身为小白的我很不情愿呀,难道我就只能够用他给出来的结果了吗,不!我要自己主导自己想要展示的内容

    结果可视化第一种

    提取inferCNV的结果 用相线图或者小提琴图画不同组或者细胞中的cnv的结果,就可以比较不同的细胞群或者不同的样本的CNV的差异,对!最重要的就是差异

    b5a9fa6b4cf6adc9c8e62d024d6e4ac.png
    这样就可以看出哪种细胞的CNV变异最大了,就最有可能是肿瘤细胞
    那么这种图应该怎么做呢?图不就是数据的体现吗,我们可以从图中看出X轴为细胞类型,Y轴是该细胞类型的CNV值,那么我们只需要这两个数据就可以了。要做成的表格如下,每一个细胞的CNV数(obs),这个细胞属于什么cluster,什么类型的细胞,来源哪里(orig.ident)
    e900ae60061929d6d791b509409b19c.png
    #第一步:提取inferCNV的结果   
    obs <- read.table("cnv1/infercnv.observations.txt",header = T,check.names = F)     #首先这个obs是每一个基因在每一个细胞的拷贝信息,相当于该基因的拷贝量
    if(T){              #可以通过定义obs的元素数值来让差异变大   在后面画图就能够更大的差异   也可以不运行,更真实体现拷贝数(但是可能没有啥差异)
      max(obs)          #根据最大最小值来定义
      min(obs)     
      obs[obs > 0.6 & obs < 0.7] <- -2   #把0.6-0.7定义为数值2  后面依此类推
      obs[obs >= 0.7 & obs < 0.8] <- -1
      obs[obs >= 0.8 & obs < 1.0] <- 0
      obs[obs >= 1.0 & obs <= 1.1] <- 1
      obs[obs > 1.1 & obs <= 1.3] <- 2
      obs[obs > 1.3] <- 2
    }
    
    score=as.data.frame(colSums(obs))   #把obs的每一个基因拷贝量加起来,就是这个细胞的总拷贝数obs
    
    #提取meta信息  celltype,seurat_clusters,orig.ident
    meta <- subset(scRNA_harmony@meta.data,select = c("celltype","seurat_clusters","orig.ident"))  #提取该细胞的其他的meta信息
    
    #将meta信息添加给score
    meta <- rownames_to_column(meta)
    score <- rownames_to_column(score)
    score <- merge(score,meta,by.x = "rowname",by.y = "rowname")    #这里会可能损失一些细胞   为什么呢,因为在前面infer时,有一些细胞无法推断,会被删掉,但是总体上问题不大
    
    #我们现在可以用ggplot画图了     但是直接这样出图很丑   因为他会根据你的Y轴的大小  所以建议定义y轴范围
    ggboxplot(score,"orig.ident","colSums(obs)",fill="orig.ident")   #也可以将orig.ident换成celltype
    #+scale_y_continuous(limits = c(0, 1000))
    

    这样就可以知道哪一个样本来源的细胞拷贝数变化大了(我这里只是一个示例数据集,不符合趋势勿喷)

    结果可视化第二种

    有一天我看了一篇文献,觉得做的还蛮有意思的,也能讲一些东西,我将图片show出来,然后我们就朝着那个目标前进吧

    10726e95d30bcb42c8e6743b912eaf4.png
    3cfb5a6a30ec811e506d50f3aef5c57.png
    文献出处《Single-cell RNA sequencing highlights the role of inflammatory cancer-associated fibroblasts in bladder urothelial carcinoma》

    就是相当于给每一个细胞定义了一个CNV的程度,并plot
    所以大家无奖竞猜一下,我们画图需要用到什么样的数据呢,有两个哦,一个是细胞每一个基因的表达量,一个是细胞的注释(相当于热图上面的anno)

    #第一步
    #我们先解决细胞注释的表格
    #由于我们要定义CNV的程度,所以首先要将数值变成注释
    #加change列,标记inferCNV的变化
    max(score$`colSums(obs)`)          #根据最大最小值来定义
    min(score$`colSums(obs)`)          #一般变化倍数大于2倍的可以定义为拷贝数变异
    k1 = score$`colSums(obs)` < 250*2;table(k1)      #这里的250是我min(score$`colSums(obs)`)的结果 
    k2 = score$`colSums(obs)` >= 250*2.5;table(k2)
    score <- mutate(score,change = ifelse(k1,"normal",ifelse(k2,"High","Low")))  #要看懂这段代码  ifelse的条件句  假如符合K1标准为normal,不符合就按照ifelse(k2,"High","Low")这个条件再分,假如符合K2标准就High,不符合就Low
    table(score$change)   #这样就做好了一个anno
    rownames(score) <- score$rowname
    score <- score[order(score$`colSums(obs)`),]   #对数据框进行升序排列  如果加decreasing = T就实现降序排列,这样就会对后面热图的细胞顺序进行排序,为什么想对细胞排序呢,因为我想让CNV属于normal,High,Low的细胞排一起,
    score <- score[,-c(1,2)]  #删除多余的
    
    #第二步,解决细胞每一个基因的表达量
    #由于前面score跟meta merge了,所以这里要对dat进行匹配
    dat=dat[,match(rownames(score), colnames(dat))]
    identical(rownames(score), colnames(dat))#这样每一个细胞的anno和它的基因表达量就对应了,记住一定要对应,要想明白哈,有些东西虽然不报错,但是你对应错了,结果也是错的。
    dat <- log2(dat+1)#这一步的目的是给表达矩阵取log2,增加基因之间的差异
    
    #第三步 画图啦
    #想自定义annotation的颜色       
    ann_colors = list(
      change = c(normal="black", Low="white",High="red"))   #这里也可以改变多个anno的颜色  
    
    #画热图
    library(pheatmap)
    pheatmap(dat,
             show_colnames =F,
             show_rownames = F,
             scale = "row",
             cluster_cols = F,                                        #这些参数建议去Google
             cluster_rows = F, 
             annotation_col=score,
             annotation_colors = ann_colors,
             colorRampPalette(c("#00FF00", "white", "#DC143C"))(75),   #改热图的颜色
             breaks = seq(-3,3,length.out = 100))
    

    相关文章

      网友评论

        本文标题:InferCNV分析+结果可视化

        本文链接:https://www.haomeiwen.com/subject/olbaertx.html