以下是我迄今为止尝试的代码:v= p值的向量,alpha=目标FDR
bh=function(v,alpha=.1){
sorted.v<-sort(v)
dif<-sorted.v-alpha
neg.dif<-dif[dif<0]
pos.dif<-neg.dif[length(neg.dif)]
index<-dif==pos.dif
p.cutoff<-sorted.v[index]
## (Comment:below will return the cutoff value)
p.cutoff
p.sig<-v[v<=p.cutoff]
## (comment:below will return p-values that are significant.)
p.sig
}
字符串
这有用吗?任何帮助都将不胜感激。非常感谢!
2条答案
按热度按时间6tqwzwtp1#
在R中进行任何类型的统计分析时,您通常不需要重新发明轮子。
p.adjust(p, method = 'hochberg', n = length(p))
fykwrbwg2#
我同意不需要重新执行BH程序,但不同意以前的答案,即“正确的方法”是用p值调整。人们可能合理地假设“执行Benjamini-Hochberg”意味着找到临界值以保持预期的错误发现率,如Benjamini和Hochberg 1995所述;
stats::p.adjust
实际上是修改p值本身,以保持预期的错误发现率:https://stats.stackexchange.com/a/402217/171222sgof::BH
看起来是Benjamini and Hochberg 1995 procedure的一个很好的实现它的worker函数
bh
返回测试拒绝的临界值(FDR
)、调整后的p.值(无论它们值多少)以及p.值集合中的拒绝数。它的参数是p值向量u
和期望的错误发现率alpha
:字符串
有趣的是,
bh
返回排序后的调整后的p.值( Package 器sgof::BH
也对输入的p.值进行排序);我认为p.adjust
按照接收的顺序返回调整后的值。型