2015-05-01 97 views
3

當我使用R的p.adjust函數來計算錯誤發現率時,我似乎得到了不一致的結果。基於在documentation 調整後的p值引用的文件應這樣計算:R如何計算錯誤發現率

adjusted_p_at_index_i= p_at_index_i*(total_number_of_tests/i). 

現在,當我運行p.adjust(c(0.0001, 0.0004, 0.0019),"fdr")我得到的

c(0.0003, 0.0006, 0.0019) 

預期的結果,但是當我運行p.adjust(c(0.517479039, 0.003657195, 0.006080152),"fdr")我得到這個

c(0.517479039, 0.009120228, 0.009120228) 

相反的結果我計算:

c(0.517479039, 0.010971585, 0.009120228) 

R對數據做了什麼來解釋這兩個結果?

+0

我覺得這是更好的問題,但它本質上是http://stackoverflow.com/questions的副本/ 10323817/R-意想不到-結果的從對 - 調節-FDR/10327132 – Dason

回答

2

原因是FDR計算可以確保FDR永遠不會隨着p值的降低而增加。這是因爲您可以隨時選擇爲拒絕規則設置較高的閾值,如果該閾值越高,您的FDR就越低。

就你而言,你的第二個假設的p值爲0.0006,而FDR爲0.010971585,但第三個假設的p值更大,FDR更小。如果您通過將您的p值閾值設置爲0.0019來實現0.009120228的FDR,則永遠不會有理由設置較低的閾值來獲得更高的FDR。

您可以通過鍵入p.adjust在代碼中看到這一點:

... 
}, BH = { 
    i <- lp:1L 
    o <- order(p, decreasing = TRUE) 
    ro <- order(o) 
    pmin(1, cummin(n/i * p[o]))[ro] 

cummin函數採用向量的累積最小,在p順序倒退。

可以在Benjamini-Hochberg paper看到這一點,你鏈接到,包括程序的293頁上的定義,其中規定(重點煤礦):

令k 是最大的我對於這 P (i)< = i/mq *;

然後拒絕所有H_(I)I = 1,2,...,K