054-再一次认真学习limma

刘小泽写于18.11.18

好资料值得花时间学习,即便是英文版。limma的学习资料有很多,我每次更新的也是不同的内容,希望能多涉及一些关于limma的知识,充实大脑

https://kasperdanielhansen.github.io/genbioconductor/html/limma.html

配置

之前果子更新了一篇推送,讲的就是bioconductor的安装方式发生了改变。我们之前直接source+install.package安装,现在用到了biocmanager。刚开始转换还遇到了一点问题,可能是网络原因吧,总提示安不上biocmanager。但是有问题不能怕,相信“一切软件问题都不是问题”,只要电脑还健在,就可以解决

# 先安装BiocManager,它位于CRAN 
if(length(getOption("CRAN"))==0) options(CRAN="https://mirrors.tuna.tsinghua.edu.cn/CRAN/")
if(!require("BiocManager")) install.packages("BiocManager",update = F,ask = F)

# 然后添加BioC的国内源,可以选清华或者中科大
if(length(getOption("BioC_mirror"))==0) options(BioC_mirror="https://mirrors.ustc.edu.cn/bioc/")

# 这就是最新的安装方式了
if(!require("limma")) BiocManager::install("limma",update = F,ask = F)
# 再安装一个数据包(关于白血病的)、
if(!require("leukemiasEset")) BiocManager::install("leukemiasEset",update = F,ask = F)

前言

LIMMA的意思原来是“linear models for microarray data”,这也就解释了为什么其中有构建线性模型的步骤【线性模型包括了线性回归、多重线性回归、方差分析等】另外limma是为芯片而生。但不仅止于此,后来衍生的limma-voom也依然成了今天转录组差异分析的金标准。另外DNA甲基化也可以用limma去分析(当然我现在还没有涉及这部分)

使用limma需要有一个代表某种测量的数值矩阵,比如基因表达矩阵(一般就是行为feature,列为sample)或者组蛋白修饰、Hi-C contact matrix。这里feature可以代表许多含义,在样本信息中(比如GEO得到的样本信息数据框)一个feature表示一个样本,在表达矩阵中一个feature就等于一个基因,另外还可以表示基因组区间(比如不同的启动子promoters或者基因重叠区域 genomic bins)。不论是limma还是deseq2或者是edgeR,都采用了经验贝叶斯方法获取feature信息。

我们这里只讨论基因表达数据,包括芯片和转录组数据,这种数据中一般样本数量在100以内,最多一般也不超过1000,并且样本是有分组的,最常见的就是对照组control和处理组case。我们分析的目标也就是找到不同组之间差异的features(genes)。

但是并非每次都是两组比较,有时涉及到更多信息,比如年龄、性别;然后还有更复杂的,就是时间序列信息,所有的样本是按照时间点划分的,每个时间点为一个组,包括了几个样本。因此,一个实验的design矩阵 就是组间样本是如何分布的。样本一般是相互独立的,但是有时也是成对出现,比如同一个病人的正常与癌变组织就是这样一对样本。最常见的design就是两个未成对的组之间的比较。

两组比较 A two group comparison

获取数据

# 使用的是一个表达数据集ExpressionSet=》leukemiasEset
library(leukemiasEset)
data(leukemiasEset) #使用data来加载这个数据集
table(leukemiasEset$LeukemiaType)

得到结果如下:这是4组不同的白血病和1组对照的样本信息,其中NoL意思是不是白血病(Not leukemia)即正常对照组

## 
## ALL AML CLL CML NoL 
##  12  12  12  12  12

如果想知道ALL型白血病与对照组之间的差异基因,可以先取出相关的子集ALL和NoL

myData <- leukemiasEset[, leukemiasEset$LeukemiaType %in% c("ALL", "NoL")]
myData$LeukemiaType <- factor(myData$LeukemiaType)
# 这里你会看到,虽然myData只包含了ALL和NoL两种type,但是显示的因子还是5种,因此需要重新赋值一下因子类型
myData$LeukemiaType <- factor(myData$LeukemiaType)

线性模型

现在做一个标准的limma model fit

design <- model.matrix(~ myData$LeukemiaType)
fit <- lmFit(myData, design)
fit <- eBayes(fit)
topTable(fit)

首先,为了比较感兴趣组的样本(这里的ALL和NoL),我们用model.matrix构建了design矩阵(叫design可以理解为是从实验设计角度出发),这里的design矩阵有两组【多组的需要稍微变一下构建方法】;

其次,拟合线性模型(line model fitting),然后利用经验贝叶斯方法【这是limma的核心所在】 得到基因间强度关系(gene strength),因为这个实验矩阵(design)只有两组,因此只有一种比较方法:即比较他们之间的基因差别;

然后,使用topTable函数列出差异表达最显著的基因【如果实验设计比较复杂,还需要告诉topTable比较哪些interest特征】

得到的结果部分如下:

                   logFC  AveExpr        t      P.Value    adj.P.Val
ENSG00000163751 4.089587 5.819472 22.51729 9.894742e-18 1.733025e-13
ENSG00000104043 4.519488 5.762115 21.98550 1.718248e-17 1.733025e-13
ENSG00000008394 5.267835 7.482490 20.08250 1.374231e-16 9.240332e-13
  • 其中一个重要的部分是logFC,也就是case与control组之间的log Fold change值,这里有个注意事项:你需要知道样本组比较顺序(是ALL-NoL还是NoL-ALL)。如果是前者,那么logFC为正就说明相对NoL,基因在ALL是高表达的。因此判断哪个样本为reference是很重要的。那么如何判断?
myData$LeukemiaType
##  [1] ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL ALL NoL NoL NoL NoL NoL
## [18] NoL NoL NoL NoL NoL NoL NoL
## Levels: ALL NoL

​ 就看上面这个代码的结果中哪个因子首先出现,它就作为reference

​ 这里的结果是ALL先出现,因此ALL组是reference,也就是NoL-ALL的模式,这样的话,如果得到的logFC是正值,那么就说明在ALL组中基因表达下调

​ 如果想要改变reference组,可以用relevel()函数

  • 另外结果还包括t检验数据、P值(P.Value 对于多组比较未校正)、校正的P值(adj.P.Val 默认使用Benjamini-Horchberg方法对多组进行P值校正)
Yunze Liu
Yunze Liu
Bioinformatics Sharer

Co-founder of Bioinfoplanet(生信星球)

Next
Previous

Related