6、无重复差异基因分析(edgeR包的使用)

1)简介

edgeR作用对象是count文件,rows 代表基因,行代表文库,count代表的是比对到每个基因的reads数目。它主要关注的是差异表达分析,而不是定量基因表达水平。

edgeR works on a table of integer read counts, with rows corresponding to genes and columns to independent libraries. The counts represent the total number of reads aligning to each gene (or other genomic locus).edgeR is concerned with differential expression analysis rather than with the quantification of expression levels. It is concerned with relative changes in expression levels between conditions,but not directly with estimating absolute expression levels.

edgeR作用的是真实的比对统计,因此不建议用预测的转录本

Note that edgeR is designed to work with actual read counts. We not recommend that predicted transcript abundances are input the edgeR in place of actual counts.

归一化原因:

技术原因影响差异表达分析:
1)Sequencing depth:统计测序深度(即代表的是library size);
2)RNA composition:个别异常高表达基因导致其它基因采样不足
3)GC content: sample-specific effects for GC-content can be detected
4)sample-specific effects for gene length have been detected

注意:edgeR必须是原始表达量,而不能是rpkm等矫正过的。
Note that normalization in edgeR is model-based, and the original read counts are not themselves transformed. This means that users should not transform the read counts in any way before inputing them to edgeR. For example, users should not enter RPKM or FPKM values to edgeR in place of read counts. Such quantities will prevent edgeR from correctly estimating the mean-variance relationship in the data, which is a crucial to the statistical strategies underlying edgeR.Similarly, users should not add artificial values to the counts before inputing them to edgeR.
个人是不太推荐没有重复的差异表达分析,因为毕竟统计学上的p值是为了证明两个样本的差异是真实存在而不是抽样误差导致的,
因此每当别人提问的时候, 我个人的建议就是定性看看倍数变化吧. 但是如果真的强行要算p值, 其实也不是不行, edgeR就是一种选择.

2)、首先安装edgeR 包
#如果没有安装BiocMaRnager则先安装BiocManager,之后通过BiocManager安装edgeR包

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")

BiocManager::install("edgeR")

安装结束之后开始处理文件

3)矩阵构建及差异分析

需要构建2个矩阵:1、表达矩阵;2、分组矩阵( 实验设计);

3.1 表达矩阵

3.11 读取文件

# 首先读取counts文件之后查看count文件前6行
> rawdata <- read.csv(file = "C://Users/My/Desktop/diff_name",header = T,stringsAsFactors = F)
# 查看读取的diff_name文件
> head(rawdata)
  X    ensembl_gene_id               gene_id control_W55 test_K54 external_gene_name
1 1 ENSMUSG00000000001  ENSMUSG00000000001.4           7       11              Gnai3
2 2 ENSMUSG00000000003 ENSMUSG00000000003.15           0        0               Pbsn
3 3 ENSMUSG00000000028 ENSMUSG00000000028.15           1        0              Cdc45
4 4 ENSMUSG00000000031 ENSMUSG00000000031.16           0        2                H19
5 5 ENSMUSG00000000037 ENSMUSG00000000037.17           0        0              Scml2
6 6 ENSMUSG00000000049 ENSMUSG00000000049.11          54       33               Apoh

读取完数据之后我们先预处理一下数据,比如我只想要ensembl_gene_id、control_w55、tese_k54、external_gene_name这几列,并调整一下顺序。

> swap_rawdata <- cbind(rawdata$ensembl_gene_id,rawdata$external_gene_name,rawdata$control_W55,rawdata$test_K54)
> head(swap_rawdata)
     [,1]                 [,2]    [,3] [,4]
[1,] "ENSMUSG00000000001" "Gnai3" "7"  "11"
[2,] "ENSMUSG00000000003" "Pbsn"  "0"  "0" 
[3,] "ENSMUSG00000000028" "Cdc45" "1"  "0" 
[4,] "ENSMUSG00000000031" "H19"   "0"  "2" 
[5,] "ENSMUSG00000000037" "Scml2" "0"  "0" 
[6,] "ENSMUSG00000000049" "Apoh"  "54" "33"
# 得到的这个swap_rawdata是一个matrix,如果想要让其变为data frame
> swap_rawdata <- data.frame(swap_rawdata)
# 查看一下是否转化成功
> head(swap_rawdata)
     ensembl_gene_id external_gene_name control_W55 test_K54
1 ENSMUSG00000000001              Gnai3           7       11
2 ENSMUSG00000000003               Pbsn           0        0
3 ENSMUSG00000000028              Cdc45           1        0
4 ENSMUSG00000000031                H19           0        2
5 ENSMUSG00000000037              Scml2           0        0
6 ENSMUSG00000000049               Apoh          54       33
# 转化完转化先存一份csv文件在电脑里,便于之后用电脑查看
> write.csv(x = swap_rawdata,file = "C://Users/My/Desktop/swap_rawdata.csv")
# 存完之后直接从电脑导入你刚存的文件,这样做可以避免出现numeric数据框变成factor形式
> swap_rawdata <- read.table("swap_rawdata.csv",header = T,sep = ",")
# 查看
> head(swap_rawdata)
  X    ensembl_gene_id external_gene_name control_W55 test_K54
