R包是否應該每次使用都聯網?以及生信必備統計學實例推薦

在牆內搞生物信息學偶爾會遇到一些莫名其妙的問題,比如突然間有天就沒辦法使用下面這個函數:

  ###   over-representation test
  kk.up <- enrichKEGG(gene         = gene_up,
                      organism     = 'hsa',
                      universe     = gene_all,
                      pvalueCutoff = 0.9,
                      qvalueCutoff =0.9)
  head(kk.up)[,1:6]

問題是我一直在大力宣傳這個clusterProfiler包的這種enrich方式,如果我一直推薦的是一個錯誤的代碼,那該多尷尬呀!

怪不得總是有些人問到使用它的各種失敗,各種報錯,因爲我大部分時間都是在牆外所以根本就沒辦法重複出求助者的錯誤。

簡單看了加源代碼,發現是download_KEGG('hsa') 這個函數的問題,這個函數每次使用都會去下載這個數據,如果某些地方某些電腦無法訪問這個KEGG的官方網站,那麼這個包就沒辦法使用了。

所以我的第一個問題來了?

一個主打統計學功能函數的R包需要每次都聯網嗎?

畢竟很多工作場景是不允許聯網的,先不說牆內牆外的問題。

雖然無法使用這個包來做註釋,但是其統計學原理我是懂的,只好自己寫enrich函數了:

library(ggplot2) 
library(KEGG.db)
library(org.Hs.eg.db)
load('for_annotation.Rdata')
## KEGG pathway analysis
library(KEGG.db)
tmp=toTable(org.Hs.egPATH)

minS=10;
maxS=500;
GeneID2Path<<- tapply(tmp[,2],as.factor(tmp[,1]),function(x) x)
Path2GeneID<<- tapply(tmp[,1],as.factor(tmp[,2]),function(x) x)
# 超幾何分佈檢驗是統計學上一種離散概率分佈。它描述了由有限個物件中抽出n個物件,成功抽出指定種類的物件的個數(不歸還)
gened=intersect(names(GeneID2Path),gene_up)  ## all genes been choosed
geneb=intersect(names(GeneID2Path),gene_all) ## all genes as backgroud 
N=length(geneb);N ## number of all the genes
M=length(gened);M ## number of all the choosed genes

kegg_r <- do.call(rbind,lapply(names(Path2GeneID),function(thisP){
  # thisP=names(Path2GeneID)[1];thisP
  n=length(intersect(geneb,Path2GeneID[[thisP]]));n
  if(n>maxS) return(NULL);
  if(n<minS) return(NULL);
  (  exp_count=n*M/N)
  k=length(intersect(gened,Path2GeneID[[thisP]]));k
  OddsRatio=k/exp_count 
  p=phyper(k-1,M, N-M, n, lower.tail=F)
  #print(paste(i,p,OddsRatio,exp_count,k,M,sep="    "))
  return(c(thisP,p,OddsRatio,exp_count,k,n,M,N))
}))
colnames(kegg_r)=c('path_id','p','OddsRatio','exp_count','k','n','M','N')
kegg_r=merge(kegg_r,toTable(KEGGPATHID2NAME),by='path_id')
kegg_r=kegg_r[order(kegg_r$p),]

寫完我就又思考了,這個統計學應該是生信工程師的必備技能,那麼除了我演示的超幾何分佈檢驗,還有哪些統計學實例是一定要掌握的呢?

大家可以留言推薦一下!

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