前面说到DESeq2包需要准备两个输入文件,一个是样本列表矩阵,一个是row count定量表达矩阵,接下来我们要对样本进行两两比对,找到两组之间有多少个基因上调和下调,不进行两两比对直接把4组数据4个重复全部导进去得到的结果是没有意义的,这里用DESeq2做表达基因的差异分析
举个栗子,我先进行短日照的“0”组样本和经过“1”天长日照的1组样本之间进行差异基因分析,从前面整理的样本列表矩阵我们可以看到,0组样本四个重复分别是ERR1698194、ERR1698202、ERR1698203和ERR1698204,同样1组数据4个重复分别为ERR1698205、ERR1698206、ERR1698207和ERR1698208,因此我们需要重新整理我们需要的数据做成csv格式,如下所示:
定量表达矩阵第一行需要和样本列表矩阵的第一列一一对应,顺序需要一模一样
下面讲解如何使用DESeq2
1. 代码示范
前面处理好raw count定量表达矩阵,建立样本列表矩阵后,我们就可以在rstudio里运行DESeq2包进行差异基因筛选了。代码如下。
1 | library("DESeq2") |
2. 代码详解
详细解释一下过程:
在R里运行程序或者写代码,首先要确定好工作目录在哪里,将之前Stringtie转化的定量表达矩阵和样本列表矩阵全都放在工作目录下,这里我的表达量矩阵是transcript_count_matrix_0_1.csv,分组列表矩阵是sample_list_0_1.csv。getwd()
可以查看当前工作目录,在全局设置里可以更改工作目录。
library("DESeq2")
# 加载DESeq2这个R包
mycounts <- read.csv("gene_count_matrix_0_1.csv",row.names = 1)
# 载入raw count矩阵,以第一列数据作为行名,读取的矩阵命名为mycounts
mycounts_1 <- mycounts[rowSums(mycounts) != 0,]
# 过滤每一行mapping总数为0的基因,将数据集整理命名为mycounts_1
mymeta <- read.csv("sample_list_0_1.csv",stringsAsFactors = T)
# 载入样品列表,遇到字符串将其转化为一个因子
colnames(mycounts_1) == mymeta$id
# 检查raw count矩阵第一行是否与样品列表的id列是否一致(如下)。这个很重要,不一致跑DESeq2会报错。如果显示false就要调整
mymeta$index <- factor(mymeta$index,levels = c("0","1"))
# 这一步同样重要,把样本分组文件的分组列转换到因子,不然会报错。我这里对照组是第0天,所以把“1”放在“0”之后,这里顺序需要特别说明!样本和定量矩阵的分组只要一一对应可以不排序,这里一定要分清楚哪个组和哪个组进行比较,否则会得出完全相反的结论!
1 | dds <- DESeqDataSetFromMatrix(countData = mycounts_1, |
# 中间那一长串是DESeq2包里的函数,countData是raw count定量矩阵,colData是样品列表,design是分组信息,这步是为了构造用于差异表达分析的数据集,并将数据集命名为dds
dds <- DESeq(dds)
# 分析的核心DESeq程序
res <- results(dds)
# 将结果输出至res数据集
res_1 <- data.frame(res)
# res不是常规的数据,我们可以用head和class命令查看一下(如下图),需要转化成常规的数据框格式才可以对其进行加减列等操作,转换格式后的数据集名字为res_1
library("dplyr")
# 加载这个包是为了对数据框进行操作,我是要增加新的一列统计差异表达情况
1 | res_1 %>% |
# 调用dplyr包给数据集增加新的一列group,log2FoldChange >=1,padj <=0.05,判断这个基因表达为上调,在log2FoldChange <=-1,padj <=0.05时判断这个基因表达为下调,其余情况为该基因表达情况不变。将结果输出到res_2数据集。
FoldChange表示两样品间表达量比值,是倍数变化,差异表达基因分析里,log2 fold change绝对值大于1为差异基因筛选标准。padj是调整后的p值,在p检验里,p值小于0.05是有显著差异的标志。
table(res_2$group)
# 查看差异基因表达的结果,上调基因多少,下调基因有多少,不变的有多少
write.csv(res_2,file = "gene_0_1.csv", quote = F)
# 输出和生成gene_0_1.csv文件,即为结果文件
3. 结果演示
我对“0”组样本(对照)和长日照1天,2天和3天这一共4组样本分别进行两两对比,做了基因表达差异分析(0_1表示0组和1组对比,1_2表示1组和2组对比,依次类推不再赘述),同时与原文献补充数据2中的差异分析结果做对比
0组与1组对比,187个基因上调,149个基因下调;原文57个基因上调,79个基因下调
0组与2组对比,51个基因上调,42个基因下调;原文21个基因上调,24个基因下调
0组与3组对比,142个基因上调,143个基因下调;原文107个基因上调,84个基因下调
1组和2组对比,26个基因上调,29个基因下调;原文3个基因上调,0个基因下调
1组和3组对比,46个基因上调,50个基因下调;原文8个基因上调,2个基因下调
2组和3组对比,11个基因上调,13个基因下调;原文2个基因上调,1个基因下调
点击这里下载原文基因表达差异总表(补充数据2)
3.1 分析
我做的差异分析总体趋势和文章类似,都是短日照组(SD组,也就是0组)与长日照1、2、3天组(LD组,分别对应123组)相比,有较多基因出现差异性表达;而长日照1、2、3天组之间相比差异表达基因较少,这样才合理,表明拟南芥茎尖分生组织在开花期长日照下,确实有不同的基因参与了光周期诱导的开花过程。如果要对这些差异表达的基因做更深入的分析(下游分析),我们就要比对GO库或者KEGG库进行代谢通路富集分析和注释。以后的笔记会说到。
至于为什么我得到的差异基因普遍比原文多,一个是差异分析之前用的分析软件不同,在过滤数据过程中我的条件比较松(只过滤了count数为0的基因),另外不同软件的组装、比对和计数的算法实现也不一样。另外,我们得到这个基因差异表达结果之后,还可以做个更直观的火山图看我们的差异基因分布是否合理,之后也会说。