我如何从 chisq.test() 函数中得到 p.value?

how may I get a p.value from chisq.test() function?

m1 <- data.frame(a=1, b=2, d=0)
chisq.test(m)$p.value
# 0.3678794

m2 <- data.frame(a=c(1,2,0), b=c(2,12,0), d=c(0,0,0))
chisq.test(m2)$p.value
# NaN

我无法理解为什么 chisq.test() 函数无法测试像 m2 这样的 table 的差异。有没有什么方法可以为第三列零的数据框(如 m1)获取 p 值?

您可以使用 Fisher 精确检验:

 fisher.test(m1)$p.value

[1] 0.4647059

正如 Marco 所展示的,Fisher's exact test 会给你一个 p 值,但即使 χ2-test 确实给了你一个你仍然应该使用的值费舍尔的。 χ2-test 给出了一个近似值,仅适用于大型数据集。
至于为什么你得到 NaN,lukeA 是正确的,尽管你可以这样说,如果任何行或列的总和为零,或者边缘为零,测试将不起作用。

m2 <- data.frame(a=c(1, 2, 0), b=c(2, 12, 0), d=c(0, 0, 0))
chisq.test(m2, simulate.p.value=TRUE)$p.value

# Warning messages:
# 1: In chisq.test(m2, simulate.p.value = TRUE) :
# cannot compute simulated p-value with zero marginals

演示近似和精确 p 值之间的差异

m3 <- data.frame(a=c(1, 2, 0), b=c(2, 12, 0), d=c(0, 0, 1))

chisq.test(m3, simulate.p.value=TRUE)$p.value
# 0.05147

fisher.test(m3)$p.value
# 0.06324