1 1 ENSMUSG00000000001              Gnai3           7       11
2 2 ENSMUSG00000000003               Pbsn           0        0
3 3 ENSMUSG00000000028              Cdc45           1        0
4 4 ENSMUSG00000000031                H19           0        2
5 5 ENSMUSG00000000037              Scml2           0        0
6 6 ENSMUSG00000000049               Apoh          54       33
> data.class(swap_rawdata[1,1])
3.2 接着构建DGEList对象

这里因为已经有rawdata的count文件,因此直接用DGEList()函数就行了,否则要用readDGE()函数

# 首先载入edgeR 包
> library(edgeR)
# 构建DGEList
> group <- 1:2
> y <- DGEList(counts = swap_rawdata[,4:5],genes = swap_rawdata[,2:3],group = group)
# 查看构建完y的信息
> y

查看构建DGElist的运行结果:

DGEList对象主要有三部分:

1、counts矩阵:包含的是整数counts;

2、samples数据框:包含的是文库(sample)信息。包含 lib.size列 :for the library size (sequencing depth) for each sample,如果不自定义, the library sizes will be computed from the column sums of the counts。其中还有一个group列,用于指定每个sample组信息

3、一个可选的数据框genes:gene的注释信息

第二步: 过滤 low counts数据。与DESeq2的预过滤不同,DESeq2的预过滤只是为了改善后续运算性能,在运行过程中依旧会自动处理low count数据,edgeR需要在分析前就要排除那些low count数据,而且非常严格。从生物学角度,有生物学意义的基因的表达量必须高于某一个阈值。从统计学角度上, low count的数据不太可能有显著性差异,而且在多重试验矫正阶段还会拖后腿。

数据过滤

由于原来的表达量矩阵基因数太大, 可能存在某些基因根本没有表达, 因此需要预先过滤

> keep <- rowSums(cpm(y)>1) >= 1
> y <- y[keep, , keep.lib.sizes=FALSE]
> y

这部分代码的意思指的是保留在至少在一个样本里有表达的基因(CPM > 1)。 基因数就从原来的55318变为15868

标准化

考虑到测序深度不同, 我们需要对其进行标准化, 避免文库大小不同导致的分析误差.

edgeR里默认采用TMM(trimmed mean of M-values) 对配对样本进行标准化,用到的函数是calcNormFactors

> y <- calcNormFactors(y)

执行结果:

差异表达分析

不同差异表达分析工具的目标就是预测出dispersion(离散值), 有了离散值就能够计算p值. 那么dispersion怎么计算呢? edgeR给了几个方法

根据经验给定一个值(BCV, square-root-dispersion). edgeR给的建议是, 如果你是人类数据, 且实验做的很好(无过多的其他因素影响), 设置为0.4, 如果是遗传上相似的模式物种(这里为小鼠), 设置为0.1 (查询edgeR的bioconductor包所得)
Simply pick a reasonable dispersion value, based on your experience with similar data,and use that for exactTest or glmFit. Typical values for the common BCV (square-root dispersion) for datasets arising from well-controlled experiments are 0.4 for human data,0.1 for data on genetically identical model organisms or 0.01 for technical replicates.

> y_bcv <- y
# 因为本次的数据使用的是小鼠的数据,所以使用0.1
> bcv <- 0.1
> et <- exactTest(y_bcv, dispersion = bcv ^ 2)
> gene1 <- decideTestsDGE(et, p.value = 0.05, lfc = 0)
> head(gene1)
> summary(gene1)

执行结果:


由统计结果可知,下调的基因为816个,上调的基因为572个

如果觉得觉得基因较多的话,可以上调bcv的值

> y_bcv <- y
> bcv <- 0.2
> et2 <- exactTest(y_bcv, dispersion = bcv ^ 2)
> gene2 <- decideTestsDGE(et2, p.value = 0.05, lfc = 0)
> summary(gene2)

执行结果:

由统计结果可知,下调的基因为377个,上调的基因为221个
与之前的结果相比,的确已经减少很多

将结果整理成excel表

# 改一下gene1的名称
> colnames(gene1) <- "Signifi"
# 组合将所需要的数据组成一个新的data.frame
> results <- cbind(y$genes,y$counts,et$table,gene1)
> head(results)
# 将新生成的results数据框写成一个excel数据表
> write.csv(x = results,file = "C://Users/My/Desktop/DEresult.csv",row.names = F)

执行结果:

生成的excel表可以将down expressed 和 up expressed基因分开

参考文献:https://blog.csdn.net/u012110870/article/details/102804557
https://www.bioconductor.org/packages/release/bioc/vignettes/edgeR/inst/doc/edgeRUsersGuide.pdf

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章