用samr包对芯片数据做差异分析

本来搞差异分析的工具和包就一大堆了,而且limma那个包已经非常完善了,我是不准备再讲这个的,正好有个同学问了一下这个包,我就随手测试了一下,顺便看看它跟limma有什么差异没有!手痒了就记录了测试流程!

学习一个包其实非常简单,就是找到包的官网看看说明书即可!说明书链接

samr这个包更简单,就一个函数SAM,但是根据分析数据的不同被包装成了两个函数,分别是处理高通量测序数据的SAMseq和处理芯片数据的samr,本次我只讲解芯片数据的处理,然后跟limma这个包做一个简单比较~

所以,我们只需要制作好数据,然后学会用samr这个函数即可!

我们还是利用CLL这个包的测试数据来讲解这个包的用法,首先也是制作表达矩阵和分组信息。

  1. suppressPackageStartupMessages(library(CLL))
  2. data(sCLLex)
  3. exprSet=exprs(sCLLex) ##sCLLex是依赖于CLL这个package的一个对象
  4. samples=sampleNames(sCLLex)
  5. pdata=pData(sCLLex)
  6. group_list=as.character(pdata[,2])
  7. group_list
  8. ## [1] "progres." "stable" "progres." "progres." "progres." "progres."
  9. ## [7] "stable" "stable" "progres." "stable" "progres." "stable"
  10. ## [13] "progres." "stable" "stable" "progres." "progres." "progres."
  11. ## [19] "progres." "progres." "progres." "stable"
  12. as.numeric(as.factor(group_list))
  13. ## [1] 1 2 1 1 1 1 2 2 1 2 1 2 1 2 2 1 1 1 1 1 1 2

这个表达矩阵exprSet和分组信息group_list就可以直接用来做差异分析啦~! 它的分组信息要求比较读取,需要1,1,1,2,2,2这样的向量,所以我用了as.numeric(as.factor(group_list)),具体见下面的代码!

  1. suppressPackageStartupMessages(library(samr))
  2. data=list(x=exprSet,y=as.numeric(as.factor(group_list)),
  3. geneid=as.character(1:nrow(exprSet)),
  4. genenames=rownames(exprSet),
  5. logged2=TRUE
  6. )
  7. samr.obj<-samr(data, resp.type="Two class unpaired", nperms=100)

这样其实已经OK啦,重点是如何调整这个函数的参数,以及如何理解这个函数返回的结果(samr.obj这个对象非常重要,关乎你能否真正用好samr)~

我这里的genenames其实是探针名,如果真正要做分析,可以修改,而且我的nperms次数为100,也可以修改,一般是1000.

除了直接应用它找差异基因外,它还有几个单独的函数

首先是对表达矩阵进行normalization

  1. x.norm par(mfrow=c(1,2))
  2. boxplot(exprSet, col = rainbow(exprSet),main="before normalization",las=2)
  3. boxplot(x.norm, col = rainbow(exprSet),main="after normalization",las=2)

用samr包对芯片数据做差异分析

看图好像没什么区别

另外几个函数,我就不一一介绍了,大家可以自行探索。

* samr.plot(samr.obj, del, min.foldchange=0)

* samr.plot(samr.obj, del=.3)

* samr.assess.samplesize.obj

* samr.assess.samplesize.plot(samr.assess.samplesize.obj)

我们重点看看这个samr得到的差异与limma的差异区别在哪里

  1. ## 首先提取samr做差异分析检验的p值
  2. pv=samr.pvalues.from.perms(samr.obj$tt, samr.obj$ttstar)
  3. ## 然后提取limma包做差异分析检验的p值
  4. library(limma)
  5. design=model.matrix(~factor(sCLLex$Disease))
  6. fit=lmFit(sCLLex,design)
  7. fit=eBayes(fit)
  8. options(digits = 4)
  9. DEG_limma=topTable(fit,coef=2,adjust=\'BH\',n=Inf)
  10. pv_limma=DEG_limma$P.Value
  11. names(pv_limma)=rownames(DEG_limma)
  12. head(pv[sort(names(pv))])
  13. ## 100_g_at 1000_at 1001_at 1002_f_at 1003_s_at 1004_at
  14. ## 0.2531 0.4144 0.5671 0.5686 0.4687 0.6340
  15. head(pv_limma[sort(names(pv_limma))])
  16. ## 100_g_at 1000_at 1001_at 1002_f_at 1003_s_at 1004_at
  17. ## 0.2497 0.4312 0.5349 0.5498 0.4361 0.6473
  18. cor(pv[sort(names(pv))],pv_limma[sort(names(pv_limma))])
  19. ## [1] 0.9976

从数据上来看,没什么本质区别,而且相关系数高达0.9978.

所以结论是,没必要搞那么多的包,用limma就好了,甚至直接用t检验也是OK的

还有plot和summary也是可以直接作用于samr的结果samr.obj对象的。

原文来自:http://www.bio-info-trainee.com/1608.html

发表评论

匿名网友

拖动滑块以完成验证
加载失败