从 t 检验中的 t 值手动计算 P 值

机器算法验证 r 统计学意义 t检验 p 值
2022-02-01 06:15:14

我有一个包含 31 个值的示例数据集。我使用 R 进行了双尾 t 检验来测试真实均值是否等于 10:

t.test(x=data, mu=10, conf.level=0.95)

输出:

t = 11.244, df = 30, p-value = 2.786e-12
alternative hypothesis: true mean is not equal to 10 
95 percent confidence interval:
 19.18980 23.26907 
sample estimates:
mean of x 
 21.22944 

现在我正在尝试手动做同样的事情:

t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) 
p.value = dt(t.value, df=length(lengths-1))

使用此方法计算的 t 值与 t 检验 R 函数的输出相同。然而,p 值为 3.025803e-12。

任何想法我做错了什么?

谢谢!

编辑

这是完整的 R 代码,包括我的数据集:

# Raw dataset -- 32 observations
data = c(21.75, 18.0875, 18.75, 23.5, 14.125, 16.75, 11.125, 11.125, 14.875, 15.5, 20.875,
            17.125, 19.075, 25.125, 27.75, 29.825, 17.825, 28.375, 22.625, 28.75, 27, 12.825, 
            26, 32.825, 25.375, 24.825, 25.825, 15.625, 26.825, 24.625, 26.625, 19.625)

# Student t-Test
t.test(x=data, mu=10, conf.level=0.95)

# Manually calculate p-value
t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data)))
p.value = dt(t.value, df=length(data) - 1)
4个回答

使用pt并使其成为双尾。

> 2*pt(11.244, 30, lower=FALSE)
[1] 2.785806e-12

我将此作为评论发布,但当我想在编辑中添加更多内容时,它变得太长了,所以我把它移到了这里。

编辑:您的测试统计数据和 df 是正确的。另一个答案指出了在对 的调用中计算尾部区域的问题pt(),以及双尾部的加倍,这解决了您的差异。尽管如此,我还是会留下我之前的讨论/评论,因为它使相关点更普遍地与极端尾部的 p 值有关:

您可能没有做错任何事情并且仍然有所不同,但是如果您发布一个可重现的示例,则可能会进一步调查您是否有一些错误(例如在 df 中)。

这些东西是根据在非常极端的尾部可能不是特别准确的近似值计算出来的。

如果这两件事不使用相同的近似值,它们可能不会非常一致,但缺乏一致应该无关紧要(对于远距离的确切尾部区域是有意义的数字,所需的假设必须保持惊人的程度准确性)。你真的有精确的正态性、精确的独立性、精确的恒定方差吗?

你不应该期望在数字无论如何都没有任何意义的情况下会有很高的准确性。,这在多大程度上有影响这两个数字都不能衡量您真实情况的实际p 值。即使其中一个数字确实代表了你真实情况的真实p 值,一旦它低于大约,你为什么要关心这个值实际上是什么?2×10123×10120.0001

手动计算的最佳方法是:

t.value = (mean(data) - 10) / (sd(data) / sqrt(length(data))) 
p.value = 2*pt(-abs(t.value), df=length(data)-1)

您需要 abs() 函数,否则您将面临 p 值大于的风险(当数据的平均值大于给定的平均值时)!1

我真的很喜欢@Aaron 提供的答案以及abs评论。我发现一个方便的确认是运行

pt(1.96, 1000000, lower.tail = F) * 2

产生0.04999607

在这里,我们使用了众所周知的属性,即正态分布下 95% 的区域出现在 ~1.96 标准偏差处,因此 ~0.05 的输出给出了我们的 p 值。我使用了 1000000,因为当 N 很大时,t 分布与正态分布几乎相同。运行这个让我对@Aaron 的解决方案感到安慰。