查看原文
其他

答读者问第一弹:R里面差异分析的limma包用法细节

jimmy 生信技能树 2022-06-07

又一次收到一个同样的求助,我不得不写推文来公开介绍这个知识点,希望大家转发给所有的初学者,别再犯糊涂了!

问题描述如下:

曾老师,这是limma包的第42页,我也在附件里面给您发了这个,我想问下,这个Group前面有时候加0,有时候不加,是个什么讲究呢。另外这里有2种方法建立这个approach,怎么选择合适呢。非常感谢您。


其实很久以前我就专门在我的github里面提到到这个知识点,这些年陆陆续续回答了不下十次这个细节的讲解了。

差异分析是否需要比较矩阵

最流行的差异分析软件就是limma了,它现在更新了一个voom的算法,所以既可以对芯片数据,也可以对转录组高通量测序数据进行分析,其它所有的差异分析软件其实都是模仿这个的。

我以前讲到过做差异分析,需要三个数据:

  • 表达矩阵

  • 分组矩阵

  • 差异比较矩阵

前面两个肯定是必须的,有表达矩阵,样本必须进行分组,才能分析,但是我看到过好几种例子,有的有差异比较矩阵,有的没有。

后来我仔细研究了一下limma包的说明书,发现这其实是一个很简单的问题。

大家仔细观察下面的两个代码

首先是不需要差异比较矩阵的

   library(CLL)    data(sCLLex)    library(limma)    design=model.matrix(~factor(sCLLex$Disease))    fit=lmFit(sCLLex,design)    fit=eBayes(fit)    options(digits = 4)    #topTable(fit,coef=2,adjust='BH')    > topTable(fit,coef=2,adjust='BH')               logFC AveExpr      t   P.Value adj.P.Val     B    39400_at  1.0285   5.621  5.836 8.341e-06   0.03344 3.234    36131_at -0.9888   9.954 -5.772 9.668e-06   0.03344 3.117    33791_at -1.8302   6.951 -5.736 1.049e-05   0.03344 3.052    1303_at   1.3836   4.463  5.732 1.060e-05   0.03344 3.044    36122_at -0.7801   7.260 -5.141 4.206e-05   0.10619 1.935    36939_at -2.5472   6.915 -5.038 5.362e-05   0.11283 1.737    41398_at  0.5187   7.602  4.879 7.824e-05   0.11520 1.428    32599_at  0.8544   5.746  4.859 8.207e-05   0.11520 1.389    36129_at  0.9161   8.209  4.859 8.212e-05   0.11520 1.389    37636_at -1.6868   5.697 -4.804 9.355e-05   0.11811 1.282

然后是需要差异比较矩阵的

   library(CLL)    data(sCLLex)    library(limma)    design=model.matrix(~0+factor(sCLLex$Disease))    colnames(design)=c('progres','stable')    fit=lmFit(sCLLex,design)    cont.matrix=makeContrasts('progres-stable',levels = design)    fit2=contrasts.fit(fit,cont.matrix)    fit2=eBayes(fit2)    options(digits = 4)    topTable(fit2,adjust='BH')               logFC AveExpr      t   P.Value adj.P.Val     B    39400_at -1.0285   5.621 -5.836 8.341e-06   0.03344 3.234    36131_at  0.9888   9.954  5.772 9.668e-06   0.03344 3.117    33791_at  1.8302   6.951  5.736 1.049e-05   0.03344 3.052    1303_at  -1.3836   4.463 -5.732 1.060e-05   0.03344 3.044    36122_at  0.7801   7.260  5.141 4.206e-05   0.10619 1.935    36939_at  2.5472   6.915  5.038 5.362e-05   0.11283 1.737    41398_at -0.5187   7.602 -4.879 7.824e-05   0.11520 1.428    32599_at -0.8544   5.746 -4.859 8.207e-05   0.11520 1.389    36129_at -0.9161   8.209 -4.859 8.212e-05   0.11520 1.389    37636_at  1.6868   5.697  4.804 9.355e-05   0.11811 1.282

大家运行一下这些代码就知道,两者结果是一模一样的。

而差异比较矩阵的需要与否,主要看分组矩阵如何制作的!

design=model.matrix(~factor(sCLLex$Disease))

design=model.matrix(~0+factor(sCLLex$Disease))

有本质的区别!!!

前面那种方法已经把需要比较的组做出到了一列,需要比较多次,就有多少列,第一列是截距不需要考虑,第二列开始往后用coef这个参数可以把差异分析结果一个个提取出来。 

而后面那种方法,仅仅是分组而已,组之间需要如何比较,需要自己再制作差异比较矩阵,通过makeContrasts函数来控制如何比较!

关键问题在于大家只是想学一个limma包的用法,并没有去探究里面的本质,每个参数的设置都是有意义的,而且里面的统计学知识非常丰富。

如果你也想问我问题,请看点击这个提问须知

苹果用户如果要赞赏,请点击欢迎商务洽谈

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存