【统计】对P值进行FDR校正的原理(附代码演示)
2018-09-15
做了多年的生物信息处理,和统计显著已经打过很多交道。然而限于生物出身背景,对于统计知识了解不是很深刻。细细想来,每次对外说出各种检验方式的名称(通常都是以人名命名的那种),自己却鲜有细细了解到底这些检验的原理以及具体操作过程。近日听了一场答辩,评委问道:“为何不做p值校正?”。闻后心里一惊,因为自己并不清楚校正的原理,如果自己遇到这种问题似乎会很难堪了。
结束后,查阅了多方资料。笔者认为对FDR的数学意义及计算实现已经有了正确的认识。总结一下相关知识,在此以飨读者。
利用Benjamini–Hochberg方法计算FDR的计算及R语言实现
FDR的计算相当简单,包括以下几步:
1.对p值进行从小到大的排序,标记上序号1~n;
2.其中,最大的FDR(不考虑重复则为第n位)等于最大的p值;
3.对于n-1位的FDR,取下面两者的较小值:
上一步(第n位)计算得出的FDR值;
p-value*n/(n-1)
4.不断迭代第三步(n-2,n-3....),直至计算到最小p值对应的FDR。
下面直接在R里实现:
###例如这10个p值进行校正
temp
根据上述定义,我们知道以此计算出的FDR是有可能出现相同值的---即使其原始p值不同。在上面的例子中,第9位的p值为0.81,根据公式计算出的待选FDR值为0.81*10/9=0.9,比第10位的0.91要小,因此成为真正的FDR。如果我们