【问题标题】:p-value from fisher.test() does not match phyper()fisher.test() 的 p 值与 phyper() 不匹配
【发布时间】:2019-04-02 18:24:51
【问题描述】:

Fisher 精确检验与超几何分布有关,我希望这两个命令会返回相同的 p 值。谁能解释我做错了什么,他们不匹配?

#data (variable names chosen to match dhyper() argument names)
x = 14
m = 20
n = 41047
k = 40

#Fisher test, alternative = 'greater'
(fisher.test(matrix(c(x, m-x, k-x, n-(k-x)),2,2), alternative='greater'))$p.value 
#returns 2.01804e-39

#geometric distribution, lower.tail = F, i.e. P[X > x]
phyper(x, m, n, k, lower.tail = F, log.p = F)
#returns 5.115862e-43

【问题讨论】:

  • 对于亲密的选民来说,有两种方法可以回答这个问题。其中之一是查看这两个函数调用,了解它们之间的关系,以及可能需要更改哪些内容才能产生相同的结果。这似乎完全是这里的主题。另一个涉及描述函数调用背后的统计理论,这可能最好在另一个 SE 站点上询问。由于这个问题是在这里提出的,并且可以在这里回答主题,我希望这就是 OP 想要的。如果没有,请编辑并迁移。

标签: r statistics p-value contingency hypothesis-test


【解决方案1】:

在这种情况下,对phyper 的相关实际调用是phyper(x - 1, m, n, k, lower.tail = FALSE)。查看与您对fisher.test(matrix(c(x, m-x, k-x, n-(k-x)),2,2), alternative='greater') 的调用相关的fisher.test 的源代码。在第 138 行,PVAL 设置为:

switch(alternative, less = pnhyper(x, or), 
    greater = pnhyper(x, or, upper.tail = TRUE), 
    two.sided = {
      if (or == 0) as.numeric(x == lo) else if (or == 
        Inf) as.numeric(x == hi) else {
        relErr <- 1 + 10^(-7)
        d <- dnhyper(or)
        sum(d[d <= d[x - lo + 1] * relErr])
      }
    })

由于alternative = 'greater'PVAL 设置为pnhyper(x, or, upper.tail = TRUE)。可以看到第122行定义了pnhyper。这里,or = 1,是传给ncp的,所以调用的是phyper(x - 1, m, n, k, lower.tail = FALSE)

用你的价值观:

x = 14
m = 20
n = 41047
k = 40
phyper(x - 1, m, n, k, lower.tail = FALSE)
# [1] 2.01804e-39

【讨论】:

    猜你喜欢
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 2016-06-24
    • 2016-04-28
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多