2011-07-06 50 views
4

在R中,我使用phyper函數做生物信息學分析的超幾何測試。然而,我使用了很多Python代碼,並且在這裏使用rpy2非常緩慢。所以,我開始尋找替代品。似乎scipy.stats.hypergeom有類似的東西。在Python中,R的「phyper」函數等價於什麼?

目前,我叫phyper這樣的:

pvalue <- 1-phyper(45, 92, 7518, 1329) 

,其中45是具有感興趣的性質,92具有產權,7518非選擇的項目數佔總項目數選擇項目的數量沒有財產,以及1329選定項目的總數。

在R中,這產生了6.92113e-13

試圖做同樣的scipy.stats.hypergeom然而產生了完全不同的結果(注意,這些數字被交換,因爲該函數以不同的方式接受編號):

import scipy.stats as stats 
pvalue = 1-stats.hypergeom.cdf(45, 7518, 92. 1329) 
print pvalue 

然而,這將返回-7.3450134863151106e-12 ,這沒什麼意義。請注意,我已經在其他數據上測試了這一點,並且我幾乎沒有問題(精確到小數點後四位,這對我來說已經足夠了)。

所以它歸結爲這些可能性:

  1. 我使用了錯誤的功能作業(或錯誤參數)
  2. 有一個在SciPy的

一個錯誤的情況下, 「1」,是否有其他替代phyper,可以在Python中使用?

編輯:正如評論注意到的,這是一個scipy中的錯誤,在git master中修復。

回答

7

docs,你可以嘗試:

hypergeom.sf(x,M,n,N,loc=0): 生存函數(1-CDF - 有時 更準確)

另外,我覺得你可能值混合起來。

從bin中繪製對象的模型。 M 是對象的總數,n是總數 類型I對象的數量。 RV計數 抽取的N個類型I對象的數量 沒有從人口中取代。

因此,我的閱讀:x=qM=n+mn=mN=k

所以我會嘗試:

stats.hypergeom.sf(45,(92+7518),92,1329) 
+0

仍然給出了否定的p值,但因爲我沒有其他的測試是相當的,我不知道如果沒有任何副作用,我不知道的。 – Einar

+0

我認爲它是一個scipy中的錯誤:http://biostar.stackexchange.com/questions/9746/which-way-to-calculate-cumulative-hypergeometric-distribution-is-more-accurate – James

+1

@Einar看起來像這個問題有最近已修復:http://projects.scipy.org/scipy/ticket/1218嘗試更新您的scipy安裝 – James

相關問題