未知的p值计算


9

我最近在调试R脚本时发现很奇怪,作者定义了自己的p值函数

pval <- function(x, y){
    if (x+y<20) { # x + y is small, requires R.basic
        p1<- nChooseK(x+y,x) * 2^-(x+y+1);
        p2<- nChooseK(x+y,y) * 2^-(x+y+1);
        pvalue = max(p1, p2)
    }
    else { # if x+y is large, use approximation
        log_p1 <- (x+y)*log(x+y) - x*log(x) - y*log(y) - (x+y+1)*log(2);
        pvalue<-exp(log_p1);
    }
    return(pvalue)
}

其中X和Y是大于0的正值。小于20的情况似乎是某种超几何分布的计算(类似于Fisher检验?),有人知道其他计算是什么吗?作为附带说明,我正在尝试优化此代码,以便尝试找出适当的R函数来调用和替换它。

编辑:可在此处找到用于p值计算的纸张详细公式(需要单击pdf以查看公式)方法从pdf的第8页开始,有问题的公式可以在第(9)页的(1)下找到。他们假设的分布是泊松。

Answers:


15

第二件事看起来像是用于x+y < 20案例的计算的近似值,但是基于Stirling近似值

通常,当将其用于此类逼近时,人们至少会使用下一个附加项(对的逼近因子),这对于小会大大提高相对逼近度。。2πñññ

例如,如果 Xÿ 都为10,则第一个计算得出的值约为0.088,而当 2πñ所有项中包含的大约为0.089,对于大多数用途来说足够接近...但是在近似中忽略该项将得到0.5-这实际上还不够接近!该函数的作者显然没有费心检查边界情况下逼近的准确性。

为此,作者可能应该简单地调用了内置lgamma函数-特别地,通过使用此函数代替他的功能log_p1

log_p1 <- lgamma(x+y+1)-lgamma(x+1)-lgamma(y+1)-(x+y+1)*log(2)

这导致他尝试近似的答案(因为lgamma(x+1)实际上返回日志X,他正试图通过Stirling近似进行近似(很差))。

同样,我不确定为什么作者choose在第一部分中不使用内置函数,该函数是R的标准发行版中提供的。为此,相关的发行函数也可能是内置的。

您实际上并不需要两个单独的案例。在lgamma一个作品就好一直到最小值。另一方面,该choose函数适用于相当大的值(例如,choose(1000,500)效果很好)。在更安全的选择可能是lgamma,但你需要有相当大的Xÿ 才是问题。

有了更多的信息,应该可以确定测试的来源。我的猜测是作者从某个地方拿走了它,因此应该可以对其进行追踪。您对此有一些了解吗?

当您说“优化”时,是指使其更快,更短,更易于维护或其他?


快速阅读论文后进行编辑:

作者在许多方面似乎是错误的。Fisher的精确检验不假设边距是固定的,仅是对它们的条件进行限制,这根本不是一回事,例如,在此处与参考文献讨论过。的确,他们似乎完全不了解关于限制利润率的条件及其原因的辩论。那里的链接值得一读。

[他们从“费舍尔的检验总是比我们的检验更保守”到“费舍尔检验太保守 ... 的断言…… 除非条件错误是不一定的” 。他们必须确定这一点,但是鉴于统计学家一直在争论约80年,而且这些作者似乎不知道为什么要进行调节,所以我认为这些家伙并没有完全解决这个问题。 。]

该论文的作者至少似乎确实理解,他们给出的概率必须累加才能给出p值。例如,在第5页第一栏的中间(强调我的位置):

根据费舍尔精确检验得出的这种结果的统计显着性为4.6%(双尾P值,即在肌动蛋白EST频率独立于cDNA文库的假设中,此类表格出现的可能性)。相比之下, 等式2 的累积形式(等式9,请参见方法)计算出的P值(即,在两个库中肌动蛋白EST的相对频率相同),前提是至少观察到11个同源EST。 (在脑库中观察到两次后的肝库)为1.6%。

(尽管我不确定我是否同意他们在那里的值的计算;我必须仔细检查以查看它们在另一条尾巴上的实际作用。)

我不认为该程序可以做到这一点。

但是要当心,他们的分析不是标准的二项式检验。他们使用贝叶斯(Bayesian)参数在否则为频繁检验的情况下得出p值。在我看来,这些条件似乎也有些奇怪-X, 而不是 X+ÿ。这意味着他们必须以负二项式而不是二项式结束,但是我发现论文的组织确实很糟糕,而且解释得很糟糕(我习惯于弄清楚统计论文的内容),所以我除非我仔细检查,否则无法确定。

我什至不相信他们的概率之和在这一点上是1。

这里还有很多要说的,但问题不在于论文,而在于程序中的实现。

-

无论如何,结果是,至少论文正确地识别出p值由几率之和组成,如等式2中的那些,但程序没有。(请参见本文“方法”部分中的等式9a和9b。)

该代码是完全错误的。

[您可以使用pbinom@whuber的注释表示,可以算出单个概率(但不能计算尾巴,因为它不是结构的二项式检验),但是等式2中有1/2的额外因数,因此如果要在纸上复制结果,则需要更改它们。]

您可以通过以下方式轻松地获得它pnbinom-

负二项式的通常形式是对 ķŤH成功或数量失败ķŤH成功。两者是等效的。维基百科在这里给出了第二种形式。概率函数为:

ķ+[R-1个ķ1个-p[Rpķ

p4上的等式2(p3上的等式1也是)是负二项式,但移位了1。p=ñ1个/ñ1个+ñ2ķ=X[R=ÿ+1个

这使我担心,因为 ÿ 并没有发生类似的变化,因此它们的概率甚至可能不等于1。

那将是不好的。


1
+1不错的解释。此代码还有一些其他问题。完全没有必要进行计算p2。的小p1p2对应的小xy分别, -这是一个低效率。一个可能的错误是条件的第二个分支根本无法计算p2并且仅使用p1。我也怀疑代码可能完全错误,因为它似乎没有计算p值:它只是二项式概率的一半,也许应该是尾部概率。为什么不只使用pbinom/ dbinom并完成呢?
whuber

感谢您的答复,我能够找到该公式的来源:基因组.cshlp.org / content / 7/10 / 986.short我想将其更改为更快,更易于维护/阅读。
yingw 2013年

谢谢你的论文;这有助于弄清代码中发生了什么。真是个妖精。
Glen_b-恢复莫妮卡

1
+1。这是不应该成为社区Wiki的帖子!我认为这是由于14转,但在这种情况下,它们全由您决定。您的努力已受到惩罚!
Darren Cook

感谢您的信任投票。是的,在阅读本文时,我一直回过头来并进行改进,但是我想这是我自己的部分错误,因为他无法更有效地获得最终结果。
Glen_b-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.